From e1718dca22c88f2fa3db0ba7f55068e9e54ff159 Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期三, 30 九月 2026 16:23:10 +0800
Subject: [PATCH] feat(migration): 补迁 5 个 cnas 业务模块

---
 cnas-device/src/main/java/com/ruoyi/device/dto/DeviceInspectionRecordDto.java                                     |   25 
 cnas-process/src/main/java/com/ruoyi/process/service/ProcessMethodSearchNewBackupsService.java                    |   16 
 cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceTraceabilityManagementDetails.java                          |   67 
 cnas-manage/src/main/java/com/ruoyi/manage/vo/MeetingParticipantsDetailsVo.java                                   |   15 
 cnas-manage/src/main/java/com/ruoyi/manage/pojo/InternalCheck.java                                                |   80 
 cnas-personnel/src/main/resources/static/supervision-record.docx                                                  |    0 
 cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonBasicInfoFileService.java                          |   16 
 cnas-device/src/main/resources/mapper/DeviceAcceptanceMapper.xml                                                  |   17 
 cnas-process/src/main/java/com/ruoyi/process/mapper/InconsistentDistributionMapper.java                           |   30 
 cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceCalibrationPlanDetail.java                                  |   73 
 cnas-process/src/main/java/com/ruoyi/process/dto/ProcessReportDto.java                                            |   30 
 cnas-require/src/main/java/com/ruoyi/require/service/impl/FeTempHumDateServiceImpl.java                           |  144 
 cnas-manage/src/main/java/com/ruoyi/manage/mapper/ManageDocumentIssueRecycleMapper.java                           |   24 
 cnas-process/src/main/resources/mapper/QualityMonitorDetailsMapper.xml                                            |   40 
 cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessMethodSearchNewArchivedServiceImpl.java          |   20 
 cnas-device/src/main/resources/static/word/device-scrapped.docx                                                   |    0 
 cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceTraceabilityManagementDetailsMapper.java                  |   26 
 cnas-manage/src/main/java/com/ruoyi/manage/pojo/ManageRecordTotal.java                                            |   77 
 cnas-device/src/main/java/com/ruoyi/device/dto/DeviceCalibrationPlanDetailDto.java                                |   21 
 cnas-personnel/src/main/resources/static/supervision-control-sheet.docx                                           |    0 
 cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceCalibrationPlan.java                                        |   66 
 cnas-manage/src/main/java/com/ruoyi/manage/mapper/ManageReviewProgramMapper.java                                  |   21 
 cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessMethodVerifyMethodFileServiceImpl.java           |   19 
 cnas-personnel/src/main/java/com/ruoyi/personnel/dto/TrainingRecordPersonDetailedDto.java                         |   26 
 cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceBorrow.java                                                 |  132 
 cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonRewardPunishmentRecordController.java           |  100 
 cnas-process/src/main/java/com/ruoyi/process/service/ProcessMethodVerifyMachineAttachmentService.java             |   15 
 cnas-process/src/main/java/com/ruoyi/process/mapper/ProcessMethodVerifyWorkFileMapper.java                        |   24 
 cnas-process/src/main/java/com/ruoyi/process/controller/ProcessEvaluateController.java                            |   62 
 cnas-manage/src/main/java/com/ruoyi/manage/mapper/ManageRecordIntervalsMapper.java                                |   21 
 cnas-process/src/main/java/com/ruoyi/process/dto/QualitySuperviseDetailsCorrectDto.java                           |   25 
 cnas-process/src/main/java/com/ruoyi/process/service/ProcessComplainService.java                                  |   31 
 cnas-require/src/main/java/com/ruoyi/require/mapper/InternalWastesMapper.java                                     |   31 
 cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceScrappedMapper.java                                       |   35 
 cnas-device/src/main/java/com/ruoyi/device/service/DeviceExamineRecordContrastDetailsService.java                 |   16 
 cnas-device/src/main/java/com/ruoyi/device/service/DeviceScrappedService.java                                     |   43 
 cnas-device/src/main/java/com/ruoyi/device/dto/DeviceScrappedDto.java                                             |   26 
 cnas-manage/src/main/java/com/ruoyi/manage/service/impl/InternalPlanServiceImpl.java                              |  259 
 cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageDocumentIssueRecycleServiceImpl.java                |  202 
 cnas-device/src/main/resources/static/word/traceability-management-details.docx                                   |    0 
 cnas-manage/src/main/java/com/ruoyi/manage/dto/InternalMeetingDto.java                                            |   22 
 cnas-manage/src/main/resources/mapper/ManageRecordVerifyMapper.xml                                                |   23 
 cnas-require/src/main/java/com/ruoyi/require/controller/FeCalibrationScheduleController.java                      |   97 
 cnas-process/src/main/resources/mapper/ProcessMethodVerifyWorkFileMapper.xml                                      |   13 
 cnas-require/src/main/java/com/ruoyi/require/dto/FeIlluminationExportDto.java                                     |   25 
 cnas-manage/src/main/java/com/ruoyi/manage/service/InternalCheckService.java                                      |   69 
 cnas-process/src/main/java/com/ruoyi/process/mapper/ProcessMethodSearchNewBackupsMapper.java                      |   27 
 cnas-device/src/main/java/com/ruoyi/device/excel/upload/DeviceExaminePlanUpload.java                              |   37 
 cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceExamineRecordDetailMapper.java                            |   16 
 cnas-personnel/src/main/resources/static/credentials-deal.docx                                                    |    0 
 cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageReviewReportServiceImpl.java                        |  138 
 cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonRewardPunishmentRecordService.java                 |   31 
 cnas-process/src/main/java/com/ruoyi/process/dto/InconsistentDistributionDto.java                                 |   28 
 cnas-require/src/main/java/com/ruoyi/require/pojo/ProcurementSuppliesList.java                                    |  100 
 cnas-device/src/main/resources/mapper/DeviceMaintenancePlanMapper.xml                                             |   23 
 cnas-manage/src/main/resources/mapper/ManageDocumentControlledMapper.xml                                          |   42 
 cnas-device/src/main/java/com/ruoyi/device/service/DeviceImpowerDetailsService.java                               |   16 
 cnas-device/src/main/resources/mapper/DeviceMapper.xml                                                            |  196 
 cnas-device/src/main/java/com/ruoyi/device/mapper/OperationInstructionMapper.java                                 |   20 
 cnas-device/src/main/java/com/ruoyi/device/service/CollectBridgeService.java                                      |   21 
 cnas-device/src/main/java/com/ruoyi/device/controller/DeviceController.java                                       |  228 
 cnas-require/src/main/java/com/ruoyi/require/service/InternalWastesDetailService.java                             |   16 
 cnas-require/src/main/java/com/ruoyi/require/service/impl/FeLightningProtectionServiceImpl.java                   |   27 
 cnas-require/src/main/java/com/ruoyi/require/pojo/FeTempHumDate.java                                              |   55 
 cnas-process/src/main/java/com/ruoyi/process/pojo/QualityMonitorDetailsEvaluateFile.java                          |   55 
 cnas-process/src/main/java/com/ruoyi/process/service/ProcessMethodSearchNewArchivedService.java                   |   16 
 cnas-personnel/src/main/resources/mapper/PersonRewardPunishmentRecordMapper.xml                                   |   47 
 cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonTrainingDto.java                                       |   22 
 cnas-manage/src/main/java/com/ruoyi/manage/controller/ManageRiskAssessmentResultsController.java                  |  134 
 cnas-manage/src/main/resources/mapper/ManageRiskAssessmentResultsMapper.xml                                       |   38 
 cnas-personnel/src/main/resources/static/person-training.docx                                                     |    0 
 cnas-device/src/main/java/com/ruoyi/device/utils/DataAcquisition.java                                             |  861 
 cnas-process/src/main/java/com/ruoyi/process/mapper/QualityMonitorDetailsRatifyMapper.java                        |   17 
 cnas-manage/src/main/resources/static/internal-plan.docx                                                          |    0 
 cnas-require/src/main/java/com/ruoyi/require/service/impl/FeStandardSubstanceAcceptanceServiceImpl.java           |  116 
 cnas-device/src/main/java/com/ruoyi/device/controller/DeviceTraceabilityManagementController.java                 |  106 
 cnas-require/src/main/java/com/ruoyi/require/dto/FeIlluminationDto.java                                           |   21 
 cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonPersonnelCapacityService.java                      |   35 
 cnas-require/src/main/java/com/ruoyi/require/service/FeIlluminationService.java                                   |   29 
 cnas-device/src/main/java/com/ruoyi/device/service/DeviceInstructionService.java                                  |   25 
 cnas-manage/src/main/java/com/ruoyi/manage/pojo/ManageRecordIntervalsTotal.java                                   |   75 
 cnas-require/src/main/java/com/ruoyi/require/pojo/CollectTemperatureHumidity.java                                 |   66 
 cnas-process/src/main/java/com/ruoyi/process/service/QualitySuperviseManagementReviewService.java                 |   34 
 cnas-manage/src/main/java/com/ruoyi/manage/mapper/ManageReviewReportMapper.java                                   |   21 
 cnas-require/src/main/java/com/ruoyi/require/controller/SuppliersDirectoryContentsController.java                 |   77 
 cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonPostAuthorizationRecordController.java          |   66 
 cnas-require/src/main/java/com/ruoyi/require/service/FeCalibrationScheduleService.java                            |   29 
 cnas-device/src/main/java/com/ruoyi/device/dto/DeviceTraceabilityManagementDetailsDto.java                        |   25 
 cnas-manage/src/main/java/com/ruoyi/manage/controller/ManageDocumentListController.java                           |   76 
 cnas-process/src/main/java/com/ruoyi/process/controller/ProcessDealController.java                                |   51 
 cnas-process/src/main/resources/mapper/ProcessDealMapper.xml                                                      |   39 
 cnas-manage/src/main/java/com/ruoyi/manage/controller/ClientSatisfactionController.java                           |  140 
 cnas-manage/src/main/resources/static/review-program.docx                                                         |    0 
 cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonBasicInfoDto.java                                      |   47 
 cnas-device/src/main/resources/mapper/DeviceBreakdownMaintenanceMapper.xml                                        |   17 
 cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceOperationInstructionServiceImpl.java                |   27 
 cnas-require/src/main/java/com/ruoyi/require/service/impl/InternalWastesServiceImpl.java                          |  169 
 cnas-process/src/main/resources/static/inspection-order.docx                                                      |    0 
 cnas-device/src/main/java/com/ruoyi/device/service/DeviceTraceabilityManagementDetailsService.java                |   16 
 cnas-device/src/main/java/com/ruoyi/device/controller/DeviceScrappedController.java                               |   82 
 cnas-manage/src/main/resources/static/audit-deal.docx                                                             |    0 
 cnas-device/src/main/java/com/ruoyi/device/service/DeviceMaintenancePlanDetailsService.java                       |   17 
 cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonTrainingRecordSubmitDto.java                           |   35 
 cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonCommunicationAbilityDto.java                           |   14 
 cnas-device/src/main/resources/mapper/InsOrderDeviceRecordMapper.xml                                              |   51 
 cnas-device/src/main/resources/static/word/maintenance-records.docx                                               |    0 
 cnas-device/src/main/java/com/ruoyi/device/controller/DeviceMaintenanceController.java                            |   81 
 cnas-process/src/main/resources/static/quality-supervise.docx                                                     |    0 
 cnas-device/src/main/java/com/ruoyi/device/dto/DeviceExamineRecordDto.java                                        |   28 
 cnas-process/src/main/java/com/ruoyi/process/service/InconsistentDistributionDetailService.java                   |   16 
 cnas-device/src/main/java/com/ruoyi/device/pojo/DataConfig.java                                                   |   82 
 cnas-device/src/main/resources/static/word/device-calibration-plan.docx                                           |    0 
 cnas-process/src/main/java/com/ruoyi/process/service/ProcessReportService.java                                    |   26 
 cnas-manage/src/main/resources/static/internal-correct.docx                                                       |    0 
 cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceAccidentReportServiceImpl.java                      |  190 
 cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceExamineRecordDetailServiceImpl.java                 |   20 
 cnas-device/src/main/resources/mapper/DeviceTraceabilityManagementMapper.xml                                      |   23 
 cnas-process/src/main/java/com/ruoyi/process/controller/QualitySuperviseManagementReviewController.java           |   71 
 cnas-process/src/main/resources/mapper/QualityMonitorMapper.xml                                                   |   20 
 cnas-manage/src/main/java/com/ruoyi/manage/controller/InternalCorrectController.java                              |  119 
 cnas-manage/src/main/java/com/ruoyi/manage/pojo/ManageMeeting.java                                                |   53 
 cnas-manage/src/main/java/com/ruoyi/manage/service/InternalMeetingDetailService.java                              |   16 
 cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageDocumentAlterServiceImpl.java                       |  292 
 cnas-require/src/main/java/com/ruoyi/require/service/FePowerStableService.java                                    |   33 
 cnas-process/src/main/resources/static/sample-receive.docx                                                        |    0 
 cnas-process/src/main/java/com/ruoyi/process/mapper/QualitySuperviseDetailsRecordMapper.java                      |   24 
 cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceMaintenanceMapper.java                                    |   26 
 cnas-require/src/main/java/com/ruoyi/require/excel/StoreExcel.java                                                |   37 
 cnas-require/src/main/resources/mapper/FeStandardSubstanceRecordMapper.xml                                        |   51 
 cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceExaminePlanDetailsMapper.java                             |   28 
 cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/AnnexServiceImpl.java                               |   13 
 cnas-require/src/main/java/com/ruoyi/require/pojo/FeLightningProtection.java                                      |   58 
 cnas-manage/src/main/resources/static/cancel-deal.docx                                                            |    0 
 cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceExamineRecordContrastDetails.java                           |   69 
 cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessMethodVerifyMachineAttachmentServiceImpl.java    |   19 
 cnas-require/src/main/java/com/ruoyi/require/dto/FePowerStableAddDto.java                                         |   15 
 cnas-require/src/main/java/com/ruoyi/require/pojo/FeStandardSubstanceAcceptance.java                              |   90 
 cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonTrainingRecordServiceImpl.java                |  179 
 cnas-manage/src/main/resources/static/review-report.docx                                                          |    0 
 cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceInstructionServiceImpl.java                         |   68 
 cnas-device/src/main/java/com/ruoyi/device/dto/DeviceExport.java                                                  |   19 
 cnas-manage/src/main/java/com/ruoyi/manage/mapper/ManageReviewProgramFileMapper.java                              |   16 
 cnas-process/src/main/resources/mapper/ProcessMethodVerifyMachineAttachmentMapper.xml                             |    5 
 cnas-device/src/main/resources/mapper/DeviceExternalApplyMapper.xml                                               |   23 
 cnas-process/src/main/java/com/ruoyi/process/dto/QualitySuperviseDetailsAccordingDto.java                         |   63 
 cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceAcceptanceFileServiceImpl.java                      |   20 
 cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessComplainServiceImpl.java                         |  113 
 cnas-process/src/main/java/com/ruoyi/process/service/impl/InspectionOrderDetailServiceImpl.java                   |   20 
 cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageRecordTotalServiceImpl.java                         |  430 
 cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceExamineRecordServiceImpl.java                       |  238 
 cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonBasicInfoMapper.java                                |   43 
 cnas-manage/src/main/java/com/ruoyi/manage/mapper/ManageDocumentControlledMapper.java                             |   23 
 cnas-device/src/main/java/com/ruoyi/device/dto/DeviceMaintenancePlanDetailsDto.java                               |   32 
 cnas-require/src/main/java/com/ruoyi/require/controller/FeLightningProtectionController.java                      |   80 
 cnas-manage/src/main/java/com/ruoyi/manage/pojo/InternalImplementDetail.java                                      |   63 
 cnas-manage/src/main/resources/mapper/ClientSatisfactionMapper.xml                                                |   48 
 cnas-process/src/main/java/com/ruoyi/process/service/ProcessOrderDeviceService.java                               |   19 
 cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceExaminePlanServiceImpl.java                         |  349 
 cnas-process/src/main/java/com/ruoyi/process/dto/QualityMonitorDetailsDto.java                                    |   23 
 cnas-device/src/main/resources/mapper/DeviceExaminePlanDetailsMapper.xml                                          |   48 
 cnas-manage/src/main/java/com/ruoyi/manage/controller/ManageRecordCancelController.java                           |   87 
 cnas-process/src/main/resources/static/supervision-detail-according.docx                                          |    0 
 cnas-process/src/main/resources/mapper/InconsistentDistributionDetailMapper.xml                                   |    6 
 cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceInspectionRecordDetailsServiceImpl.java             |   20 
 cnas-manage/src/main/java/com/ruoyi/manage/pojo/ManageRecordIssueRecycle.java                                     |   77 
 cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceDocumentsServiceImpl.java                           |   14 
 cnas-manage/src/main/java/com/ruoyi/manage/controller/InternalMeetingController.java                              |  103 
 cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceLog.java                                                    |   29 
 cnas-manage/src/main/resources/static/analysis-risk-factors.docx                                                  |    0 
 cnas-require/src/main/java/com/ruoyi/require/service/FeTempHumDateService.java                                    |   30 
 cnas-device/src/main/java/com/ruoyi/device/controller/DeviceMetricRecordController.java                           |   89 
 cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceMetricRecordServiceImpl.java                        |   20 
 cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonPostAuthorizationRecordDto.java                        |   14 
 cnas-manage/src/main/resources/mapper/ManageRecordCheckMapper.xml                                                 |   35 
 cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonBasicInfoDetailsDto.java                               |   65 
 cnas-require/src/main/java/com/ruoyi/require/mapper/CollectLaboratoryMapper.java                                  |   15 
 cnas-device/src/main/resources/mapper/DataConfigMapper.xml                                                        |   47 
 cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceMetricServiceImpl.java                              |   11 
 cnas-require/src/main/java/com/ruoyi/require/pojo/ProcurementSuppliesConsumables.java                             |   49 
 cnas-personnel/src/main/resources/static/personnel-capacity.docx                                                  |    0 
 cnas-manage/src/main/java/com/ruoyi/manage/service/ManageDocumentControlledService.java                           |   34 
 cnas-process/src/main/java/com/ruoyi/process/pojo/QualitySuperviseDetails.java                                    |   77 
 cnas-process/src/main/java/com/ruoyi/process/service/ProcessEvaluateService.java                                  |   29 
 cnas-device/src/main/java/com/ruoyi/device/excel/DeviceRecordExportWord.java                                      |   28 
 cnas-device/src/main/java/com/ruoyi/device/dto/DeviceMetricRecordDto.java                                         |   13 
 cnas-process/src/main/java/com/ruoyi/process/pojo/ProcessOrderDevice.java                                         |   68 
 cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageRecordIssueRecycleServiceImpl.java                  |  701 
 cnas-device/src/main/java/com/ruoyi/device/task/DeviceRecordSchedule.java                                         |  104 
 cnas-require/src/main/java/com/ruoyi/require/pojo/FeIllumination.java                                             |   61 
 cnas-device/src/main/resources/mapper/DeviceInspectionRecordMapper.xml                                            |   13 
 cnas-process/src/main/java/com/ruoyi/process/listener/NewJuOrderInspectionListener.java                           |   70 
 cnas-manage/src/main/java/com/ruoyi/manage/mapper/InternalPlanDetailMapper.java                                   |   18 
 cnas-process/src/main/java/com/ruoyi/process/dto/ImageDemoData.java                                               |   43 
 cnas-device/src/main/java/com/ruoyi/device/dto/DeviceExaminePlanDetailsDto.java                                   |   23 
 cnas-manage/src/main/resources/mapper/InternalCorrectFileMapper.xml                                               |   18 
 cnas-process/src/main/java/com/ruoyi/process/service/impl/QualitySuperviseDetailsServiceImpl.java                 |   19 
 cnas-require/src/main/java/com/ruoyi/require/service/impl/FeStandardSubstanceServiceImpl.java                     |  144 
 cnas-require/src/main/java/com/ruoyi/require/service/FeMeasuredQuantityService.java                               |   16 
 cnas-manage/src/main/resources/lib/license.xml                                                                    |   13 
 cnas-process/src/main/java/com/ruoyi/process/pojo/ProcessComplain.java                                            |  141 
 cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonPersonnelCapacityMapper.java                        |   29 
 cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceExamineRecordContrastDetailsMapper.java                   |   16 
 cnas-device/src/main/java/com/ruoyi/device/dto/DeviceExaminePlanDto.java                                          |   33 
 cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonCommunicationAbilityServiceImpl.java          |  114 
 cnas-process/src/main/java/com/ruoyi/process/controller/QualityMonitorController.java                             |  296 
 cnas-process/src/main/java/com/ruoyi/process/service/impl/QualityMonitorServiceImpl.java                          |  835 
 cnas-device/src/main/java/com/ruoyi/device/dto/DeviceRecordDto.java                                               |   14 
 cnas-device/src/main/resources/mapper/DeviceExamineRecordContrastMapper.xml                                       |   39 
 cnas-process/src/main/resources/mapper/InconsistentDistributionMapper.xml                                         |   20 
 cnas-require/src/main/java/com/ruoyi/require/controller/SupplierManagementController.java                         |   91 
 cnas-device/src/main/resources/mapper/DeviceScrappedMapper.xml                                                    |   27 
 cnas-manage/src/main/java/com/ruoyi/manage/pojo/ManageDocumentAlter.java                                          |  114 
 cnas-require/src/main/java/com/ruoyi/require/mapper/FeStandardSubstanceAcceptanceMapper.java                      |   22 
 cnas-process/src/main/java/com/ruoyi/process/service/ProcessTotaldealService.java                                 |   32 
 cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceInstruction.java                                            |   63 
 cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceBreakdownMaintenanceMapper.java                           |   27 
 cnas-manage/src/main/resources/mapper/InternalCheckMapper.xml                                                     |   15 
 cnas-require/src/main/java/com/ruoyi/require/controller/InternalWastesController.java                             |   96 
 cnas-process/src/main/resources/mapper/ProcessMethodSearchNewBackupsMapper.xml                                    |   16 
 cnas-process/src/main/resources/mapper/QualitySuperviseDetailsCorrectMapper.xml                                   |   15 
 cnas-manage/src/main/java/com/ruoyi/manage/controller/ManageRecordTotalController.java                            |   55 
 cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessSampleServiceImpl.java                           |   70 
 cnas-process/src/main/java/com/ruoyi/process/pojo/ProcessSample.java                                              |   78 
 cnas-process/src/main/java/com/ruoyi/process/service/InspectionOrderService.java                                  |   86 
 cnas-manage/src/main/java/com/ruoyi/manage/pojo/InternalReport.java                                               |  122 
 cnas-device/src/main/java/com/ruoyi/device/service/DeviceTraceabilityManagementService.java                       |   71 
 cnas-require/src/main/java/com/ruoyi/require/service/impl/ProcurementSuppliesConsumablesServiceImpl.java          |   14 
 cnas-device/src/main/resources/mapper/DeviceStateMapper.xml                                                       |   19 
 cnas-require/src/main/java/com/ruoyi/require/service/ProcurementSuppliesContentsService.java                      |   16 
 cnas-require/src/main/java/com/ruoyi/require/pojo/FeStandardSubstance.java                                        |   80 
 cnas-manage/src/main/java/com/ruoyi/manage/controller/InternalPlanController.java                                 |  125 
 cnas-manage/src/main/java/com/ruoyi/manage/dto/InternalPlanDto.java                                               |   19 
 cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceMaintenancePlanMapper.java                                |   35 
 cnas-require/src/main/java/com/ruoyi/require/mapper/FePowerStableMapper.java                                      |   34 
 cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageRecordAuditServiceImpl.java                         |  679 
 cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonBasicInfoWorkService.java                          |   16 
 cnas-require/src/main/java/com/ruoyi/require/service/FeStandardSubstanceAcceptanceInspectionService.java          |   16 
 cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceRecordMapper.java                                         |   38 
 cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceMetricRecord.java                                           |   88 
 cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceInspectionRecordServiceImpl.java                    |  225 
 cnas-require/src/main/java/com/ruoyi/require/pojo/ForeignRegister.java                                            |   73 
 cnas-manage/src/main/java/com/ruoyi/manage/pojo/ManageDocumentIssueRecycle.java                                   |  108 
 cnas-process/src/main/resources/mapper/ProcessMethodVerifyMethodFileMapper.xml                                    |    6 
 cnas-require/src/main/java/com/ruoyi/require/controller/ProcurementSuppliesStoreController.java                   |   80 
 cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonCommunicationAbilityService.java                   |   25 
 cnas-process/src/main/java/com/ruoyi/process/pojo/QualitySupervise.java                                           |   79 
 cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceAccidentReport.java                                         |  119 
 cnas-manage/src/main/resources/mapper/ManageRecordAuditMapper.xml                                                 |   50 
 cnas-manage/src/main/java/com/ruoyi/manage/pojo/InternalImplement.java                                            |  107 
 cnas-device/src/main/resources/static/word/device-document.docx                                                   |    0 
 cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceExternalApply.java                                          |  122 
 cnas-device/src/main/java/com/ruoyi/device/controller/DeviceExternalApplyController.java                          |   84 
 cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceDocumentsMapper.java                                      |   12 
 cnas-process/src/main/java/com/ruoyi/process/service/ProcessMethodVerifyMethodFileService.java                    |   15 
 cnas-process/src/main/java/com/ruoyi/process/controller/ProcessComplainController.java                            |   67 
 cnas-manage/src/main/java/com/ruoyi/manage/controller/ManageRecordAuditController.java                            |   75 
 cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonTraining.java                                         |   82 
 cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonTrainingRecordMapper.java                           |   67 
 cnas-require/src/main/java/com/ruoyi/require/dto/StoreDto.java                                                    |   22 
 cnas-device/src/main/java/com/ruoyi/device/dto/DeviceMaintenancePlanDto.java                                      |   30 
 cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonBasicInfo.java                                        |  155 
 cnas-require/src/main/java/com/ruoyi/require/service/impl/ForeignRegisterServiceImpl.java                         |  102 
 cnas-process/src/main/java/com/ruoyi/process/dto/ProcessMethodVerifyDto.java                                      |   30 
 cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceExamineRecordContrastMapper.java                          |   31 
 cnas-process/src/main/resources/mapper/ProcessSampleMapper.xml                                                    |   28 
 cnas-device/src/main/resources/static/word/device-inspection-record.docx                                          |    0 
 cnas-manage/src/main/resources/mapper/InternalPlanDetailMapper.xml                                                |    6 
 cnas-manage/src/main/java/com/ruoyi/manage/service/impl/InternalPlanDetailServiceImpl.java                        |   20 
 cnas-process/src/main/java/com/ruoyi/process/pojo/QualitySuperviseDetailsRecord.java                              |  117 
 cnas-manage/src/main/java/com/ruoyi/manage/controller/ManageDocumentControlledController.java                     |   82 
 cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonPostAuthorizationRecord.java                          |   73 
 cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceMaintenanceImpl.java                                |  197 
 cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageRiskAssessmentResultsServiceImpl.java               |  124 
 cnas-process/src/main/java/com/ruoyi/process/service/ProcessSampleService.java                                    |   24 
 cnas-manage/src/main/java/com/ruoyi/manage/controller/ManageReviewProgramController.java                          |   68 
 cnas-process/src/main/java/com/ruoyi/process/pojo/InconsistentDistribution.java                                   |   44 
 cnas-process/src/main/java/com/ruoyi/process/mapper/QualityMonitorDetailsMapper.java                              |   29 
 cnas-require/src/main/java/com/ruoyi/require/mapper/ProcurementSuppliesConsumablesMapper.java                     |    9 
 cnas-manage/src/main/java/com/ruoyi/manage/pojo/InternalMeeting.java                                              |   55 
 cnas-process/src/main/java/com/ruoyi/process/mapper/QualityMonitorDetailsEvaluateMapper.java                      |   23 
 cnas-process/src/main/java/com/ruoyi/process/dto/ProcessDealDto.java                                              |   19 
 cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceExamineRecordContrast.java                                  |   96 
 cnas-manage/src/main/java/com/ruoyi/manage/service/impl/InternalImplementDetailServiceImpl.java                   |   19 
 cnas-process/src/main/resources/mapper/ProcessOrderDeviceMapper.xml                                               |   52 
 cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageMeetingParticipantsServiceImpl.java                 |   42 
 cnas-require/src/main/java/com/ruoyi/require/mapper/FeTempHumDateMapper.java                                      |   30 
 cnas-device/src/main/java/com/ruoyi/device/excel/upload/DeviceCalibrationPlanDetailUpload.java                    |   36 
 cnas-device/src/main/resources/mapper/DeviceExaminePlanMapper.xml                                                 |   33 
 cnas-device/src/main/resources/static/word/use-record.docx                                                        |    0 
 cnas-manage/src/main/java/com/ruoyi/manage/mapper/InternalMeetingMapper.java                                      |   27 
 cnas-process/src/main/java/com/ruoyi/process/dto/InspectionOrderExportDto.java                                    |   51 
 cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageReviewProgramServiceImpl.java                       |  125 
 cnas-require/src/main/java/com/ruoyi/require/pojo/ProcurementSuppliesStore.java                                   |   51 
 cnas-manage/src/main/java/com/ruoyi/manage/schedule/ManageRecordTotalSchedule.java                                |   36 
 cnas-process/src/main/resources/static/report-deal.docx                                                           |    0 
 cnas-require/src/main/java/com/ruoyi/require/service/FeStandardSubstanceRecordService.java                        |   30 
 cnas-manage/src/main/java/com/ruoyi/manage/mapper/ManageRecordIssueRecycleMapper.java                             |   21 
 cnas-require/src/main/java/com/ruoyi/require/mapper/ProcurementSuppliesExpendsMapper.java                         |   16 
 cnas-require/src/main/java/com/ruoyi/require/mapper/ProcurementSuppliesListMapper.java                            |   30 
 cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceTraceabilityManagementMapper.java                         |   34 
 cnas-require/src/main/resources/mapper/InternalWastesMapper.xml                                                   |   20 
 cnas-manage/src/main/java/com/ruoyi/manage/pojo/InternalCheckDetail.java                                          |   63 
 cnas-manage/src/main/java/com/ruoyi/manage/pojo/ManageRecordVerify.java                                           |   63 
 cnas-require/src/main/java/com/ruoyi/require/mapper/FeTempHumRecordMapper.java                                    |   30 
 cnas-device/src/main/java/com/ruoyi/device/pojo/CollectBridge.java                                                |   34 
 cnas-manage/src/main/java/com/ruoyi/manage/service/impl/InternalReportServiceImpl.java                            |  165 
 cnas-process/src/main/java/com/ruoyi/process/service/ProcessMethodVerifyService.java                              |   87 
 cnas-process/src/main/java/com/ruoyi/process/dto/QualityMonitorDetailsEvaluateDto.java                            |   16 
 cnas-process/src/main/java/com/ruoyi/process/service/InconsistentDistributionService.java                         |   64 
 cnas-process/src/main/resources/mapper/ProcessMethodSearchNewMapper.xml                                           |   21 
 cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceExternalApplyMapper.java                                  |   34 
 cnas-process/src/main/java/com/ruoyi/process/controller/InconsistentDistributionController.java                   |   94 
 cnas-process/src/main/java/com/ruoyi/process/excel/QualityMonitorDetailsUpload.java                               |   33 
 cnas-device/src/main/java/com/ruoyi/device/service/DeviceExaminePlanDetailsService.java                           |   16 
 cnas-manage/src/main/java/com/ruoyi/manage/controller/ManageRecordVerifyController.java                           |   68 
 cnas-process/src/main/java/com/ruoyi/process/pojo/QualityMonitorDetailsEvaluate.java                              |   87 
 cnas-manage/src/main/resources/mapper/InternalPlanMapper.xml                                                      |   14 
 cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonTrainingDetailedDto.java                               |   36 
 cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonBasicInfoWorkServiceImpl.java                 |   20 
 cnas-require/src/main/java/com/ruoyi/require/controller/FeIlluminationController.java                             |   88 
 cnas-personnel/src/main/resources/mapper/PersonPostAuthorizationRecordMapper.xml                                  |   23 
 cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonTrainingMapper.java                                 |   21 
 cnas-manage/src/main/java/com/ruoyi/manage/excel/ManageDocumentListListener.java                                  |   63 
 cnas-require/src/main/java/com/ruoyi/require/mapper/ForeignRegisterMapper.java                                    |   39 
 cnas-device/src/main/java/com/ruoyi/device/controller/DeviceRecordController.java                                 |   63 
 cnas-process/src/main/java/com/ruoyi/process/service/impl/CnasProcessMethodVerifyWorkFileServiceImpl.java         |   19 
 cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonTrainingServiceImpl.java                      |  438 
 cnas-require/src/main/java/com/ruoyi/require/controller/FeTempHumDateController.java                              |  118 
 cnas-require/src/main/java/com/ruoyi/require/pojo/ProcurementSuppliesExpends.java                                 |   52 
 cnas-process/src/main/java/com/ruoyi/process/mapper/QualitySuperviseDetailsCorrectFileMapper.java                 |   17 
 cnas-manage/src/main/java/com/ruoyi/manage/service/ManageRiskAssessmentResultsService.java                        |   24 
 cnas-require/src/main/java/com/ruoyi/require/pojo/ProcurementSuppliesContents.java                                |   41 
 cnas-process/src/main/resources/static/supervision-detail-record.docx                                             |    0 
 cnas-require/src/main/java/com/ruoyi/require/pojo/SupplierManagement.java                                         |  109 
 cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceServiceImpl.java                                    |  690 
 cnas-require/src/main/resources/static/illumination.docx                                                          |    0 
 cnas-personnel/src/main/java/com/ruoyi/personnel/dto/UserPageDto.java                                             |   24 
 cnas-device/src/main/java/com/ruoyi/device/controller/DeviceImpowerController.java                                |  108 
 cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceCalibrationPlanDetailMapper.java                          |   27 
 cnas-manage/src/main/java/com/ruoyi/manage/service/impl/InternalCheckServiceImpl.java                             |  233 
 cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceDocuments.java                                              |   94 
 cnas-require/src/main/java/com/ruoyi/require/service/ProcurementSuppliesStoreService.java                         |   21 
 cnas-manage/src/main/java/com/ruoyi/manage/controller/ManageDocumentCancelController.java                         |   83 
 cnas-device/src/main/java/com/ruoyi/device/service/DataConfigService.java                                         |   55 
 cnas-process/src/main/java/com/ruoyi/process/controller/ProcessOrderDeviceController.java                         |   64 
 cnas-process/src/main/resources/mapper/QualitySuperviseMapper.xml                                                 |   26 
 cnas-require/src/main/java/com/ruoyi/require/service/impl/FeMeasuredQuantityServiceImpl.java                      |   20 
 cnas-manage/src/main/java/com/ruoyi/manage/service/impl/InternalImplementServiceImpl.java                         |  239 
 cnas-manage/src/main/java/com/ruoyi/manage/service/ClientSatisfactionService.java                                 |   59 
 cnas-manage/src/main/java/com/ruoyi/manage/service/InternalImplementDetailService.java                            |   15 
 cnas-manage/src/main/java/com/ruoyi/manage/service/InternalMeetingService.java                                    |   63 
 cnas-process/src/main/resources/static/sample-deal.docx                                                           |    0 
 cnas-device/src/main/java/com/ruoyi/device/service/DeviceMetricsCopyService.java                                  |   16 
 cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonTrainingDetailedFileMapper.java                     |   15 
 cnas-manage/src/main/java/com/ruoyi/manage/mapper/ManageRecordCheckMapper.java                                    |   21 
 cnas-process/src/main/java/com/ruoyi/process/service/impl/QualitySuperviseServiceImpl.java                        | 1267 +
 cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonTrainingController.java                         |  246 
 cnas-device/src/main/java/com/ruoyi/device/service/DeviceStateService.java                                        |   31 
 cnas-process/src/main/java/com/ruoyi/process/pojo/ProcessEvaluate.java                                            |   73 
 cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonJobResponsibilities.java                              |   77 
 cnas-manage/src/main/java/com/ruoyi/manage/mapper/ManageDocumentAlterMapper.java                                  |   24 
 cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceImpowerDetailsMapper.java                                 |   26 
 cnas-personnel/src/main/resources/static/supervision-processing-sheet.docx                                        |    0 
 cnas-device/src/main/java/com/ruoyi/device/dto/DeviceInstructionDto.java                                          |   13 
 cnas-device/src/main/java/com/ruoyi/device/service/DeviceInspectionRecordDetailsService.java                      |   16 
 cnas-manage/src/main/resources/static/verify-deal.docx                                                            |    0 
 cnas-manage/src/main/java/com/ruoyi/manage/controller/ManageControlPlanListController.java                        |  134 
 cnas-require/src/main/java/com/ruoyi/require/vo/SubstanceRecordVo.java                                            |   46 
 cnas-manage/src/main/java/com/ruoyi/manage/controller/ManageReviewReportController.java                           |   63 
 cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceExamineRecordMapper.java                                  |   31 
 cnas-process/src/main/java/com/ruoyi/process/mapper/InspectionOrderDetailMapper.java                              |   16 
 cnas-manage/src/main/java/com/ruoyi/manage/pojo/ManageDocumentList.java                                           |   80 
 cnas-manage/src/main/resources/mapper/ManageMeetingMapper.xml                                                     |   32 
 cnas-require/src/main/java/com/ruoyi/require/dto/SupplierManagementDto.java                                       |   67 
 cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceMaintenancePlanDetailsMapper.java                         |   25 
 cnas-require/src/main/resources/mapper/FeStandardSubstanceAcceptanceMapper.xml                                    |   46 
 cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceTraceabilityManagementDetailsServiceImpl.java       |   20 
 cnas-process/src/main/resources/static/method-verify.docx                                                         |    0 
 cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonTrainingRecordDto.java                                 |   27 
 cnas-manage/src/main/java/com/ruoyi/manage/controller/ManageDocumentAlterController.java                          |   89 
 cnas-device/src/main/java/com/ruoyi/device/service/DeviceExamineRecordDetailService.java                          |   16 
 cnas-process/src/main/java/com/ruoyi/process/pojo/ProcessMethodVerifyCalibrationsFile.java                        |   56 
 cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonTrainingDetailedMapper.java                         |   49 
 cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/AnnexMapper.java                                          |    9 
 cnas-device/src/main/java/com/ruoyi/device/service/DeviceAcceptanceService.java                                   |   39 
 cnas-personnel/src/main/resources/static/explain-deal.docx                                                        |    0 
 cnas-process/src/main/java/com/ruoyi/process/mapper/ProcessMethodVerifyMethodFileMapper.java                      |   17 
 cnas-personnel/src/main/java/com/ruoyi/personnel/excel/PersonTrainingDetailedUpload.java                          |   38 
 cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/Annex.java                                                  |   47 
 cnas-device/src/main/java/com/ruoyi/device/service/DeviceExamineRecordContrastService.java                        |   46 
 cnas-device/src/main/java/com/ruoyi/device/controller/DeviceAccidentReportController.java                         |   84 
 cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageRecordIntervalsServiceImpl.java                     |  528 
 cnas-device/src/main/resources/mapper/DeviceMaintenanceMapper.xml                                                 |   20 
 cnas-device/src/main/java/com/ruoyi/device/service/DeviceInspectionRecordService.java                             |   70 
 cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonTrainingDetailedServiceImpl.java              |   85 
 cnas-device/src/main/java/com/ruoyi/device/controller/DeviceBreakdownMaintenanceController.java                   |   85 
 cnas-manage/src/main/java/com/ruoyi/manage/pojo/ManageRecordAudit.java                                            |  133 
 cnas-manage/src/main/java/com/ruoyi/manage/pojo/ClientSatisfaction.java                                           |   95 
 cnas-personnel/src/main/resources/mapper/PersonTrainingMapper.xml                                                 |   46 
 cnas-device/src/main/java/com/ruoyi/device/controller/DeviceStateController.java                                  |   87 
 cnas-device/src/main/resources/mapper/DeviceAccidentReportMapper.xml                                              |   29 
 cnas-process/src/main/java/com/ruoyi/process/service/impl/InspectionOrderServiceImpl.java                         |  439 
 cnas-process/src/main/java/com/ruoyi/process/service/ProcessMethodVerifyCalibrationsFileService.java              |   15 
 cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceMetric.java                                                 |   29 
 cnas-manage/src/main/java/com/ruoyi/manage/mapper/InternalImplementMapper.java                                    |   28 
 cnas-device/src/main/java/com/ruoyi/device/pojo/Device.java                                                       |  138 
 cnas-manage/src/main/java/com/ruoyi/manage/pojo/InternalPlanDetail.java                                           |   82 
 cnas-process/src/main/resources/mapper/QualityMonitorDetailsEvaluateFileMapper.xml                                |    5 
 cnas-require/src/main/java/com/ruoyi/require/controller/ProcurementSuppliesContentsController.java                |   75 
 cnas-device/src/main/java/com/ruoyi/device/dto/DeviceDto.java                                                     |   43 
 cnas-manage/src/main/java/com/ruoyi/manage/mapper/ManageRecordAuditMapper.java                                    |   21 
 cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceMaintenancePlan.java                                        |   74 
 cnas-device/src/main/resources/static/word/device-breakdown-maintenance.docx                                      |    0 
 cnas-require/src/main/java/com/ruoyi/require/service/InternalWastesService.java                                   |   63 
 cnas-process/src/main/java/com/ruoyi/process/pojo/QualitySuperviseDetailsCorrect.java                             |  130 
 cnas-require/src/main/java/com/ruoyi/require/excel/FeLightningProtectionExcel.java                                |   22 
 cnas-process/src/main/java/com/ruoyi/process/service/impl/QualityMonitorDetailsServiceImpl.java                   |   19 
 cnas-process/src/main/java/com/ruoyi/process/service/QualitySuperviseService.java                                 |  201 
 cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessDealServiceImpl.java                             |   36 
 cnas-manage/src/main/java/com/ruoyi/manage/dto/InternalImplementDto.java                                          |   19 
 cnas-process/src/main/java/com/ruoyi/process/mapper/InconsistentDistributionDetailMapper.java                     |   18 
 cnas-process/src/main/resources/mapper/ProcessReportMapper.xml                                                    |   37 
 cnas-require/src/main/java/com/ruoyi/require/pojo/FeStandardSubstanceRecord.java                                  |   77 
 cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonRewardPunishmentRecordServiceImpl.java        |   36 
 cnas-device/src/main/java/com/ruoyi/device/service/DeviceExaminePlanService.java                                  |   89 
 cnas-device/src/main/java/com/ruoyi/device/service/DeviceMaintenancePlanService.java                              |   79 
 cnas-device/src/main/resources/static/word/review-examine-record-contrast.docx                                    |    0 
 cnas-require/src/main/java/com/ruoyi/require/service/impl/FeStandardSubstanceRecordServiceImpl.java               |   78 
 cnas-require/src/main/java/com/ruoyi/require/service/impl/SupplierManagementServiceImpl.java                      |   91 
 cnas-manage/src/main/resources/static/internal-meeting.docx                                                       |    0 
 cnas-process/src/main/resources/mapper/ProcessComplainMapper.xml                                                  |   62 
 cnas-process/src/main/resources/mapper/ProcessMethodSearchNewArchivedMapper.xml                                   |   19 
 cnas-require/src/main/java/com/ruoyi/require/service/FeStandardSubstanceAcceptanceService.java                    |   33 
 cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageRecordVerifyServiceImpl.java                        |  157 
 cnas-manage/src/main/java/com/ruoyi/manage/pojo/ManageRecordCancel.java                                           |   80 
 cnas-manage/src/main/java/com/ruoyi/manage/service/impl/InternalMeetingDetailServiceImpl.java                     |   20 
 cnas-require/src/main/resources/mapper/ProcurementSuppliesStoreMapper.xml                                         |   84 
 cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageRecordCancelServiceImpl.java                        |  486 
 cnas-manage/src/main/java/com/ruoyi/manage/dto/ManageDocumentIssueRecycleDto.java                                 |   26 
 cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonTrainingRecordService.java                         |   59 
 cnas-require/src/main/java/com/ruoyi/require/dto/FePowerStableExportDto.java                                      |   30 
 cnas-require/src/main/java/com/ruoyi/require/service/FeStandardSubstanceService.java                              |   26 
 cnas-device/src/main/java/com/ruoyi/device/controller/DeviceAcceptanceController.java                             |  133 
 cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonTrainingRecordController.java                   |   59 
 cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageDocumentControlledServiceImpl.java                  |  219 
 cnas-device/src/main/java/com/ruoyi/device/service/DeviceAccidentReportService.java                               |   41 
 cnas-process/src/main/java/com/ruoyi/process/mapper/QualitySuperviseDetailsAccordingMapper.java                   |   36 
 cnas-device/src/main/resources/mapper/DeviceMaintenancePlanDetailsMapper.xml                                      |   20 
 cnas-device/src/main/java/com/ruoyi/device/mapper/CollectBridgeMapper.java                                        |   15 
 cnas-process/src/main/resources/mapper/QualitySuperviseManagementReviewMapper.xml                                 |   14 
 cnas-device/src/main/resources/mapper/DeviceTraceabilityManagementDetailsMapper.xml                               |   17 
 cnas-manage/src/main/java/com/ruoyi/manage/mapper/InternalCorrectFileMapper.java                                  |   18 
 cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonBasicInfoServiceImpl.java                     |  383 
 cnas-require/src/main/java/com/ruoyi/require/mapper/SuppliersDirectoryContentsMapper.java                         |   16 
 cnas-device/src/main/java/com/ruoyi/device/dto/DeviceCalibrationPlanDto.java                                      |   31 
 cnas-require/src/main/java/com/ruoyi/require/controller/FeStandardSubstanceController.java                        |   93 
 cnas-device/src/main/java/com/ruoyi/device/controller/DeviceBorrowController.java                                 |   73 
 cnas-process/src/main/resources/mapper/QualityMonitorDetailsRatifyMapper.xml                                      |    5 
 cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ClientSatisfactionServiceImpl.java                        |  188 
 cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessReportServiceImpl.java                           |  109 
 cnas-process/src/main/resources/mapper/ProcessTotaldealMapper.xml                                                 |   29 
 cnas-require/src/main/java/com/ruoyi/require/service/impl/FeStandardSubstanceAcceptanceInspectionServiceImpl.java |   20 
 cnas-manage/src/main/resources/mapper/ManageMeetingParticipantsMapper.xml                                         |   17 
 cnas-process/src/main/java/com/ruoyi/process/controller/ProcessReportController.java                              |   71 
 cnas-require/src/main/java/com/ruoyi/require/service/impl/FeIlluminationDetectionAreaServiceImpl.java             |   20 
 cnas-device/src/main/java/com/ruoyi/device/controller/DeviceInspectionRecordController.java                       |   99 
 cnas-device/src/main/java/com/ruoyi/device/service/impl/DataConfigServiceImpl.java                                |  104 
 cnas-device/src/main/java/com/ruoyi/device/excel/upload/DeviceImport.java                                         |   73 
 cnas-process/src/main/java/com/ruoyi/process/mapper/ProcessEvaluateMapper.java                                    |   21 
 cnas-device/src/main/java/com/ruoyi/device/service/DeviceBreakdownMaintenanceService.java                         |   41 
 cnas-process/src/main/java/com/ruoyi/process/service/ProcessDealService.java                                      |   19 
 cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceExamineRecordContrastDetailsServiceImpl.java        |   20 
 cnas-require/src/main/java/com/ruoyi/require/mapper/FeStandardSubstanceRecordMapper.java                          |   22 
 cnas-manage/src/main/java/com/ruoyi/manage/pojo/InternalMeetingDetail.java                                        |   52 
 cnas-require/src/main/java/com/ruoyi/require/dto/FeTempHumRecordDto.java                                          |   64 
 cnas-require/src/main/resources/mapper/FePowerStableMapper.xml                                                    |   63 
 cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonJobResponsibilitiesService.java                    |   27 
 cnas-process/src/main/java/com/ruoyi/process/mapper/ProcessDealMapper.java                                        |   27 
 cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonJobResponsibilitiesDto.java                            |   16 
 cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceMetricRecordMapper.java                                   |   16 
 cnas-manage/src/main/resources/mapper/ManageRecordCancelMapper.xml                                                |   34 
 cnas-device/src/main/java/com/ruoyi/device/mapper/DataConfigMapper.java                                           |   32 
 cnas-device/src/main/java/com/ruoyi/device/service/DeviceRecordService.java                                       |   31 
 cnas-require/src/main/java/com/ruoyi/require/service/FeIlluminationDetectionAreaService.java                      |   16 
 cnas-manage/src/main/java/com/ruoyi/manage/controller/ManageRecordIssueRecycleController.java                     |   74 
 cnas-process/src/main/java/com/ruoyi/process/mapper/ProcessMethodVerifyCalibrationsFileMapper.java                |   34 
 cnas-require/src/main/java/com/ruoyi/require/excel/FeStandardSubstanceExcel.java                                  |   54 
 cnas-process/src/main/java/com/ruoyi/process/pojo/ProcessMethodSearchNewArchived.java                             |   62 
 cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceAcceptanceFileMapper.java                                 |   16 
 cnas-require/src/main/resources/mapper/FeTempHumDateMapper.xml                                                    |   25 
 cnas-process/src/main/java/com/ruoyi/process/pojo/QualityMonitorDetails.java                                      |   92 
 cnas-manage/src/main/resources/mapper/ClientSatisfactionAnalyseFileMapper.xml                                     |   18 
 cnas-manage/src/main/java/com/ruoyi/manage/service/ManageControlPlanListService.java                              |   24 
 cnas-manage/src/main/java/com/ruoyi/manage/service/ManageDocumentListService.java                                 |   29 
 cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonJobResponsibilitiesController.java              |   60 
 cnas-process/src/main/java/com/ruoyi/process/dto/ProcessMethodSearchNewBackupsDto.java                            |   62 
 cnas-process/src/main/java/com/ruoyi/process/service/QualityMonitorDetailsService.java                            |   15 
 cnas-process/src/main/java/com/ruoyi/process/controller/ProcessMethodVerifyController.java                        |  156 
 cnas-process/src/main/java/com/ruoyi/process/service/QualityMonitorDetailsRatifyService.java                      |   15 
 cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonCommunicationAbility.java                             |   60 
 cnas-device/src/main/resources/static/word/device-external-apply.docx                                             |    0 
 cnas-manage/src/main/resources/static/internal-check.docx                                                         |    0 
 cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonJobResponsibilitiesServiceImpl.java           |  114 
 cnas-device/src/main/java/com/ruoyi/device/dto/DeviceBreakdownMaintenance.java                                    |   89 
 cnas-manage/src/main/resources/mapper/ManageReviewProgramFileMapper.xml                                           |   17 
 cnas-device/src/main/resources/static/word/quipment-details.docx                                                  |    0 
 cnas-process/src/main/java/com/ruoyi/process/dto/QualityMonitorDto.java                                           |   22 
 cnas-manage/src/main/java/com/ruoyi/manage/service/InternalCorrectFileService.java                                |   16 
 cnas-device/src/main/java/com/ruoyi/device/service/IDeviceMetricService.java                                      |    7 
 cnas-manage/src/main/java/com/ruoyi/manage/service/ManageRecordIntervalsService.java                              |   31 
 cnas-process/src/main/java/com/ruoyi/process/dto/InconsistentDistributionProportionDto.java                       |   45 
 cnas-device/src/main/resources/static/word/device-accident-report.docx                                            |    0 
 cnas-manage/src/main/resources/static/check-deal.docx                                                             |    0 
 cnas-manage/src/main/resources/mapper/ManageControlPlanListMapper.xml                                             |   33 
 cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonBasicInfoController.java                        |  243 
 cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceImpowerDetails.java                                         |   60 
 cnas-process/src/main/java/com/ruoyi/process/service/impl/InconsistentDistributionDetailServiceImpl.java          |   20 
 cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceMetricMapper.java                                         |    9 
 cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceAcceptance.java                                             |   76 
 cnas-process/src/main/java/com/ruoyi/process/pojo/QualityMonitorDetailsRatify.java                                |   86 
 cnas-manage/src/main/resources/static/customer-satisfaction-questionnaire.docx                                    |    0 
 cnas-device/src/main/resources/mapper/DeviceCalibrationPlanDetailMapper.xml                                       |   17 
 cnas-require/src/main/java/com/ruoyi/require/pojo/CollectLaboratory.java                                          |   41 
 cnas-manage/src/main/resources/mapper/ManageRecordIntervalsTotalMapper.xml                                        |   33 
 cnas-process/src/main/java/com/ruoyi/process/mapper/ProcessComplainMapper.java                                    |   25 
 cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonPostAuthorizationRecordServiceImpl.java       |  133 
 cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageMeetingServiceImpl.java                             |  161 
 cnas-device/src/main/resources/static/word/device-status.docx                                                     |    0 
 cnas-require/src/main/java/com/ruoyi/require/service/impl/ProcurementSuppliesStoreServiceImpl.java                |  124 
 cnas-device/src/main/java/com/ruoyi/device/service/impl/CollectBridgeServiceImpl.java                             |  107 
 cnas-manage/src/main/java/com/ruoyi/manage/mapper/ManageDocumentListMapper.java                                   |   22 
 cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonRewardPunishmentRecordDto.java                         |   14 
 cnas-require/src/main/java/com/ruoyi/require/pojo/FeIlluminationDetectionArea.java                                |   58 
 cnas-require/src/main/resources/mapper/FeLightningProtectionMapper.xml                                            |   20 
 cnas-require/src/main/java/com/ruoyi/require/service/FeTempHumRecordService.java                                  |   20 
 cnas-manage/src/main/java/com/ruoyi/manage/mapper/InternalPlanMapper.java                                         |   30 
 cnas-personnel/src/main/java/com/ruoyi/personnel/excel/PersonRewardPunishmentRecordExcel.java                     |   34 
 cnas-manage/src/main/java/com/ruoyi/manage/mapper/ManageRecordIntervalsTotalMapper.java                           |   21 
 cnas-manage/src/main/java/com/ruoyi/manage/controller/ManageMeetingParticipantsController.java                    |   53 
 cnas-process/src/main/java/com/ruoyi/process/excel/QualitySuperviseDetailsUpload.java                             |   30 
 cnas-device/src/main/java/com/ruoyi/device/service/DeviceDocumentsService.java                                    |   10 
 cnas-process/src/main/java/com/ruoyi/process/pojo/ProcessMethodVerifyWorkFile.java                                |   59 
 cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonRewardPunishmentRecordMapper.java                   |   27 
 cnas-require/src/main/resources/mapper/FeIlluminationMapper.xml                                                   |   46 
 cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceMaintenancePlanDetails.java                                 |   61 
 cnas-manage/src/main/java/com/ruoyi/manage/vo/ManageControlPlanListVo.java                                        |   20 
 cnas-manage/src/main/java/com/ruoyi/manage/service/InternalImplementService.java                                  |   69 
 cnas-require/src/main/resources/mapper/FeTempHumRecordMapper.xml                                                  |   36 
 cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceMapper.java                                               |   46 
 cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonTrainingDetailedFile.java                             |   49 
 cnas-manage/src/main/resources/mapper/InternalMeetingDetailMapper.xml                                             |    6 
 cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonTrainingRecordListDto.java                             |   37 
 cnas-device/src/main/java/com/ruoyi/device/controller/DeviceExaminePlanController.java                            |  274 
 cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceExternalApplyServiceImpl.java                       |  162 
 cnas-require/src/main/java/com/ruoyi/require/mapper/ProcurementSuppliesContentsMapper.java                        |    9 
 cnas-manage/src/main/java/com/ruoyi/manage/service/ManageReviewProgramService.java                                |   25 
 cnas-manage/src/main/resources/static/internal-implement.docx                                                     |    0 
 cnas-manage/src/main/java/com/ruoyi/manage/service/ManageMeetingService.java                                      |   28 
 cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonTrainingDetailed.java                                 |  101 
 cnas-require/src/main/java/com/ruoyi/require/dto/ProcurementSuppliesExpendDto.java                                |   11 
 cnas-device/src/main/java/com/ruoyi/device/controller/DeviceCalibrationPlanController.java                        |  173 
 cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceInspectionRecord.java                                       |   92 
 cnas-manage/src/main/resources/static/internal-report.docx                                                        |    0 
 cnas-manage/src/main/resources/mapper/ManageRecordIntervalsMapper.xml                                             |   27 
 cnas-require/src/main/java/com/ruoyi/require/service/impl/ProcurementSuppliesExpendsServiceImpl.java              |   90 
 cnas-require/src/main/java/com/ruoyi/require/service/impl/SuppliersDirectoryContentsServiceImpl.java              |   76 
 cnas-process/src/main/java/com/ruoyi/process/dto/ProcessComplainDto.java                                          |   23 
 cnas-manage/src/main/java/com/ruoyi/manage/mapper/ManageControlPlanListMapper.java                                |   21 
 cnas-manage/src/main/java/com/ruoyi/manage/pojo/ManageRiskAssessmentResults.java                                  |  102 
 cnas-require/src/main/java/com/ruoyi/require/service/impl/ProcurementSuppliesContentsServiceImpl.java             |   91 
 cnas-device/src/main/java/com/ruoyi/device/controller/DeviceDocumentsController.java                              |   92 
 cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessTotaldealServiceImpl.java                        |  274 
 cnas-process/src/main/java/com/ruoyi/process/service/impl/CnasProcessMethodVerifyCalibrationsFileServiceImpl.java |   19 
 cnas-personnel/src/main/resources/mapper/PersonCommunicationAbilityMapper.xml                                     |   19 
 cnas-manage/src/main/java/com/ruoyi/manage/mapper/ManageDocumentCancelMapper.java                                 |   23 
 cnas-require/src/main/java/com/ruoyi/require/mapper/SupplierManagementMapper.java                                 |   31 
 cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonPersonnelCapacity.java                                |  113 
 cnas-require/src/main/java/com/ruoyi/require/vo/AcceptanceDetailsVo.java                                          |   22 
 cnas-manage/src/main/java/com/ruoyi/manage/mapper/InternalImplementDetailMapper.java                              |   17 
 cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonPostAuthorizationRecordMapper.java                  |   21 
 cnas-require/src/main/java/com/ruoyi/require/pojo/FeCalibrationSchedule.java                                      |   84 
 cnas-require/src/main/java/com/ruoyi/require/service/ProcurementSuppliesConsumablesService.java                   |    7 
 cnas-manage/src/main/java/com/ruoyi/manage/service/ManageRecordAuditService.java                                  |   30 
 cnas-manage/src/main/java/com/ruoyi/manage/pojo/ManageReviewProgram.java                                          |   80 
 cnas-device/src/main/java/com/ruoyi/device/service/DeviceCalibrationPlanService.java                              |   89 
 cnas-process/src/main/java/com/ruoyi/process/mapper/QualitySuperviseDetailsMapper.java                            |   29 
 cnas-process/src/main/java/com/ruoyi/process/pojo/ProcessMethodSearchNew.java                                     |   69 
 cnas-require/src/main/resources/static/foreign-register.docx                                                      |    0 
 cnas-process/src/main/java/com/ruoyi/process/pojo/InconsistentDistributionDetail.java                             |   73 
 cnas-process/src/main/java/com/ruoyi/process/service/impl/QualityMonitorDetailsEvaluateServiceImpl.java           |   19 
 cnas-manage/src/main/java/com/ruoyi/manage/service/ManageRecordCancelService.java                                 |   29 
 cnas-manage/src/main/resources/mapper/ManageRecordIssueRecycleMapper.xml                                          |   33 
 cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonPersonnelCapacityExportDto.java                        |  101 
 cnas-device/src/main/java/com/ruoyi/device/pojo/OperationInstruction.java                                         |   87 
 cnas-device/src/main/java/com/ruoyi/device/service/DeviceMetricRecordService.java                                 |   16 
 cnas-personnel/src/main/resources/mapper/PersonTrainingRecordMapper.xml                                           |  127 
 cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceAcceptanceFile.java                                         |   57 
 cnas-device/src/main/java/com/ruoyi/device/dto/DeviceExamineRecordContrastDetailsDto.java                         |   16 
 cnas-device/src/main/java/com/ruoyi/device/dto/DeviceMetricRecordAndMaintenanceDto.java                           |   38 
 cnas-process/src/main/resources/static/supervise-detail-correct.docx                                              |    0 
 cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceCalibrationPlanDetailServiceImpl.java               |   20 
 cnas-process/src/main/java/com/ruoyi/process/mapper/ProcessMethodVerifyMachineAttachmentMapper.java               |   17 
 cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonPersonnelCapacityDto.java                              |   30 
 cnas-require/src/main/resources/mapper/ProcurementSuppliesListMapper.xml                                          |   71 
 cnas-process/src/main/java/com/ruoyi/process/controller/InspectionOrderController.java                            |  126 
 cnas-require/src/main/resources/static/temp_hum_date.docx                                                         |    0 
 cnas-process/src/main/java/com/ruoyi/process/mapper/ProcessReportMapper.java                                      |   26 
 cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceMaintenancePlanDetailsServiceImpl.java              |   20 
 cnas-device/src/main/resources/static/word/acceptance-certificate.docx                                            |    0 
 cnas-device/src/main/java/com/ruoyi/device/controller/DeviceMaintenancePlanController.java                        |  108 
 cnas-process/src/main/java/com/ruoyi/process/pojo/ProcessTotaldeal.java                                           |   62 
 cnas-process/src/main/java/com/ruoyi/process/mapper/ProcessMethodVerifyMapper.java                                |   29 
 cnas-personnel/src/main/java/com/ruoyi/personnel/dto/TrainingRecordExportDto.java                                 |   36 
 cnas-process/src/main/java/com/ruoyi/process/mapper/ProcessOrderDeviceMapper.java                                 |   27 
 cnas-require/src/main/resources/mapper/ForeignRegisterMapper.xml                                                  |   39 
 cnas-require/src/main/resources/mapper/FeStandardSubstanceMapper.xml                                              |   56 
 cnas-manage/src/main/resources/mapper/ManageReviewReportMapper.xml                                                |   48 
 cnas-device/src/main/java/com/ruoyi/device/service/DeviceBorrowService.java                                       |   28 
 cnas-manage/src/main/resources/mapper/ManageDocumentAlterMapper.xml                                               |   48 
 cnas-require/src/main/java/com/ruoyi/require/pojo/InternalWastes.java                                             |   43 
 cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonBasicInfoService.java                              |   60 
 cnas-personnel/src/main/java/com/ruoyi/personnel/excel/PersonTrainingDetailedListener.java                        |   42 
 cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceTraceabilityManagementServiceImpl.java              |  292 
 cnas-process/src/main/java/com/ruoyi/process/service/QualityMonitorDetailsEvaluateService.java                    |   15 
 cnas-require/src/main/java/com/ruoyi/require/controller/ProcurementSuppliesExpendsController.java                 |   49 
 cnas-device/src/main/java/com/ruoyi/device/service/DeviceExamineRecordService.java                                |   43 
 cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceMaintenancePlanServiceImpl.java                     |  292 
 cnas-device/src/main/resources/static/word/device-maintenance.docx                                                |    0 
 cnas-manage/src/main/java/com/ruoyi/manage/controller/ManageDocumentIssueRecycleController.java                   |   84 
 cnas-manage/src/main/java/com/ruoyi/manage/controller/InternalCheckController.java                                |  116 
 cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonTrainingRecord.java                                   |   40 
 cnas-require/src/main/java/com/ruoyi/require/pojo/SuppliersDirectoryContents.java                                 |   51 
 cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessEvaluateServiceImpl.java                         |   99 
 cnas-require/src/main/java/com/ruoyi/require/service/impl/FeTempHumRecordServiceImpl.java                         |   75 
 cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceStateServiceImpl.java                               |  160 
 cnas-process/src/main/java/com/ruoyi/process/controller/QualitySuperviseController.java                           |  354 
 cnas-require/src/main/java/com/ruoyi/require/pojo/FePowerStable.java                                              |   63 
 cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceScrappedServiceImpl.java                            |  180 
 cnas-manage/src/main/java/com/ruoyi/manage/dto/ManageMeetingDto.java                                              |   16 
 cnas-manage/src/main/java/com/ruoyi/manage/pojo/ManageRecordCheck.java                                            |   77 
 cnas-manage/src/main/java/com/ruoyi/manage/controller/ManageRecordCheckController.java                            |   90 
 ruoyi-system/src/main/resources/mapper/system/SysRoleMenuMapper.xml                                               |   13 
 cnas-device/src/main/java/com/ruoyi/device/service/DeviceAcceptanceFileService.java                               |   17 
 cnas-device/src/main/resources/mapper/OperationInstructionMapper.xml                                              |   13 
 cnas-process/src/main/java/com/ruoyi/process/pojo/QualitySuperviseManagementReview.java                           |   62 
 cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonJobResponsibilitiesMapper.java                      |   21 
 cnas-manage/src/main/java/com/ruoyi/manage/mapper/InternalCheckMapper.java                                        |   28 
 cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonRewardPunishmentRecord.java                           |   60 
 cnas-manage/src/main/java/com/ruoyi/manage/service/impl/InternalMeetingServiceImpl.java                           |  203 
 cnas-process/src/main/java/com/ruoyi/process/service/ProcessMethodVerifyWorkFileService.java                      |   15 
 cnas-require/src/main/java/com/ruoyi/require/controller/ProcurementSuppliesListController.java                    |   93 
 cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceScrapped.java                                               |  104 
 cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceAccidentReportMapper.java                                 |   35 
 cnas-device/src/main/java/com/ruoyi/device/dto/DeviceMaintenanceDto.java                                          |   20 
 cnas-require/src/main/java/com/ruoyi/require/mapper/FeMeasuredQuantityMapper.java                                 |   16 
 cnas-manage/src/main/java/com/ruoyi/manage/dto/InternalCorrectDto.java                                            |   26 
 cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceBorrowMapper.java                                         |   25 
 cnas-manage/src/main/java/com/ruoyi/manage/pojo/ManageDocumentCancel.java                                         |  103 
 cnas-device/src/main/java/com/ruoyi/device/service/DeviceService.java                                             |   62 
 cnas-device/src/main/resources/mapper/InstructionMapper.xml                                                       |   22 
 cnas-manage/src/main/java/com/ruoyi/manage/pojo/InternalPlan.java                                                 |   94 
 cnas-manage/src/main/java/com/ruoyi/manage/service/ManageRecordIntervalsTotalService.java                         |   25 
 cnas-process/src/main/resources/static/quality-monitor-details-ratify.docx                                        |    0 
 cnas-device/src/main/java/com/ruoyi/device/service/DeviceExternalApplyService.java                                |   42 
 cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceExaminePlanDetailsServiceImpl.java                  |   20 
 cnas-require/src/main/java/com/ruoyi/require/task/FeTempHumDateSchedule.java                                      |  387 
 cnas-device/src/main/resources/mapper/DeviceImpowerMapper.xml                                                     |   14 
 cnas-process/src/main/java/com/ruoyi/process/pojo/ProcessMethodVerifyMachineAttachment.java                       |   60 
 cnas-process/src/main/resources/mapper/QualitySuperviseDetailsMapper.xml                                          |   54 
 cnas-device/src/main/java/com/ruoyi/device/dto/DocumentExportWordDto.java                                         |   45 
 cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonBasicInfoFile.java                                    |   57 
 cnas-process/src/main/resources/static/inconsistent-distribution.docx                                             |    0 
 cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonTrainingService.java                               |   64 
 cnas-manage/src/main/java/com/ruoyi/manage/pojo/ManageDocumentControlled.java                                     |   92 
 cnas-manage/src/main/java/com/ruoyi/manage/service/impl/InternalCorrectServiceImpl.java                           |  320 
 cnas-personnel/src/main/resources/static/training-record.docx                                                     |    0 
 cnas-process/src/main/java/com/ruoyi/process/pojo/ProcessMethodVerify.java                                        |  133 
 cnas-device/src/main/java/com/ruoyi/device/excel/DeviceStateExport.java                                           |   36 
 cnas-require/src/main/java/com/ruoyi/require/dto/FeTempHumDateDto.java                                            |   21 
 cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonBasicInfoWorkDto.java                                  |   16 
 cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceRecordServiceImpl.java                              |  148 
 cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceBreakdownMaintenanceServiceImpl.java                |  153 
 cnas-manage/src/main/resources/mapper/InternalCorrectMapper.xml                                                   |   15 
 cnas-process/src/main/java/com/ruoyi/process/pojo/QualityMonitor.java                                             |   82 
 cnas-process/src/main/resources/mapper/QualitySuperviseDetailsAccordingMapper.xml                                 |   57 
 cnas-personnel/src/main/resources/static/super-vise-plan.docx                                                     |    0 
 cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonCommunicationAbilityController.java             |   61 
 cnas-require/src/main/java/com/ruoyi/require/mapper/ProcurementSuppliesStoreMapper.java                           |   27 
 cnas-manage/src/main/java/com/ruoyi/manage/service/ManageMeetingParticipantsService.java                          |   20 
 cnas-process/src/main/java/com/ruoyi/process/pojo/ProcessMethodSearchNewBackups.java                              |   83 
 cnas-manage/src/main/java/com/ruoyi/manage/pojo/ManageControlPlanList.java                                        |   80 
 cnas-device/src/main/resources/mapper/DeviceBorrowMapper.xml                                                      |   21 
 cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonCommunicationAbilityMapper.java                     |   21 
 cnas-device/src/main/java/com/ruoyi/device/service/DeviceOperationInstructionService.java                         |   20 
 cnas-process/src/main/resources/static/quality-monitor.docx                                                       |    0 
 cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceExaminePlan.java                                            |   66 
 cnas-device/src/main/resources/static/word/examine-plan-detail.docx                                               |    0 
 cnas-manage/src/main/java/com/ruoyi/manage/mapper/ManageRecordCancelMapper.java                                   |   21 
 cnas-device/src/main/java/com/ruoyi/device/dto/DataConfigDto.java                                                 |   39 
 cnas-manage/src/main/java/com/ruoyi/manage/pojo/ManageRecordIntervals.java                                        |   62 
 cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessMethodSearchNewServiceImpl.java                  |  370 
 cnas-require/src/main/java/com/ruoyi/require/dto/AcceptanceDto.java                                               |   15 
 cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceMetricsCopyMapper.java                                    |   16 
 cnas-require/src/main/java/com/ruoyi/require/dto/ProcurementSuppliesListDto.java                                  |   15 
 cnas-require/src/main/java/com/ruoyi/require/mapper/FeStandardSubstanceAcceptanceInspectionMapper.java            |   16 
 cnas-personnel/src/main/resources/static/person-basic-info.docx                                                   |    0 
 cnas-process/src/main/java/com/ruoyi/process/service/InspectionOrderDetailService.java                            |   16 
 cnas-manage/src/main/java/com/ruoyi/manage/mapper/ManageMeetingMapper.java                                        |   22 
 cnas-manage/src/main/java/com/ruoyi/manage/service/InternalPlanDetailService.java                                 |   16 
 cnas-require/src/main/java/com/ruoyi/require/excel/FeCalibrationScheduleExport.java                               |   36 
 cnas-manage/src/main/java/com/ruoyi/manage/service/ManageReviewReportService.java                                 |   24 
 cnas-process/src/main/resources/mapper/InspectionOrderDetailMapper.xml                                            |   19 
 cnas-process/src/main/java/com/ruoyi/process/task/QualitySuperviseSchedule.java                                   |  142 
 cnas-manage/src/main/java/com/ruoyi/manage/mapper/InternalReportMapper.java                                       |   28 
 cnas-require/src/main/java/com/ruoyi/require/mapper/CollectTemperatureHumidityMapper.java                         |   15 
 cnas-device/src/main/java/com/ruoyi/device/dto/DeviceImpowerDto.java                                              |   24 
 cnas-manage/src/main/java/com/ruoyi/manage/dto/ManageMeetingParticipantsDto.java                                  |   21 
 cnas-process/src/main/resources/mapper/QualitySuperviseDetailsCorrectFileMapper.xml                               |    6 
 cnas-device/src/main/java/com/ruoyi/device/service/DeviceMaintenanceService.java                                  |   30 
 cnas-manage/src/main/java/com/ruoyi/manage/service/InternalPlanService.java                                       |   77 
 cnas-process/src/main/java/com/ruoyi/process/mapper/QualitySuperviseDetailsCorrectMapper.java                     |   28 
 cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceMetricsCopy.java                                            |   65 
 cnas-manage/src/main/java/com/ruoyi/manage/mapper/InternalMeetingDetailMapper.java                                |   16 
 cnas-require/src/main/java/com/ruoyi/require/mapper/FeStandardSubstanceMapper.java                                |   20 
 cnas-process/src/main/java/com/ruoyi/process/service/impl/QualityMonitorDetailsRatifyServiceImpl.java             |   19 
 cnas-manage/src/main/java/com/ruoyi/manage/controller/InternalImplementController.java                            |  117 
 cnas-require/src/main/java/com/ruoyi/require/mapper/FeIlluminationDetectionAreaMapper.java                        |   16 
 cnas-require/src/main/java/com/ruoyi/require/service/impl/ProcurementSuppliesListServiceImpl.java                 |  130 
 cnas-manage/src/main/java/com/ruoyi/manage/vo/ManageRiskAssessmentResultsVo.java                                  |   21 
 cnas-process/src/main/java/com/ruoyi/process/mapper/ProcessMethodSearchNewArchivedMapper.java                     |   28 
 cnas-process/src/main/java/com/ruoyi/process/service/QualityMonitorService.java                                   |  161 
 cnas-require/src/main/java/com/ruoyi/require/service/impl/InternalWastesDetailServiceImpl.java                    |   20 
 cnas-require/src/main/java/com/ruoyi/require/controller/FeStandardSubstanceRecordController.java                  |   60 
 cnas-personnel/src/main/resources/mapper/PersonJobResponsibilitiesMapper.xml                                      |   24 
 cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceAcceptanceMapper.java                                     |   27 
 cnas-manage/src/main/java/com/ruoyi/manage/dto/ClientSatisfactionDto.java                                         |   50 
 cnas-manage/src/main/java/com/ruoyi/manage/mapper/InternalCorrectMapper.java                                      |   23 
 cnas-require/src/main/java/com/ruoyi/require/mapper/FeLightningProtectionMapper.java                              |   21 
 cnas-process/src/main/resources/static/excel/check-records.xlsx                                                   |    0 
 cnas-require/src/main/resources/mapper/SupplierManagementMapper.xml                                               |   81 
 cnas-process/src/main/java/com/ruoyi/process/dto/ProcessMethodSearchNewArchivedDto.java                           |   19 
 cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceTraceabilityManagement.java                                 |   76 
 cnas-process/src/main/resources/mapper/QualityMonitorDetailsEvaluateMapper.xml                                    |   15 
 cnas-manage/src/main/resources/mapper/ManageDocumentCancelMapper.xml                                              |   44 
 cnas-device/src/main/resources/static/word/examine-record.docx                                                    |    0 
 cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceMetricsCopyServiceImpl.java                         |   20 
 cnas-process/src/main/java/com/ruoyi/process/controller/ProcessSampleController.java                              |   57 
 cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceExamineRecord.java                                          |  138 
 cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceImpowerDetailsServiceImpl.java                      |   20 
 cnas-require/src/main/java/com/ruoyi/require/service/FeLightningProtectionService.java                            |   21 
 cnas-process/src/main/java/com/ruoyi/process/mapper/ProcessTotaldealMapper.java                                   |   21 
 cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceBorrowServiceImpl.java                              |  116 
 cnas-manage/src/main/resources/mapper/ManageRecordTotalMapper.xml                                                 |   32 
 cnas-personnel/src/main/resources/mapper/PersonPersonnelCapacityMapper.xml                                        |  118 
 cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageRecordIntervalsTotalServiceImpl.java                |  507 
 cnas-require/src/main/java/com/ruoyi/require/service/impl/FeIlluminationServiceImpl.java                          |  124 
 cnas-require/src/main/java/com/ruoyi/require/excel/FeStandardSubstanceImport.java                                 |   46 
 cnas-process/src/main/java/com/ruoyi/process/pojo/ProcessDeal.java                                                |   75 
 cnas-manage/src/main/java/com/ruoyi/manage/controller/ManageRecordIntervalsController.java                        |   74 
 cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceMaintenance.java                                            |   65 
 cnas-manage/src/main/resources/static/risk-factor-identification-risk.docx                                        |    0 
 cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonBasicInfoWork.java                                    |   52 
 cnas-manage/src/main/resources/static/intervals-deal.docx                                                         |    0 
 cnas-device/src/main/resources/static/word/device-impower.docx                                                    |    0 
 cnas-require/src/main/java/com/ruoyi/require/service/SupplierManagementService.java                               |   32 
 cnas-require/src/main/java/com/ruoyi/require/mapper/InternalWastesDetailMapper.java                               |   16 
 cnas-manage/src/main/java/com/ruoyi/manage/pojo/InternalCorrect.java                                              |  114 
 cnas-require/src/main/java/com/ruoyi/require/dto/InternalWastesDto.java                                           |   26 
 cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceInspectionRecordMapper.java                               |   29 
 cnas-manage/src/main/java/com/ruoyi/manage/mapper/ManageRecordVerifyMapper.java                                   |   22 
 cnas-manage/src/main/java/com/ruoyi/manage/service/InternalReportService.java                                     |   47 
 cnas-manage/src/main/java/com/ruoyi/manage/service/ManageRecordIssueRecycleService.java                           |   31 
 cnas-require/src/main/java/com/ruoyi/require/controller/FePowerStableController.java                              |   99 
 cnas-process/src/main/java/com/ruoyi/process/pojo/QualitySuperviseDetailsAccording.java                           |  143 
 cnas-process/src/main/java/com/ruoyi/process/mapper/QualityMonitorDetailsEvaluateFileMapper.java                  |   17 
 cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonPostAuthorizationRecordService.java                |   27 
 cnas-manage/src/main/java/com/ruoyi/manage/controller/ManageRecordIntervalsTotalController.java                   |   55 
 cnas-manage/src/main/java/com/ruoyi/manage/mapper/InternalCheckDetailMapper.java                                  |   17 
 cnas-manage/src/main/java/com/ruoyi/manage/dto/InternalCheckDto.java                                              |   19 
 cnas-process/src/main/java/com/ruoyi/process/pojo/QualitySuperviseDetailsCorrectFile.java                         |   55 
 cnas-manage/src/main/java/com/ruoyi/manage/mapper/ManageMeetingParticipantsMapper.java                            |   16 
 cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceExamineRecordDetail.java                                    |   69 
 cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageReviewProgramFileServiceImpl.java                   |   76 
 cnas-device/src/main/java/com/ruoyi/device/mapper/InstructionMapper.java                                          |   25 
 cnas-process/src/main/java/com/ruoyi/process/pojo/ProcessReport.java                                              |   76 
 cnas-process/src/main/resources/static/quality-monitor-evaluate.docx                                              |    0 
 cnas-manage/src/main/java/com/ruoyi/manage/dto/InternalMeetingParticipantDto.java                                 |   32 
 cnas-require/src/main/java/com/ruoyi/require/pojo/FeStandardSubstanceAcceptanceInspection.java                    |   47 
 cnas-device/src/main/resources/static/word/maintenance-plan.docx                                                  |    0 
 cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceAcceptanceServiceImpl.java                          |  160 
 cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceState.java                                                  |  106 
 cnas-process/src/main/java/com/ruoyi/process/mapper/InspectionOrderMapper.java                                    |   41 
 cnas-manage/src/main/java/com/ruoyi/manage/pojo/ManageReviewReport.java                                           |  101 
 ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysRoleMenuMapper.java                                         |   11 
 cnas-process/src/main/java/com/ruoyi/process/dto/ProcessMethodVerifyCalibrationsFileDto.java                      |   19 
 cnas-manage/src/main/java/com/ruoyi/manage/controller/ManageMeetingController.java                                |   66 
 cnas-personnel/src/main/java/com/ruoyi/personnel/task/PersonTrainingSchedule.java                                 |   65 
 cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonPersonnelCapacityController.java                |   92 
 cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonTrainingDetailedService.java                       |   29 
 cnas-manage/src/main/resources/mapper/ManageDocumentIssueRecycleMapper.xml                                        |   54 
 cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceExamineRecordContrastServiceImpl.java               |  194 
 cnas-manage/src/main/java/com/ruoyi/manage/pojo/ManageReviewProgramFile.java                                      |   49 
 cnas-manage/src/main/java/com/ruoyi/manage/mapper/ManageRiskAssessmentResultsMapper.java                          |   21 
 cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessMethodVerifyServiceImpl.java                     |  455 
 cnas-require/src/main/java/com/ruoyi/require/service/impl/FePowerStableServiceImpl.java                           |  124 
 cnas-process/src/main/java/com/ruoyi/process/dto/ProcessMethodVerifyExportWordDto.java                            |   40 
 cnas-process/src/main/java/com/ruoyi/process/controller/ProcessTotaldealController.java                           |   74 
 cnas-device/src/main/java/com/ruoyi/device/controller/DeviceMetricController.java                                 |   35 
 cnas-manage/src/main/java/com/ruoyi/manage/vo/ReviewProgramDetailsVo.java                                         |   15 
 cnas-manage/src/main/resources/mapper/ManageDocumentListMapper.xml                                                |   26 
 cnas-process/src/main/java/com/ruoyi/process/pojo/InspectionOrderDetail.java                                      |   61 
 cnas-process/src/main/java/com/ruoyi/process/dto/SampleItemDto.java                                               |   23 
 cnas-manage/src/main/java/com/ruoyi/manage/service/ManageDocumentCancelService.java                               |   34 
 cnas-device/src/main/java/com/ruoyi/device/excel/DeviceMaintenanceExport.java                                     |   45 
 cnas-process/src/main/java/com/ruoyi/process/service/impl/InconsistentDistributionServiceImpl.java                |  232 
 cnas-manage/src/main/java/com/ruoyi/manage/service/ManageRecordTotalService.java                                  |   25 
 cnas-process/src/main/java/com/ruoyi/process/dto/QualitySuperviseDetailsDto.java                                  |   34 
 cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageDocumentListServiceImpl.java                        |   98 
 cnas-device/src/main/java/com/ruoyi/device/dto/DeviceExamineRecordContrastDto.java                                |   47 
 cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceImpowerServiceImpl.java                             |  299 
 cnas-device/src/main/java/com/ruoyi/device/dto/DeviceOperationInstructionDto.java                                 |   35 
 cnas-manage/src/main/java/com/ruoyi/manage/mapper/ManageRecordTotalMapper.java                                    |   21 
 cnas-require/src/main/java/com/ruoyi/require/pojo/InternalWastesDetail.java                                       |   65 
 cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageRecordCheckServiceImpl.java                         |  475 
 cnas-manage/src/main/java/com/ruoyi/manage/service/ManageRecordVerifyService.java                                 |   28 
 cnas-personnel/src/main/resources/static/communication-deal.docx                                                  |    0 
 cnas-manage/src/main/java/com/ruoyi/manage/controller/InternalReportController.java                               |  124 
 cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceImpowerMapper.java                                        |   36 
 cnas-require/src/main/resources/static/power-stable.docx                                                          |    0 
 cnas-manage/src/main/resources/static/review-meet.docx                                                            |    0 
 cnas-manage/src/main/resources/mapper/ManageReviewProgramMapper.xml                                               |   41 
 cnas-device/src/main/resources/mapper/DeviceImpowerDetailsMapper.xml                                              |   16 
 cnas-require/src/main/java/com/ruoyi/require/controller/ForeignRegisterController.java                            |   96 
 cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonBasicInfoWorkMapper.java                            |   16 
 cnas-manage/src/main/resources/mapper/InternalMeetingMapper.xml                                                   |   18 
 cnas-process/src/main/java/com/ruoyi/process/mapper/QualitySuperviseMapper.java                                   |   38 
 cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceCalibrationPlanServiceImpl.java                     |  357 
 cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceExaminePlanDetails.java                                     |   75 
 cnas-require/src/main/java/com/ruoyi/require/service/ForeignRegisterService.java                                  |   34 
 cnas-process/src/main/java/com/ruoyi/process/mapper/ProcessMethodSearchNewMapper.java                             |   32 
 cnas-require/src/main/java/com/ruoyi/require/dto/FePowerStableDto.java                                            |   22 
 cnas-device/src/main/java/com/ruoyi/device/dto/DeviceImpowerDetailsDto.java                                       |   25 
 cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceInspectionRecordDetails.java                                |   62 
 cnas-manage/src/main/java/com/ruoyi/manage/mapper/ClientSatisfactionAnalyseFileMapper.java                        |   27 
 cnas-process/src/main/java/com/ruoyi/process/pojo/ProcessMethodVerifyMethodFile.java                              |   54 
 cnas-require/src/main/java/com/ruoyi/require/pojo/FeMeasuredQuantity.java                                         |   53 
 cnas-process/src/main/resources/mapper/ProcessMethodVerifyMapper.xml                                              |   22 
 cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceLogMapper.java                                            |    9 
 cnas-manage/src/main/java/com/ruoyi/manage/pojo/ManageMeetingParticipants.java                                    |   53 
 cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceRecord.java                                                 |   69 
 cnas-manage/src/main/java/com/ruoyi/manage/service/ManageReviewProgramFileService.java                            |   22 
 cnas-process/src/main/java/com/ruoyi/process/service/QualitySuperviseDetailsService.java                          |   15 
 cnas-process/src/main/resources/static/supervise-management-eview.docx                                            |    0 
 cnas-personnel/src/main/resources/static/person-training-record.docx                                              |    0 
 cnas-process/src/main/java/com/ruoyi/process/mapper/QualitySuperviseManagementReviewMapper.java                   |   26 
 cnas-process/src/main/resources/mapper/ProcessEvaluateMapper.xml                                                  |   26 
 cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonBasicInfoFileServiceImpl.java                 |   20 
 cnas-manage/src/main/java/com/ruoyi/manage/pojo/ClientSatisfactionAnalyseFile.java                                |   54 
 cnas-personnel/src/main/resources/mapper/PersonBasicInfoMapper.xml                                                |   64 
 cnas-personnel/src/main/resources/mapper/PersonTrainingDetailedMapper.xml                                         |   55 
 cnas-require/src/main/java/com/ruoyi/require/mapper/FeCalibrationScheduleMapper.java                              |   20 
 cnas-require/src/main/java/com/ruoyi/require/dto/ForeignRegisterDto.java                                          |   32 
 cnas-device/src/main/java/com/ruoyi/device/service/DeviceCalibrationPlanDetailService.java                        |   16 
 cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageDocumentCancelServiceImpl.java                      |  146 
 cnas-require/src/main/java/com/ruoyi/require/pojo/FeTempHumRecord.java                                            |   66 
 cnas-manage/src/main/java/com/ruoyi/manage/service/InternalCheckDetailService.java                                |   15 
 cnas-device/src/main/java/com/ruoyi/device/dto/DeviceAccidentReportDto.java                                       |   31 
 cnas-device/src/main/resources/static/word/incident-report.docx                                                   |    0 
 cnas-manage/src/main/resources/static/recycle-deal.docx                                                           |    0 
 cnas-device/src/main/java/com/ruoyi/device/dto/DeviceCollectionDto.java                                           |   28 
 cnas-process/src/main/java/com/ruoyi/process/controller/ProcessMethodSearchNewController.java                     |  128 
 cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonPersonnelCapacityServiceImpl.java             |  160 
 cnas-process/src/main/java/com/ruoyi/process/service/ProcessMethodSearchNewService.java                           |   82 
 cnas-device/src/main/java/com/ruoyi/device/dto/DeviceConfigDtoPage.java                                           |   77 
 cnas-manage/src/main/java/com/ruoyi/manage/service/ManageDocumentIssueRecycleService.java                         |   35 
 cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceInspectionRecordDetailsMapper.java                        |   16 
 cnas-process/src/main/java/com/ruoyi/process/mapper/ProcessSampleMapper.java                                      |   21 
 cnas-require/src/main/java/com/ruoyi/require/service/SuppliersDirectoryContentsService.java                       |   22 
 cnas-process/src/main/resources/mapper/InspectionOrderMapper.xml                                                  |   27 
 cnas-manage/src/main/java/com/ruoyi/manage/service/ManageRecordCheckService.java                                  |   32 
 cnas-manage/src/main/java/com/ruoyi/manage/service/impl/InternalCheckDetailServiceImpl.java                       |   19 
 cnas-process/src/main/resources/mapper/ProcessMethodVerifyCalibrationsFileMapper.xml                              |   24 
 cnas-require/src/main/java/com/ruoyi/require/controller/FeStandardSubstanceAcceptanceController.java              |   88 
 cnas-process/src/main/resources/mapper/QualitySuperviseDetailsRecordMapper.xml                                    |   11 
 cnas-manage/src/main/java/com/ruoyi/manage/controller/ManageReviewProgramFileController.java                      |   46 
 cnas-require/src/main/java/com/ruoyi/require/vo/AcceptanceVo.java                                                 |   46 
 cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceCalibrationPlanMapper.java                                |   29 
 cnas-require/src/main/resources/static/internal-wastes.docx                                                       |    0 
 cnas-manage/src/main/java/com/ruoyi/manage/mapper/ClientSatisfactionMapper.java                                   |   36 
 cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageControlPlanListServiceImpl.java                     |  129 
 cnas-process/src/main/java/com/ruoyi/process/service/impl/QualitySuperviseManagementReviewServiceImpl.java        |   86 
 cnas-process/src/main/java/com/ruoyi/process/mapper/QualityMonitorMapper.java                                     |   28 
 cnas-device/src/main/resources/mapper/DeviceExamineRecordMapper.xml                                               |   25 
 cnas-manage/src/main/resources/mapper/InternalReportMapper.xml                                                    |   14 
 cnas-process/src/main/java/com/ruoyi/process/pojo/InspectionOrder.java                                            |  109 
 cnas-manage/src/main/resources/mapper/InternalImplementMapper.xml                                                 |   14 
 cnas-require/src/main/java/com/ruoyi/require/service/impl/FeCalibrationScheduleServiceImpl.java                   |   76 
 cnas-personnel/src/main/java/com/ruoyi/personnel/service/AnnexService.java                                        |    7 
 cnas-device/src/main/resources/mapper/DeviceCalibrationPlanMapper.xml                                             |   20 
 cnas-device/src/main/java/com/ruoyi/device/dto/DeviceTraceabilityManagementDto.java                               |   28 
 cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceImpower.java                                                |   74 
 cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessOrderDeviceServiceImpl.java                      |   26 
 cnas-device/src/main/java/com/ruoyi/device/dto/DeviceStateDto.java                                                |   32 
 cnas-device/src/main/java/com/ruoyi/device/service/DeviceImpowerService.java                                      |   71 
 cnas-manage/src/main/java/com/ruoyi/manage/pojo/InternalCorrectFile.java                                          |   52 
 cnas-manage/src/main/java/com/ruoyi/manage/service/InternalCorrectService.java                                    |   66 
 cnas-process/src/main/java/com/ruoyi/process/dto/InspectionOrderDto.java                                          |   19 
 cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessMethodSearchNewBackupsServiceImpl.java           |   20 
 cnas-require/src/main/java/com/ruoyi/require/service/ProcurementSuppliesListService.java                          |   28 
 cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonBasicInfoFileMapper.java                            |   16 
 cnas-manage/src/main/java/com/ruoyi/manage/service/impl/InternalCorrectFileServiceImpl.java                       |   20 
 cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceStateMapper.java                                          |   21 
 cnas-device/src/main/java/com/ruoyi/device/controller/DeviceInstructionController.java                            |  105 
 cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceExaminePlanMapper.java                                    |   35 
 cnas-require/src/main/java/com/ruoyi/require/dto/FeIlluminationAddDto.java                                        |   15 
 cnas-require/src/main/java/com/ruoyi/require/service/ProcurementSuppliesExpendsService.java                       |   22 
 cnas-manage/src/main/java/com/ruoyi/manage/service/ManageDocumentAlterService.java                                |   36 
 cnas-require/src/main/java/com/ruoyi/require/mapper/FeIlluminationMapper.java                                     |   28 
 918 files changed, 56,325 insertions(+), 0 deletions(-)

diff --git a/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceAcceptanceController.java b/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceAcceptanceController.java
new file mode 100644
index 0000000..863da69
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceAcceptanceController.java
@@ -0,0 +1,133 @@
+package com.ruoyi.device.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.ruoyi.common.core.domain.Result;
+import com.ruoyi.device.pojo.DeviceAcceptance;
+import com.ruoyi.device.pojo.DeviceAcceptanceFile;
+import com.ruoyi.device.service.DeviceAcceptanceFileService;
+import com.ruoyi.device.service.DeviceAcceptanceService;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import jakarta.servlet.http.HttpServletResponse;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 璁惧楠屾敹(瑁呭) 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-20 01:45:14
+ */
+@Tag(name = "璁惧楠屾敹(瑁呭)")
+@AllArgsConstructor
+@RestController
+@RequestMapping("/deviceAcceptance")
+public class DeviceAcceptanceController {
+
+    private DeviceAcceptanceService deviceAcceptanceService;
+    private DeviceAcceptanceFileService deviceAcceptanceFileService;
+
+    /**
+     * 璁惧楠屾敹鍒楄〃
+     * @return
+     */
+    @Operation(summary = "璁惧楠屾敹鍒楄〃")
+    @GetMapping("/pageDeviceAcceptance")
+    public Result<IPage<DeviceAcceptance>> pageDeviceAcceptance(Page page, DeviceAcceptance deviceAcceptance) {
+        return Result.success(deviceAcceptanceService.pageDeviceAcceptance(page, deviceAcceptance));
+    }
+
+    /**
+     * 鏌ヨ璁惧楠屾敹
+     * @return
+     */
+    @Operation(summary = "鏌ヨ璁惧楠屾敹")
+    @GetMapping("/getDeviceAcceptance")
+    public Result getDeviceAcceptance(Integer acceptanceId){
+        return Result.success(deviceAcceptanceService.getById(acceptanceId));
+    }
+
+    /**
+     * 鍒犻櫎璁惧楠屾敹
+     * @return
+     */
+    @Operation(summary = "鍒犻櫎璁惧楠屾敹")
+    @DeleteMapping("/delDeviceAcceptance")
+    public Result delDeviceAcceptance(Integer acceptanceId){
+        return Result.success(deviceAcceptanceService.removeById(acceptanceId));
+    }
+
+    /**
+     * 鏂板璁惧楠屾敹
+     * @return
+     */
+    @Operation(summary = "鏂板璁惧楠屾敹")
+    @PostMapping("/addDeviceAcceptance")
+    public Result addDeviceAcceptance(@RequestBody DeviceAcceptance deviceAcceptance){
+        return Result.success(deviceAcceptanceService.save(deviceAcceptance));
+    }
+
+    /**
+     * 鏂板璁惧楠屾敹
+     * @return
+     */
+    @Operation(summary = "缂栬緫璁惧楠屾敹")
+    @PostMapping("/updateDeviceAcceptance")
+    public Result updateDeviceAcceptance(@RequestBody DeviceAcceptance deviceAcceptance){
+        return Result.success(deviceAcceptanceService.updateById(deviceAcceptance));
+    }
+
+    /**
+     * 璁惧楠屾敹瀵煎嚭
+     * @param acceptanceId  璁惧楠屾敹id
+     * @param response   鍝嶅簲浣�
+     * @return
+     */
+    @Operation(summary = "璁惧楠屾敹瀵煎嚭")
+    @GetMapping("/exportDeviceAcceptance")
+    public void exportDeviceAcceptance(Integer acceptanceId, HttpServletResponse response){
+        deviceAcceptanceService.exportDeviceAcceptance(acceptanceId, response);
+    }
+
+    /**
+     * 璁惧楠屾敹闄勪欢鏂板
+     * @param acceptanceId
+     * @param file
+     * @return
+     */
+    @Operation(summary = "璁惧楠屾敹闄勪欢鏂板")
+    @PostMapping("/uploadDeviceAcceptanceFile")
+    public Result<?> uploadDeviceAcceptanceFile(Integer acceptanceId, MultipartFile file) {
+        return Result.success(deviceAcceptanceService.uploadDeviceAcceptanceFile(acceptanceId, file));
+    }
+
+
+    /**
+     * 璁惧楠屾敹闄勪欢鍒楄〃
+     * @return
+     */
+    @Operation(summary = "璁惧楠屾敹闄勪欢鍒楄〃")
+    @GetMapping("/getDeviceAcceptanceFileList")
+    public Result<List<DeviceAcceptanceFile>> getVerifyMethodFileList(Integer acceptanceId){
+        return Result.success(deviceAcceptanceFileService.list(Wrappers.<DeviceAcceptanceFile>lambdaQuery()
+                .eq(DeviceAcceptanceFile::getAcceptanceId, acceptanceId)));
+    }
+
+    /**
+     * 璁惧楠屾敹闄勪欢鍒犻櫎
+     * @return
+     */
+    @Operation(summary = "璁惧楠屾敹闄勪欢鍒犻櫎")
+    @DeleteMapping("/delDeviceAcceptanceFileList")
+    public Result delDeviceAcceptanceFileList(Integer acceptanceFileId){
+        return Result.success(deviceAcceptanceFileService.removeById(acceptanceFileId));
+    }
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceAccidentReportController.java b/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceAccidentReportController.java
new file mode 100644
index 0000000..0406f3b
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceAccidentReportController.java
@@ -0,0 +1,84 @@
+package com.ruoyi.device.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.device.pojo.DeviceAccidentReport;
+import com.ruoyi.device.service.DeviceAccidentReportService;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+
+import jakarta.servlet.http.HttpServletResponse;
+import java.util.Map;
+
+/**
+ * <p>
+ * 璁惧浜嬫晠鎶ュ憡鍗� 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-17 06:31:12
+ */
+@Tag(name = "璁惧浜嬫晠鎶ュ憡鍗�")
+@AllArgsConstructor
+@RestController
+@RequestMapping("/deviceAccidentReport")
+public class DeviceAccidentReportController {
+
+    private DeviceAccidentReportService deviceAccidentReportService;
+
+
+    /**
+     * 璁惧浜嬫晠鎶ュ憡鍒楄〃
+     * @return
+     */
+    @Operation(summary = "璁惧浜嬫晠鎶ュ憡鍒楄〃")
+    @GetMapping("/pageDeviceAccidentReport")
+    public Result<IPage<DeviceAccidentReport>> pageDeviceAccidentReport(Page page, DeviceAccidentReport deviceAccidentReport){
+        return Result.success(deviceAccidentReportService.pageDeviceAccidentReport(page, deviceAccidentReport));
+    }
+
+    /**
+     * 鏌ヨ璁惧浜嬫晠鎶ュ憡
+     * @return
+     */
+    @Operation(summary = "鏌ヨ璁惧浜嬫晠鎶ュ憡")
+    @GetMapping("/getDeviceAccidentReport")
+    public Result getDeviceAccidentReport(Integer accidentReportId){
+        return Result.success(deviceAccidentReportService.getById(accidentReportId));
+    }
+
+    /**
+     * 鍒犻櫎璁惧浜嬫晠鎶ュ憡
+     * @return
+     */
+    @Operation(summary = "鍒犻櫎璁惧浜嬫晠鎶ュ憡")
+    @DeleteMapping("/delDeviceAccidentReport")
+    public Result delDeviceAccidentReport(Integer accidentReportId){
+        return Result.success(deviceAccidentReportService.removeById(accidentReportId));
+    }
+
+    /**
+     * 鏂板璁惧浜嬫晠鎶ュ憡
+     * @return
+     */
+    @Operation(summary = "鏂板璁惧浜嬫晠鎶ュ憡")
+    @PostMapping("/addDeviceAccidentReport")
+    public Result addDeviceAccidentReport(@RequestBody DeviceAccidentReport deviceAccidentReport){
+        return Result.success(deviceAccidentReportService.addDeviceAccidentReport(deviceAccidentReport));
+    }
+
+    /**
+     * 瀵煎嚭璁惧浜嬫晠鎶ュ憡
+     * @param accidentReportId 璁惧浜嬫晠鎶ュ憡id
+     * @param response 鍝嶅簲
+     */
+    @Operation(summary = "瀵煎嚭璁惧浜嬫晠鎶ュ憡")
+    @GetMapping("/exportDeviceAccidentReport")
+    public Result exportDeviceAccidentReport(Integer accidentReportId, HttpServletResponse response) {
+        deviceAccidentReportService.exportDeviceAccidentReport(accidentReportId, response);
+        return Result.success();
+    }
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceBorrowController.java b/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceBorrowController.java
new file mode 100644
index 0000000..8709b5d
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceBorrowController.java
@@ -0,0 +1,73 @@
+package com.ruoyi.device.controller;
+
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.device.pojo.DeviceBorrow;
+import com.ruoyi.device.service.DeviceBorrowService;
+import org.springframework.web.bind.annotation.*;
+
+import jakarta.annotation.Resource;
+import jakarta.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;
+
+
+    //鍒嗛〉
+    @GetMapping("/deviceBorrowPage")
+    public Result deviceBorrowPage(Page page, DeviceBorrow deviceBorrow) throws Exception {
+        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));
+    }
+
+    //鍒犻櫎
+    @DeleteMapping("/deleteDeviceBorrow")
+    public Result deleteDeviceBorrow(Integer id) {
+        return Result.success(deviceBorrowService.removeById(id));
+    }
+
+    //瀵煎嚭
+    @GetMapping("/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-device/src/main/java/com/ruoyi/device/controller/DeviceBreakdownMaintenanceController.java b/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceBreakdownMaintenanceController.java
new file mode 100644
index 0000000..980aa4d
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceBreakdownMaintenanceController.java
@@ -0,0 +1,85 @@
+package com.ruoyi.device.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.device.dto.DeviceBreakdownMaintenance;
+import com.ruoyi.device.service.DeviceBreakdownMaintenanceService;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+
+import jakarta.servlet.http.HttpServletResponse;
+import java.util.Map;
+
+/**
+ * <p>
+ * 璁惧鏁呴殰缁翠慨琛� 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-17 04:50:57
+ */
+@Tag(name = "璁惧鏁呴殰缁翠慨琛�")
+@AllArgsConstructor
+@RestController
+@RequestMapping("/deviceBreakdownMaintenance")
+public class DeviceBreakdownMaintenanceController {
+
+    private DeviceBreakdownMaintenanceService deviceBreakdownMaintenanceService;
+
+
+    /**
+     * 璁惧鏁呴殰缁翠慨鍒楄〃
+     * @return
+     */
+    @Operation(summary = "璁惧鏁呴殰缁翠慨鍒楄〃")
+    @GetMapping("/pageDeviceBreakdownMaintenance")
+    public Result<IPage<DeviceBreakdownMaintenance>> pageDeviceBreakdownMaintenance(Page page, DeviceBreakdownMaintenance deviceBreakdownMaintenance) {
+        return Result.success(deviceBreakdownMaintenanceService.pageDeviceBreakdownMaintenance(page, deviceBreakdownMaintenance));
+    }
+
+    /**
+     * 鏌ヨ璁惧鏁呴殰缁翠慨
+     * @return
+     */
+    @Operation(summary = "鏌ヨ璁惧鏁呴殰缁翠慨")
+    @GetMapping("/getDeviceBreakdownMaintenance")
+    public Result getDeviceBreakdownMaintenance(Integer maintenanceId){
+        return Result.success(deviceBreakdownMaintenanceService.getById(maintenanceId));
+    }
+
+    /**
+     * 鍒犻櫎璁惧鏁呴殰缁翠慨
+     * @return
+     */
+    @Operation(summary = "鍒犻櫎璁惧鏁呴殰缁翠慨")
+    @DeleteMapping("/delDeviceBreakdownMaintenance")
+    public Result delDeviceBreakdownMaintenance(Integer maintenanceId){
+        return Result.success(deviceBreakdownMaintenanceService.removeById(maintenanceId));
+    }
+
+    /**
+     * 鏂板璁惧鏁呴殰缁翠慨
+     * @return
+     */
+    @Operation(summary = "鏂板璁惧鏁呴殰缁翠慨")
+    @PostMapping("/addDeviceBreakdownMaintenance")
+    public Result addDeviceBreakdownMaintenance(@RequestBody DeviceBreakdownMaintenance deviceBreakdownMaintenance){
+        return Result.success(deviceBreakdownMaintenanceService.addDeviceBreakdownMaintenance(deviceBreakdownMaintenance));
+    }
+
+    /**
+     * 瀵煎嚭璁惧鏁呴殰缁翠慨
+     * @param maintenanceId 璁惧鏁呴殰缁翠慨id
+     * @param response 鍝嶅簲
+     * @return
+     */
+    @Operation(summary = "瀵煎嚭璁惧鏁呴殰缁翠慨")
+    @GetMapping("/exportDeviceBreakdownMaintenance")
+    public Result exportDeviceBreakdownMaintenance(Integer maintenanceId, HttpServletResponse response){
+        deviceBreakdownMaintenanceService.exportDeviceBreakdownMaintenance(maintenanceId, response);
+        return Result.success();
+    }
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceCalibrationPlanController.java b/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceCalibrationPlanController.java
new file mode 100644
index 0000000..438d008
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceCalibrationPlanController.java
@@ -0,0 +1,173 @@
+package com.ruoyi.device.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.device.dto.DeviceCalibrationPlanDto;
+import com.ruoyi.device.pojo.DeviceCalibrationPlan;
+import com.ruoyi.device.pojo.DeviceCalibrationPlanDetail;
+import com.ruoyi.device.service.DeviceCalibrationPlanDetailService;
+import com.ruoyi.device.service.DeviceCalibrationPlanService;
+import com.ruoyi.framework.exception.ErrorException;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import jakarta.servlet.http.HttpServletResponse;
+import java.util.Map;
+
+/**
+ * <p>
+ * 璁惧鏍″噯璁″垝涓昏〃 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-16 03:58:17
+ */
+@Tag(name = "璁惧鏍″噯璁″垝")
+@AllArgsConstructor
+@RestController
+@RequestMapping("/deviceCalibrationPlan")
+public class DeviceCalibrationPlanController {
+
+    private DeviceCalibrationPlanService deviceCalibrationPlanService;
+
+    private DeviceCalibrationPlanDetailService deviceCalibrationPlanDetailService;
+
+    /**
+     * 鏂板璁惧鏍″噯璁″垝
+     * @return
+     */
+    @Operation(summary = "鏂板璁惧鏍″噯璁″垝")
+    @PostMapping("/addDeviceCalibrationPlan")
+    public Result addDeviceCalibrationPlan(@RequestBody DeviceCalibrationPlanDto calibrationPlanDto){
+        return Result.success(deviceCalibrationPlanService.addDeviceCalibrationPlan(calibrationPlanDto));
+    }
+
+    /**
+     * 淇敼璁惧鏍″噯璁″垝
+     * @param calibrationPlanDto 璁惧鏍″噯璁″垝
+     */
+    @Operation(summary = "鎵归噺淇敼璁惧鏍″噯璁″垝")
+    @PostMapping("/updateDeviceCalibrationPlan")
+    public Result updateDeviceCalibrationPlan(@RequestBody DeviceCalibrationPlanDto calibrationPlanDto) {
+        return Result.success(deviceCalibrationPlanService.updateDeviceCalibrationPlan(calibrationPlanDto));
+    }
+
+    /**
+     * 鏌ヨ璁惧鏍″噯璁″垝璇︽儏
+     */
+    @Operation(summary = "鏌ヨ璁惧鏍″噯璁″垝璇︽儏")
+    @GetMapping("/getDeviceCalibrationPlan")
+    public Result<DeviceCalibrationPlanDto> getDeviceCalibrationPlan(Integer planId) {
+        return Result.success(deviceCalibrationPlanService.getDeviceCalibrationPlan(planId));
+    }
+
+    /**
+     * 瀵煎叆璁惧鏍″噯璁″垝
+     * @return
+     */
+    @Operation(summary = "瀵煎叆璁惧鏍″噯璁″垝")
+    @PostMapping("/importDeviceCalibrationPlan")
+    public Result importDeviceCalibrationPlan(MultipartFile file, String planYear){
+        return Result.success(deviceCalibrationPlanService.importDeviceCalibrationPlan(file, planYear));
+    }
+
+
+    /**
+     * 璁惧鏍″噯璁″垝鍒犻櫎
+     * @return
+     */
+    @Operation(summary = "璁惧鏍″噯璁″垝鍒犻櫎")
+    @DeleteMapping("/delDeviceCalibrationPlan")
+    public Result delDeviceCalibrationPlan(Integer planId){
+        return Result.success(deviceCalibrationPlanService.removeById(planId));
+    }
+
+    /**
+     * 鎻愪氦鎵瑰噯
+     * @return
+     */
+    @Operation(summary = "鎻愪氦鎵瑰噯")
+    @PostMapping("/submiatRatifyDeviceCalibrationPlan")
+    public Result submiatRatifyDeviceCalibrationPlan(@RequestBody DeviceCalibrationPlan DeviceCalibrationPlan){
+        return Result.success(deviceCalibrationPlanService.submiatRatifyDeviceCalibrationPlan(DeviceCalibrationPlan));
+    }
+
+    /**
+     * 璁惧鏍″噯璁″垝鎵瑰噯
+     * @return
+     */
+    @Operation(summary = "璁惧鏍″噯璁″垝鎵瑰噯")
+    @PostMapping("/ratifyDeviceCalibrationPlan")
+    public Result ratifyDeviceCalibrationPlan(@RequestBody DeviceCalibrationPlan DeviceCalibrationPlan){
+        return Result.success(deviceCalibrationPlanService.ratifyDeviceCalibrationPlan(DeviceCalibrationPlan));
+    }
+
+
+    /**
+     * 璁惧鏍″噯璁″垝鍒楄〃
+     * @return
+     */
+    @Operation(summary = "璁惧鏍″噯璁″垝鍒楄〃")
+    @GetMapping("/pageDeviceCalibrationPlan")
+    public Result<IPage<DeviceCalibrationPlanDto>> pageDeviceCalibrationPlan(Page page, DeviceCalibrationPlan DeviceCalibrationPlan) throws Exception {
+        return Result.success(deviceCalibrationPlanService.pageDeviceCalibrationPlan(page, DeviceCalibrationPlan));
+    }
+
+    /**
+     * 璁惧鏍″噯璁″垝璇︽儏鍒楄〃
+     * @return
+     */
+    @Operation(summary = "璁惧鏍″噯璁″垝璇︽儏鍒楄〃")
+    @GetMapping("/pageDeviceCalibrationPlanDetail")
+    public Result<IPage<DeviceCalibrationPlanDetail>> pageDeviceCalibrationPlanDetail(Page page, DeviceCalibrationPlanDetail deviceCalibrationPlanDetails) {
+        return Result.success(deviceCalibrationPlanService.pageDeviceCalibrationPlanDetail(page, deviceCalibrationPlanDetails));
+    }
+
+    /**
+     * 鏂板璁惧鏍″噯璁″垝璇︽儏
+     * @return
+     */
+    @Operation(summary = "鏂板璁惧鏍″噯璁″垝璇︽儏")
+    @PostMapping("/addDeviceCalibrationPlanDetail")
+    public Result addDeviceCalibrationPlanDetail(@RequestBody DeviceCalibrationPlanDetail deviceCalibrationPlanDetail){
+        if (deviceCalibrationPlanDetail.getPlanId() == null) {
+            throw new ErrorException("缂哄皯璁惧鏍″噯璁″垝涓昏〃id");
+        }
+        return Result.success(deviceCalibrationPlanDetailService.save(deviceCalibrationPlanDetail));
+    }
+
+    /**
+     * 淇敼璁惧鏍″噯璁″垝璇︽儏
+     * @return
+     */
+    @Operation(summary = "淇敼璁惧鏍″噯璁″垝璇︽儏")
+    @PostMapping("/updateDeviceCalibrationPlanDetail")
+    public Result updateDeviceCalibrationPlanDetail(@RequestBody DeviceCalibrationPlanDetail deviceCalibrationPlanDetail){
+        return Result.success(deviceCalibrationPlanDetailService.updateById(deviceCalibrationPlanDetail));
+    }
+
+    /**
+     * 鍒犻櫎璁惧鏍″噯璁″垝璇︽儏
+     * @return
+     */
+    @Operation(summary = "鍒犻櫎璁惧鏍″噯璁″垝璇︽儏")
+    @DeleteMapping("/delDeviceCalibrationPlanDetail")
+    public Result delDeviceCalibrationPlanDetail(Integer planDetailsId){
+        return Result.success(deviceCalibrationPlanDetailService.removeById(planDetailsId));
+    }
+
+    /**
+     * 瀵煎嚭璁惧鏍″噯璁″垝
+     * @return
+     */
+    @Operation(summary = "瀵煎嚭璁惧鏍″噯璁″垝")
+    @GetMapping("/exportDeviceCalibrationPlanDetail")
+    public void exportDeviceCalibrationPlanDetail(Integer planId, HttpServletResponse response){
+        deviceCalibrationPlanService.exportDeviceCalibrationPlanDetail(planId, response);
+    }
+
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceController.java b/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceController.java
new file mode 100644
index 0000000..7022e75
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceController.java
@@ -0,0 +1,228 @@
+package com.ruoyi.device.controller;
+
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.device.dto.DataConfigDto;
+import com.ruoyi.device.dto.DeviceCollectionDto;
+import com.ruoyi.device.dto.DeviceDto;
+import com.ruoyi.device.pojo.DataConfig;
+import com.ruoyi.device.pojo.Device;
+import com.ruoyi.device.service.DataConfigService;
+import com.ruoyi.device.service.DeviceService;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+import java.io.File;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * 璁惧(DeviceController)琛ㄦ帶鍒跺眰
+ */
+@Tag(name = "璁惧")
+@RestController
+@RequestMapping("/deviceScope")
+public class DeviceController {
+
+    @Resource
+    private DeviceService deviceService;
+
+    @Value("${file.path}")
+    private String filePath;
+
+    @Value("${wordUrl}")
+    private String wordUrl;
+
+    @Autowired
+    private DataConfigService dataConfigService;
+
+    @Operation(summary = "鏌ヨ璁惧璇︽儏")
+    @GetMapping("/getDeviceById")
+    public Result getDeviceById(Integer deviceId) {
+        return Result.success(deviceService.getById(deviceId));
+    }
+
+
+    //璁惧宸ュ叿鏄庣粏
+    @Operation(summary = "鏌ヨ璁惧璇︽儏鍒楄〃")
+    @GetMapping("/selectDeviceParameter")
+    public Result selectDeviceParameter(Page page, DeviceDto itemParameter, Boolean laboratoryNameIsNull) {
+        return Result.success(deviceService.selectDeviceParameter(page, itemParameter, laboratoryNameIsNull));
+    }
+
+    @Operation(summary = "娣诲姞璁惧璇︽儏鍙傛暟")
+    @PostMapping("/addDeviceParameter")
+    public Result addDeviceParameter(@RequestBody Device itemParameter) {
+        return Result.success(deviceService.addDeviceParameter(itemParameter));
+    }
+
+    @Operation(summary = "鍒犻櫎璁惧璇︽儏鍙傛暟")
+    @DeleteMapping("/delDeviceParameter")
+    public Result<?> delDeviceParameter(Integer id) {
+        return Result.success(deviceService.delDeviceParameter(id));
+    }
+
+    @Operation(summary = "淇敼璁惧璇︽儏鍙傛暟")
+    @PostMapping("/upDeviceParameter")
+    public Result<?> upDeviceParameter(@RequestBody Device itemParameter) {
+        return Result.success(deviceService.upDeviceParameter(itemParameter));
+    }
+
+    @Operation(summary = "鑾峰彇璁惧鎬昏")
+    @GetMapping("/selectEquipmentOverview")
+    public Result selectEquipmentOverview() {
+        return Result.success(deviceService.selectEquipmentOverview());
+    }
+
+    @Operation(summary = "鑾峰彇琚巿鏉冧汉")
+    @GetMapping("/authorizedPerson")
+    public Result authorizedPerson() {
+        return Result.success(deviceService.authorizedPerson());
+    }
+
+    @Operation(summary = "鎼滅储")
+    @GetMapping("/search")
+    public Result search(Integer status, String deviceName, String specificationModel, String largeCategory) {
+        return Result.success(deviceService.search(status, deviceName, specificationModel, largeCategory));
+    }
+
+    //鍥剧墖涓婁紶
+    @Operation(summary = "璁惧鏂囦欢涓婁紶")
+    @PostMapping("/uploadFile")
+    public Result uploadFile(MultipartFile file) {
+        String urlString;
+        String pathName;
+        String filename = file.getOriginalFilename();
+        String path;
+        try {
+            String contentType = file.getContentType();
+            if (contentType != null && contentType.startsWith("image/")) {
+                // 鏄浘鐗�
+                path = filePath;
+            } else {
+                // 鏄枃浠�
+                path = wordUrl;
+            }
+
+            File realpath = new File(path);
+            if (!realpath.exists()) {
+                realpath.mkdirs();
+            }
+            pathName = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyMMddHHmmss")) + "-" + file.getOriginalFilename();
+            urlString = realpath + "/" + pathName;
+            file.transferTo(new File(urlString));
+            HashMap<String, String> map = new HashMap<>();
+            map.put("name", filename);
+            map.put("url", pathName);
+            return Result.success(map);
+        } catch (Exception e) {
+            e.printStackTrace();
+            System.err.println("鏂囦欢涓婁紶閿欒");
+            return null;
+        }
+    }
+
+    @Operation(summary = "閫氳繃椤圭洰鑾峰彇璁惧鍒楄〃")
+    @GetMapping("/selectDeviceByCategory")
+    public Result selectDeviceByCategory(String inspectionItem, String inspectionItemSubclass, String laboratory) {
+        return Result.success(deviceService.selectDeviceByCategory(inspectionItem, inspectionItemSubclass, laboratory));
+    }
+
+    @Operation(summary = "閫氳繃璁惧缂栧彿鑾峰彇璁惧鍒楄〃")
+    @GetMapping("/selectDeviceByCode")
+    public Result<DeviceDto> selectDeviceByCode(Integer id) {
+        return Result.success(deviceService.selectDeviceByCode(id));
+    }
+
+
+    @Operation(summary = "/鏁伴噰-鏁版嵁閲囬泦")
+    @PostMapping("/dataCollection")
+    public Result<?> dataAcquisition(HttpServletRequest request, @RequestBody DeviceCollectionDto dto) {
+        return deviceService.dataAcquisition(request, dto);
+    }
+
+    @Operation(summary = "缁存姢璁惧鏂囦欢閰嶇疆")
+    @PostMapping("/saveDeviceFileConfiguration")
+    public Result<?> saveDeviceFileConfiguration(@RequestBody DataConfigDto dataConfigList) {
+        dataConfigService.saveDeviceFileConfiguration(dataConfigList);
+        return Result.success();
+    }
+
+    @Operation(summary = "鏌ヨ鏁伴噰閰嶇疆")
+    @GetMapping("/queryDataAcquisitionConfiguration")
+    public Result<?> queryDataAcquisitionConfiguration(DataConfig dataConfig) {
+        return dataConfigService.queryDataAcquisitionConfiguration(dataConfig);
+    }
+
+    @Operation(summary = "鏌ヨ妫�楠岄」鏁伴噰閰嶇疆")
+    @GetMapping("/queryProductConfiguration")
+    public Result<?> queryProductConfiguration(DataConfig dataConfig) {
+        return dataConfigService.queryProductConfiguration(dataConfig);
+    }
+
+    @Operation(summary = "缁存姢鏁伴噰閰嶇疆")
+    @PostMapping("/saveDataAcquisitionConfiguration")
+    public Result<?> saveDataAcquisitionConfiguration(@RequestBody DataConfigDto dataConfigList) {
+        dataConfigService.saveDataAcquisitionConfiguration(dataConfigList);
+        return Result.success();
+    }
+
+
+    @Operation(summary = "鏌ヨ缁戝畾浜嗕絾鏄病鏈夐厤缃殑妫�楠岄」")
+    @GetMapping("/getNoConfigProduct")
+    public Result<?> getNoConfigProduct(Page page, Integer deviceId) {
+        return Result.success(dataConfigService.getNoConfigProduct(page, deviceId));
+    }
+
+    @Operation(summary = "鍒犻櫎鏁伴噰閰嶇疆")
+    @DeleteMapping("/deleteDataAcquisitionConfiguration")
+    public Result<?> deleteDataAcquisitionConfiguration(@RequestParam("ids") String ids) {
+        List<String> split = Arrays.asList(ids.split(","));
+        List<String> collect = split.stream().distinct().collect(Collectors.toList());
+        dataConfigService.removeBatchByIds(collect);
+        return Result.success();
+    }
+
+    @Operation(summary = "宸︿晶璁惧鏍戝舰鏍�")
+    @GetMapping("/treeDevice")
+    public Result treeDevice(String deviceName) {
+        return Result.success(deviceService.treeDevice(deviceName));
+    }
+
+
+    @Operation(summary = "璁惧妗f瀵煎嚭")
+    @GetMapping("/exportDeviceFile")
+    public void exportDeviceFile(@RequestParam Integer deviceId, HttpServletResponse response) {
+        deviceService.exportDeviceFile(deviceId, response);
+    }
+
+    @Operation(summary = "浠櫒璁惧涓�瑙堣〃瀵煎嚭")
+    @GetMapping("/exportEquipmentDetails")
+    public void exportEquipmentDetails(HttpServletResponse response) {
+        deviceService.exportEquipmentDetails(response);
+    }
+
+    @Operation(summary = "涓嬭浇璁惧瀵煎叆妯℃澘")
+    @GetMapping("/importTemplate")
+    public void importTemplate(HttpServletResponse response) {
+        deviceService.downloadImportTemplate(response);
+    }
+
+    @Operation(summary = "瀵煎叆璁惧")
+    @PostMapping("/importDevice")
+    public Result importDevice(MultipartFile file) {
+        return Result.success(deviceService.importDevice(file));
+    }
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceDocumentsController.java b/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceDocumentsController.java
new file mode 100644
index 0000000..653c072
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceDocumentsController.java
@@ -0,0 +1,92 @@
+package com.ruoyi.device.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.device.pojo.DeviceDocuments;
+import com.ruoyi.device.service.DeviceDocumentsService;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
+import org.springframework.web.bind.annotation.*;
+
+import jakarta.annotation.Resource;
+
+
+/**
+ * 璁惧妗f鏂囨。
+ *
+ * @author zhuo
+ * @since 2025-02-28
+ */
+@RestController
+@Tag(name = "璁惧妗f鏂囨。")
+@RequestMapping("/deviceDocuments")
+public class DeviceDocumentsController {
+
+    @Resource
+    private DeviceDocumentsService deviceDocumentsService;
+
+
+    /**
+     * 鏂板璁惧妗f
+     * @param document
+     * @return
+     */
+    @Operation(summary = "鏂板璁惧妗f")
+    @PostMapping("/addDocument")
+    public Result addDocument(@RequestBody DeviceDocuments document) {
+        if (document.getDeviceId() == null) {
+            throw new RuntimeException("璁惧id涓虹┖");
+        }
+        deviceDocumentsService.save(document);
+        return Result.success();
+    }
+
+    /**
+     * 鏌ヨ璁惧妗f淇℃伅
+     * @param id
+     * @return
+     */
+    @Operation(summary = "鏌ヨ璁惧妗f淇℃伅")
+    @GetMapping("/getDocumentById")
+    public Result getDocumentById(Integer id) {
+        return Result.success(deviceDocumentsService.getById(id));
+    }
+
+    /**
+     * 淇敼璁惧妗f
+     * @param document
+     * @return
+     */
+    @Operation(summary = "淇敼璁惧妗f")
+    @PostMapping("/updateDocument")
+    public Result updateDocument(@RequestBody DeviceDocuments document) {
+        return Result.success(deviceDocumentsService.updateById(document));
+    }
+
+    /**
+     * 鍒犻櫎璁惧妗f
+     * @param id
+     * @return
+     */
+    @Operation(summary = "鍒犻櫎璁惧妗f")
+    @DeleteMapping("/deleteDocumentById")
+    public Result deleteDocumentById(Integer id) {
+        return Result.success(deviceDocumentsService.removeById(id));
+    }
+
+    /**
+     * 鏌ヨ璁惧妗f鍒楄〃
+     * @param deviceId
+     * @return
+     */
+    @Operation(summary = "鏌ヨ璁惧妗f鍒楄〃")
+    @GetMapping("/getAllDocuments")
+    public Result getAllDocuments(Integer deviceId) {
+        LambdaQueryWrapper<DeviceDocuments> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+        lambdaQueryWrapper.eq(DeviceDocuments::getDeviceId, deviceId);
+        return Result.success(deviceDocumentsService.list(lambdaQueryWrapper));
+    }
+
+}
+
diff --git a/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceExaminePlanController.java b/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceExaminePlanController.java
new file mode 100644
index 0000000..deeeb1c
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceExaminePlanController.java
@@ -0,0 +1,274 @@
+package com.ruoyi.device.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.device.dto.DeviceExaminePlanDetailsDto;
+import com.ruoyi.device.dto.DeviceExaminePlanDto;
+import com.ruoyi.device.dto.DeviceExamineRecordContrastDto;
+import com.ruoyi.device.dto.DeviceExamineRecordDto;
+import com.ruoyi.device.pojo.DeviceExaminePlan;
+import com.ruoyi.device.pojo.DeviceExaminePlanDetails;
+import com.ruoyi.device.service.DeviceExaminePlanDetailsService;
+import com.ruoyi.device.service.DeviceExaminePlanService;
+import com.ruoyi.device.service.DeviceExamineRecordContrastService;
+import com.ruoyi.device.service.DeviceExamineRecordService;
+import com.ruoyi.framework.exception.ErrorException;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import jakarta.servlet.http.HttpServletResponse;
+import java.util.Map;
+
+/**
+ * <p>
+ * 璁惧鏍告煡璁″垝涓昏〃 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-16 07:14:04
+ */
+@Tag(name = "璁惧鏍告煡璁″垝")
+@AllArgsConstructor
+@RestController
+@RequestMapping("/deviceExaminePlan")
+public class DeviceExaminePlanController {
+
+    private DeviceExaminePlanService deviceExaminePlanService;
+
+    private DeviceExaminePlanDetailsService deviceExaminePlanDetailsService;
+
+    private DeviceExamineRecordService deviceExamineRecordService;
+
+    private DeviceExamineRecordContrastService deviceExamineRecordContrastService;
+
+
+    /**
+     * 鏂板璁惧鏍告煡璁″垝
+     * @return
+     */
+    @Operation(summary = "鏂板璁惧鏍告煡璁″垝")
+    @PostMapping("/addDeviceExaminePlan")
+    public Result addDeviceExaminePlan(@RequestBody DeviceExaminePlanDto examinePlanDto){
+        return Result.success(deviceExaminePlanService.addDeviceExaminePlan(examinePlanDto));
+    }
+
+    /**
+     * 淇敼璁惧鏍告煡璁″垝
+     * @param examinePlanDto 璁惧鏍告煡璁″垝
+     */
+    @Operation(summary = "鎵归噺淇敼璁惧鏍告煡璁″垝")
+    @PostMapping("/updateDeviceExaminePlan")
+    public Result updateDeviceExaminePlan(@RequestBody DeviceExaminePlanDto examinePlanDto) {
+        return Result.success(deviceExaminePlanService.updateDeviceExaminePlan(examinePlanDto));
+    }
+
+    /**
+     * 鏌ヨ璁惧鏍告煡璁″垝璇︽儏
+     */
+    @Operation(summary = "鏌ヨ璁惧鏍告煡璁″垝璇︽儏")
+    @GetMapping("/getDeviceExaminePlan")
+    public Result<DeviceExaminePlanDto> getDeviceExaminePlan(Integer planId) {
+        return Result.success(deviceExaminePlanService.getDeviceExaminePlan(planId));
+    }
+
+    /**
+     * 瀵煎叆璁惧鏍告煡璁″垝
+     * @return
+     */
+    @Operation(summary = "瀵煎叆璁惧鏍告煡璁″垝")
+    @PostMapping("/importDeviceExaminePlan")
+    public Result importDeviceExaminePlan(MultipartFile file){
+        return Result.success(deviceExaminePlanService.importDeviceExaminePlan(file));
+    }
+
+
+    /**
+     * 璁惧鏍告煡璁″垝鍒犻櫎
+     * @return
+     */
+    @Operation(summary = "璁惧鏍告煡璁″垝鍒犻櫎")
+    @DeleteMapping("/delDeviceExaminePlan")
+    public Result delDeviceExaminePlan(Integer planId){
+        return Result.success(deviceExaminePlanService.removeById(planId));
+    }
+
+
+    /**
+     * 璁惧鏍告煡璁″垝鎵瑰噯
+     * @return
+     */
+    @Operation(summary = "鎻愪氦鎵瑰噯")
+    @PostMapping("/submitRatifyDeviceExaminePlan")
+    public Result submitRatifyDeviceExaminePlan(@RequestBody DeviceExaminePlan DeviceExaminePlan){
+        return Result.success(deviceExaminePlanService.submitRatifyDeviceExaminePlan(DeviceExaminePlan));
+    }
+
+    /**
+     * 璁惧鏍告煡璁″垝鎵瑰噯
+     * @return
+     */
+    @Operation(summary = "璁惧鏍告煡璁″垝鎵瑰噯")
+    @PostMapping("/ratifyDeviceExaminePlan")
+    public Result ratifyDeviceExaminePlan(@RequestBody DeviceExaminePlan DeviceExaminePlan){
+        return Result.success(deviceExaminePlanService.ratifyDeviceExaminePlan(DeviceExaminePlan));
+    }
+
+
+    /**
+     * 璁惧鏍告煡璁″垝鍒楄〃
+     * @return
+     */
+    @Operation(summary = "璁惧鏍告煡璁″垝鍒楄〃")
+    @GetMapping("/pageDeviceExaminePlan")
+    public Result<IPage<DeviceExaminePlanDto>> pageDeviceExaminePlan(Page page, DeviceExaminePlan DeviceExaminePlan) {
+        return Result.success(deviceExaminePlanService.pageDeviceExaminePlan(page, DeviceExaminePlan));
+    }
+
+    /**
+     * 璁惧鏍告煡璁″垝璇︽儏鍒楄〃
+     * @return
+     */
+    @Operation(summary = "璁惧鏍告煡璁″垝璇︽儏鍒楄〃")
+    @GetMapping("/pageDeviceExaminePlanDetail")
+    public Result<IPage<DeviceExaminePlanDetailsDto>> pageDeviceExaminePlanDetail(Page page, DeviceExaminePlanDetails deviceExaminePlanDetails) {
+        return Result.success(deviceExaminePlanService.pageDeviceExaminePlanDetail(page, deviceExaminePlanDetails));
+    }
+
+    /**
+     * 鏂板璁惧鏍告煡璁″垝璇︽儏
+     * @return
+     */
+    @Operation(summary = "鏂板璁惧鏍告煡璁″垝璇︽儏")
+    @PostMapping("/addDeviceExaminePlanDetail")
+    public Result addDeviceExaminePlanDetail(@RequestBody DeviceExaminePlanDetails deviceExaminePlanDetail){
+        if (deviceExaminePlanDetail.getPlanId() == null) {
+            throw new ErrorException("缂哄皯璁惧鏍告煡璁″垝涓昏〃id");
+        }
+        return Result.success(deviceExaminePlanDetailsService.save(deviceExaminePlanDetail));
+    }
+
+    /**
+     * 淇敼璁惧鏍告煡璁″垝璇︽儏
+     * @return
+     */
+    @Operation(summary = "淇敼璁惧鏍告煡璁″垝璇︽儏")
+    @PostMapping("/updateDeviceExaminePlanDetail")
+    public Result updateDeviceExaminePlanDetail(@RequestBody DeviceExaminePlanDetails deviceExaminePlanDetail){
+        return Result.success(deviceExaminePlanDetailsService.updateById(deviceExaminePlanDetail));
+    }
+
+    /**
+     * 鍒犻櫎璁惧鏍告煡璁″垝璇︽儏
+     * @return
+     */
+    @Operation(summary = "鍒犻櫎璁惧鏍告煡璁″垝璇︽儏")
+    @DeleteMapping("/delDeviceExaminePlanDetail")
+    public Result delDeviceExaminePlanDetail(Integer planDetailsId){
+        return Result.success(deviceExaminePlanDetailsService.removeById(planDetailsId));
+    }
+
+    /**
+     * 瀵煎嚭璁惧鏍告煡璁″垝
+     * @param planId 璁惧鏍告煡璁″垝id
+     * @return
+     */
+    @Operation(summary = "瀵煎嚭璁惧鏍告煡璁″垝")
+    @GetMapping("/exportDeviceExaminePlanDetail")
+    public void exportDeviceExaminePlanDetail(Integer planId, HttpServletResponse response){
+        deviceExaminePlanService.exportDeviceExaminePlanDetail(planId, response);
+    }
+
+    /*********************************************** 鎶ュ憡 **************************************************/
+
+    /**
+     * 鏌ヨ鏍告煡璁板綍
+     * @return
+     */
+    @Operation(summary = "鏌ヨ鏍告煡璁板綍")
+    @GetMapping("/getExamineRecord")
+    public Result<DeviceExamineRecordDto> getExamineRecord(Integer planDetailsId){
+        return Result.success(deviceExamineRecordService.getExamineRecord(planDetailsId));
+    }
+
+    /**
+     * 鏂板鏍告煡璁板綍
+     * @return
+     */
+    @Operation(summary = "鏂板鏍告煡璁板綍")
+    @PostMapping("/addExamineRecord")
+    public Result addExamineRecord(@RequestBody DeviceExamineRecordDto deviceExamineRecordDto){
+        return Result.success(deviceExamineRecordService.addExamineRecord(deviceExamineRecordDto));
+    }
+
+
+    /**
+     * 澶嶆牳鏍告煡璁板綍
+     * @return
+     */
+    @Operation(summary = "澶嶆牳鏍告煡璁板綍")
+    @PostMapping("/reviewExamineRecord")
+    public Result reviewExamineRecord(@RequestBody DeviceExamineRecordDto deviceExamineRecordDto){
+        return Result.success(deviceExamineRecordService.reviewExamineRecord(deviceExamineRecordDto));
+    }
+
+    /**
+     * 瀵煎嚭澶嶆牳鏍告煡璁板綍
+     * @param planDetailsId
+     * @return
+     */
+    @Operation(summary = "瀵煎嚭澶嶆牳鏍告煡璁板綍")
+    @GetMapping("/exportReviewExamineRecordDetail")
+    public void exportReviewExamineRecordDetail(Integer planDetailsId, HttpServletResponse response){
+        deviceExamineRecordService.exportReviewExamineRecordDetail(planDetailsId, response);
+    }
+
+    /*********************************************** 鎶ュ憡瀵规瘮 **************************************************/
+
+
+    /**
+     * 鏌ヨ鏍告煡瀵规瘮璁板綍
+     * @return
+     */
+    @Operation(summary = "鏌ヨ鏍告煡瀵规瘮璁板綍")
+    @GetMapping("/getExamineRecordContrast")
+    public Result<DeviceExamineRecordContrastDto> getExamineRecordContrast(Integer planDetailsId){
+        return Result.success(deviceExamineRecordContrastService.getExamineRecordContrast(planDetailsId));
+    }
+
+    /**
+     * 鏂板鏍告煡瀵规瘮璁板綍
+     * @return
+     */
+    @Operation(summary = "鏂板鏍告煡瀵规瘮璁板綍")
+    @PostMapping("/addExamineRecordContrast")
+    public Result addExamineRecordContrast(@RequestBody DeviceExamineRecordContrastDto deviceExamineRecordContrastDto){
+        return Result.success(deviceExamineRecordContrastService.addExamineRecordContrast(deviceExamineRecordContrastDto));
+    }
+
+
+    /**
+     * 瀹℃牳鏍告煡瀵规瘮璁板綍
+     * @return
+     */
+    @Operation(summary = "瀹℃牳鏍告煡瀵规瘮璁板綍")
+    @PostMapping("/reviewExamineRecordContrast")
+    public Result reviewExamineRecordContrast(@RequestBody DeviceExamineRecordContrastDto deviceExamineRecordContrastDto){
+        return Result.success(deviceExamineRecordContrastService.reviewExamineRecordContrast(deviceExamineRecordContrastDto));
+    }
+
+    /**
+     * 瀵煎嚭瀹℃牳鏍告煡瀵规瘮璁板綍
+     * @param planDetailsId
+     * @return
+     */
+    @Operation(summary = "瀵煎嚭瀹℃牳鏍告煡瀵规瘮璁板綍")
+    @GetMapping("/exportReviewExamineRecordContrast")
+    public Result exportReviewExamineRecordContrast(Integer planDetailsId, HttpServletResponse response){
+        deviceExamineRecordContrastService.exportReviewExamineRecordContrast(planDetailsId, response);
+        return Result.success();
+    }
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceExternalApplyController.java b/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceExternalApplyController.java
new file mode 100644
index 0000000..0081ade
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceExternalApplyController.java
@@ -0,0 +1,84 @@
+package com.ruoyi.device.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.device.pojo.DeviceExternalApply;
+import com.ruoyi.device.service.DeviceExternalApplyService;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+
+import jakarta.servlet.http.HttpServletResponse;
+import java.util.Map;
+
+/**
+ * <p>
+ * 鍒╃敤澶栭儴璁惧鐢宠琛� 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-17 10:28:43
+ */
+@Tag(name = "鍒╃敤澶栭儴璁惧鐢宠琛�")
+@AllArgsConstructor
+@RestController
+@RequestMapping("/deviceExternalApply")
+public class DeviceExternalApplyController {
+
+    private DeviceExternalApplyService deviceExternalApplyService;
+
+
+    /**
+     * 鍒╃敤澶栭儴璁惧鐢宠鍒楄〃
+     * @return
+     */
+    @Operation(summary = "鍒╃敤澶栭儴璁惧鐢宠鍒楄〃")
+    @GetMapping("/pageDeviceExternalApply")
+    public Result<IPage<DeviceExternalApply>> pageDeviceExternalApply(Page page, DeviceExternalApply deviceExternalApply) throws Exception {
+        return Result.success(deviceExternalApplyService.pageDeviceExternalApply(page, deviceExternalApply));
+    }
+
+    /**
+     * 鏌ヨ鍒╃敤澶栭儴璁惧鐢宠
+     * @return
+     */
+    @Operation(summary = "鏌ヨ鍒╃敤澶栭儴璁惧鐢宠")
+    @GetMapping("/getDeviceExternalApply")
+    public Result getDeviceExternalApply(Integer externalApplyId){
+        return Result.success(deviceExternalApplyService.getById(externalApplyId));
+    }
+
+    /**
+     * 鍒犻櫎鍒╃敤澶栭儴璁惧鐢宠
+     * @return
+     */
+    @Operation(summary = "鍒犻櫎鍒╃敤澶栭儴璁惧鐢宠")
+    @DeleteMapping("/delDeviceExternalApply")
+    public Result delDeviceExternalApply(Integer externalApplyId){
+        return Result.success(deviceExternalApplyService.removeById(externalApplyId));
+    }
+
+    /**
+     * 鏂板鍒╃敤澶栭儴璁惧鐢宠
+     * @return
+     */
+    @Operation(summary = "鏂板鍒╃敤澶栭儴璁惧鐢宠")
+    @PostMapping("/addDeviceExternalApply")
+    public Result addDeviceExternalApply(@RequestBody DeviceExternalApply deviceExternalApply){
+        return Result.success(deviceExternalApplyService.addDeviceExternalApply(deviceExternalApply));
+    }
+
+    /**
+     * 瀵煎嚭鍒╃敤澶栭儴璁惧鐢宠
+     * @param externalApplyId 澶栭儴璁惧鐢宠id
+     * @return
+     */
+    @Operation(summary = "瀵煎嚭鍒╃敤澶栭儴璁惧鐢宠")
+    @GetMapping("/exportDeviceExternalApply")
+    public Result exportDeviceExternalApply(Integer externalApplyId, HttpServletResponse response){
+        deviceExternalApplyService.exportDeviceExternalApply(externalApplyId, response);
+        return Result.success();
+    }
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceImpowerController.java b/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceImpowerController.java
new file mode 100644
index 0000000..453f99d
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceImpowerController.java
@@ -0,0 +1,108 @@
+package com.ruoyi.device.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.device.dto.DeviceImpowerDto;
+import com.ruoyi.device.pojo.DeviceImpower;
+import com.ruoyi.device.service.DeviceImpowerService;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
+import org.springframework.web.bind.annotation.*;
+
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletResponse;
+
+/**
+ * <p>
+ * 璁惧浣跨敤鎺堟潈琛� 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author
+ * @since 2025-04-17 03:23:23
+ */
+@Tag(name = "璁惧浣跨敤鎺堟潈琛�")
+@RestController
+@RequestMapping("/deviceImpower")
+public class DeviceImpowerController {
+
+    @Resource
+    private DeviceImpowerService deviceImpowerService;
+
+    /**
+     * 鍒嗛〉鏌ヨ浣跨敤鎺堟潈
+     * @return
+     */
+    @Operation(summary = "鍒嗛〉鏌ヨ浣跨敤鎺堟潈")
+    @GetMapping("selectDeviceImpowerByPage")
+    public Result<IPage<DeviceImpower>> selectDeviceImpowerByPage(Page page, DeviceImpowerDto itemParameter){
+        return deviceImpowerService.selectDeviceImpowerByPage(page, itemParameter);
+    }
+
+    /**
+     * 鏂板浣跨敤鎺堟潈
+     * @param deviceImpowerDto 浣跨敤鎺堟潈
+     */
+    @Operation(summary = "鏂板浣跨敤鎺堟潈")
+    @PostMapping("/addImpower")
+    public Result addImpower(@RequestBody DeviceImpowerDto deviceImpowerDto) {
+        return deviceImpowerService.addImpower(deviceImpowerDto);
+    }
+
+    /**
+     * 淇敼浣跨敤鎺堟潈
+     * @param deviceImpowerDto 浣跨敤鎺堟潈
+     */
+    @Operation(summary = "淇敼浣跨敤鎺堟潈")
+    @PostMapping("/updateImpower")
+    public Result updateImpower(@RequestBody DeviceImpowerDto deviceImpowerDto) {
+        return deviceImpowerService.updateImpower(deviceImpowerDto);
+    }
+
+    /**
+     * 鍒犻櫎浣跨敤鎺堟潈
+     * @param deviceImpowerDto 浣跨敤鎺堟潈
+     */
+    @Operation(summary = "鍒犻櫎浣跨敤鎺堟潈")
+    @DeleteMapping("/deleteImpower")
+    public Result deleteImpower(DeviceImpowerDto deviceImpowerDto) {
+        return deviceImpowerService.deleteImpower(deviceImpowerDto);
+    }
+
+    /**
+     * 鏌ヨ浣跨敤鎺堟潈璇︽儏
+     */
+    @Operation(summary = "鏌ヨ浣跨敤鎺堟潈璇︽儏")
+    @GetMapping("/getImpowerDetail")
+    public Result<DeviceImpowerDto> getImpowerDetail(Integer impowerId) {
+        return deviceImpowerService.getImpowerDetail(impowerId);
+    }
+
+    /**
+     * 鎻愪氦鎵瑰噯
+     */
+    @Operation(summary = "鎻愪氦鎵瑰噯閫氱煡")
+    @PostMapping("/submitReviewImpowerStatus")
+    public Result submitReviewImpowerStatus(@RequestBody DeviceImpowerDto deviceImpowerDto) {
+        return deviceImpowerService.submitReviewImpowerStatus(deviceImpowerDto);
+    }
+
+    /**
+     * 浣跨敤鎺堟潈鎵瑰噯
+     */
+    @Operation(summary = "鎺堟潈鎵瑰噯")
+    @PostMapping("/reviewImpowerStatus")
+    public Result reviewImpowerStatus(@RequestBody DeviceImpowerDto deviceImpowerDto) {
+        return deviceImpowerService.reviewImpowerStatus(deviceImpowerDto);
+    }
+
+    /**
+     * 瀵煎嚭浣跨敤鎺堟潈
+     */
+    @Operation(summary = "瀵煎嚭浣跨敤鎺堟潈")
+    @GetMapping("/exportDeviceImpower")
+    public void exportDeviceImpower(@RequestParam("impowerId") Integer impowerId, HttpServletResponse response) {
+        deviceImpowerService.exportDeviceImpowerDto(impowerId, response);
+    }
+
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceInspectionRecordController.java b/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceInspectionRecordController.java
new file mode 100644
index 0000000..2948d54
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceInspectionRecordController.java
@@ -0,0 +1,99 @@
+package com.ruoyi.device.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.device.dto.DeviceInspectionRecordDto;
+import com.ruoyi.device.pojo.DeviceInspectionRecord;
+import com.ruoyi.device.service.DeviceInspectionRecordService;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
+import lombok.SneakyThrows;
+import org.springframework.web.bind.annotation.*;
+
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletResponse;
+import java.util.Map;
+
+/**
+ * <p>
+ *  璁惧鐐规璁板綍琛�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-16 04:25:14
+ */
+@Tag(name = "璁惧鐐规璁板綍")
+@RestController
+@RequestMapping("/deviceInspectionRecord")
+public class DeviceInspectionRecordController {
+    @Resource
+    private DeviceInspectionRecordService deviceInspectionRecordService;
+
+    /**
+     * 鍒嗛〉鏌ヨ璁惧鐐规璁板綍
+     */
+    @Operation(summary = "鍒嗛〉鏌ヨ璁惧鐐规璁板綍")
+    @GetMapping("/getDeviceInspectionRecordByPage")
+    public Result<IPage<DeviceInspectionRecord>> getDeviceInspectionRecordByPage(Page page, DeviceInspectionRecordDto itemParameter) {
+        return deviceInspectionRecordService.getDeviceInspectionRecordByPage(page, itemParameter);
+    }
+
+    /**
+     * 鏌ヨ鐐规璇︽儏
+     */
+    @Operation(summary = "鏌ヨ鐐规璇︽儏")
+    @GetMapping("/getDeviceInspectionRecord")
+    public Result getDeviceInspectionRecord(Integer inspectionRecordId) {
+        return deviceInspectionRecordService.getDeviceInspectionRecord(inspectionRecordId);
+    }
+
+    /**
+     * 鏂板璁惧鐐规璁板綍
+     * @param deviceInspectionRecord  璁惧鐐规璁板綍
+     */
+    @Operation(summary = "鏂板璁惧鐐规璁板綍")
+    @PostMapping("/addDeviceInspectionRecord")
+    public Result addDeviceInspectionRecord(@RequestBody DeviceInspectionRecordDto deviceInspectionRecord) {
+        return deviceInspectionRecordService.addDeviceInspectionRecord(deviceInspectionRecord);
+    }
+
+    /**
+     * 淇敼璁惧鐐规璁板綍
+     */
+    @Operation(summary = "淇敼璁惧鐐规璁板綍")
+    @PostMapping("/updateDeviceInspectionRecord")
+    public Result updateDeviceInspectionRecord(@RequestBody DeviceInspectionRecordDto deviceInspectionRecord) {
+        return deviceInspectionRecordService.updateInspectionRecordAndDetails(deviceInspectionRecord);
+    }
+
+    /**
+     * 鍒犻櫎璁惧鐐规璁板綍
+     */
+    @Operation(summary = "鍒犻櫎璁惧鐐规璁板綍")
+    @DeleteMapping("/deleteDeviceInspectionRecord")
+    public Result deleteDeviceInspectionRecord(DeviceInspectionRecordDto deviceInspectionRecord) {
+        return deviceInspectionRecordService.deleteDeviceInspectionRecordOrDetails(deviceInspectionRecord);
+    }
+
+
+    /**
+     * 澶嶆牳鐐规璁板綍
+     * @return
+     */
+    @Operation(summary = "澶嶆牳鏍告煡璁板綍")
+    @PostMapping("/reviewDeviceInspectionRecord")
+    public Result reviewDeviceInspectionRecord(@RequestBody DeviceInspectionRecordDto deviceExamineRecordDto){
+        return deviceInspectionRecordService.reviewDeviceInspectionRecord(deviceExamineRecordDto);
+    }
+
+
+    /**
+     * 瀵煎嚭璁惧鐐规璁板綍
+     */
+    @Operation(summary = "瀵煎嚭璁惧鐐规璁板綍")
+    @GetMapping("/exportDeviceInspectionRecord")
+    public Result exportDeviceInspectionRecord(@RequestParam("inspectionRecordId") Integer inspectionRecordId, HttpServletResponse response) {
+        return deviceInspectionRecordService.exportDeviceInspectionRecord(inspectionRecordId, response);
+    }
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceInstructionController.java b/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceInstructionController.java
new file mode 100644
index 0000000..7d2a469
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceInstructionController.java
@@ -0,0 +1,105 @@
+package com.ruoyi.device.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.device.dto.DeviceInstructionDto;
+import com.ruoyi.device.dto.DeviceOperationInstructionDto;
+import com.ruoyi.device.pojo.DeviceInstruction;
+import com.ruoyi.device.pojo.OperationInstruction;
+import com.ruoyi.device.service.DeviceInstructionService;
+import com.ruoyi.device.service.DeviceOperationInstructionService;
+import io.swagger.v3.oas.annotations.Operation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.time.LocalDateTime;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 浣滀笟鎸囧涔︽坊鍔犲彈鎺ф枃浠惰〃 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author
+ * @since 2024-12-04 10:29:18
+ */
+@RestController
+@RequestMapping("/deviceInstruction")
+public class DeviceInstructionController {
+
+    @Autowired
+    private DeviceInstructionService deviceInstructionService;
+
+    @Autowired
+    private DeviceOperationInstructionService deviceOperationInstructionService;
+
+
+    @Operation(summary = "浣滀笟鎸囧涔﹀垎椤�")
+    @GetMapping("/pageByPageQueryOfHomeworkInstructions")
+    public Result<IPage<DeviceOperationInstructionDto>> pageByPageQueryOfHomeworkInstructions(Page page, DeviceOperationInstructionDto operationInstructionDto){
+        return Result.success(deviceInstructionService.pageByPageQueryOfHomeworkInstructions(page, operationInstructionDto));
+    }
+
+    @Operation(summary = "浣滀笟鎸囧涔︽柊澧�")
+    @PostMapping("/newHomeworkGuidebookAdded")
+    public Result newHomeworkGuidebookAdded(@RequestBody DeviceInstructionDto instructionDto){
+        deviceInstructionService.newHomeworkGuidebookAdded(instructionDto);
+        return Result.success();
+    }
+
+    @Operation(summary = "浣滀笟鎸囧涔﹁鎯�")
+    @GetMapping("/homeworkGuidebookEditor")
+    public Result<Map<String, Object>> homeworkGuidebookEditor(Integer instructionId){
+        DeviceInstruction instruction = deviceInstructionService.getById(instructionId);
+        List<DeviceOperationInstructionDto> list = deviceOperationInstructionService.homeworkGuidebookEditor(instructionId);
+        HashMap<String, Object> map = new HashMap<>();
+        map.put("list", list);
+        map.put("instruction", instruction);
+        return Result.success(map);
+    }
+
+    @Operation(summary = "浣滀笟鎸囧涔﹀彈鎺ф枃浠跺垹闄�")
+    @DeleteMapping("/deleteHomeworkGuidebook")
+    public Result deleteHomeworkGuidebook(String ids){
+        if (ObjectUtils.isNotEmpty(ids)) {
+            String[] idArray = ids.split(",");
+            deviceOperationInstructionService.removeBatchByIds(Arrays.asList(idArray));
+        }
+        return Result.success();
+    }
+
+    @Operation(summary = "浣滀笟鎸囧涔﹀垹闄�")
+    @DeleteMapping("/homeworkGuidebook")
+    public Result homeworkGuidebook(String id, String instructionId){
+        // 鍒犻櫎瀛愯〃鏁版嵁
+        deviceOperationInstructionService.removeById(id);
+        // 濡傛灉瀛愯〃鏁版嵁涓虹┖
+        long count = deviceOperationInstructionService.count(Wrappers.<OperationInstruction>lambdaQuery()
+                .eq(OperationInstruction::getInstructionId, instructionId));
+        // 閭d箞灏卞垹闄ょ埗琛ㄦ暟鎹�
+        if (count < 1) {
+            deviceInstructionService.removeById(id);
+        }
+        return Result.success();
+    }
+
+    @Operation(summary = "浣滀笟鎸囧涔﹀鎵�")
+    @PostMapping("/approvalOfHomeworkInstructionManual")
+    public Result approvalOfHomeworkInstructionManual(@RequestBody Map<String,Object> map){
+        Integer id =(Integer) map.get("id");
+        Boolean status =(Boolean) map.get("status");
+        deviceOperationInstructionService.update(Wrappers.<OperationInstruction>lambdaUpdate()
+                .eq(OperationInstruction::getId, id)
+                .set(OperationInstruction::getStatus, status)
+                .set(OperationInstruction::getApproverId, SecurityUtils.getUserId().intValue())
+                .set(OperationInstruction::getEntryIntoForceTime, LocalDateTime.now()));
+        return Result.success();
+    }
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceMaintenanceController.java b/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceMaintenanceController.java
new file mode 100644
index 0000000..7220c40
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceMaintenanceController.java
@@ -0,0 +1,81 @@
+package com.ruoyi.device.controller;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.common.core.domain.entity.User;
+import com.ruoyi.device.dto.DeviceMaintenanceDto;
+import com.ruoyi.device.pojo.DeviceMaintenance;
+import com.ruoyi.device.service.DeviceMaintenanceService;
+import com.ruoyi.system.mapper.UserMapper;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import jakarta.servlet.http.HttpServletResponse;
+
+/**
+ * todo: 瀛欐渤婊�
+ */
+@RestController
+@Tag(name = "璁惧缁存姢淇濆吇")
+@RequestMapping("/deviceMaintain")
+public class DeviceMaintenanceController {
+
+    @Autowired
+    private DeviceMaintenanceService deviceMaintenanceService;
+
+    @Autowired
+    private UserMapper userMapper;
+
+
+    /**
+     * 璁惧缁存姢鍒嗛〉鏌ヨ
+     * @param deviceMaintenance
+     * @return
+     */
+    @Operation(summary = "璁惧缁存姢鍒嗛〉鏌ヨ")
+    @GetMapping("/selectDeviceMaintenancePage")
+    public Result selectDeviceMaintenancePage(Page page, DeviceMaintenanceDto deviceMaintenance){
+        return Result.success(deviceMaintenanceService.selectDeviceMaintenancePage(page, deviceMaintenance));
+    }
+
+
+    /**
+     * 鏂板淇敼璁惧缁存姢淇濆吇
+     * @param deviceMaintenance
+     * @return
+     */
+    @Operation(summary = "鏂板淇敼璁惧缁存姢淇濆吇")
+    @PostMapping("/addDeviceMaintenance")
+    public Result addDeviceMaintenance(@RequestBody DeviceMaintenance deviceMaintenance){
+        if (deviceMaintenance.getDeviceId() == null) {
+            throw new RuntimeException("缂哄皯璁惧id");
+        }
+        User user = userMapper.selectById(deviceMaintenance.getMaintenanceUserId());
+        deviceMaintenance.setMaintenanceUserName(user.getName());
+
+        return Result.success(deviceMaintenanceService.saveOrUpdate(deviceMaintenance));
+    }
+
+    /**
+     * 鍒犻櫎淇敼璁惧缁存姢淇濆吇
+     * @param id
+     * @return
+     */
+    @Operation(summary = "鍒犻櫎淇敼璁惧缁存姢淇濆吇")
+    @DeleteMapping("/deleteDeviceMaintenance")
+    public Result deleteDeviceMaintenance(Integer id){
+        return Result.success(deviceMaintenanceService.removeById(id));
+    }
+
+    /**
+     * 瀵煎嚭璁惧缁存姢淇濆吇
+     */
+    @Operation(summary = "瀵煎嚭璁惧缁存姢淇濆吇")
+    @GetMapping("/exportDeviceMaintenance")
+    public void exportDeviceMaintenance(@RequestParam("deviceId") Integer deviceId, HttpServletResponse response) {
+        deviceMaintenanceService.exportDeviceMaintenance(deviceId, response);
+    }
+
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceMaintenancePlanController.java b/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceMaintenancePlanController.java
new file mode 100644
index 0000000..81be805
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceMaintenancePlanController.java
@@ -0,0 +1,108 @@
+package com.ruoyi.device.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.device.dto.DeviceMaintenancePlanDto;
+import com.ruoyi.device.pojo.DeviceMaintenancePlan;
+import com.ruoyi.device.service.DeviceMaintenancePlanService;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
+import lombok.SneakyThrows;
+import org.springframework.web.bind.annotation.*;
+
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletResponse;
+import java.util.Map;
+
+/**
+ * <p>
+ * 璁惧淇濆吇璁″垝琛� 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-16 06:10:52
+ */
+@Tag(name = "璁惧淇濆吇璁″垝")
+@RestController
+@RequestMapping("/deviceMaintenancePlan")
+public class DeviceMaintenancePlanController {
+    @Resource
+    private DeviceMaintenancePlanService deviceMaintenancePlanService;
+
+    /**
+     * 鍒嗛〉鏌ヨ璁惧淇濆吇璁″垝
+     * @return
+     */
+    @Operation(summary = "鍒嗛〉鏌ヨ璁惧淇濆吇璁″垝")
+    @GetMapping("selectDeviceMaintenancePlanByPage")
+    public Result<IPage<DeviceMaintenancePlan>> selectDeviceMaintenancePlanByPage(Page page, DeviceMaintenancePlanDto itemParameter){
+        return deviceMaintenancePlanService.selectDeviceMaintenancePlanByPage(page, itemParameter);
+    }
+
+    /**
+     * 鏂板璁惧淇濆吇璁″垝
+     * @param deviceMaintenancePlanDto 璁惧淇濆吇璁″垝
+     */
+    @Operation(summary = "鏂板璁惧淇濆吇璁″垝")
+    @PostMapping("/addMaintenancePlan")
+    public Result addMaintenancePlan(@RequestBody DeviceMaintenancePlanDto deviceMaintenancePlanDto) {
+        return deviceMaintenancePlanService.addMaintenancePlan(deviceMaintenancePlanDto);
+    }
+
+    /**
+     * 淇敼璁惧淇濆吇璁″垝
+     * @param deviceMaintenancePlanDto 璁惧淇濆吇璁″垝
+     */
+    @Operation(summary = "淇敼璁惧淇濆吇璁″垝")
+    @PostMapping("/updateMaintenancePlan")
+    public Result updateMaintenancePlan(@RequestBody DeviceMaintenancePlanDto deviceMaintenancePlanDto) {
+        return deviceMaintenancePlanService.updateMaintenancePlan(deviceMaintenancePlanDto);
+    }
+
+    /**
+     * 鍒犻櫎璁惧淇濆吇璁″垝
+     * @param deviceMaintenancePlanDto 璁惧淇濆吇璁″垝
+     */
+    @Operation(summary = "鍒犻櫎璁惧淇濆吇璁″垝")
+    @DeleteMapping("/deleteMaintenancePlan")
+    public Result deleteMaintenancePlan(DeviceMaintenancePlanDto deviceMaintenancePlanDto) {
+        return deviceMaintenancePlanService.deleteMaintenancePlan(deviceMaintenancePlanDto);
+    }
+
+    /**
+     * 鏌ヨ璁惧淇濆吇璁″垝璇︽儏
+     */
+    @Operation(summary = "鏌ヨ璁惧淇濆吇璁″垝璇︽儏")
+    @GetMapping("/getMaintenancePlanDetail")
+    public Result<DeviceMaintenancePlanDto> getMaintenancePlanDetail(Integer maintenancePlanId) {
+        return deviceMaintenancePlanService.getMaintenancePlanDetail(maintenancePlanId);
+    }
+
+    /**
+     * 瀵煎嚭璁惧淇濆吇璁″垝
+     */
+    @Operation(summary = "瀵煎嚭璁惧淇濆吇璁″垝")
+    @GetMapping("/exportDeviceMaintenancePlan")
+    public Result exportDeviceMaintenancePlan(@RequestParam("maintenancePlanId") Integer maintenancePlanId, HttpServletResponse response) {
+        return deviceMaintenancePlanService.exportDeviceMaintenancePlanDto(maintenancePlanId, response);
+    }
+
+    /**
+     * 鎻愪氦瀹℃牳
+     */
+    @Operation(summary = "鎻愪氦瀹℃牳")
+    @PostMapping("/submitReviewMaintenancePlanStatus")
+    public Result submitReviewMaintenancePlanStatus(@RequestBody DeviceMaintenancePlanDto deviceMaintenancePlanDto) {
+        return deviceMaintenancePlanService.submitReviewMaintenancePlanStatus(deviceMaintenancePlanDto);
+    }
+
+    /**
+     * 瀹℃牳璁惧淇濆吇璁″垝鐘舵��
+     */
+    @Operation(summary = "瀹℃牳璁惧淇濆吇璁″垝鐘舵��")
+    @PostMapping("/reviewMaintenancePlanStatus")
+    public Result reviewMaintenancePlanStatus(@RequestBody DeviceMaintenancePlanDto deviceMaintenancePlanDto) {
+        return deviceMaintenancePlanService.reviewMaintenancePlanStatus(deviceMaintenancePlanDto);
+    }
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceMetricController.java b/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceMetricController.java
new file mode 100644
index 0000000..82dcefd
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceMetricController.java
@@ -0,0 +1,35 @@
+package com.ruoyi.device.controller;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.device.pojo.DeviceMetric;
+import com.ruoyi.device.service.IDeviceMetricService;
+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));
+    }
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceMetricRecordController.java b/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceMetricRecordController.java
new file mode 100644
index 0000000..2f52724
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceMetricRecordController.java
@@ -0,0 +1,89 @@
+package com.ruoyi.device.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.ruoyi.common.core.domain.Result;
+import com.ruoyi.common.numgen.NumberGenerator;
+import com.ruoyi.common.utils.FileSaveUtil;
+import com.ruoyi.device.dto.DeviceMetricRecordDto;
+import com.ruoyi.device.pojo.DeviceMetricRecord;
+import com.ruoyi.device.pojo.DeviceMetricsCopy;
+import com.ruoyi.device.service.DeviceMetricRecordService;
+import com.ruoyi.device.service.DeviceMetricsCopyService;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
+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
+ */
+@Tag(name = "璁惧 - 璁惧鏍″噯")
+@RestController
+@RequestMapping("/deviceMetricRecord")
+public class DeviceMetricRecordController {
+
+    @Autowired
+    private DeviceMetricRecordService deviceMetricRecordService;
+
+    @Autowired
+    private DeviceMetricsCopyService deviceMetricsCopyService;
+
+    @Autowired
+    private NumberGenerator<DeviceMetricRecord> numberGenerator;
+
+    @Operation(summary = "璁惧鏍″噯鍒嗛〉鏌ヨ")
+    @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)));
+    }
+
+    @Operation(summary = "璁惧鏍″噯 鏂板 鏇存柊")
+    @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();
+    }
+
+    @Operation(summary = "璁惧鏍″噯 鍒犻櫎")
+    @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));
+    }
+
+    @Operation(summary = "璁惧鏍″噯 鏍″噯鏉$洰鏌ヨ")
+    @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-device/src/main/java/com/ruoyi/device/controller/DeviceRecordController.java b/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceRecordController.java
new file mode 100644
index 0000000..cec5390
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceRecordController.java
@@ -0,0 +1,63 @@
+package com.ruoyi.device.controller;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.common.numgen.NumberGenerator;
+import com.ruoyi.device.pojo.DeviceRecord;
+import com.ruoyi.device.service.DeviceRecordService;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import jakarta.servlet.http.HttpServletResponse;
+
+/**
+ * <p>
+ * cnas璁惧浣跨敤璁板綍琛� 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-09-21 11:06:47
+ */
+@Tag(name = "璁惧浣跨敤璁板綍")
+@RestController
+@RequestMapping("/deviceRecord")
+public class DeviceRecordController {
+    @Autowired
+    private DeviceRecordService deviceRecordService;
+
+    @Operation(summary = "澶囦娇鐢ㄨ褰曟煡璇�")
+    @GetMapping("/deviceRecordPage")
+    public Result deviceRecordPage(Integer deviceId, Page page, String sampleCode, String managementNumber) {
+        return Result.success(deviceRecordService.deviceRecordPage(deviceId, page, sampleCode, managementNumber));
+    }
+
+    @Operation(summary = "鏂板")
+    @PostMapping("/saveDeviceRecord")
+    public Result saveDeviceRecords(@RequestBody DeviceRecord deviceRecord) {
+        return Result.success(deviceRecordService.save(deviceRecord));
+    }
+
+    /**
+     * 缂栬緫璁惧浣跨敤璁板綍
+     * @param deviceRecord
+     * @return
+     */
+    @Operation(summary = "淇敼")
+    @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));
+    }
+
+    @Operation(summary = "璁惧浣跨敤璁板綍瀵煎嚭")
+    @GetMapping("/exportUseRecord")
+    public void exportUseRecord(Integer deviceId, String exportDate, HttpServletResponse response){
+        deviceRecordService.exportUseRecord(deviceId, exportDate, response);
+    }
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceScrappedController.java b/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceScrappedController.java
new file mode 100644
index 0000000..daad128
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceScrappedController.java
@@ -0,0 +1,82 @@
+package com.ruoyi.device.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.device.pojo.DeviceScrapped;
+import com.ruoyi.device.service.DeviceScrappedService;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+
+import jakarta.servlet.http.HttpServletResponse;
+import java.util.Map;
+
+/**
+ * <p>
+ * 璁惧鎶ュ簾鐢宠琛� 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-17 01:53:47
+ */
+@Tag(name = "璁惧鎶ュ簾鐢宠琛�")
+@AllArgsConstructor
+@RestController
+@RequestMapping("/deviceScrapped")
+public class DeviceScrappedController {
+
+    private DeviceScrappedService deviceScrappedService;
+
+
+    /**
+     * 璁惧鎶ュ簾鐢宠鍒楄〃
+     * @return
+     */
+    @Operation(summary = "璁惧鎶ュ簾鐢宠鍒楄〃")
+    @GetMapping("/pageDeviceScrapped")
+    public Result<IPage<DeviceScrapped>> pageDeviceScrapped(Page page, DeviceScrapped deviceScrapped) {
+        return Result.success(deviceScrappedService.pageDeviceScrapped(page, deviceScrapped));
+    }
+
+    /**
+     * 鏌ヨ璁惧鎶ュ簾鐢宠
+     * @return
+     */
+    @Operation(summary = "鏌ヨ璁惧鎶ュ簾鐢宠")
+    @GetMapping("/getDeviceScrapped")
+    public Result getDeviceScrapped(Integer scrappedId){
+        return Result.success(deviceScrappedService.getById(scrappedId));
+    }
+
+    /**
+     * 鍒犻櫎璁惧鏍告煡璁″垝璇︽儏
+     * @return
+     */
+    @Operation(summary = "鍒犻櫎璁惧鎶ュ簾鐢宠")
+    @DeleteMapping("/delDeviceScrapped")
+    public Result delDeviceScrapped(Integer scrappedId){
+        return Result.success(deviceScrappedService.removeById(scrappedId));
+    }
+
+    /**
+     * 鏂板璁惧鎶ュ簾鐢宠
+     * @return
+     */
+    @Operation(summary = "鏂板璁惧鎶ュ簾鐢宠")
+    @PostMapping("/addDeviceScrapped")
+    public Result addDeviceScrapped(@RequestBody DeviceScrapped deviceScrapped){
+        return Result.success(deviceScrappedService.addDeviceScrapped(deviceScrapped));
+    }
+
+    /**
+     * 瀵煎嚭璁惧鎶ュ簾鐢宠
+     */
+    @Operation(summary = "瀵煎嚭璁惧鎶ュ簾鐢宠")
+    @GetMapping("/exportDeviceScrapped")
+    public Result exportDeviceScrapped(Integer scrappedId, HttpServletResponse response) {
+        return deviceScrappedService.exportDeviceScrapped(scrappedId, response);
+    }
+
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceStateController.java b/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceStateController.java
new file mode 100644
index 0000000..c888fc4
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceStateController.java
@@ -0,0 +1,87 @@
+package com.ruoyi.device.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.ruoyi.common.core.domain.Result;
+import com.ruoyi.common.numgen.NumberGenerator;
+import com.ruoyi.device.dto.DeviceStateDto;
+import com.ruoyi.device.excel.DeviceStateExport;
+import com.ruoyi.device.pojo.DeviceState;
+import com.ruoyi.device.service.DeviceStateService;
+import io.swagger.v3.oas.annotations.Operation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import jakarta.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));
+    }
+
+    @GetMapping("/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();
+    }
+
+    @Operation(summary = "璁惧鍚姩/鍋滄瀵煎嚭")
+    @GetMapping("/exportDeviceStatus")
+    public void exportDeviceStatus(@RequestParam("processNumber") String processNumber,@RequestParam("deviceId") Integer deviceId, HttpServletResponse response) throws Exception {
+        deviceStateService.exportDeviceStatus(deviceId, processNumber, response);
+    }
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceTraceabilityManagementController.java b/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceTraceabilityManagementController.java
new file mode 100644
index 0000000..e334202
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceTraceabilityManagementController.java
@@ -0,0 +1,106 @@
+package com.ruoyi.device.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.device.dto.DeviceTraceabilityManagementDto;
+import com.ruoyi.device.pojo.DeviceTraceabilityManagement;
+import com.ruoyi.device.service.DeviceTraceabilityManagementService;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
+import org.springframework.web.bind.annotation.*;
+
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletResponse;
+
+/**
+ * <p>
+ * 璁惧閲忓�兼函婧愯鍒掕〃 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-20 02:27:44
+ */
+@Tag(name = "璁惧閲忓�兼函婧愯鍒�")
+@RestController
+@RequestMapping("/deviceTraceabilityManagement")
+public class DeviceTraceabilityManagementController {
+    @Resource
+    private DeviceTraceabilityManagementService deviceTraceabilityManagementService;
+
+    /**
+     * 鍒嗛〉鏌ヨ閲忓�兼函婧愯鍒�
+     * @return
+     */
+    @Operation(summary = "鍒嗛〉鏌ヨ閲忓�兼函婧愯鍒�")
+    @GetMapping("selectDeviceTraceabilityManagementByPage")
+    public Result<IPage<DeviceTraceabilityManagement>> selectDeviceTraceabilityManagementByPage(Page page, DeviceTraceabilityManagementDto itemParameter){
+        return deviceTraceabilityManagementService.selectDeviceTraceabilityManagementByPage(page, itemParameter);
+    }
+
+    /**
+     * 鏂板閲忓�兼函婧愯鍒�
+     * @param deviceTraceabilityManagementDto 閲忓�兼函婧愯鍒�
+     */
+    @Operation(summary = "鏂板閲忓�兼函婧愯鍒�")
+    @PostMapping("/addTraceabilityManagement")
+    public Result addTraceabilityManagement(@RequestBody DeviceTraceabilityManagementDto deviceTraceabilityManagementDto) {
+        return deviceTraceabilityManagementService.addTraceabilityManagement(deviceTraceabilityManagementDto);
+    }
+
+    /**
+     * 淇敼閲忓�兼函婧愯鍒�
+     * @param deviceTraceabilityManagementDto 閲忓�兼函婧愯鍒�
+     */
+    @Operation(summary = "淇敼閲忓�兼函婧愯鍒�")
+    @PostMapping("/updateTraceabilityManagement")
+    public Result updateTraceabilityManagement(@RequestBody DeviceTraceabilityManagementDto deviceTraceabilityManagementDto) {
+        return deviceTraceabilityManagementService.updateTraceabilityManagement(deviceTraceabilityManagementDto);
+    }
+
+    /**
+     * 鍒犻櫎閲忓�兼函婧愯鍒�
+     * @param deviceTraceabilityManagementDto 閲忓�兼函婧愯鍒�
+     */
+    @Operation(summary = "鍒犻櫎閲忓�兼函婧愯鍒�")
+    @DeleteMapping("/deleteTraceabilityManagement")
+    public Result deleteTraceabilityManagement(DeviceTraceabilityManagementDto deviceTraceabilityManagementDto) {
+        return deviceTraceabilityManagementService.deleteTraceabilityManagement(deviceTraceabilityManagementDto);
+    }
+
+    /**
+     * 鏌ヨ閲忓�兼函婧愯鍒掕鎯�
+     */
+    @Operation(summary = "鏌ヨ閲忓�兼函婧愯鍒掕鎯�")
+    @GetMapping("/getTraceabilityManagementDetail")
+    public Result<DeviceTraceabilityManagementDto> getTraceabilityManagementDetail(Integer traceabilityManagementId) {
+        return deviceTraceabilityManagementService.getTraceabilityManagementDetail(traceabilityManagementId);
+    }
+
+    /**
+     * 鎻愪氦鎵瑰噯
+     */
+    @Operation(summary = "鎻愪氦鎵瑰噯")
+    @PostMapping("/submitReviewTraceabilityManagementStatus")
+    public Result submitReviewTraceabilityManagementStatus(@RequestBody DeviceTraceabilityManagementDto deviceTraceabilityManagementDto) {
+        return deviceTraceabilityManagementService.submitReviewTraceabilityManagementStatus(deviceTraceabilityManagementDto);
+    }
+
+    /**
+     * 閲忓�兼函婧愯鍒掓壒鍑�
+     */
+    @Operation(summary = "閲忓�兼函婧愯鍒掓壒鍑�")
+    @PostMapping("/reviewTraceabilityManagementStatus")
+    public Result reviewTraceabilityManagementStatus(@RequestBody DeviceTraceabilityManagementDto deviceTraceabilityManagementDto) {
+        return deviceTraceabilityManagementService.reviewTraceabilityManagementStatus(deviceTraceabilityManagementDto);
+    }
+
+    /**
+     * 瀵煎嚭閲忓�兼函婧愯鍒�
+     */
+    @Operation(summary = "瀵煎嚭閲忓�兼函婧愯鍒�")
+    @GetMapping("/exportDeviceTraceabilityManagement")
+    public Result exportDeviceTraceabilityManagement(@RequestParam("traceabilityManagementId") Integer traceabilityManagementId, HttpServletResponse response) {
+        return deviceTraceabilityManagementService.exportDeviceTraceabilityManagementDto(traceabilityManagementId, response);
+    }
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/dto/DataConfigDto.java b/cnas-device/src/main/java/com/ruoyi/device/dto/DataConfigDto.java
new file mode 100644
index 0000000..d8ca336
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/dto/DataConfigDto.java
@@ -0,0 +1,39 @@
+package com.ruoyi.device.dto;
+
+import com.ruoyi.device.pojo.DataConfig;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class DataConfigDto {
+
+    private List<DataConfig> dataConfigList;
+
+    private Boolean isDevice;
+
+    @Schema(description = "鏂囦欢鍚庣紑")
+    private String fileType;
+
+    @Schema(description = "閲囬泦鍦板潃")
+    private String collectUrl;
+
+    @Schema(description = "瀛樺偍鍦板潃")
+    private String storageUrl;
+
+    @Schema(description = "璁惧IP")
+    private String ip;
+
+    @Schema(description = "鏁伴噰-濮旀墭瀛楁")
+    private String entrustCode;
+
+    @Schema(description = "鏁伴噰-鏍峰搧瀛楁")
+    private String sampleCode;
+
+    @Schema(description = "鏁伴噰-db锛宮db鏂囦欢鍚嶇О")
+    private String dbFileName;
+
+    @Schema(description = "璁惧ID")
+    private Integer deviceId;
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceAccidentReportDto.java b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceAccidentReportDto.java
new file mode 100644
index 0000000..fb280c7
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceAccidentReportDto.java
@@ -0,0 +1,31 @@
+package com.ruoyi.device.dto;
+
+import com.ruoyi.device.pojo.DeviceAccidentReport;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * Author: yuan
+ * Date: 2024-12-18 鏄熸湡涓� 10:00:48
+ * Description:
+ */
+@Data
+public class DeviceAccidentReportDto extends DeviceAccidentReport {
+    @Schema(description = "鏃堕棿")
+    private String accidentDateStr;
+
+    @Schema(description = "鎶ュ憡浜哄~鍐欐椂闂�")
+    private String reportDateStr;
+
+    @Schema(description = "璇勪及浜哄~鍐欐椂闂�")
+    private String assessorDateStr;
+
+    @Schema(description = "閮ㄩ棬璐熻矗浜哄~鍐欐椂闂�")
+    private String departmentHeadDateStr;
+
+    @Schema(description = "鎶�鏈礋璐d汉濉啓鏃堕棿")
+    private String technicalDirectorDateStr;
+
+    @Schema(description = "涓讳换濉啓鏃堕棿")
+    private String directorHeadDateStr;
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceBreakdownMaintenance.java b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceBreakdownMaintenance.java
new file mode 100644
index 0000000..083d50c
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceBreakdownMaintenance.java
@@ -0,0 +1,89 @@
+package com.ruoyi.device.dto;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+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")
+@Schema(description = "璁惧鏁呴殰缁翠慨琛�")
+public class DeviceBreakdownMaintenance {
+
+    @TableId(value = "maintenance_id", type = IdType.AUTO)
+    private Integer maintenanceId;
+
+    @Schema(description = "璁惧id")
+    private Integer deviceId;
+
+    @Schema(description = "瀹夎鍦板潃")
+    private String location;
+
+    @Schema(description = "鎹熷潖鎴栨晠闅滄儏鍐�")
+    private String damageOrMalfunction;
+
+    @Schema(description = "鐢宠浜篿d")
+    private Integer applicantUserId;
+
+    @Schema(description = "鐢宠浜�")
+    private String applicantUser;
+
+    @Schema(description = "瑕佹眰淇鏃堕棿")
+    private LocalDate repairDate;
+
+    @Schema(description = "閮ㄩ棬璐熻矗浜烘剰瑙�")
+    private String departmentHeadOpinion;
+
+    @Schema(description = "閮ㄩ棬璐熻矗浜篿d")
+    private Integer departmentHeadUserId;
+
+    @Schema(description = "閮ㄩ棬璐熻矗浜�")
+    private String departmentHeadUser;
+
+    @Schema(description = "閮ㄩ棬璐熻矗浜哄~鍐欐椂闂�")
+    private LocalDate departmentHeadDate;
+
+    @Schema(description = "缁翠慨璁颁簨")
+    private String maintenanceRecord;
+
+    @Schema(description = "缁翠慨浜�")
+    private String maintenanceUser;
+
+    @Schema(description = "缁翠慨鏃堕棿")
+    private LocalDate maintenanceDate;
+
+    @Schema(description = "鏄惁缁撴潫,0 鏈粨鏉�, 1缁撴潫")
+    private Integer isFinish;
+
+    @Schema(description = "鍒涘缓浜�")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @Schema(description = "鍒涘缓鏃堕棿")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @Schema(description = "淇敼浜�")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    @Schema(description = "淇敼鏃堕棿")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+
+    @TableField(exist = false,select = false)
+    @Schema(description = "娴佺▼, 0:鐢宠, 1鐢宠閮ㄩ棬璐熻矗浜烘剰瑙�, 2:缁翠慨璁颁簨")
+    private Integer flowType;
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceCalibrationPlanDetailDto.java b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceCalibrationPlanDetailDto.java
new file mode 100644
index 0000000..73ef496
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceCalibrationPlanDetailDto.java
@@ -0,0 +1,21 @@
+package com.ruoyi.device.dto;
+
+import com.ruoyi.device.pojo.DeviceCalibrationPlanDetail;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * Author: yuan
+ * Date: 2024-12-17 鏄熸湡浜� 10:05:08
+ * Description:
+ */
+@Data
+public class DeviceCalibrationPlanDetailDto extends DeviceCalibrationPlanDetail {
+
+    @Schema(description = "搴忓彿")
+    private Integer index;
+    @Schema(description = "鏈�杩戞瀹氭椂闂碨tr")
+    private String lastDateStr;
+    @Schema(description = "鏈勾璁″垝鏍″噯鏃堕棿Str")
+    private String planDateStr;
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceCalibrationPlanDto.java b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceCalibrationPlanDto.java
new file mode 100644
index 0000000..ba6c597
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceCalibrationPlanDto.java
@@ -0,0 +1,31 @@
+package com.ruoyi.device.dto;
+
+import com.ruoyi.device.pojo.DeviceCalibrationPlan;
+import com.ruoyi.device.pojo.DeviceCalibrationPlanDetail;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @Author zhuo
+ * @Date 2024/12/16
+ */
+@Data
+public class DeviceCalibrationPlanDto extends DeviceCalibrationPlan {
+
+    @Schema(description = "缂栧埗浜�")
+    private String writeName;
+
+    @Schema(description = "鎵瑰噯浜�")
+    private String ratifyName;
+
+    @Schema(description = "缂栧埗鏃堕棿")
+    private String writeTimeStr;
+
+    @Schema(description = "鎵瑰噯鏃堕棿")
+    private String ratifyTimeStr;
+
+    @Schema(description = "鏍″噯璁″垝璇︽儏")
+    private List<DeviceCalibrationPlanDetail> calibrationPlanDetailList;
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceCollectionDto.java b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceCollectionDto.java
new file mode 100644
index 0000000..323a0f7
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceCollectionDto.java
@@ -0,0 +1,28 @@
+package com.ruoyi.device.dto;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 璁惧閲囬泦瀵硅薄
+ *
+ * @Author zhuo
+ * @Date 2024/12/3
+ */
+@Data
+public class DeviceCollectionDto {
+
+    @Schema(description = "鏍峰搧id")
+    private Integer id;
+
+    @Schema(description = "璁㈠崟缂栧彿")
+    private String entrustCode;
+
+    @Schema(description = "鏍峰搧缂栧彿")
+    private String sampleCode;
+
+    @Schema(description = "閲囬泦鐨勬楠岄」id")
+    private List<Integer> itemIds;
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceConfigDtoPage.java b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceConfigDtoPage.java
new file mode 100644
index 0000000..889e3e6
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceConfigDtoPage.java
@@ -0,0 +1,77 @@
+package com.ruoyi.device.dto;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+@Data
+public class DeviceConfigDtoPage{
+
+    @Schema(description = "璁惧鍚嶇О")
+    private String deviceName;
+
+    @Schema(description = "鍒涘缓鐢ㄦ埛")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @Schema(description = "鏂囦欢鍚庣紑")
+    private String fileType;
+
+    @Schema(description = "閲囬泦鍦板潃")
+    private String collectUrl;
+
+    @Schema(description = "瀛樺偍鍦板潃")
+    private String storageUrl;
+
+    @Schema(description = "IP鍦板潃")
+    private String ip;
+
+    @Schema(description = "妫�楠岄」鍒嗙被")
+    private String inspectionItemClass;
+
+    @Schema(description = "妫�楠岄」")
+    private String inspectionItem;
+
+    @Schema(description = "妫�楠岄」瀛愰」")
+    private String inspectionItemSubclass;
+
+    @Schema(description = "鍏紡")
+    private String formula;
+
+    @Schema(description = "鍙傜収X")
+    private String referx;
+
+    @Schema(description = "X")
+    private String x;
+
+    @Schema(description = "鍙傜収Y")
+    private String refery;
+
+
+    @Schema(description = "Y")
+    private String y;
+
+    @Schema(description = "鍒悕")
+    private String anotherName;
+
+    @Schema(description = "鍖归厤鍚嶇О")
+    private String matchingName;
+
+    private Integer id;
+
+    @Schema(description = "妫�楠屽璞�")
+    private String sample;
+
+    @Schema(description = "妫�楠岄」鐩甶d")
+    private Integer structureItemParameterId;
+
+    @Schema(description = "鏁伴噰-濮旀墭瀛楁")
+    private String entrustCode;
+
+    @Schema(description = "鏁伴噰-鏍峰搧瀛楁")
+    private String sampleCode;
+
+    @Schema(description = "鏁伴噰-db锛宮db鏂囦欢鍚嶇О")
+    private String dbFileName;
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceDto.java b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceDto.java
new file mode 100644
index 0000000..cbcaf97
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceDto.java
@@ -0,0 +1,43 @@
+package com.ruoyi.device.dto;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.ruoyi.device.pojo.Device;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.time.LocalDateTime;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class DeviceDto extends Device {
+
+    @Schema(description = "绠$悊浜�")
+    private String equipmentManagerUser;
+
+    @Schema(description = "鎵�灞為儴闂�")
+    @JsonInclude(JsonInclude.Include.NON_NULL)
+    private String laboratoryName;
+
+    @Schema(description = "妫�楠岄」鐩�")
+    private String insProductItem;
+
+    @Schema(description = "绠$悊浜哄鍚�")
+    private String equipmentManagerName;
+
+    @Schema(description = "琚巿鏉冧汉濮撳悕")
+    private String authorizedPersonName;
+
+    @Schema(description = "鏍稿噯璇佷功缂栧彿")
+    private String calibrateNo;
+
+    @Schema(description = "鏈�杩戞牎鍑嗘棩鏈�")
+    private LocalDateTime lastCalibrationDateTwo;
+
+    @Schema(description = "涓嬫鏍″噯鏃ユ湡")
+    private LocalDateTime nextCalibrationDateTwo;
+
+
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceExaminePlanDetailsDto.java b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceExaminePlanDetailsDto.java
new file mode 100644
index 0000000..08a320c
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceExaminePlanDetailsDto.java
@@ -0,0 +1,23 @@
+package com.ruoyi.device.dto;
+
+import com.ruoyi.device.pojo.DeviceExaminePlanDetails;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * Author: yuan
+ * Date: 2024-12-17 鏄熸湡浜� 15:34:44
+ * Description:
+ */
+@Data
+public class DeviceExaminePlanDetailsDto extends DeviceExaminePlanDetails {
+    @Schema(description = "搴忓彿")
+    private Integer index;
+
+    @Schema(description = "璁板綍鐘舵��, 0: 鏈紑濮�, 1:寰呮壒鍑�, 2:閫氳繃, 3:涓嶉�氳繃")
+    private Integer recordStatus;
+
+    @Schema(description = "瀵规瘮鐘舵��, 0: 鏈紑濮�, 1:寰呮壒鍑�, 2:閫氳繃, 3:涓嶉�氳繃")
+    private Integer recordContrastStatus;
+
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceExaminePlanDto.java b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceExaminePlanDto.java
new file mode 100644
index 0000000..41cd442
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceExaminePlanDto.java
@@ -0,0 +1,33 @@
+package com.ruoyi.device.dto;
+
+import com.ruoyi.device.pojo.DeviceExaminePlan;
+import com.ruoyi.device.pojo.DeviceExaminePlanDetails;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @Author zhuo
+ * @Date 2024/12/16
+ */
+@Data
+public class DeviceExaminePlanDto extends DeviceExaminePlan {
+
+    @Schema(description = "缂栧埗浜�")
+    private String writeName;
+
+    @Schema(description = "鎵瑰噯浜�")
+    private String ratifyName;
+
+    @Schema(description = "缂栧埗鏃堕棿")
+    private String writeTimeStr;
+
+    @Schema(description = "鎵瑰噯鏃堕棿")
+    private String ratifyTimeStr;
+
+    @Schema(description = "骞村害")
+    private String year;
+
+    private List<DeviceExaminePlanDetails> examinePlanDetailsList;
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceExamineRecordContrastDetailsDto.java b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceExamineRecordContrastDetailsDto.java
new file mode 100644
index 0000000..0f0eb22
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceExamineRecordContrastDetailsDto.java
@@ -0,0 +1,16 @@
+package com.ruoyi.device.dto;
+
+import com.ruoyi.device.pojo.DeviceExamineRecordContrastDetails;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * Author: yuan
+ * Date: 2024-12-17 鏄熸湡浜� 13:59:37
+ * Description:
+ */
+@Data
+public class DeviceExamineRecordContrastDetailsDto extends DeviceExamineRecordContrastDetails {
+    @Schema(description = "搴忓彿")
+    private Integer index;
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceExamineRecordContrastDto.java b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceExamineRecordContrastDto.java
new file mode 100644
index 0000000..0841375
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceExamineRecordContrastDto.java
@@ -0,0 +1,47 @@
+package com.ruoyi.device.dto;
+
+import com.ruoyi.device.pojo.DeviceExamineRecordContrast;
+import com.ruoyi.device.pojo.DeviceExamineRecordContrastDetails;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @Author zhuo
+ * @Date 2024/12/16
+ */
+@Data
+public class DeviceExamineRecordContrastDto extends DeviceExamineRecordContrast {
+
+    @Schema(description = "鏍告煡璁板綍瀵规瘮璇︽儏")
+    private List<DeviceExamineRecordContrastDetails> recordContrastDetailsList;
+
+
+    @Schema(description = "A璁惧鍚嶇О")
+    private String aDeviceName;
+
+    @Schema(description = "A璁惧缂栧彿")
+    private String aDeviceNumber;
+
+    @Schema(description = "b璁惧鍚嶇О")
+    private String bDeviceName;
+
+    @Schema(description = "b璁惧缂栧彿")
+    private String bDeviceNumber;
+
+    @Schema(description = "c璁惧鍚嶇О")
+    private String cDeviceName;
+
+    @Schema(description = "c璁惧缂栧彿")
+    private String cDeviceNumber;
+
+    @Schema(description = "鏍告煡鏃ユ湡")
+    private String checkerTimeStr;
+
+    @Schema(description = "瀹℃牳鏃ユ湡")
+    private String reviewTimeStr;
+
+    @Schema(description = "瀹為獙瀹�")
+    private String labName;
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceExamineRecordDto.java b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceExamineRecordDto.java
new file mode 100644
index 0000000..b0e36ab
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceExamineRecordDto.java
@@ -0,0 +1,28 @@
+package com.ruoyi.device.dto;
+
+import com.ruoyi.device.pojo.DeviceExamineRecord;
+import com.ruoyi.device.pojo.DeviceExamineRecordDetail;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @Author zhuo
+ * @Date 2024/12/16
+ */
+@Data
+public class DeviceExamineRecordDto extends DeviceExamineRecord {
+
+    @Schema(description = "鏍告煡璁板綍璇︽儏")
+    private List<DeviceExamineRecordDetail> recordDetailList;
+
+    @Schema(description = "璁惧鍚嶇О")
+    private String deviceName;
+
+    @Schema(description = "璁惧缂栧彿")
+    private String deviceNumber;
+
+    @Schema(description = "鏈�鍚庝竴娆′慨鏀规棩鏈�")
+    private String updateTimeStr;
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceExport.java b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceExport.java
new file mode 100644
index 0000000..7e312d8
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceExport.java
@@ -0,0 +1,19 @@
+package com.ruoyi.device.dto;
+
+import com.ruoyi.device.pojo.Device;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * Author: yuan
+ * Date: 2024-12-10 鏄熸湡浜� 15:55:29
+ * Description:
+ */
+@Data
+public class DeviceExport extends Device {
+    @Schema(description = "绠$悊浜�")
+    private String equipmentManagerName;
+
+    @Schema(description = "搴忓彿")
+    private Integer index;
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceImpowerDetailsDto.java b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceImpowerDetailsDto.java
new file mode 100644
index 0000000..2eb09ac
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceImpowerDetailsDto.java
@@ -0,0 +1,25 @@
+package com.ruoyi.device.dto;
+
+import com.ruoyi.device.pojo.DeviceImpowerDetails;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * @Author zhuo
+ * @Date 2025/4/17
+ */
+@Data
+public class DeviceImpowerDetailsDto extends DeviceImpowerDetails {
+
+    @Schema(description = "搴忓彿")
+    private Integer index;
+
+    @Schema(description = "浠櫒璁惧鍚嶇О")
+    private String deviceName;
+
+    @Schema(description = "浠櫒璁惧鍨嬪彿")
+    private String specificationModel;
+
+    @Schema(description = "浠櫒缂栧彿")
+    private String managementNumber;
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceImpowerDto.java b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceImpowerDto.java
new file mode 100644
index 0000000..e4cc815
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceImpowerDto.java
@@ -0,0 +1,24 @@
+package com.ruoyi.device.dto;
+
+import com.ruoyi.device.pojo.DeviceImpower;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @Author zhuo
+ * @Date 2025/4/17
+ */
+@Data
+public class DeviceImpowerDto extends DeviceImpower {
+
+    @Schema(description = "璇︽儏")
+    private List<DeviceImpowerDetailsDto> deviceImpowerDetails;
+
+    @Schema(description = "鎺堟潈鏃ユ湡涓枃")
+    private String auditDateCH;
+
+    @Schema(description = "鎺堟潈鏃ユ湡鑻辨枃")
+    private String auditDateEN;
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceInspectionRecordDto.java b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceInspectionRecordDto.java
new file mode 100644
index 0000000..bc1ce28
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceInspectionRecordDto.java
@@ -0,0 +1,25 @@
+package com.ruoyi.device.dto;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.ruoyi.device.pojo.DeviceInspectionRecord;
+import com.ruoyi.device.pojo.DeviceInspectionRecordDetails;
+import io.swagger.v3.oas.annotations.media.Schema;
+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)
+    @Schema(description = "娴嬭瘯璇︽儏鍐呭")
+    private List<DeviceInspectionRecordDetails> details;
+
+    @Schema(description = "娴嬭瘯鏃堕棿")
+    private String testDateString;
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceInstructionDto.java b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceInstructionDto.java
new file mode 100644
index 0000000..11244b4
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceInstructionDto.java
@@ -0,0 +1,13 @@
+package com.ruoyi.device.dto;
+
+import com.ruoyi.device.pojo.DeviceInstruction;
+import com.ruoyi.device.pojo.OperationInstruction;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class DeviceInstructionDto extends DeviceInstruction {
+
+    private List<OperationInstruction> feTempHumRecordList;
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceMaintenanceDto.java b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceMaintenanceDto.java
new file mode 100644
index 0000000..162f445
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceMaintenanceDto.java
@@ -0,0 +1,20 @@
+package com.ruoyi.device.dto;
+
+import com.ruoyi.device.pojo.DeviceMaintenance;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * @Author zhuo
+ * @Date 2025/4/17
+ */
+@Data
+public class DeviceMaintenanceDto extends DeviceMaintenance {
+
+    @Schema(description = "璁惧鍚嶇О")
+    private String deviceName;
+
+    @Schema(description = "璁惧缂栧彿")
+    private String managementNumber;
+
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceMaintenancePlanDetailsDto.java b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceMaintenancePlanDetailsDto.java
new file mode 100644
index 0000000..00185c1
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceMaintenancePlanDetailsDto.java
@@ -0,0 +1,32 @@
+package com.ruoyi.device.dto;
+
+import com.ruoyi.device.pojo.DeviceMaintenancePlanDetails;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * Author: yuan
+ * Date: 2024-12-17 鏄熸湡浜� 9:26:48
+ * Description: 璁惧淇濆吇璁″垝璇︽儏
+ */
+@Data
+public class DeviceMaintenancePlanDetailsDto extends DeviceMaintenancePlanDetails {
+
+    @Schema(description = "搴忓彿")
+    private Integer index;
+
+    @Schema(description = "浠櫒璁惧鍚嶇О")
+    private String deviceName;
+
+    @Schema(description = "浠櫒璁惧缂栧彿")
+    private String deviceNumber;
+
+    @Schema(description = "浠櫒璁惧鍨嬪彿")
+    private String specificationModel;
+
+    @Schema(description = "浠櫒缂栧彿")
+    private String managementNumber;
+
+    @Schema(description = "褰掑睘瀹為獙瀹�")
+    private String storagePoint;
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceMaintenancePlanDto.java b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceMaintenancePlanDto.java
new file mode 100644
index 0000000..9f59025
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceMaintenancePlanDto.java
@@ -0,0 +1,30 @@
+package com.ruoyi.device.dto;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.ruoyi.device.pojo.DeviceMaintenancePlan;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * Author: yuan
+ * Date: 2024-12-16 鏄熸湡涓� 18:26:59
+ * Description:
+ */
+@Data
+public class DeviceMaintenancePlanDto extends DeviceMaintenancePlan {
+
+    @Schema(description = "璁惧淇濆吇璁″垝璇︽儏")
+    @TableField(exist = false)
+    private List<DeviceMaintenancePlanDetailsDto> deviceMaintenancePlanDetails;
+
+    @Schema(description = "缂栧埗鏃ユ湡")
+    private String datePreparationStr;
+
+    @Schema(description = "瀹℃牳鏃ユ湡")
+    private String auditDateStr;
+
+    @Schema(description = "璁惧Id")
+    private Integer deviceId;
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceMetricRecordAndMaintenanceDto.java b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceMetricRecordAndMaintenanceDto.java
new file mode 100644
index 0000000..9c5303f
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceMetricRecordAndMaintenanceDto.java
@@ -0,0 +1,38 @@
+package com.ruoyi.device.dto;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * Author: yuan
+ * Date: 2024-12-13 鏄熸湡浜� 10:43:06
+ * Description: 浠櫒璁惧妗f鍗′腑鏄剧ず鐨勮澶囨牎鍑嗚褰曞拰缁存姢璁板綍鐨勫垪琛ㄥ璞�
+ */
+@Data
+public class DeviceMetricRecordAndMaintenanceDto {
+    @Schema(description = "搴忓彿")
+    private Integer index;
+
+    // 鏍″噯琛ㄤ腑鐨勬暟鎹�
+    @Schema(description = "鏍″噯鏃ユ湡")
+    private String calibrationDateString;
+
+    @Schema(description = "璇佷功鏍囧彿")
+    private String certificateNumber;
+
+    @Schema(description = "鏍″噯鏈夋晥鏃ユ湡")
+    private String validityDateString;
+
+    @Schema(description = "鍒ゅ畾")
+    private String judgement;
+
+    // 缁翠慨璁板綍琛ㄤ腑鐨勬暟鎹�
+    @Schema(description = "缁翠慨鏃ユ湡")
+    private String maintenanceDateString;
+
+    @Schema(description = "澶勭悊鏂瑰紡")
+    private String handlingMethod;
+
+    @Schema(description = "澶囨敞")
+    private String comments;
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceMetricRecordDto.java b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceMetricRecordDto.java
new file mode 100644
index 0000000..bf0918c
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceMetricRecordDto.java
@@ -0,0 +1,13 @@
+package com.ruoyi.device.dto;
+
+import com.ruoyi.device.pojo.DeviceMetricRecord;
+import com.ruoyi.device.pojo.DeviceMetricsCopy;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class DeviceMetricRecordDto extends DeviceMetricRecord {
+
+    private List<DeviceMetricsCopy> deviceMetricsCopyList;
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceOperationInstructionDto.java b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceOperationInstructionDto.java
new file mode 100644
index 0000000..0a69de0
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceOperationInstructionDto.java
@@ -0,0 +1,35 @@
+package com.ruoyi.device.dto;
+
+import com.ruoyi.device.pojo.OperationInstruction;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+@Data
+public class DeviceOperationInstructionDto extends OperationInstruction {
+    @Schema(description = "鐢宠缂栧彿")
+    private String applicationNumber;
+
+    @Schema(description = "鐢宠閮ㄩ棬")
+    private String applicationDepartment;
+
+    @Schema(description = "璐d换浜�")
+    private String personLiable;
+
+    @Schema(description = "鍙楁帶鐢宠璇存槑")
+    private String controlledApplicationDescription;
+
+    @Schema(description = "绠$悊缂栧彿")
+    private String deviceNumber;
+
+    @Schema(description = "鍨嬪彿")
+    private String deviceModel;
+
+    @Schema(description = "璁惧鍚嶇О")
+    private String deviceName;
+
+    @Schema(description = "涓婁紶浜�")
+    private String uploaderName;
+
+    @Schema(description = "瀹℃壒浜�")
+    private String approverName;
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceRecordDto.java b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceRecordDto.java
new file mode 100644
index 0000000..57c90a5
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceRecordDto.java
@@ -0,0 +1,14 @@
+package com.ruoyi.device.dto;
+
+import com.ruoyi.device.pojo.DeviceRecord;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+@Data
+public class DeviceRecordDto extends DeviceRecord {
+
+    @Schema(description = "璁惧鍚嶇О")
+    private String deviceName;
+    @Schema(description = "璁惧缂栧彿")
+    private String managementNumber;
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceScrappedDto.java b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceScrappedDto.java
new file mode 100644
index 0000000..b3d40b0
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceScrappedDto.java
@@ -0,0 +1,26 @@
+package com.ruoyi.device.dto;
+
+import com.ruoyi.device.pojo.DeviceScrapped;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * Author: yuan
+ * Date: 2024-12-17 鏄熸湡浜� 18:34:17
+ * Description:
+ */
+@Data
+public class DeviceScrappedDto extends DeviceScrapped {
+
+    @Schema(description = "鐢宠鏃堕棿")
+    private String applicantDateStr;
+
+    @Schema(description = "閮ㄩ棬璐熻矗浜哄~鍐欐椂闂�")
+    private String departmentHeadDateStr;
+
+    @Schema(description = "璁¢噺瀹や汉濉啓鏃堕棿")
+    private String meteringRoomDateStr;
+
+    @Schema(description = "鎵瑰噯浜哄~鍐欐椂闂�")
+    private String approverDateStr;
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceStateDto.java b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceStateDto.java
new file mode 100644
index 0000000..a96428e
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceStateDto.java
@@ -0,0 +1,32 @@
+package com.ruoyi.device.dto;
+
+import com.ruoyi.device.pojo.DeviceState;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+@Data
+public class DeviceStateDto extends DeviceState {
+    @Schema(description = "璁惧鍚嶇О")
+    private String deviceName;
+
+    @Schema(description = "瑙勬牸鍨嬪彿")
+    private String specificationModel;
+
+    @Schema(description = "绠$悊缂栧彿")
+    private String managementNumber;
+
+    @Schema(description = "鎿嶄綔鏃ユ湡 yyyy-MM-dd")
+    private String submitDateString;
+
+    @Schema(description = "璐熻矗浜哄鎵规棩鏈� yyyy-MM-dd")
+    private String departmentDateString;
+
+    @Schema(description = "璁¢噺瀹ゅ鎵规棩鏈� yyyy-MM-dd")
+    private String measuringRoomDateString;
+
+    @Schema(description = "鎵瑰噯鏃ユ湡 yyyy-MM-dd")
+    private String approvalDateString;
+
+    @Schema(description = "璁惧绫诲瀷")
+    private String largeCategory;
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceTraceabilityManagementDetailsDto.java b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceTraceabilityManagementDetailsDto.java
new file mode 100644
index 0000000..fa9adcc
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceTraceabilityManagementDetailsDto.java
@@ -0,0 +1,25 @@
+package com.ruoyi.device.dto;
+
+import com.ruoyi.device.pojo.DeviceTraceabilityManagementDetails;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * Author: yuan
+ * Date: 2024-12-20 鏄熸湡浜� 15:05:02
+ * Description:
+ */
+@Data
+public class DeviceTraceabilityManagementDetailsDto extends DeviceTraceabilityManagementDetails {
+    @Schema(description = "搴忓彿")
+    private Integer index;
+
+    @Schema(description = "浠櫒璁惧鍚嶇О")
+    private String deviceName;
+
+    @Schema(description = "浠櫒璁惧鍨嬪彿")
+    private String specificationModel;
+
+    @Schema(description = "浠櫒缂栧彿")
+    private String managementNumber;
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceTraceabilityManagementDto.java b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceTraceabilityManagementDto.java
new file mode 100644
index 0000000..51b846e
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceTraceabilityManagementDto.java
@@ -0,0 +1,28 @@
+package com.ruoyi.device.dto;
+
+import com.ruoyi.device.pojo.DeviceTraceabilityManagement;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * Author: yuan
+ * Date: 2024-12-20 鏄熸湡浜� 14:30:45
+ * Description:
+ */
+@Data
+public class DeviceTraceabilityManagementDto extends DeviceTraceabilityManagement {
+
+    @Schema(description = "璁惧閲忓�兼函婧愯鍒掕鎯�")
+    private List<DeviceTraceabilityManagementDetailsDto> deviceTraceabilityManagementDetails;
+
+    @Schema(description = "缂栧埗鏃ユ湡")
+    private String datePreparationStr;
+
+    @Schema(description = "瀹℃牳鏃ユ湡")
+    private String auditDateStr;
+
+    @Schema(description = "璁惧Id")
+    private Integer deviceId;
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/dto/DocumentExportWordDto.java b/cnas-device/src/main/java/com/ruoyi/device/dto/DocumentExportWordDto.java
new file mode 100644
index 0000000..921020b
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/dto/DocumentExportWordDto.java
@@ -0,0 +1,45 @@
+package com.ruoyi.device.dto;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * Author: yuan
+ * Date: 2024-12-13 鏄熸湡浜� 8:45:34
+ * Description: 鐢ㄤ簬浠櫒璁惧妗f鍗$殑瀵煎嚭
+ */
+@Data
+public class DocumentExportWordDto {
+
+    // 璁惧妗f宸﹀垪琛�
+    @Schema(description = "搴忓彿")
+    private Integer index1;
+
+    @Schema(description = "妗f鍚嶇О")
+    private String name1;
+
+    @Schema(description = "浠芥暟")
+    private Integer quantity1;
+
+    @Schema(description = "椤电爜")
+    private Integer pageCount1;
+
+    @Schema(description = "褰掓。鏃ユ湡")
+    private String archiveDateString1;
+
+    // 璁惧妗f鍙冲垪琛�
+    @Schema(description = "搴忓彿")
+    private Integer index2;
+
+    @Schema(description = "妗f鍚嶇О")
+    private String name2;
+
+    @Schema(description = "浠芥暟")
+    private Integer quantity2;
+
+    @Schema(description = "椤电爜")
+    private Integer pageCount2;
+
+    @Schema(description = "褰掓。鏃ユ湡")
+    private String archiveDateString2;
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/excel/DeviceMaintenanceExport.java b/cnas-device/src/main/java/com/ruoyi/device/excel/DeviceMaintenanceExport.java
new file mode 100644
index 0000000..d2cde7e
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/excel/DeviceMaintenanceExport.java
@@ -0,0 +1,45 @@
+package com.ruoyi.device.excel;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ColumnWidth;
+import lombok.Data;
+
+@Data
+public class DeviceMaintenanceExport {
+
+    @ColumnWidth(20)
+    @ExcelProperty("璁惧鍚嶇О")
+    private String deviceName;
+
+    @ColumnWidth(20)
+    @ExcelProperty("娴佺▼缂栧彿")
+    private String deviceNumber;
+
+    @ColumnWidth(20)
+    @ExcelProperty("绠$悊缂栧彿")
+    private String managementNumber;
+
+    @ColumnWidth(50)
+    @ExcelProperty("缁存姢鍐呭")
+    private String content;
+
+    @ColumnWidth(20)
+    @ExcelProperty("缁存姢鏃堕棿")
+    private String date;
+
+    @ColumnWidth(20)
+    @ExcelProperty("涓嬫缁存姢鏃堕棿")
+    private String nextDate;
+
+    @ColumnWidth(20)
+    @ExcelProperty("缁存姢绫诲瀷")
+    private String maintenanceType;
+
+    @ColumnWidth(20)
+    @ExcelProperty("缁存姢浜�")
+    private String name;
+
+    @ColumnWidth(50)
+    @ExcelProperty("澶囨敞")
+    private String comments;
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/excel/DeviceRecordExportWord.java b/cnas-device/src/main/java/com/ruoyi/device/excel/DeviceRecordExportWord.java
new file mode 100644
index 0000000..db56f63
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/excel/DeviceRecordExportWord.java
@@ -0,0 +1,28 @@
+package com.ruoyi.device.excel;
+
+import com.ruoyi.device.pojo.DeviceRecord;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * Author: yuan
+ * Date: 2024-12-10 鏄熸湡浜� 17:19:22
+ * Description:
+ */
+@Data
+public class DeviceRecordExportWord extends DeviceRecord {
+    @Schema(description = "浣跨敤鍓�0浠h〃涓嶆甯�1浠h〃姝e父")
+    private String useBeforeString;
+
+    @Schema(description = "浣跨敤鍚�0浠h〃涓嶆甯�1浠h〃姝e父")
+    private String useAfterString;
+
+    @Schema(description = "鎿嶄綔鏃堕棿 String yyyy-MM-dd")
+    private String operationDate;
+
+    @Schema(description = "浣跨敤寮�濮嬫棩鏈� String yyyy-MM-dd \n HH:mm:ss")
+    private String useStartDateString;
+
+    @Schema(description = "浣跨敤缁撴潫鏃ユ湡 String yyyy-MM-dd \n HH:mm:ss")
+    private String useEndDateString;
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/excel/DeviceStateExport.java b/cnas-device/src/main/java/com/ruoyi/device/excel/DeviceStateExport.java
new file mode 100644
index 0000000..f4e5592
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/excel/DeviceStateExport.java
@@ -0,0 +1,36 @@
+package com.ruoyi.device.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-device/src/main/java/com/ruoyi/device/excel/upload/DeviceCalibrationPlanDetailUpload.java b/cnas-device/src/main/java/com/ruoyi/device/excel/upload/DeviceCalibrationPlanDetailUpload.java
new file mode 100644
index 0000000..b1e6f2a
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/excel/upload/DeviceCalibrationPlanDetailUpload.java
@@ -0,0 +1,36 @@
+package com.ruoyi.device.excel.upload;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * @Author zhuo
+ * @Date 2024/12/20
+ */
+@Data
+public class DeviceCalibrationPlanDetailUpload {
+
+    @Schema(description = "璁惧鍚嶇О鍙婂瀷鍙�")
+    private String deviceName;
+
+    @Schema(description = "璁惧鏁伴噺")
+    private String deviceAmount;
+
+    @Schema(description = "浠櫒缂栧彿")
+    private String deviceNumber;
+
+    @Schema(description = "妫�瀹氬崟浣�")
+    private String verificationUnit;
+
+    @Schema(description = "妫�瀹氬懆鏈�")
+    private String verificationCycles;
+
+    @Schema(description = "鏈�杩戞瀹氭椂闂�")
+    private String lastDate;
+
+    @Schema(description = "鏈勾璁″垝鏍″噯鏃堕棿")
+    private String planDate;
+
+    @Schema(description = "澶囨敞")
+    private String remark;
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/excel/upload/DeviceExaminePlanUpload.java b/cnas-device/src/main/java/com/ruoyi/device/excel/upload/DeviceExaminePlanUpload.java
new file mode 100644
index 0000000..f61bd00
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/excel/upload/DeviceExaminePlanUpload.java
@@ -0,0 +1,37 @@
+package com.ruoyi.device.excel.upload;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * @Author zhuo
+ * @Date 2024/12/20
+ */
+@Data
+public class DeviceExaminePlanUpload {
+
+    @Schema(description = "璁惧缂栧彿")
+    private String deviceNumber;
+
+    @Schema(description = "璁″垝鍚嶇О")
+    private String deviceName;
+
+    @Schema(description = "鏍告煡鏃堕棿")
+    private String checkTime;
+
+    @Schema(description = "鏍告煡鎸囨爣")
+    private String checkIndex;
+
+    @Schema(description = "鏍告煡鏂规硶")
+    private String checkMethod;
+
+    @Schema(description = "缁撴灉濡備綍鍒ゅ畾")
+    private String howResults;
+
+    @Schema(description = "鏍告煡璐d换浜�")
+    private String checkChargerUser;
+
+    @Schema(description = "澶囨敞")
+    private String remark;
+
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/excel/upload/DeviceImport.java b/cnas-device/src/main/java/com/ruoyi/device/excel/upload/DeviceImport.java
new file mode 100644
index 0000000..86904df
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/excel/upload/DeviceImport.java
@@ -0,0 +1,73 @@
+package com.ruoyi.device.excel.upload;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ColumnWidth;
+import lombok.Data;
+
+@Data
+@ColumnWidth(22)
+public class DeviceImport {
+
+    @ExcelProperty("浠櫒鍚嶇О*")
+    private String deviceName;
+
+    @ExcelProperty("瑙勬牸鍨嬪彿*")
+    private String specificationModel;
+
+    @ExcelProperty("绠$悊缂栧彿*")
+    private String managementNumber;
+
+    @ExcelProperty("鏍″噯鏈夋晥鏈�*(yyyy-MM-dd)")
+    private String activationDate;
+
+    @ExcelProperty("鎵�灞為儴闂�*")
+    private String laboratoryName;
+
+    @ExcelProperty("褰撳墠鐘舵��*")
+    private String deviceStatus;
+
+    @ExcelProperty("鏍″噯鍛ㄦ湡(鏈�)*")
+    private String calibrationDate;
+
+    @ExcelProperty("鑻辨枃鍚嶇О")
+    private String enDeviceName;
+
+    @ExcelProperty("鐢熶骇鍘傚")
+    private String manufacturer;
+
+    @ExcelProperty("鍑哄巶缂栧彿")
+    private String factoryNo;
+
+    @ExcelProperty("璧勪骇缂栫爜")
+    private String assetCode;
+
+    @ExcelProperty("浜у湴")
+    private String origin;
+
+    @ExcelProperty("璐疆鏃ユ湡(yyyy-MM-dd)")
+    private String acquisitionDate;
+
+    @ExcelProperty("璐熻矗浜�")
+    private String equipmentManagerName;
+
+    @ExcelProperty("瀛樻斁鐐�")
+    private String storagePoint;
+
+    @ExcelProperty("鎶�鏈寚鏍�")
+    private String technicalIndicators;
+
+    @ExcelProperty("鏍″噯鏈嶅姟鏈烘瀯")
+    private String calibrationServices;
+
+    @ExcelProperty("鏈�杩戞牎鍑嗘棩鏈�(yyyy-MM-dd)")
+    private String lastCalibrationDate;
+
+    @ExcelProperty("涓嬫鏍″噯鏃ユ湡(yyyy-MM-dd)")
+    private String nextCalibrationDate;
+
+    @ExcelProperty("璁惧绫诲瀷")
+    private String largeCategory;
+
+    @ExcelProperty("鍗曚环(涓囧厓)")
+    private String unitPrice;
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/mapper/CollectBridgeMapper.java b/cnas-device/src/main/java/com/ruoyi/device/mapper/CollectBridgeMapper.java
new file mode 100644
index 0000000..7392b4e
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/mapper/CollectBridgeMapper.java
@@ -0,0 +1,15 @@
+package com.ruoyi.device.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.device.pojo.CollectBridge;
+
+/**
+ * 鏁板瓧鐢垫ˉ閲囬泦
+ *
+ * @author zhuo
+ * @since 2025-02-19
+ */
+public interface CollectBridgeMapper extends BaseMapper<CollectBridge> {
+
+}
+
diff --git a/cnas-device/src/main/java/com/ruoyi/device/mapper/DataConfigMapper.java b/cnas-device/src/main/java/com/ruoyi/device/mapper/DataConfigMapper.java
new file mode 100644
index 0000000..18f5c99
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/mapper/DataConfigMapper.java
@@ -0,0 +1,32 @@
+package com.ruoyi.device.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.ruoyi.device.dto.DeviceConfigDtoPage;
+import com.ruoyi.device.pojo.DataConfig;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * <p>
+ *  Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-07-13 12:23:00
+ */
+public interface DataConfigMapper extends BaseMapper<DataConfig> {
+
+    List<DeviceConfigDtoPage> selectDataConfigList(Integer deviceId);
+
+    List<Integer> deleteDataConfig();
+
+    /**
+     * 鏌ヨ浜嗙粦瀹氫絾鏄病鏈夐厤缃殑妫�楠岄」
+     * @param deviceId
+     * @return
+     */
+    IPage<DataConfig> getNoConfigProduct(@Param("page") Page page, @Param("deviceId") Integer deviceId);
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceAcceptanceFileMapper.java b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceAcceptanceFileMapper.java
new file mode 100644
index 0000000..e6eb335
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceAcceptanceFileMapper.java
@@ -0,0 +1,16 @@
+package com.ruoyi.device.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.device.pojo.DeviceAcceptanceFile;
+
+/**
+ * <p>
+ * 璁惧楠屾敹(瑁呭)闄勪欢琛� Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-20 01:45:26
+ */
+public interface DeviceAcceptanceFileMapper extends BaseMapper<DeviceAcceptanceFile> {
+
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceAcceptanceMapper.java b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceAcceptanceMapper.java
new file mode 100644
index 0000000..31bdb87
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceAcceptanceMapper.java
@@ -0,0 +1,27 @@
+package com.ruoyi.device.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.device.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-device/src/main/java/com/ruoyi/device/mapper/DeviceAccidentReportMapper.java b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceAccidentReportMapper.java
new file mode 100644
index 0000000..25de891
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceAccidentReportMapper.java
@@ -0,0 +1,35 @@
+package com.ruoyi.device.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.device.dto.DeviceAccidentReportDto;
+import com.ruoyi.device.pojo.DeviceAccidentReport;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * <p>
+ * 璁惧浜嬫晠鎶ュ憡鍗� Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-17 06:31:12
+ */
+public interface DeviceAccidentReportMapper extends BaseMapper<DeviceAccidentReport> {
+
+    /**
+     * 璁惧浜嬫晠鎶ュ憡鍒楄〃
+     * @param page
+     * @param ew
+     * @return
+     */
+    IPage<DeviceAccidentReport> pageDeviceAccidentReport(Page page, @Param("ew") QueryWrapper<DeviceAccidentReport> ew);
+
+    /**
+     * 鏌ヨ璁惧浜嬫晠鎶ュ憡璇︽儏
+     * @param accidentReportId 璁惧浜嬫晠鎶ュ憡id
+     * @return
+     */
+    DeviceAccidentReportDto selectDeviceAccidentReportById(Integer accidentReportId);
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceBorrowMapper.java b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceBorrowMapper.java
new file mode 100644
index 0000000..498e972
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceBorrowMapper.java
@@ -0,0 +1,25 @@
+package com.ruoyi.device.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.device.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-device/src/main/java/com/ruoyi/device/mapper/DeviceBreakdownMaintenanceMapper.java b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceBreakdownMaintenanceMapper.java
new file mode 100644
index 0000000..78e9da2
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceBreakdownMaintenanceMapper.java
@@ -0,0 +1,27 @@
+package com.ruoyi.device.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.device.dto.DeviceBreakdownMaintenance;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * <p>
+ * 璁惧鏁呴殰缁翠慨琛� Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-17 04:50:57
+ */
+public interface DeviceBreakdownMaintenanceMapper extends BaseMapper<DeviceBreakdownMaintenance> {
+
+    /**
+     * 璁惧鏁呴殰缁翠慨鍒楄〃
+     * @param page
+     * @param ew
+     * @return
+     */
+    IPage<DeviceBreakdownMaintenance> pageDeviceBreakdownMaintenance(Page page, @Param("ew") QueryWrapper<DeviceBreakdownMaintenance> ew);
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceCalibrationPlanDetailMapper.java b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceCalibrationPlanDetailMapper.java
new file mode 100644
index 0000000..3f45575
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceCalibrationPlanDetailMapper.java
@@ -0,0 +1,27 @@
+package com.ruoyi.device.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.device.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-device/src/main/java/com/ruoyi/device/mapper/DeviceCalibrationPlanMapper.java b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceCalibrationPlanMapper.java
new file mode 100644
index 0000000..deedc46
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceCalibrationPlanMapper.java
@@ -0,0 +1,29 @@
+package com.ruoyi.device.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.device.dto.DeviceCalibrationPlanDto;
+import com.ruoyi.device.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-device/src/main/java/com/ruoyi/device/mapper/DeviceDocumentsMapper.java b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceDocumentsMapper.java
new file mode 100644
index 0000000..e786646
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceDocumentsMapper.java
@@ -0,0 +1,12 @@
+package com.ruoyi.device.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.device.pojo.DeviceDocuments;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 璁惧妗f
+ */
+@Mapper
+public interface DeviceDocumentsMapper extends BaseMapper<DeviceDocuments> {
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceExaminePlanDetailsMapper.java b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceExaminePlanDetailsMapper.java
new file mode 100644
index 0000000..228f0ad
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceExaminePlanDetailsMapper.java
@@ -0,0 +1,28 @@
+package com.ruoyi.device.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.device.dto.DeviceExaminePlanDetailsDto;
+import com.ruoyi.device.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<DeviceExaminePlanDetailsDto> pageDeviceExaminePlanDetail(Page page, @Param("ew") QueryWrapper<DeviceExaminePlanDetails> ew);
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceExaminePlanMapper.java b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceExaminePlanMapper.java
new file mode 100644
index 0000000..2161630
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceExaminePlanMapper.java
@@ -0,0 +1,35 @@
+package com.ruoyi.device.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.device.dto.DeviceExaminePlanDto;
+import com.ruoyi.device.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-device/src/main/java/com/ruoyi/device/mapper/DeviceExamineRecordContrastDetailsMapper.java b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceExamineRecordContrastDetailsMapper.java
new file mode 100644
index 0000000..07c67b8
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceExamineRecordContrastDetailsMapper.java
@@ -0,0 +1,16 @@
+package com.ruoyi.device.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.device.pojo.DeviceExamineRecordContrastDetails;
+
+/**
+ * <p>
+ * 璁惧鏍告煡璁板綍瀵规瘮璇︽儏琛� Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-16 07:14:57
+ */
+public interface DeviceExamineRecordContrastDetailsMapper extends BaseMapper<DeviceExamineRecordContrastDetails> {
+
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceExamineRecordContrastMapper.java b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceExamineRecordContrastMapper.java
new file mode 100644
index 0000000..c20a385
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceExamineRecordContrastMapper.java
@@ -0,0 +1,31 @@
+package com.ruoyi.device.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.device.dto.DeviceExamineRecordContrastDto;
+import com.ruoyi.device.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-device/src/main/java/com/ruoyi/device/mapper/DeviceExamineRecordDetailMapper.java b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceExamineRecordDetailMapper.java
new file mode 100644
index 0000000..990c345
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceExamineRecordDetailMapper.java
@@ -0,0 +1,16 @@
+package com.ruoyi.device.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.device.pojo.DeviceExamineRecordDetail;
+
+/**
+ * <p>
+ * 璁惧鏍告煡璁板綍璇︽儏琛� Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-16 07:15:11
+ */
+public interface DeviceExamineRecordDetailMapper extends BaseMapper<DeviceExamineRecordDetail> {
+
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceExamineRecordMapper.java b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceExamineRecordMapper.java
new file mode 100644
index 0000000..145a768
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceExamineRecordMapper.java
@@ -0,0 +1,31 @@
+package com.ruoyi.device.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.device.dto.DeviceExamineRecordDto;
+import com.ruoyi.device.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-device/src/main/java/com/ruoyi/device/mapper/DeviceExternalApplyMapper.java b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceExternalApplyMapper.java
new file mode 100644
index 0000000..b87c009
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceExternalApplyMapper.java
@@ -0,0 +1,34 @@
+package com.ruoyi.device.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.device.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-device/src/main/java/com/ruoyi/device/mapper/DeviceImpowerDetailsMapper.java b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceImpowerDetailsMapper.java
new file mode 100644
index 0000000..200e9a9
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceImpowerDetailsMapper.java
@@ -0,0 +1,26 @@
+package com.ruoyi.device.mapper;
+
+import com.ruoyi.device.dto.DeviceImpowerDetailsDto;
+import com.ruoyi.device.pojo.DeviceImpowerDetails;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 璁惧閲忓�兼函婧愯鍒掕鎯呰〃 Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author
+ * @since 2025-04-17 03:23:39
+ */
+public interface DeviceImpowerDetailsMapper extends BaseMapper<DeviceImpowerDetails> {
+
+    /**
+     * 鏌ヨ璁惧浣跨敤璇︽儏
+     * @param impowerId
+     * @return
+     */
+    List<DeviceImpowerDetailsDto> deviceImpowerDetailsList(@Param("impowerId") Integer impowerId);
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceImpowerMapper.java b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceImpowerMapper.java
new file mode 100644
index 0000000..8fb2b91
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceImpowerMapper.java
@@ -0,0 +1,36 @@
+package com.ruoyi.device.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.device.dto.DeviceImpowerDto;
+import com.ruoyi.device.dto.DeviceTraceabilityManagementDto;
+import com.ruoyi.device.pojo.DeviceImpower;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * <p>
+ * 璁惧閲忓�兼函婧愯鍒掕〃 Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author
+ * @since 2025-04-17 03:23:23
+ */
+public interface DeviceImpowerMapper extends BaseMapper<DeviceImpower> {
+
+    /**
+     * 鍒嗛〉鏌ヨ浣跨敤鎺堟潈
+     * @param page
+     * @param deviceImpowerDtoQueryWrapper
+     * @return
+     */
+    IPage<DeviceImpower> selectDeviceParameterPage(@Param("page") Page page, @Param("ew") QueryWrapper<DeviceImpowerDto> deviceImpowerDtoQueryWrapper);
+
+    /**
+     * 鏍规嵁id鏌ヨ璁惧浣跨敤鎺堟潈
+     * @param traceabilityManagementId
+     * @return
+     */
+    DeviceTraceabilityManagementDto selectDeviceTraceabilityManagementById(@Param("traceabilityManagementId") Integer traceabilityManagementId);
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceInspectionRecordDetailsMapper.java b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceInspectionRecordDetailsMapper.java
new file mode 100644
index 0000000..66d10cd
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceInspectionRecordDetailsMapper.java
@@ -0,0 +1,16 @@
+package com.ruoyi.device.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.device.pojo.DeviceInspectionRecordDetails;
+
+/**
+ * <p>
+ *  Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-16 04:27:32
+ */
+public interface DeviceInspectionRecordDetailsMapper extends BaseMapper<DeviceInspectionRecordDetails> {
+
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceInspectionRecordMapper.java b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceInspectionRecordMapper.java
new file mode 100644
index 0000000..9a05395
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceInspectionRecordMapper.java
@@ -0,0 +1,29 @@
+package com.ruoyi.device.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.device.dto.DeviceInspectionRecordDto;
+import com.ruoyi.device.pojo.DeviceInspectionRecord;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * <p>
+ *  Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-16 04:25:14
+ */
+public interface DeviceInspectionRecordMapper extends BaseMapper<DeviceInspectionRecord> {
+
+    /**
+     * 鍒嗛〉鏌ヨ璁惧鐐规璁板綍
+     * @param page
+     * @param queryWrappers
+     * @return
+     */
+    IPage<DeviceInspectionRecord> selectDeviceParameterPage(Page page, @Param("ew") QueryWrapper<DeviceInspectionRecordDto> queryWrappers);
+
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceLogMapper.java b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceLogMapper.java
new file mode 100644
index 0000000..193b5b6
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceLogMapper.java
@@ -0,0 +1,9 @@
+package com.ruoyi.device.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.device.pojo.DeviceLog;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface DeviceLogMapper extends BaseMapper<DeviceLog> {
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceMaintenanceMapper.java b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceMaintenanceMapper.java
new file mode 100644
index 0000000..e538a31
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceMaintenanceMapper.java
@@ -0,0 +1,26 @@
+package com.ruoyi.device.mapper;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.device.dto.DeviceMaintenanceDto;
+import com.ruoyi.device.pojo.DeviceMaintenance;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * 璁惧缁存姢淇濆吇
+ */
+@Mapper
+public interface DeviceMaintenanceMapper extends BaseMapper<DeviceMaintenance> {
+
+    /**
+     * 璁惧缁存姢鍒嗛〉鏌ヨ
+     * @param page
+     * @return
+     */
+    IPage<DeviceMaintenanceDto> selectDeviceMaintenancePage(@Param("page") Page page, @Param("ew") QueryWrapper<DeviceMaintenanceDto> ew);
+
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceMaintenancePlanDetailsMapper.java b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceMaintenancePlanDetailsMapper.java
new file mode 100644
index 0000000..86760eb
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceMaintenancePlanDetailsMapper.java
@@ -0,0 +1,25 @@
+package com.ruoyi.device.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.device.dto.DeviceMaintenancePlanDetailsDto;
+import com.ruoyi.device.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-device/src/main/java/com/ruoyi/device/mapper/DeviceMaintenancePlanMapper.java b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceMaintenancePlanMapper.java
new file mode 100644
index 0000000..eb9cd0a
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceMaintenancePlanMapper.java
@@ -0,0 +1,35 @@
+package com.ruoyi.device.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.device.dto.DeviceMaintenancePlanDto;
+import com.ruoyi.device.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(Page page, @Param("ew") QueryWrapper<DeviceMaintenancePlanDto> queryWrappers);
+
+    /**
+     * 鏍规嵁淇濆吇璁″垝id鏌ヨ璁惧淇濆吇璁″垝
+     * @param maintenancePlanId 淇濆吇璁″垝id
+     * @return
+     */
+    DeviceMaintenancePlanDto selectMaintenancePlanById(@Param("maintenancePlanId") Integer maintenancePlanId);
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceMapper.java b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceMapper.java
new file mode 100644
index 0000000..be50081
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceMapper.java
@@ -0,0 +1,46 @@
+package com.ruoyi.device.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.device.dto.DeviceDto;
+import com.ruoyi.device.pojo.Device;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 璁惧(Device)琛ㄦ暟鎹簱璁块棶灞�
+ */
+public interface DeviceMapper extends BaseMapper<Device> {
+
+    IPage<Device> selectDeviceParameter(Page page, QueryWrapper<Device> ew);
+    List<Device> selectEquipmentOverview(Page page, QueryWrapper<Device> ew);
+
+    //鑾峰彇琚巿鏉冧汉
+    List<Device> authorizedPerson();
+
+    //鏌ヨ
+    List<Device> search(@Param(value = "status") Integer status, @Param(value = "deviceName") String deviceName,
+                        @Param(value = "specificationModel") String specificationModel, @Param(value = "largeCategory") String largeCategory);
+
+    //鑾峰彇鍥剧墖鏁版嵁
+    void selectDeviceImage(@Param(value = "name") String name ,@Param(value = "id") Integer id);
+
+    IPage<DeviceDto> selectDeviceParameterPage(Page page, @Param("ew") QueryWrapper<DeviceDto> queryWrappers, @Param("laboratoryNameIsNull") Boolean laboratoryNameIsNull);
+
+    List<Map<String, Object>> getInspectionItemSubclass(@Param("id") Integer id);
+
+    List<Map<String, Object>> treeDevice(@Param("deviceName") String deviceName);
+
+    DeviceDto selectDeviceByCode(Integer id);
+
+    /**
+     * 鏌ヨ鍒拌揪鏍″噯鏈夋晥鏈熺殑璁惧-鎻愬墠5澶�
+     * @return
+     */
+    List<Device> selectOverdueDevice();
+}
+
diff --git a/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceMetricMapper.java b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceMetricMapper.java
new file mode 100644
index 0000000..6304f16
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceMetricMapper.java
@@ -0,0 +1,9 @@
+package com.ruoyi.device.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.device.pojo.DeviceMetric;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface DeviceMetricMapper extends BaseMapper<DeviceMetric> {
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceMetricRecordMapper.java b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceMetricRecordMapper.java
new file mode 100644
index 0000000..65f45dd
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceMetricRecordMapper.java
@@ -0,0 +1,16 @@
+package com.ruoyi.device.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.device.pojo.DeviceMetricRecord;
+
+/**
+ * <p>
+ * 璁惧鏍″噯 - 鏍″噯璁板綍 Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 
+ * @since 2024-09-27 10:20:01
+ */
+public interface DeviceMetricRecordMapper extends BaseMapper<DeviceMetricRecord> {
+
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceMetricsCopyMapper.java b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceMetricsCopyMapper.java
new file mode 100644
index 0000000..f5a66ca
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceMetricsCopyMapper.java
@@ -0,0 +1,16 @@
+package com.ruoyi.device.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.device.pojo.DeviceMetricsCopy;
+
+/**
+ * <p>
+ * 璁惧鏍″噯 - 鏍″噯璁板綍 - 鏍″噯鏉$洰 Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author
+ * @since 2024-09-27 10:20:11
+ */
+public interface DeviceMetricsCopyMapper extends BaseMapper<DeviceMetricsCopy> {
+
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceRecordMapper.java b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceRecordMapper.java
new file mode 100644
index 0000000..66e47cf
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceRecordMapper.java
@@ -0,0 +1,38 @@
+package com.ruoyi.device.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.ruoyi.device.dto.DeviceRecordDto;
+import com.ruoyi.device.pojo.DeviceRecord;
+import org.apache.ibatis.annotations.Param;
+
+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(@Param("deviceId") Integer deviceId, @Param("page") Page page, @Param("sampleCode") String sampleCode, @Param("managementNumber") String managementNumber, @Param("userId") Integer userId);
+
+
+    /**
+     * 鏌ヨ鏈~鍐欑殑璁惧
+     * @return
+     */
+    List<DeviceRecordDto> selectNotFilled();
+
+    /**
+     * 鏌ヨ瀵煎嚭璁惧浣跨敤璁板綍
+     * @param deviceId
+     * @param exportDate
+     * @return
+     */
+    List<DeviceRecord> selectExportList(@Param("deviceId") Integer deviceId, @Param("exportDate") String exportDate);
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceScrappedMapper.java b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceScrappedMapper.java
new file mode 100644
index 0000000..bf6266f
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceScrappedMapper.java
@@ -0,0 +1,35 @@
+package com.ruoyi.device.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.device.dto.DeviceScrappedDto;
+import com.ruoyi.device.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-device/src/main/java/com/ruoyi/device/mapper/DeviceStateMapper.java b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceStateMapper.java
new file mode 100644
index 0000000..5f2bc41
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceStateMapper.java
@@ -0,0 +1,21 @@
+package com.ruoyi.device.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.ruoyi.device.dto.DeviceStateDto;
+import com.ruoyi.device.pojo.DeviceState;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * <p>
+ * 璁惧鍋滅敤/鍚敤 Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 
+ * @since 2024-09-26 09:51:40
+ */
+public interface DeviceStateMapper extends BaseMapper<DeviceState> {
+
+    IPage<DeviceStateDto> getDeviceStatePage(@Param("deviceId") Integer deviceId, @Param("page") Page page, @Param("processNumber") String processNumber);
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceTraceabilityManagementDetailsMapper.java b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceTraceabilityManagementDetailsMapper.java
new file mode 100644
index 0000000..6834f74
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceTraceabilityManagementDetailsMapper.java
@@ -0,0 +1,26 @@
+package com.ruoyi.device.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.device.dto.DeviceTraceabilityManagementDetailsDto;
+import com.ruoyi.device.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-device/src/main/java/com/ruoyi/device/mapper/DeviceTraceabilityManagementMapper.java b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceTraceabilityManagementMapper.java
new file mode 100644
index 0000000..12b5fbb
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceTraceabilityManagementMapper.java
@@ -0,0 +1,34 @@
+package com.ruoyi.device.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.ruoyi.device.dto.DeviceTraceabilityManagementDto;
+import com.ruoyi.device.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> ew);
+
+    /**
+     * 鏍规嵁id鏌ヨ璁惧閲忓�兼函婧愯鍒�
+     * @param traceabilityManagementId
+     * @return
+     */
+    DeviceTraceabilityManagementDto selectDeviceTraceabilityManagementById(@Param("traceabilityManagementId") Integer traceabilityManagementId);
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/mapper/InstructionMapper.java b/cnas-device/src/main/java/com/ruoyi/device/mapper/InstructionMapper.java
new file mode 100644
index 0000000..ad93c15
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/mapper/InstructionMapper.java
@@ -0,0 +1,25 @@
+package com.ruoyi.device.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.device.dto.DeviceOperationInstructionDto;
+import com.ruoyi.device.pojo.DeviceInstruction;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.Map;
+
+/**
+ * <p>
+ * 浣滀笟鎸囧涔︽坊鍔犲彈鎺ф枃浠惰〃 Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author
+ * @since 2024-12-04 10:29:18
+ */
+public interface InstructionMapper extends BaseMapper<DeviceInstruction> {
+
+
+    IPage<DeviceOperationInstructionDto> pageByPageQueryOfHomeworkInstructions(Page page, @Param("ew") QueryWrapper<DeviceOperationInstructionDto> ew);
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/mapper/OperationInstructionMapper.java b/cnas-device/src/main/java/com/ruoyi/device/mapper/OperationInstructionMapper.java
new file mode 100644
index 0000000..6c6576d
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/mapper/OperationInstructionMapper.java
@@ -0,0 +1,20 @@
+package com.ruoyi.device.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.device.dto.DeviceOperationInstructionDto;
+import com.ruoyi.device.pojo.OperationInstruction;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 璁惧 - 浣滀笟鎸囧涔� 娣诲姞鍙楁帶鏂囦欢 瀛� Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author
+ * @since 2024-12-04 10:43:32
+ */
+public interface OperationInstructionMapper extends BaseMapper<OperationInstruction> {
+
+    List<DeviceOperationInstructionDto> homeworkGuidebookEditor(Integer instructionId);
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/pojo/CollectBridge.java b/cnas-device/src/main/java/com/ruoyi/device/pojo/CollectBridge.java
new file mode 100644
index 0000000..3f28a03
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/pojo/CollectBridge.java
@@ -0,0 +1,34 @@
+package com.ruoyi.device.pojo;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+/**
+ * 鏁板瓧鐢垫ˉ閲囬泦
+ *
+ * @author zhuo
+ * @since 2025-02-19
+ */
+@Data
+@TableName("collect_bridge")
+public class CollectBridge {
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @Schema(description = "濮旀墭缂栧彿")
+    private String entrustCode;
+
+    @Schema(description = "閲囬泦鍊�")
+    private String collectValue;
+
+    @Schema(description = "鏃堕棿")
+    private LocalDateTime collectDate;
+
+}
+
diff --git a/cnas-device/src/main/java/com/ruoyi/device/pojo/DataConfig.java b/cnas-device/src/main/java/com/ruoyi/device/pojo/DataConfig.java
new file mode 100644
index 0000000..ee93d20
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/pojo/DataConfig.java
@@ -0,0 +1,82 @@
+package com.ruoyi.device.pojo;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-07-13 12:23:00
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@TableName("device_data_config")
+@Schema(description = "")
+public class DataConfig implements Serializable {
+
+    @Schema(description = "涓婚敭id")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @Schema(description = "鍏紡")
+    private String formula;
+
+    @Schema(description = "鍙傜収X")
+    private String referx;
+
+    @Schema(description = "鍙傜収Y")
+    private String refery;
+
+    @Schema(description = "x")
+    private String x;
+
+    @Schema(description = "y")
+    private String y;
+
+    @Schema(description = "璁惧id")
+    private Integer deviceId;
+
+    @Schema(description = "妫�楠岄」鍒嗙被")
+    private String inspectionItemClass;
+
+    @Schema(description = "妫�楠岄」鐩�")
+    private String inspectionItem;
+
+    @Schema(description = "妫�楠岄」瀛愰」")
+    private String inspectionItemSubclass;
+
+    @TableField(exist = false)
+    @Schema(description = "妫�楠岄」瀛愰」")
+    private String insProductItem;
+
+    @Schema(description = "妫�楠岄」id")
+    private Integer structureItemParameterId;
+
+    @Schema(description = "搴忓彿")
+    private String serialNumber;
+
+    @Schema(description = "鍒悕")
+    private String anotherName;
+
+    @Schema(description = "鍖归厤鍚嶇О")
+    private String matchingName;
+
+    @TableField(select = false, exist = false)
+    private Boolean isDevice;
+
+    @TableField(select = false, exist = false)
+    private String sample;
+
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/pojo/Device.java b/cnas-device/src/main/java/com/ruoyi/device/pojo/Device.java
new file mode 100644
index 0000000..ef47471
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/pojo/Device.java
@@ -0,0 +1,138 @@
+package com.ruoyi.device.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+/**
+ * 璁惧(Device)琛ㄥ璞�
+ */
+@TableName(value = "device")
+@Data
+public class Device implements Serializable {
+
+    @Schema(description = "涓婚敭")
+    @TableId(type = IdType.AUTO)
+    private Integer id;
+
+    @Schema(description = "璁惧鍚嶇О")
+    private String deviceName;
+
+    @Schema(description = "en璁惧鍚嶇О")
+    private String enDeviceName;
+
+    @Schema(description = "瑙勬牸鍨嬪彿")
+    private String specificationModel;
+
+    @Schema(description = "鐢熶骇鍘傚")
+    private String manufacturer;
+
+    @Schema(description = "鍑哄巶缂栧彿")
+    private String factoryNo;
+
+    @Schema(description = "绠$悊缂栧彿")
+    private String managementNumber;
+
+    @Schema(description = "鎶�鏈寚鏍�")
+    private String technicalIndicators;
+
+    @Schema(description = "璐疆鏃ユ湡")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime acquisitionDate;
+
+    @Schema(description = "鏍″噯鏈夋晥鏃ユ湡")
+    private LocalDateTime activationDate;
+
+    @Schema(description = "绠$悊浜篒d")
+    private Integer equipmentManager;
+
+    @Schema(description = "瀛樻斁鐐�")
+    private String storagePoint;
+
+    @Schema(description = "鎵�灞為儴闂↖d")
+    private Integer subordinateDepartmentsId;
+
+    @Schema(description = "妫�楠岄」鐩甀d")
+    private String insProductIds;
+
+    @Schema(description = "鏍″噯鏈嶅姟鏈烘瀯")
+    private String calibrationServices;
+
+    @Schema(description = "鏈�杩戞牎鍑嗘棩鏈�")
+    private LocalDateTime lastCalibrationDate;
+
+    @Schema(description = "涓嬫鏍″噯鏃ユ湡")
+    private LocalDateTime nextCalibrationDate;
+
+    @Schema(description = "璁惧绫诲瀷")
+    private String largeCategory;
+
+    @Schema(description = "鍗曚环")
+    private BigDecimal unitPrice;
+
+    @Schema(description = "璁惧鐘舵��")
+    private Integer deviceStatus;
+
+    @Schema(description = "鏍″噯鍛ㄦ湡(鏈�)")
+    private String calibrationDate;
+
+    @Schema(description = "鍥剧墖涓婁紶")
+    private String imageUpload;
+
+    @Schema(description = "鍥剧墖澶囨敞")
+    private String imageName;
+
+    @Schema(description = "鍒涘缓浜篿d")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @Schema(description = "鏇存柊鏃堕棿")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime updateTime;
+
+    @Schema(description = "鍒涘缓鏃堕棿")
+    @TableField(fill = FieldFill.INSERT)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime createTime;
+
+    @Schema(description = "鏁伴噰-鏂囦欢鍚庣紑")
+    private String fileType;
+
+    @Schema(description = "鏁伴噰-閲囬泦鍦板潃")
+    private String collectUrl;
+
+    @Schema(description = "鏁伴噰-瀛樺偍鍦板潃")
+    private String storageUrl;
+
+    @Schema(description = "鏁伴噰-璁惧IP")
+    private String ip;
+
+    @Schema(description = "鏁伴噰-鏄惁涓烘暟閲囪澶�")
+    @TableField(exist = false)
+    private Boolean isItADataAcquisitionDevice;
+
+    @Schema(description = "鏁伴噰-濮旀墭瀛楁")
+    private String entrustCode;
+
+    @Schema(description = "鏁伴噰-鏍峰搧瀛楁")
+    private String sampleCode;
+
+    @Schema(description = "鏁伴噰-db锛宮db鏂囦欢鍚嶇О")
+    private String dbFileName;
+
+    @Schema(description = "琚巿鏉冧汉")
+    private String authorizedPerson;
+
+    @Schema(description = "璧勪骇缂栫爜")
+    private String assetCode;
+
+    @Schema(description = "浜у湴")
+    private String origin;
+
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceAcceptance.java b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceAcceptance.java
new file mode 100644
index 0000000..8f91e9a
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceAcceptance.java
@@ -0,0 +1,76 @@
+package com.ruoyi.device.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+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")
+@Schema(description = "璁惧楠屾敹(瑁呭)")
+public class DeviceAcceptance {
+
+    @TableId(value = "acceptance_id", type = IdType.AUTO)
+    private Integer acceptanceId;
+
+    @Schema(description = "璁惧id")
+    private Integer deviceId;
+
+    @Schema(description = "鍒拌揣鏃ユ湡")
+    private LocalDate arrivalDate;
+
+    @Schema(description = "閲戦")
+    private String goldAmount;
+
+    @Schema(description = "缁翠慨鍗曚綅")
+    private String maintenanceunit;
+
+    @Schema(description = "鏀惰澶囦富鏈哄拰澶囦唤鎯呭喌")
+    private String spareParts;
+
+    @Schema(description = "瀹夎鍜岃皟璇曟儏鍐�")
+    private String installationDebugging;
+
+    @Schema(description = "楠屾敹鎯呭喌")
+    private String checkSituation;
+
+    @Schema(description = "鎺ユ敹绛惧瓧")
+    private String receivingSignature;
+
+    @Schema(description = "鍘傚浠h〃")
+    private String producer;
+
+    @Schema(description = "鎺ユ敹浜�")
+    private String recipient;
+
+    @Schema(description = "鎺ユ敹鏃堕棿")
+    private String recipientDate;
+
+    @Schema(description = "鍒涘缓浜�")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @Schema(description = "鍒涘缓鏃堕棿")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @Schema(description = "淇敼浜�")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    @Schema(description = "淇敼鏃堕棿")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceAcceptanceFile.java b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceAcceptanceFile.java
new file mode 100644
index 0000000..5888234
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceAcceptanceFile.java
@@ -0,0 +1,57 @@
+package com.ruoyi.device.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+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")
+@Schema(description = "璁惧楠屾敹(瑁呭)闄勪欢琛�")
+public class DeviceAcceptanceFile implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "acceptance_file_id", type = IdType.AUTO)
+    private Integer acceptanceFileId;
+
+    @Schema(description = "璁惧楠屾敹id")
+    private Integer acceptanceId;
+
+    @Schema(description = "绫诲瀷:1鍥剧墖/2鏂囦欢")
+    private Integer type;
+
+    @Schema(description = "闄勪欢璺緞")
+    private String fileUrl;
+
+    @Schema(description = "闄勪欢鍚嶇О")
+    private String fileName;
+
+    @Schema(description = "鍒涘缓浜�")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @Schema(description = "鍒涘缓鏃堕棿")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @Schema(description = "淇敼浜�")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    @Schema(description = "淇敼鏃堕棿")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceAccidentReport.java b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceAccidentReport.java
new file mode 100644
index 0000000..be242b0
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceAccidentReport.java
@@ -0,0 +1,119 @@
+package com.ruoyi.device.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+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")
+@Schema(description = "璁惧浜嬫晠鎶ュ憡鍗�")
+public class DeviceAccidentReport {
+
+    @TableId(value = "accident_report_id", type = IdType.AUTO)
+    private Integer accidentReportId;
+
+    @Schema(description = "璁惧id")
+    private Integer deviceId;
+
+    @Schema(description = "鍦板潃")
+    private String address;
+
+    @Schema(description = "鏃堕棿")
+    private LocalDateTime accidentDate;
+
+    @Schema(description = "浜嬫晠鎯呭喌鎻忚堪")
+    private String descriptionOfAccident;
+
+    @Schema(description = "鎶ュ憡浜篿d")
+    private Integer reportUserId;
+
+    @Schema(description = "鎶ュ憡浜�")
+    private String reportUser;
+
+    @Schema(description = "鎶ュ憡浜哄~鍐欐椂闂�")
+    private LocalDate reportDate;
+
+    @Schema(description = "璇勪及浜烘剰瑙�")
+    private String assessorOpinion;
+
+    @Schema(description = "璇勪及浜篿d")
+    private Integer assessorUserId;
+
+    @Schema(description = "璇勪及浜�")
+    private String assessorUser;
+
+    @Schema(description = "璇勪及浜哄~鍐欐椂闂�")
+    private LocalDate assessorDate;
+
+    @Schema(description = "閮ㄩ棬璐熻矗浜烘剰瑙�")
+    private String departmentHeadOpinion;
+
+    @Schema(description = "閮ㄩ棬璐熻矗浜篿d")
+    private Integer departmentHeadUserId;
+
+    @Schema(description = "閮ㄩ棬璐熻矗浜�")
+    private String departmentHeadUser;
+
+    @Schema(description = "閮ㄩ棬璐熻矗浜哄~鍐欐椂闂�")
+    private LocalDate departmentHeadDate;
+
+    @Schema(description = "鎶�鏈礋璐d汉鎰忚")
+    private String technicalDirectorOpinion;
+
+    @Schema(description = "鎶�鏈礋璐d汉id")
+    private Integer technicalDirectorUserId;
+
+    @Schema(description = "鎶�鏈礋璐d汉")
+    private String technicalDirectorUser;
+
+    @Schema(description = "鎶�鏈礋璐d汉濉啓鏃堕棿")
+    private LocalDate technicalDirectorDate;
+
+    @Schema(description = "涓讳换鎰忚")
+    private String directorHeadOpinion;
+
+    @Schema(description = "涓讳换id")
+    private Integer directorHeadUserId;
+
+    @Schema(description = "涓讳换")
+    private String directorHeadUser;
+
+    @Schema(description = "涓讳换濉啓鏃堕棿")
+    private LocalDate directorHeadDate;
+
+    @Schema(description = "鏄惁缁撴潫,0 鏈粨鏉�, 1缁撴潫")
+    private Integer isFinish;
+
+    @Schema(description = "鍒涘缓浜�")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @Schema(description = "鍒涘缓鏃堕棿")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @Schema(description = "淇敼浜�")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    @Schema(description = "淇敼鏃堕棿")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+
+    @TableField(exist = false,select = false)
+    @Schema(description = "娴佺▼, 0:鎶ュ憡, 1璇勪及, 2:閮ㄩ棬璐熻矗浜烘剰瑙�, 3:鎶�鏈礋璐d汉鎰忚, 4:涓讳换鎰忚")
+    private Integer flowType;
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceBorrow.java b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceBorrow.java
new file mode 100644
index 0000000..ba32816
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceBorrow.java
@@ -0,0 +1,132 @@
+package com.ruoyi.device.pojo;
+
+import com.alibaba.excel.annotation.ExcelIgnore;
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+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")
+@Schema(description = "璁惧鍊熺敤")
+@ExcelIgnoreUnannotated
+public class DeviceBorrow implements Serializable {
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @Schema(description = "娴佺▼缂栧彿")
+    @ExcelProperty(value = "娴佺▼缂栧彿")
+    private String processNumber;
+
+    @Schema(description = "璁惧id")
+    private Integer deviceId;
+
+    @Schema(description = "绠$悊缂栧彿")
+    @ExcelProperty(value = "绠$悊缂栧彿")
+    private String unifyNumber;
+
+    @Schema(description = "鍊熺敤浜�")
+    @ExcelProperty(value = "鍊熺敤浜�")
+    private String recipientUser;
+
+    @ExcelProperty(value = "鍊熺敤浜鸿仈绯绘柟寮�")
+    @Schema(description = "鍊熺敤浜鸿仈绯绘柟寮�")
+    private String borrowerContactInformation;
+
+    @Schema(description = "鍊熺敤鏃剁姸鎬�")
+    @ExcelProperty(value = "鍊熺敤鏃剁姸鎬�")
+    //0鍚堟牸;1缁翠慨;2鍋滅敤;3鎶ュ簾
+    private Integer recipientState;
+
+    @Schema(description = "鍊熺敤鏃ユ湡")
+    @ExcelProperty(value = "鎻愪氦鏃ユ湡")
+    private Date recipientTime;
+
+    @Schema(description = "鍊熷嚭浜�")
+    @ExcelProperty(value = "鍊熷嚭浜�")
+    private String submitUser;
+
+    @Schema(description = "鍊熷嚭鏃ユ湡")
+    @ExcelProperty(value = "鍊熷嚭鏃ユ湡")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @Schema(description = "褰撳墠鐘舵��")
+    @ExcelProperty(value = "褰撳墠鐘舵��")
+    private String nowState;
+
+    @Schema(description = "褰撳墠璐d换浜�")
+    @ExcelProperty(value = "褰撳墠璐d换浜�")
+    private String nowUser;
+
+    @Schema(description = "闄勪欢")
+    //璺緞
+    private String url;
+
+    @Schema(description = "闄勪欢")
+    @ExcelProperty(value = "闄勪欢")
+    //鏂囦欢鍚�
+    private String fileName;
+
+    @Schema(description = "涓嬬幆鑺傝矗浠讳汉")
+    private String nextUser;
+
+    @Schema(description = "鎻愪氦鎿嶄綔浜�")
+    private String submitOperationUser;
+
+    @Schema(description = "鎻愪氦鎿嶄綔鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime submitOperationTime;
+
+    @Schema(description = "褰掕繕浜�")
+    private String rebackUser;
+
+    @Schema(description = "褰掕繕鏃ユ湡")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime rebackTime;
+
+    @Schema(description = "鎺ュ彈鐘舵��0鍚堟牸;1缁翠慨;2鍋滅敤;3鎶ュ簾")
+    private Integer receiveState;
+
+    @Schema(description = "璁惧璐d换浜�")
+    private String deviceUser;
+
+    @Schema(description = "澶囨敞")
+    private String note;
+
+    @Schema(description = "鎺ユ敹鎿嶄綔浜�")
+    private String receiveOperationUser;
+
+    @Schema(description = "鎺ユ敹鎿嶄綔鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime receiveOperationTime;
+
+    @Schema(description = "璁惧鍚嶇О")
+    @TableField(select = false, exist = false)
+    @ExcelProperty(value = "璁惧鍚嶇О")
+    private String deviceName;
+
+
+    @Schema(description = "娴佺▼璺熻釜")
+    @TableField(select = false, exist = false)
+    private List<DeviceLog> deviceLogs;
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceCalibrationPlan.java b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceCalibrationPlan.java
new file mode 100644
index 0000000..e19f3a0
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceCalibrationPlan.java
@@ -0,0 +1,66 @@
+package com.ruoyi.device.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+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")
+@Schema(description = "璁惧鏍″噯璁″垝涓昏〃")
+public class DeviceCalibrationPlan{
+
+    @TableId(value = "plan_id", type = IdType.AUTO)
+    private Integer planId;
+
+    @Schema(description = "璁″垝鍚嶇О")
+    private String planName;
+
+    @Schema(description = "璁″垝骞翠唤")
+    private String planYear;
+
+    @Schema(description = "缂栧埗浜�")
+    private Integer writeUserId;
+
+    @Schema(description = "缂栧埗鏃堕棿")
+    private LocalDateTime writeTime;
+
+    @Schema(description = "鎵瑰噯浜�")
+    private Integer ratifyUserId;
+
+    @Schema(description = "鎵瑰噯鏃堕棿")
+    private LocalDateTime ratifyTime;
+
+    @Schema(description = "鎵瑰噯鐘舵��,0 涓嶉�氳繃, 1 閫氳繃")
+    private Integer ratifyStatus;
+
+    @Schema(description = "鎵瑰噯淇℃伅")
+    private String ratifyRemark;
+
+    @Schema(description = "鍒涘缓浜�")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @Schema(description = "鍒涘缓鏃堕棿")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @Schema(description = "淇敼浜�")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    @Schema(description = "淇敼鏃堕棿")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceCalibrationPlanDetail.java b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceCalibrationPlanDetail.java
new file mode 100644
index 0000000..ec5e252
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceCalibrationPlanDetail.java
@@ -0,0 +1,73 @@
+package com.ruoyi.device.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+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")
+@Schema(description = "璁惧鏍″噯璁″垝璇︽儏琛�")
+public class DeviceCalibrationPlanDetail{
+
+    @TableId(value = "plan_detail_id", type = IdType.AUTO)
+    private Integer planDetailId;
+
+    @Schema(description = "璁″垝涓昏〃id")
+    private Integer planId;
+
+    @Schema(description = "璁惧id")
+    private Integer deviceId;
+
+    @Schema(description = "璁惧鍚嶇О鍙婂瀷鍙�")
+    private String deviceName;
+
+    @Schema(description = "璁惧鏁伴噺")
+    private String deviceAmount;
+
+    @Schema(description = "浠櫒缂栧彿")
+    private String deviceNumber;
+
+    @Schema(description = "妫�瀹氬崟浣�")
+    private String verificationUnit;
+
+    @Schema(description = "妫�瀹氬懆鏈�")
+    private String verificationCycles;
+
+    @Schema(description = "鏈�杩戞瀹氭椂闂�")
+    private LocalDate lastDate;
+
+    @Schema(description = "鏈勾璁″垝鏍″噯鏃堕棿")
+    private LocalDate planDate;
+
+    @Schema(description = "澶囨敞")
+    private String remark;
+
+    @Schema(description = "鍒涘缓浜�")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @Schema(description = "鍒涘缓鏃堕棿")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @Schema(description = "淇敼浜�")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    @Schema(description = "淇敼鏃堕棿")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceDocuments.java b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceDocuments.java
new file mode 100644
index 0000000..1d52a7d
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceDocuments.java
@@ -0,0 +1,94 @@
+package com.ruoyi.device.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+
+/**
+ * 璁惧妗f
+ */
+@Data
+@TableName(value = "device_documents")
+public class DeviceDocuments 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;
+
+    /**
+     * 鎻愪緵鏃ユ湡
+     */
+    private LocalDateTime provideDate;
+
+    /**
+     * 澶囨敞
+     */
+    private String comments;
+
+    /**
+     * 鍒涘缓鏃堕棿
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime createTime;
+
+    /**
+     * 鏇存柊鏃堕棿
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+
+    @Schema(description = "璁惧id")
+    private Integer deviceId;
+
+    @Schema(description = "璧勪骇缂栧彿")
+    private String number;
+
+    @Schema(description = "鍘熷鏂囦欢鍚嶇О")
+    private String systemFileName;
+
+    @Schema(description = "绯荤粺鐢熸垚鏂囦欢鍚嶇О")
+    private String fileName;
+
+
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceExaminePlan.java b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceExaminePlan.java
new file mode 100644
index 0000000..28d14ee
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceExaminePlan.java
@@ -0,0 +1,66 @@
+package com.ruoyi.device.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+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")
+@Schema(description = "璁惧鏍告煡璁″垝涓昏〃")
+public class DeviceExaminePlan{
+
+    @TableId(value = "plan_id", type = IdType.AUTO)
+    private Integer planId;
+
+    @Schema(description = "璁″垝鍚嶇О")
+    private String planName;
+
+    @Schema(description = "璁″垝鍚嶇О")
+    private String planYear;
+
+    @Schema(description = "缂栧埗浜�")
+    private Integer writeUserId;
+
+    @Schema(description = "缂栧埗鏃堕棿")
+    private LocalDateTime writeTime;
+
+    @Schema(description = "鎵瑰噯浜�")
+    private Integer ratifyUserId;
+
+    @Schema(description = "鎵瑰噯鏃堕棿")
+    private LocalDateTime ratifyTime;
+
+    @Schema(description = "鎵瑰噯鐘舵��,0 涓嶉�氳繃, 1 閫氳繃")
+    private Integer ratifyStatus;
+
+    @Schema(description = "鎵瑰噯淇℃伅")
+    private String ratifyRemark;
+
+    @Schema(description = "鍒涘缓浜�")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @Schema(description = "鍒涘缓鏃堕棿")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @Schema(description = "淇敼浜�")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    @Schema(description = "淇敼鏃堕棿")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceExaminePlanDetails.java b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceExaminePlanDetails.java
new file mode 100644
index 0000000..bc8c1c3
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceExaminePlanDetails.java
@@ -0,0 +1,75 @@
+package com.ruoyi.device.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+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")
+@Schema(description = "璁惧鏍告煡璁″垝璇︽儏琛�")
+public class DeviceExaminePlanDetails {
+
+    @TableId(value = "plan_details_id", type = IdType.AUTO)
+    private Integer planDetailsId;
+
+    @Schema(description = "涓昏〃id")
+    private Integer planId;
+
+    @Schema(description = "璁惧id")
+    private Integer deviceId;
+
+    @Schema(description = "璁惧缂栧彿")
+    private String deviceNumber;
+
+    @Schema(description = "璁″垝鍚嶇О")
+    private String deviceName;
+
+    @Schema(description = "鏍告煡鏃堕棿")
+    private String checkTime;
+
+    @Schema(description = "鏍告煡鎸囨爣")
+    private String checkIndex;
+
+    @Schema(description = "鏍告煡鏂规硶")
+    private String checkMethod;
+
+    @Schema(description = "缁撴灉濡備綍鍒ゅ畾")
+    private String howResults;
+
+    @Schema(description = "鏍告煡璐d换浜篿d")
+    private Integer checkChargerUserId;
+
+    @Schema(description = "鏍告煡璐d换浜�")
+    private String checkChargerUser;
+
+    @Schema(description = "澶囨敞")
+    private String remark;
+
+    @Schema(description = "鍒涘缓浜�")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @Schema(description = "鍒涘缓鏃堕棿")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @Schema(description = "淇敼浜�")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    @Schema(description = "淇敼鏃堕棿")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceExamineRecord.java b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceExamineRecord.java
new file mode 100644
index 0000000..ac00f28
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceExamineRecord.java
@@ -0,0 +1,138 @@
+package com.ruoyi.device.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+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")
+@Schema(description = "璁惧鏍告煡璁板綍琛�")
+public class DeviceExamineRecord implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "record_id", type = IdType.AUTO)
+    private Integer recordId;
+
+    @Schema(description = "璁惧鏍告煡璇︽儏id")
+    private Integer planDetailsId;
+
+    @Schema(description = "绮惧害绛夌骇")
+    private String accuracyGrade;
+
+    @Schema(description = "浣跨敤鐗╄川鍚嶇О")
+    private String materialName;
+
+    @Schema(description = "浣跨敤鐗╄川绠$悊缂栧彿")
+    private String materialNumber;
+
+    @Schema(description = "浣跨敤鐗╄川绮惧害/涓嶇‘瀹氬害")
+    private String materialAccuracyUncertainty;
+
+    @Schema(description = "浣跨敤鐗╄川瑙勬牸鍨嬪彿")
+    private String materialModel;
+
+    @Schema(description = "浣跨敤鐗╄川鏍告煡鏂瑰紡")
+    private String materialCheckMethod;
+
+    @Schema(description = "浣跨敤鐗╄川鏍告煡椤圭洰")
+    private String materialCheckItems;
+
+    @Schema(description = "娓╁害")
+    private String temperature;
+
+    @Schema(description = "婀垮害")
+    private String humidity;
+
+    @Schema(description = "鍒ゅ畾")
+    private String determine;
+
+    @Schema(description = "澶囨敞")
+    private String remark;
+
+    @Schema(description = "鏍告煡浜篿d")
+    private Integer checkerUserId;
+
+    @Schema(description = "鏍告煡浜�")
+    private String checkerUser;
+
+    @Schema(description = "澶嶆牳浜篿d")
+    private Integer reviewUserId;
+
+    @Schema(description = "澶嶆牳浜�")
+    private String reviewUser;
+
+    @Schema(description = "瀹℃牳鐘舵��0,涓嶉�氳繃, 1閫氳繃")
+    private Integer reviewStatus;
+
+    @Schema(description = "瀹℃牳澶囨敞")
+    private String reviewRemark;
+
+    @Schema(description = "娴嬭瘯鐐�1")
+    private String dataValue1;
+    @Schema(description = "娴嬭瘯鐐�2")
+    private String dataValue2;
+    @Schema(description = "娴嬭瘯鐐�3")
+    private String dataValue3;
+    @Schema(description = "娴嬭瘯鐐�4")
+    private String dataValue4;
+    @Schema(description = "娴嬭瘯鐐�5")
+    private String dataValue5;
+    @Schema(description = "娴嬭瘯鐐�6")
+    private String dataValue6;
+
+    @Schema(description = "鏈�澶у亸宸�1")
+    private String maximun1;
+    @Schema(description = "鏈�澶у亸宸�2")
+    private String maximun2;
+    @Schema(description = "鏈�澶у亸宸�3")
+    private String maximun3;
+    @Schema(description = "鏈�澶у亸宸�4")
+    private String maximun4;
+    @Schema(description = "鏈�澶у亸宸�5")
+    private String maximun5;
+    @Schema(description = "鏈�澶у亸宸�6")
+    private String maximun6;
+
+    @Schema(description = "鐩稿鍋忓樊1")
+    private String relative1;
+    @Schema(description = "鐩稿鍋忓樊2")
+    private String relative2;
+    @Schema(description = "鐩稿鍋忓樊3")
+    private String relative3;
+    @Schema(description = "鐩稿鍋忓樊4")
+    private String relative4;
+    @Schema(description = "鐩稿鍋忓樊5")
+    private String relative5;
+    @Schema(description = "鐩稿鍋忓樊6")
+    private String relative6;
+
+    @Schema(description = "鍒涘缓浜�")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @Schema(description = "鍒涘缓鏃堕棿")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @Schema(description = "淇敼浜�")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    @Schema(description = "淇敼鏃堕棿")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceExamineRecordContrast.java b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceExamineRecordContrast.java
new file mode 100644
index 0000000..44809aa
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceExamineRecordContrast.java
@@ -0,0 +1,96 @@
+package com.ruoyi.device.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+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")
+@Schema(description = "璁惧鏍告煡璁板綍瀵规瘮琛�")
+public class DeviceExamineRecordContrast implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "record_contrast_id", type = IdType.AUTO)
+    private Integer recordContrastId;
+
+    @Schema(description = "鏍告煡鏂瑰紡")
+    private String checkMethod;
+
+    @Schema(description = "璁惧鏍告煡璇︽儏id")
+    private Integer planDetailsId;
+
+    @Schema(description = "璁惧idA")
+    private Integer aDeviceId;
+
+    @Schema(description = "璁惧idb")
+    private Integer bDeviceId;
+
+    @Schema(description = "璁惧idc")
+    private Integer cDeviceId;
+
+    @Schema(description = "鑼冨洿涓嶇‘瀹氬害A")
+    private String aRangeUncertainty;
+
+    @Schema(description = "鑼冨洿涓嶇‘瀹氬害b")
+    private String bRangeUncertainty;
+
+    @Schema(description = "鑼冨洿涓嶇‘瀹氬害c")
+    private String cRangeUncertainty;
+
+    @Schema(description = "缁煎悎鍒ゅ畾")
+    private String judgment;
+
+    @Schema(description = "鏍告煡浜篿d")
+    private Integer checkerUserId;
+
+    @Schema(description = "鏍告煡浜�")
+    private String checkerUser;
+
+    @Schema(description = "鏍告煡鏃ユ湡")
+    private LocalDateTime checkerTime;
+
+    @Schema(description = "瀹℃牳浜篿d")
+    private Integer reviewUserId;
+
+    @Schema(description = "瀹℃牳浜�")
+    private String reviewUser;
+
+    @Schema(description = "瀹℃牳鐘舵��0,涓嶉�氳繃, 1閫氳繃")
+    private Integer reviewStatus;
+
+    @Schema(description = "瀹℃牳澶囨敞")
+    private String reviewRemark;
+
+    @Schema(description = "瀹℃牳鏃ユ湡")
+    private LocalDateTime reviewTime;
+
+    @Schema(description = "鍒涘缓浜�")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @Schema(description = "鍒涘缓鏃堕棿")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @Schema(description = "淇敼浜�")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    @Schema(description = "淇敼鏃堕棿")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceExamineRecordContrastDetails.java b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceExamineRecordContrastDetails.java
new file mode 100644
index 0000000..89d1b54
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceExamineRecordContrastDetails.java
@@ -0,0 +1,69 @@
+package com.ruoyi.device.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+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")
+@Schema(description = "璁惧鏍告煡璁板綍瀵规瘮璇︽儏琛�")
+public class DeviceExamineRecordContrastDetails implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "record_contrast_details_id", type = IdType.AUTO)
+    private Integer recordContrastDetailsId;
+
+    @Schema(description = "璁惧鏍告煡璇︽儏id")
+    private Integer recordContrastId;
+
+    @Schema(description = "鏍告煡椤圭洰")
+    private String checkItems;
+
+    @Schema(description = "a浠櫒绀哄��")
+    private String indicationA;
+
+    @Schema(description = "b浠櫒绀哄��")
+    private String indicationB;
+
+    @Schema(description = "c浠櫒绀哄��")
+    private String indicationC;
+
+    @Schema(description = "宸��")
+    private String dValue;
+
+    @Schema(description = "鍋忓樊")
+    private String deviation;
+
+    @Schema(description = "鍒ゅ畾")
+    private String determine;
+
+    @Schema(description = "鍒涘缓浜�")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @Schema(description = "鍒涘缓鏃堕棿")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @Schema(description = "淇敼浜�")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    @Schema(description = "淇敼鏃堕棿")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceExamineRecordDetail.java b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceExamineRecordDetail.java
new file mode 100644
index 0000000..50cf912
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceExamineRecordDetail.java
@@ -0,0 +1,69 @@
+package com.ruoyi.device.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+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")
+@Schema(description = "璁惧鏍告煡璁板綍璇︽儏琛�")
+public class DeviceExamineRecordDetail implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "record_detail_id", type = IdType.AUTO)
+    private Integer recordDetailId;
+
+    @Schema(description = "璁捐澶囨牳鏌ヨ褰昳d")
+    private Integer recordId;
+
+    @Schema(description = "娴嬭瘯鐐�")
+    private String testPoint;
+
+    @Schema(description = "鍐呭鍊�1")
+    private String dataValue1;
+
+    @Schema(description = "鍐呭鍊�2")
+    private String dataValue2;
+
+    @Schema(description = "鍐呭鍊�3")
+    private String dataValue3;
+
+    @Schema(description = "鍐呭鍊�4")
+    private String dataValue4;
+
+    @Schema(description = "鍐呭鍊�5")
+    private String dataValue5;
+
+    @Schema(description = "鍐呭鍊�6")
+    private String dataValue6;
+
+    @Schema(description = "鍒涘缓浜�")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @Schema(description = "鍒涘缓鏃堕棿")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @Schema(description = "淇敼浜�")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    @Schema(description = "淇敼鏃堕棿")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceExternalApply.java b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceExternalApply.java
new file mode 100644
index 0000000..2a5d1dc
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceExternalApply.java
@@ -0,0 +1,122 @@
+package com.ruoyi.device.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+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")
+@Schema(description = "鍒╃敤澶栭儴璁惧鐢宠琛�")
+public class DeviceExternalApply{
+
+    @TableId(value = "external_apply_id", type = IdType.AUTO)
+    private Integer externalApplyId;
+
+    @Schema(description = "鍗曚綅鍚嶇О")
+    private String unitName;
+
+    @Schema(description = "鍦板潃")
+    private String address;
+
+    @Schema(description = "浠櫒鍚嶇О")
+    private String deviceName;
+
+    @Schema(description = "浠櫒鍨嬪彿")
+    private String deviceModel;
+
+    @Schema(description = "閰嶄欢")
+    private String parts;
+
+    @Schema(description = "瀵规柟浠櫒缂栧彿")
+    private String instrumentNumber;
+
+    @Schema(description = "鎶�鏈寚鏍�")
+    private String technicalIndex;
+
+    @Schema(description = "鎶�鏈姹�")
+    private String technicalRequirements;
+
+    @Schema(description = "鍒╃敤鍘熷洜")
+    private String useReason;
+
+    @Schema(description = "0鐢宠浜篿d")
+    private Integer applicantUserId;
+
+    @Schema(description = "0鐢宠浜�")
+    private String applicantUser;
+
+    @Schema(description = "0鐢宠鏃堕棿")
+    private LocalDate applicantDate;
+
+    @Schema(description = "1閮ㄩ棬璐熻矗浜烘剰瑙�")
+    private String departmentHeadOpinion;
+
+    @Schema(description = "1閮ㄩ棬璐熻矗浜篿d")
+    private Integer departmentHeadUserId;
+
+    @Schema(description = "1閮ㄩ棬璐熻矗浜�")
+    private String departmentHeadUser;
+
+    @Schema(description = "1閮ㄩ棬璐熻矗浜哄~鍐欐椂闂�")
+    private LocalDate departmentHeadDate;
+
+    @Schema(description = "2璁¢噺瀹ゆ剰瑙�")
+    private String meteringRoomOpinion;
+
+    @Schema(description = "2璁¢噺瀹や汉id")
+    private Integer meteringRoomUserId;
+
+    @Schema(description = "2璁¢噺瀹や汉")
+    private String meteringRoomUser;
+
+    @Schema(description = "2璁¢噺瀹や汉濉啓鏃堕棿")
+    private LocalDate meteringRoomDate;
+
+    @Schema(description = "3鎵瑰噯浜烘剰瑙�")
+    private String approverOpinion;
+
+    @Schema(description = "3鎵瑰噯浜篿d")
+    private Integer approverUserId;
+
+    @Schema(description = "3鎵瑰噯浜�")
+    private String approverUser;
+
+    @Schema(description = "3鎵瑰噯浜哄~鍐欐椂闂�")
+    private LocalDate approverDate;
+
+    @Schema(description = "鏄惁缁撴潫,0: 鏈粨鏉�, 1:缁撴潫")
+    private Integer isFinish;
+
+    @Schema(description = "鍒涘缓浜�")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @Schema(description = "鍒涘缓鏃堕棿")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @Schema(description = "淇敼浜�")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    @Schema(description = "淇敼鏃堕棿")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+
+    @TableField(exist = false,select = false)
+    @Schema(description = "娴佺▼, 0:鐢宠, 1鐢宠閮ㄩ棬璐熻矗浜烘剰瑙�, 2:璁¢噺瀹ゆ剰瑙�, 3:鎵瑰噯浜�")
+    private Integer flowType;
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceImpower.java b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceImpower.java
new file mode 100644
index 0000000..9c7ff24
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceImpower.java
@@ -0,0 +1,74 @@
+package com.ruoyi.device.pojo;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 璁惧浣跨敤鎺堟潈琛�
+ * </p>
+ *
+ * @author
+ * @since 2025-04-17 03:23:23
+ */
+@Getter
+@Setter
+@TableName("device_impower")
+@Schema(description = "璁惧浣跨敤鎺堟潈琛�")
+public class DeviceImpower implements Serializable {
+
+    @Schema(description = "鎺堟潈id")
+    @TableId(value = "impower_id", type = IdType.AUTO)
+    private Integer impowerId;
+
+    @Schema(description = "璁″垝骞翠唤")
+    private String impowerYear;
+
+    @Schema(description = "缂栧埗浜篿d")
+    private Integer compilerId;
+
+    @Schema(description = "缂栧埗浜�")
+    private String compiler;
+
+    @Schema(description = "缂栧埗鏃堕棿")
+    private LocalDateTime datePreparation;
+
+    @Schema(description = "瀹℃牳鐘舵�侊紝0鏈鏍革紝1瀹℃牳")
+    private Integer status;
+
+    @Schema(description = "鎺堟潈id")
+    private Integer auditId;
+
+    @Schema(description = "鎺堟潈浜�")
+    private String audit;
+
+    @Schema(description = "鎺堟潈鏃ユ湡")
+    private LocalDateTime auditDate;
+
+    @Schema(description = "鎺堟潈淇℃伅")
+    private String auditRemark;
+
+    @Schema(description = "鍒涘缓浜篿d")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @Schema(description = "鍒涘缓鏃ユ湡")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @Schema(description = "淇敼浜篿d")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    @Schema(description = "淇敼鏃堕棿")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceImpowerDetails.java b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceImpowerDetails.java
new file mode 100644
index 0000000..b662883
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceImpowerDetails.java
@@ -0,0 +1,60 @@
+package com.ruoyi.device.pojo;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 璁惧閲忓�兼函婧愯鍒掕鎯呰〃
+ * </p>
+ *
+ * @author
+ * @since 2025-04-17 03:23:39
+ */
+@Getter
+@Setter
+@TableName("device_impower_details")
+@Schema(description = "璁惧閲忓�兼函婧愯鍒掕鎯呰〃")
+public class DeviceImpowerDetails implements Serializable {
+
+
+    @Schema(description = "璁惧閲忓�兼函婧愯鍒掕鎯卛d")
+    @TableId(value = "impower_detail_id", type = IdType.AUTO)
+    private Integer impowerDetailId;
+
+    @Schema(description = "璁惧閲忓�兼函婧愯鍒抜d")
+    private Integer impowerId;
+
+    @Schema(description = "璁惧id")
+    private Integer deviceId;
+
+    @Schema(description = "妫�娴嬮」鐩�")
+    private String inspectionItem;
+
+    @Schema(description = "琚巿鏉冧汉")
+    private String delegatedUser;
+
+    @Schema(description = "鍒涘缓浜篿d")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @Schema(description = "鍒涘缓鏃ユ湡")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @Schema(description = "淇敼浜篿d")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    @Schema(description = "淇敼鏃堕棿")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceInspectionRecord.java b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceInspectionRecord.java
new file mode 100644
index 0000000..463403c
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceInspectionRecord.java
@@ -0,0 +1,92 @@
+package com.ruoyi.device.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+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")
+@Schema(description = "")
+public class DeviceInspectionRecord implements Serializable {
+
+    @Schema(description = "璁惧鐐规璁板綍id")
+    @TableId(value = "inspection_record_id", type = IdType.AUTO)
+    private Integer inspectionRecordId;
+
+    @Schema(description = "璁惧id")
+    private Integer deviceId;
+
+    @Schema(description = "娴嬮噺鑼冨洿")
+    private String measurementScope;
+
+    @Schema(description = "鐐规浣跨敤鐗╄川鍚嶇О")
+    private String materialName;
+
+    @Schema(description = "鐐规浣跨敤鐗╄川瑙勬牸鍨嬪彿")
+    private String materialModel;
+
+    @Schema(description = "鐐规浣跨敤鐗╄川绠$悊缂栧彿")
+    private String materialManagementNumber;
+
+    @Schema(description = "鐐规浣跨敤鐗╄川绮惧害绛夌骇")
+    private String materialAccuracyGrade;
+
+    @Schema(description = "娓╁害")
+    private String temperature;
+
+    @Schema(description = "婀垮害")
+    private String humidity;
+
+    @Schema(description = "娴嬭瘯缁撹")
+    private String testConclusion;
+
+    @Schema(description = "澶囨敞")
+    private String remark;
+
+    @Schema(description = "鐘舵�侊紙鏄惁澶嶆牳锛�0鏈鏍革紝1澶嶆牳")
+    private Integer status;
+
+    @Schema(description = "娴嬭瘯浜�")
+    private String recorder;
+
+    @Schema(description = "娴嬭瘯浜篿d")
+    private Integer recorderId;
+
+    @Schema(description = "澶嶆牳浜�")
+    private String reviewer;
+
+    @Schema(description = "澶嶆牳浜篿d")
+    private Integer reviewerId;
+
+    @Schema(description = "澶嶆牳淇℃伅")
+    private String reviewerRemark;
+
+    @Schema(description = "娴嬭瘯鏃ユ湡")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private LocalDateTime testDate;
+
+    @Schema(description = "鍒涘缓鏃堕棿")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @Schema(description = "淇敼鏃堕棿")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+
+    @Schema(description = "淇敼浜篿d")
+    private Integer updateUserId;
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceInspectionRecordDetails.java b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceInspectionRecordDetails.java
new file mode 100644
index 0000000..0a9dd30
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceInspectionRecordDetails.java
@@ -0,0 +1,62 @@
+package com.ruoyi.device.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+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")
+@Schema(description = "")
+public class DeviceInspectionRecordDetails implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @Schema(description = "鐐规璇︽儏id")
+    @TableId(value = "inspection_record_detail_id", type = IdType.AUTO)
+    private Integer inspectionRecordDetailId;
+
+    @Schema(description = "鐐规id")
+    private Integer inspectionRecordId;
+
+    @Schema(description = "娴嬭瘯椤圭洰")
+    private String testItems;
+
+    @Schema(description = "鏍囧噯鍊�")
+    private String standardValue;
+
+    @Schema(description = "瀹炴祴鍊�")
+    private String measuredValue;
+
+    @Schema(description = "绀哄�艰宸�")
+    private String indicationError;
+
+    @Schema(description = "鍏佽璇樊")
+    private String allowableError;
+
+    @Schema(description = "鍗曢」缁撹")
+    private String singleItemConclusion;
+
+    @Schema(description = "鍒涘缓鏃堕棿")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @Schema(description = "淇敼鏃堕棿")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+
+    @Schema(description = "淇敼浜篿d")
+    private Integer updateUserId;
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceInstruction.java b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceInstruction.java
new file mode 100644
index 0000000..4bf30af
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceInstruction.java
@@ -0,0 +1,63 @@
+package com.ruoyi.device.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+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")
+@Schema(description = "浣滀笟鎸囧涔︽坊鍔犲彈鎺ф枃浠惰〃")
+public class DeviceInstruction implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @Schema(description = "鐢宠缂栧彿")
+    private String applicationNumber;
+
+    @Schema(description = "鐢宠閮ㄩ棬")
+    private String applicationDepartment;
+
+    @Schema(description = "璐d换浜�")
+    private String personLiable;
+
+    @Schema(description = "鍙楁帶鐢宠璇存槑")
+    private String controlledApplicationDescription;
+
+    @Schema(description = "绯荤粺鐢熸垚鍚嶇О")
+    private String fileName;
+
+    @Schema(description = "绯荤粺鐢熸垚鍚嶇О")
+    private String fileSystemName;
+
+    @Schema(description = "鍒涘缓鏃堕棿")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @Schema(description = "鏇存柊鏃堕棿")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+
+    @Schema(description = "鍒涘缓浜�")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @Schema(description = "鏇存柊浜�")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceLog.java b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceLog.java
new file mode 100644
index 0000000..5141c82
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceLog.java
@@ -0,0 +1,29 @@
+package com.ruoyi.device.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;
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceMaintenance.java b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceMaintenance.java
new file mode 100644
index 0000000..014f88f
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceMaintenance.java
@@ -0,0 +1,65 @@
+package com.ruoyi.device.pojo;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.util.Date;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.deepoove.poi.data.PictureRenderData;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * 璁惧缁存姢娣诲姞缁存姢璁板綍琛�
+ *
+ * @author makejava
+ * @since 2025-04-17 11:28:56
+ */
+@Data
+@TableName("device_maintenance")
+public class DeviceMaintenance {
+
+    @TableId(type = IdType.AUTO)
+    private Integer id;
+
+    @Schema(description = "璁惧id")
+    private Integer deviceId;
+
+    @Schema(description = "缁存姢鏃ユ湡")
+    private LocalDate maintenanceDate;
+
+    @Schema(description = "缁存姢鍐呭")
+    private String maintenanceContent;
+
+    @Schema(description = "缁存姢浜篿d")
+    private Integer maintenanceUserId;
+
+    @Schema(description = "缁存姢浜�")
+    private String maintenanceUserName;
+
+    @Schema(description = "澶囨敞")
+    private String remark;
+
+    @Schema(description = "鍒涘缓鏃ユ湡")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @Schema(description = "鍒涘缓浜篿d")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @Schema(description = "鏇存柊鏃堕棿")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+
+    @Schema(description = "鏇存柊浜篿d")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    @TableField(select = false, exist = false)
+    @Schema(description = "缁存姢浜哄浘鐗�")
+    private PictureRenderData maintenanceUserUrlRender;
+
+
+}
+
diff --git a/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceMaintenancePlan.java b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceMaintenancePlan.java
new file mode 100644
index 0000000..8bb3b65
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceMaintenancePlan.java
@@ -0,0 +1,74 @@
+package com.ruoyi.device.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+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")
+@Schema(description = "璁惧淇濆吇璁″垝琛�")
+public class DeviceMaintenancePlan implements Serializable {
+
+    @Schema(description = "璁惧淇濆吇璁″垝id")
+    @TableId(value = "maintenance_plan_id", type = IdType.AUTO)
+    private Integer maintenancePlanId;
+
+    @Schema(description = "缂栧埗浜�")
+    private String compiler;
+
+    @Schema(description = "璁″垝鍚嶇О")
+    private String planName;
+
+    @Schema(description = "璁″垝骞翠唤")
+    private String planYear;
+
+    @Schema(description = "缂栧埗浜篿d")
+    private Integer compilerId;
+
+    @Schema(description = "缂栧埗鏃ユ湡")
+    private LocalDateTime datePreparation;
+
+    @Schema(description = "瀹℃牳鐘舵�侊紝0鏈鏍革紝1瀹℃牳")
+    private Integer status;
+
+    @Schema(description = "瀹℃牳浜篿d")
+    private Integer auditId;
+
+    @Schema(description = "瀹℃牳浜�")
+    private String audit;
+
+    @Schema(description = "瀹℃牳鏃ユ湡")
+    private LocalDateTime auditDate;
+
+    @Schema(description = "瀹℃牳淇℃伅")
+    private String auditRemark;
+
+    @Schema(description = "鍒涘缓浜�")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @Schema(description = "鍒涘缓鏃堕棿")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @Schema(description = "淇敼浜�")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    @Schema(description = "淇敼鏃堕棿")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceMaintenancePlanDetails.java b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceMaintenancePlanDetails.java
new file mode 100644
index 0000000..13c541e
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceMaintenancePlanDetails.java
@@ -0,0 +1,61 @@
+package com.ruoyi.device.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+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")
+@Schema(description = "璁惧淇濆吇璁″垝璇︽儏琛�")
+public class DeviceMaintenancePlanDetails implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @Schema(description = "淇濆吇璁″垝璇︽儏id")
+    @TableId(value = "maintenance_plan_detail_id", type = IdType.AUTO)
+    private Integer maintenancePlanDetailId;
+
+    @Schema(description = "淇濆吇璁″垝id")
+    private Integer maintenancePlanId;
+
+    @Schema(description = "璁惧id")
+    private Integer deviceId;
+
+    @Schema(description = "淇濆吇鍏抽敭閮ㄤ綅")
+    private String maintenanceSite;
+
+    @Schema(description = "淇濆吇鍐呭")
+    private String maintenanceContent;
+
+    @Schema(description = "淇濆吇鍛ㄦ湡")
+    private String maintenanceIntervals;
+
+    @Schema(description = "鍒涘缓浜�")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @Schema(description = "鍒涘缓鏃堕棿")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @Schema(description = "淇敼浜�")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    @Schema(description = "淇敼鏃堕棿")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceMetric.java b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceMetric.java
new file mode 100644
index 0000000..966309a
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceMetric.java
@@ -0,0 +1,29 @@
+package com.ruoyi.device.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.v3.oas.annotations.media.Schema;
+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;      // 鍒涘缓鏃堕棿
+
+    @Schema(description = "calibrate锛氭牎鍑嗭紱examine锛氭牳鏌�")
+    private String type; // 绫诲瀷
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceMetricRecord.java b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceMetricRecord.java
new file mode 100644
index 0000000..ed9e10c
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceMetricRecord.java
@@ -0,0 +1,88 @@
+package com.ruoyi.device.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+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")
+@Schema(description = "璁惧鏍″噯 - 鏍″噯璁板綍")
+public class DeviceMetricRecord implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @Schema(description = "涓婚敭id")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @Schema(description = "璁板綍缂栧彿")
+    private String processNumber;
+
+    @Schema(description = "璁¢噺鍗曚綅")
+    private String unitOfMeasure;
+
+    @Schema(description = "鏍″噯鏃ユ湡")
+    private Date calibrationDate;
+
+    @Schema(description = "涓嬫鏍″噯鏃ユ湡")
+    private Date nextCalibrationDate;
+
+    @Schema(description = "璁$畻鍣ㄥ叿")
+    private String calculatingApparatus;
+
+    @Schema(description = "璁$畻鏍囧噯閲忕▼")
+    private String standardRange;
+
+    @Schema(description = "璁¢噺鏍囧噯涓嶇‘瀹氬害")
+    private String calibrationStandardUncertainty;
+
+    @Schema(description = "渚濇嵁鏂囦欢")
+    private String byDocument;
+
+    @Schema(description = "璇佷功缂栧彿")
+    private String certificateSerialNumber;
+
+    @Schema(description = "鐘舵��")
+    private String status;
+
+    @Schema(description = "鍘熸枃浠跺悕绉�")
+    private String fileName;
+
+    @Schema(description = "绯荤粺鐢熸垚鏂囦欢鍚嶇О")
+    private String systemFileName;
+
+    @Schema(description = "澶囨敞")
+    private String remark;
+
+    @Schema(description = "璁惧id")
+    private Integer deviceId;
+
+    @Schema(description = "鍒涘缓鏃堕棿 / 鐧昏鏃ユ湡")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @Schema(description = "鐧昏浜�")
+    private String createUser;
+
+    @Schema(description = "calibrate锛氭牎鍑嗭紱examine锛氭牳鏌�")
+    private String type;
+
+    @Schema(description = "纭鏃堕棿")
+    private Date confirmDate;
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceMetricsCopy.java b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceMetricsCopy.java
new file mode 100644
index 0000000..0c90818
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceMetricsCopy.java
@@ -0,0 +1,65 @@
+package com.ruoyi.device.pojo;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.v3.oas.annotations.media.Schema;
+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")
+@Schema(description = "璁惧鏍″噯 - 鏍″噯璁板綍 - 鏍″噯鏉$洰")
+public class DeviceMetricsCopy implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @Schema(description = "id")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @Schema(description = "璁惧鏍″噯 - 鏍″噯璁板綍id")
+    private Integer deviceMetricsId;
+
+    @Schema(description = "璁¢噺鍙傛暟")
+    private String measurementParameter;
+
+    @Schema(description = "閲忕▼鑼冨洿")
+    private String rangeOfMeasurement;
+
+    @Schema(description = "鏈�澶у厑璁歌宸�")
+    private String maxPermissibleError;
+
+    @Schema(description = "鍒ゅ畾鏍囧噯")
+    private String judgmentCriteria;
+
+    @Schema(description = "鍒涘缓浜�")
+    private String createdBy;
+
+    @Schema(description = "鍒涘缓鏃堕棿")
+    private LocalDateTime creationTime;
+
+    @Schema(description = "鏄惁鏍″噯")
+    private String isCalibration;
+
+    @Schema(description = "鍒ゅ畾缁撴灉")
+    private String result;
+
+    @Schema(description = "鍗曢」缁撴灉璇存槑")
+    private String singleResultStatement;
+
+    @Schema(description = "calibrate锛氭牎鍑嗭紱examine锛氭牳鏌�")
+    private String type;
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceRecord.java b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceRecord.java
new file mode 100644
index 0000000..72d568e
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceRecord.java
@@ -0,0 +1,69 @@
+package com.ruoyi.device.pojo;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.v3.oas.annotations.media.Schema;
+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")
+@Schema(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;
+
+    @Schema(description = "璁㈠崟id")
+    private Integer insOrderId;
+
+    @Schema(description = "鏍峰搧缂栧彿")
+    private String sampleCode;
+
+    @Schema(description = "娓╁害")
+    private String temperature;
+
+    @Schema(description = "婀垮害")
+    private String humidity;
+
+    @Schema(description = "浣跨敤鍓�0寮傚父1鑹ソ")
+    private Integer useBefore;
+
+    @Schema(description = "浣跨敤鍚�0寮傚父1鑹ソ")
+    private Integer useAfter;
+
+    @Schema(description = "寮傚父鎯呭喌")
+    private String abnormal;
+
+    @Schema(description = "浣跨敤浜篿d")
+    private Integer usePersonId;
+
+    @Schema(description = "浣跨敤浜�")
+    private String usePerson;
+
+    @Schema(description = "澶囨敞")
+    private String remark;
+
+    @Schema(description = "浣跨敤寮�濮嬫棩鏈�")
+    private LocalDateTime useStartDate;
+
+    @Schema(description = "浣跨敤缁撴潫鏃ユ湡")
+    private LocalDateTime useEndDate;
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceScrapped.java b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceScrapped.java
new file mode 100644
index 0000000..2d08048
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceScrapped.java
@@ -0,0 +1,104 @@
+package com.ruoyi.device.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+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")
+@Schema(description = "璁惧鎶ュ簾鐢宠琛�")
+public class DeviceScrapped {
+
+    @TableId(value = "scrapped_id", type = IdType.AUTO)
+    private Integer scrappedId;
+
+    @Schema(description = "璁惧id")
+    private Integer deviceId;
+
+    @Schema(description = "閰嶄欢")
+    private String parts;
+
+    @Schema(description = "鎶ュ簾鐞嗙敱")
+    private String reasonsForScrap;
+
+    @Schema(description = "鐢宠浜篿d")
+    private Integer applicantUserId;
+
+    @Schema(description = "鐢宠浜�")
+    private String applicantUser;
+
+    @Schema(description = "鐢宠鏃堕棿")
+    private LocalDate applicantDate;
+
+    @Schema(description = "閮ㄩ棬璐熻矗浜烘剰瑙�")
+    private String departmentHeadOpinion;
+
+    @Schema(description = "閮ㄩ棬璐熻矗浜篿d")
+    private Integer departmentHeadUserId;
+
+    @Schema(description = "閮ㄩ棬璐熻矗浜�")
+    private String departmentHeadUser;
+
+    @Schema(description = "閮ㄩ棬璐熻矗浜哄~鍐欐椂闂�")
+    private LocalDate departmentHeadDate;
+
+    @Schema(description = "璁¢噺瀹ゆ剰瑙�")
+    private String meteringRoomOpinion;
+
+    @Schema(description = "璁¢噺瀹や汉id")
+    private Integer meteringRoomUserId;
+
+    @Schema(description = "璁¢噺瀹や汉")
+    private String meteringRoomUser;
+
+    @Schema(description = "璁¢噺瀹や汉濉啓鏃堕棿")
+    private LocalDate meteringRoomDate;
+
+    @Schema(description = "鎵瑰噯浜烘剰瑙�")
+    private String approverOpinion;
+
+    @Schema(description = "鎵瑰噯浜篿d")
+    private Integer approverUserId;
+
+    @Schema(description = "鎵瑰噯浜�")
+    private String approverUser;
+
+    @Schema(description = "鎵瑰噯浜哄~鍐欐椂闂�")
+    private LocalDate approverDate;
+
+    @Schema(description = "鏄惁缁撴潫,0: 鏈粨鏉�, 1:缁撴潫")
+    private Integer isFinish;
+
+    @Schema(description = "鍒涘缓浜�")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @Schema(description = "鍒涘缓鏃堕棿")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @Schema(description = "淇敼浜�")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    @Schema(description = "淇敼鏃堕棿")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+
+    @TableField(exist = false,select = false)
+    @Schema(description = "娴佺▼, 0:鎶ュ簾鐢宠, 1鐢宠閮ㄩ棬璐熻矗浜烘剰瑙�, 2:璁¢噺瀹ゆ剰瑙�, 3:鎵瑰噯浜�")
+    private Integer flowType;
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceState.java b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceState.java
new file mode 100644
index 0000000..c4e00c2
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceState.java
@@ -0,0 +1,106 @@
+package com.ruoyi.device.pojo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+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")
+@Schema(description = "璁惧鍋滅敤/鍚敤")
+public class DeviceState implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @Schema(description = "璁惧鍋滅敤鍚敤id")
+    @TableId(value = "state_id", type = IdType.AUTO)
+    private Integer stateId;
+
+    @Schema(description = "娴佺▼缂栧彿")
+    private String processNumber;
+
+    @Schema(description = "0閰嶄欢")
+    private String accessoryPart;
+
+    @Schema(description = "0璁惧鐘舵��")
+    private String deviceStatus;
+
+    @Schema(description = "0鍋滅敤鍚敤鐞嗙敱")
+    private String reason;
+
+    @Schema(description = "0涓嬬幆鑺傝矗浠讳汉")
+    private String submitNextPesponsible;
+
+    @Schema(description = "0鎿嶄綔浜�")
+    private String submitOperatingPersonnel;
+
+    @Schema(description = "0鏃ユ湡")
+    private LocalDateTime submitDate;
+
+    @Schema(description = "1閮ㄩ棬璐熻矗浜烘剰瑙�")
+    private String departmentReviewOpinion;
+
+    @Schema(description = "1涓嬬幆鑺傝矗浠讳汉")
+    private String departmentNextPesponsible;
+
+    @Schema(description = "1鎿嶄綔浜�")
+    private String departmentOperatingPersonnel;
+
+    @Schema(description = "1鏃ユ湡")
+    private LocalDateTime departmentDate;
+
+    @Schema(description = "2璁¢噺瀹ゆ剰瑙�")
+    private String measuringRoomReviewOpinion;
+
+    @Schema(description = "2涓嬬幆鑺傝矗浠讳汉")
+    private String measuringRoomNextPesponsible;
+
+    @Schema(description = "2鎿嶄綔浜�")
+    private String measuringRoomOperatingPersonnel;
+
+    @Schema(description = "2鏃ユ湡")
+    private LocalDateTime measuringRoomDate;
+
+    @Schema(description = "3鎵瑰噯鎰忚")
+    private String approvalOpinion;
+
+    @Schema(description = "3涓嬬幆鑺傝矗浠讳汉")
+    private String approvalNextPesponsible;
+
+    @Schema(description = "3鎿嶄綔浜�")
+    private String approvalOperatingPersonnel;
+
+    @Schema(description = "3鏃ユ湡")
+    private LocalDateTime approvalDate;
+
+    @Schema(description = "褰撳墠鐘舵��")
+    private String currentState;
+
+    @Schema(description = "璁惧Id")
+    private Integer deviceId;
+
+    @Schema(description = "褰撳墠鐜妭璐熻矗浜�")
+    private String currentResponsible;
+
+    @Schema(description = "鎻愪氦浜�")
+    @ExcelProperty(value = "鎻愪氦浜�")
+    private String createUser;
+
+    @Schema(description = "鎻愪氦鏃ユ湡")
+    @ExcelProperty(value = "鎻愪氦鏃ユ湡")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceTraceabilityManagement.java b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceTraceabilityManagement.java
new file mode 100644
index 0000000..a0b7f15
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceTraceabilityManagement.java
@@ -0,0 +1,76 @@
+package com.ruoyi.device.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+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")
+@Schema(description = "璁惧閲忓�兼函婧愯鍒掕〃")
+public class DeviceTraceabilityManagement{
+
+    @Schema(description = "璁惧閲忓�兼函婧愯鍒抜d")
+    @TableId(value = "traceability_management_id", type = IdType.AUTO)
+    private Integer traceabilityManagementId;
+
+    @Schema(description = "鏂囦欢鍚嶇О")
+    private String fileName;
+
+    @Schema(description = "璁″垝鍚嶇О")
+    private String planName;
+
+    @Schema(description = "璁″垝骞翠唤")
+    private String planYear;
+
+    @Schema(description = "缂栧埗浜篿d")
+    private Integer compilerId;
+
+    @Schema(description = "缂栧埗浜�")
+    private String compiler;
+
+    @Schema(description = "缂栧埗鏃堕棿")
+    private LocalDateTime datePreparation;
+
+    @Schema(description = "瀹℃牳鐘舵�侊紝0鏈鏍革紝1瀹℃牳")
+    private Integer status;
+
+    @Schema(description = "淇敼浜篿d")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    @Schema(description = "淇敼鏃堕棿")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+
+    @Schema(description = "瀹℃牳浜篿d")
+    private Integer auditId;
+
+    @Schema(description = "瀹℃牳浜�")
+    private String audit;
+
+    @Schema(description = "瀹℃牳鏃ユ湡")
+    private LocalDateTime auditDate;
+
+    @Schema(description = "瀹℃牳淇℃伅")
+    private String auditRemark;
+
+    @Schema(description = "鍒涘缓浜篿d")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @Schema(description = "鍒涘缓鏃ユ湡")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceTraceabilityManagementDetails.java b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceTraceabilityManagementDetails.java
new file mode 100644
index 0000000..0c75d89
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceTraceabilityManagementDetails.java
@@ -0,0 +1,67 @@
+package com.ruoyi.device.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+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")
+@Schema(description = "璁惧閲忓�兼函婧愯鍒掕鎯呰〃")
+public class DeviceTraceabilityManagementDetails implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @Schema(description = "璁惧閲忓�兼函婧愯鍒掕鎯卛d")
+    @TableId(value = "traceability_management_detail_id", type = IdType.AUTO)
+    private Integer traceabilityManagementDetailId;
+
+    @Schema(description = "璁惧閲忓�兼函婧愯鍒抜d")
+    private Integer traceabilityManagementId;
+
+    @Schema(description = "璁惧id")
+    private Integer deviceId;
+
+    @Schema(description = "鎶�鏈寚鏍囧弬鏁�")
+    private String technicalIndexParameters;
+
+    @Schema(description = "鎶�鏈寚鏍囪姹�")
+    private String technicalRequirements;
+
+    @Schema(description = "妫�瀹氬懆鏈�")
+    private String verificationCycle;
+
+    @Schema(description = "妫�瀹氬崟浣�")
+    private String verificationUnit;
+
+    @Schema(description = "澶囨敞")
+    private String remark;
+
+    @Schema(description = "鍒涘缓浜篿d")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @Schema(description = "鍒涘缓鏃ユ湡")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @Schema(description = "淇敼浜篿d")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    @Schema(description = "淇敼鏃堕棿")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/pojo/OperationInstruction.java b/cnas-device/src/main/java/com/ruoyi/device/pojo/OperationInstruction.java
new file mode 100644
index 0000000..8036351
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/pojo/OperationInstruction.java
@@ -0,0 +1,87 @@
+package com.ruoyi.device.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 璁惧 - 浣滀笟鎸囧涔� 娣诲姞鍙楁帶鏂囦欢 瀛�
+ * </p>
+ *
+ * @author
+ * @since 2024-12-04 10:43:32
+ */
+@Getter
+@Setter
+@TableName("device_operation_instruction")
+public class OperationInstruction {
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @Schema(description = "璁惧涓婚敭id")
+    private String deviceId;
+
+    @Schema(description = "鏂囦欢绫诲瀷")
+    private String documentType;
+
+    @Schema(description = "鏂囨。缂栧彿")
+    private String documentNumber;
+
+    @Schema(description = "鏂囦欢鐗堟湰")
+    private String documentVersion;
+
+    @Schema(description = "浣滆��")
+    private String author;
+
+    @Schema(description = "鎻愪氦鏃ユ湡")
+    private LocalDate submitDate;
+
+    @Schema(description = "鏂囨。璇存槑")
+    private String documentNote;
+
+    @Schema(description = "绯荤粺鐢熸垚鍚嶇О")
+    private String fileName;
+
+    @Schema(description = "绯荤粺鐢熸垚鍚嶇О")
+    private String fileSystemName;
+
+    @Schema(description = "浣滀笟鎸囧涔d")
+    private Integer instructionId;
+
+    @Schema(description = "涓婁紶浜篿d")
+    private Integer uploader;
+
+    @Schema(description = "瀹℃壒浜篿d")
+    private Integer approverId;
+
+    @Schema(description = "瀹℃壒鐘舵��")
+    private Boolean status;
+
+    @Schema(description = "鐢熸晥鏃堕棿")
+    private LocalDateTime entryIntoForceTime;
+
+    @Schema(description = "涓婁紶鏃堕棿")
+    private LocalDateTime uploadTime;
+
+    @Schema(description = "鏇存柊鏃堕棿")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+
+    @Schema(description = "鍒涘缓鏃堕棿")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @Schema(description = "鏇存柊浜篿d")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    @Schema(description = "鍒涘缓浜篿d")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/CollectBridgeService.java b/cnas-device/src/main/java/com/ruoyi/device/service/CollectBridgeService.java
new file mode 100644
index 0000000..3a6ce16
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/CollectBridgeService.java
@@ -0,0 +1,21 @@
+package com.ruoyi.device.service;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.device.pojo.CollectBridge;
+
+/**
+ * 鏁板瓧鐢垫ˉ閲囬泦
+ *
+ * @author zhuo
+ * @since 2025-02-19
+ */
+public interface CollectBridgeService extends IService<CollectBridge> {
+
+    /**
+     * 濉厖閲囬泦鏁版嵁
+     * @param jsonObject
+     */
+    void addBridgeValue(JSONObject jsonObject);
+}
+
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/DataConfigService.java b/cnas-device/src/main/java/com/ruoyi/device/service/DataConfigService.java
new file mode 100644
index 0000000..0232400
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/DataConfigService.java
@@ -0,0 +1,55 @@
+package com.ruoyi.device.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.device.dto.DataConfigDto;
+import com.ruoyi.device.pojo.DataConfig;
+
+import java.util.List;
+
+/**
+ * <p>
+ *  鏈嶅姟绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-07-13 12:23:00
+ */
+public interface DataConfigService extends IService<DataConfig> {
+
+
+    /**
+     * 缁存姢璁惧鏂囦欢閰嶇疆
+     * @param dataConfigList
+     */
+    void saveDeviceFileConfiguration(DataConfigDto dataConfigList);
+
+    /**
+     * 鏁伴噰閰嶇疆
+     * @param dataConfigList
+     */
+    void saveDataAcquisitionConfiguration(DataConfigDto dataConfigList);
+
+    /**
+     * 鏌ヨ鏁伴噰閰嶇疆
+     * @param dataConfig
+     * @return
+     */
+    Result<?> queryDataAcquisitionConfiguration(DataConfig dataConfig);
+
+    /**
+     * 鏌ヨ妫�楠岄」鏁伴噰閰嶇疆
+     * @param dataConfig
+     * @return
+     */
+    Result<?> queryProductConfiguration(DataConfig dataConfig);
+
+    /**
+     * 鏌ヨ浜嗙粦瀹氫絾鏄病鏈夐厤缃殑妫�楠岄」
+     * @param deviceId
+     * @return
+     */
+    IPage<DataConfig> getNoConfigProduct(Page page, Integer deviceId);
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/DeviceAcceptanceFileService.java b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceAcceptanceFileService.java
new file mode 100644
index 0000000..11218d1
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceAcceptanceFileService.java
@@ -0,0 +1,17 @@
+package com.ruoyi.device.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.device.pojo.DeviceAcceptanceFile;
+
+/**
+ * <p>
+ * 璁惧楠屾敹(瑁呭)闄勪欢琛� 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-20 01:45:26
+ */
+public interface DeviceAcceptanceFileService extends IService<DeviceAcceptanceFile> {
+
+
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/DeviceAcceptanceService.java b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceAcceptanceService.java
new file mode 100644
index 0000000..0309c91
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceAcceptanceService.java
@@ -0,0 +1,39 @@
+package com.ruoyi.device.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.device.pojo.DeviceAcceptance;
+import org.springframework.web.multipart.MultipartFile;
+
+import jakarta.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-device/src/main/java/com/ruoyi/device/service/DeviceAccidentReportService.java b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceAccidentReportService.java
new file mode 100644
index 0000000..2aaf6c5
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceAccidentReportService.java
@@ -0,0 +1,41 @@
+package com.ruoyi.device.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.device.pojo.DeviceAccidentReport;
+
+import jakarta.servlet.http.HttpServletResponse;
+
+/**
+ * <p>
+ * 璁惧浜嬫晠鎶ュ憡鍗� 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-17 06:31:12
+ */
+public interface DeviceAccidentReportService extends IService<DeviceAccidentReport> {
+
+    /**
+     * 璁惧浜嬫晠鎶ュ憡鍒楄〃
+     * @param page
+     * @param deviceAccidentReport
+     * @return
+     */
+    IPage<DeviceAccidentReport> pageDeviceAccidentReport(Page page, DeviceAccidentReport deviceAccidentReport);
+
+    /**
+     * 鏂板璁惧浜嬫晠鎶ュ憡
+     * @param deviceAccidentReport
+     * @return
+     */
+    boolean addDeviceAccidentReport(DeviceAccidentReport deviceAccidentReport);
+
+    /**
+     * 瀵煎嚭璁惧浜嬫晠鎶ュ憡
+     * @param accidentReportId 璁惧浜嬫晠鎶ュ憡id
+     * @param response 鍝嶅簲
+     */
+    void exportDeviceAccidentReport(Integer accidentReportId, HttpServletResponse response);
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/DeviceBorrowService.java b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceBorrowService.java
new file mode 100644
index 0000000..298b03e
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceBorrowService.java
@@ -0,0 +1,28 @@
+package com.ruoyi.device.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.device.pojo.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> {
+
+    IPage<DeviceBorrow> deviceBorrowPage(Page page, DeviceBorrow deviceBorrow);
+
+    int saveDeviceBorrow(DeviceBorrow deviceBorrow);
+
+    DeviceBorrow getDeviceBorrow(Integer id);
+
+    List<DeviceBorrow> getDeviceBorrowBydeviceId(Integer deviceId);
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/DeviceBreakdownMaintenanceService.java b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceBreakdownMaintenanceService.java
new file mode 100644
index 0000000..1bed4f7
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceBreakdownMaintenanceService.java
@@ -0,0 +1,41 @@
+package com.ruoyi.device.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.device.dto.DeviceBreakdownMaintenance;
+
+import jakarta.servlet.http.HttpServletResponse;
+
+/**
+ * <p>
+ * 璁惧鏁呴殰缁翠慨琛� 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-17 04:50:57
+ */
+public interface DeviceBreakdownMaintenanceService extends IService<DeviceBreakdownMaintenance> {
+
+    /**
+     * 璁惧鏁呴殰缁翠慨鍒楄〃
+     * @param page
+     * @param deviceBreakdownMaintenance
+     * @return
+     */
+    IPage<DeviceBreakdownMaintenance> pageDeviceBreakdownMaintenance(Page page, DeviceBreakdownMaintenance deviceBreakdownMaintenance);
+
+    /**
+     * 鏂板璁惧鏁呴殰缁翠慨
+     * @param deviceBreakdownMaintenance
+     * @return
+     */
+    boolean addDeviceBreakdownMaintenance(DeviceBreakdownMaintenance deviceBreakdownMaintenance);
+
+    /**
+     * 瀵煎嚭璁惧鏁呴殰缁翠慨
+     * @param maintenanceId 璁惧鏁呴殰缁翠慨id
+     * @param response 鍝嶅簲
+     */
+    void exportDeviceBreakdownMaintenance(Integer maintenanceId, HttpServletResponse response);
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/DeviceCalibrationPlanDetailService.java b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceCalibrationPlanDetailService.java
new file mode 100644
index 0000000..f696dd4
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceCalibrationPlanDetailService.java
@@ -0,0 +1,16 @@
+package com.ruoyi.device.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.device.pojo.DeviceCalibrationPlanDetail;
+
+/**
+ * <p>
+ * 璁惧鏍″噯璁″垝璇︽儏琛� 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-16 03:58:29
+ */
+public interface DeviceCalibrationPlanDetailService extends IService<DeviceCalibrationPlanDetail> {
+
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/DeviceCalibrationPlanService.java b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceCalibrationPlanService.java
new file mode 100644
index 0000000..0a85152
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceCalibrationPlanService.java
@@ -0,0 +1,89 @@
+package com.ruoyi.device.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.device.dto.DeviceCalibrationPlanDto;
+import com.ruoyi.device.pojo.DeviceCalibrationPlan;
+import com.ruoyi.device.pojo.DeviceCalibrationPlanDetail;
+import org.springframework.web.multipart.MultipartFile;
+
+import jakarta.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 submiatRatifyDeviceCalibrationPlan(DeviceCalibrationPlan deviceCalibrationPlan);
+
+    /**
+     * 璁惧鏍″噯璁″垝鎵瑰噯
+     * @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);
+
+    /**
+     * 鎵归噺缂栬緫璁惧鏍″噯璇︽儏
+     * @param calibrationPlanDto
+     * @return
+     */
+    boolean updateDeviceCalibrationPlan(DeviceCalibrationPlanDto calibrationPlanDto);
+
+    /**
+     * 鏌ヨ璁惧鏍″噯璇︽儏
+     * @param planId
+     * @return
+     */
+    DeviceCalibrationPlanDto getDeviceCalibrationPlan(Integer planId);
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/DeviceDocumentsService.java b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceDocumentsService.java
new file mode 100644
index 0000000..f6d91cf
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceDocumentsService.java
@@ -0,0 +1,10 @@
+package com.ruoyi.device.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.device.pojo.DeviceDocuments;
+
+/**
+ * 璁惧妗f
+ */
+public interface DeviceDocumentsService extends IService<DeviceDocuments> {
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/DeviceExaminePlanDetailsService.java b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceExaminePlanDetailsService.java
new file mode 100644
index 0000000..e3a1924
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceExaminePlanDetailsService.java
@@ -0,0 +1,16 @@
+package com.ruoyi.device.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.device.pojo.DeviceExaminePlanDetails;
+
+/**
+ * <p>
+ * 璁惧鏍告煡璁″垝璇︽儏琛� 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-16 07:14:16
+ */
+public interface DeviceExaminePlanDetailsService extends IService<DeviceExaminePlanDetails> {
+
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/DeviceExaminePlanService.java b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceExaminePlanService.java
new file mode 100644
index 0000000..a468993
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceExaminePlanService.java
@@ -0,0 +1,89 @@
+package com.ruoyi.device.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.device.dto.DeviceExaminePlanDetailsDto;
+import com.ruoyi.device.dto.DeviceExaminePlanDto;
+import com.ruoyi.device.pojo.DeviceExaminePlan;
+import com.ruoyi.device.pojo.DeviceExaminePlanDetails;
+import org.springframework.web.multipart.MultipartFile;
+
+import jakarta.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 submitRatifyDeviceExaminePlan(DeviceExaminePlan deviceExaminePlan);
+
+    /**
+     * 璁惧鏍告煡璁″垝鎵瑰噯
+     * @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<DeviceExaminePlanDetailsDto> pageDeviceExaminePlanDetail(Page page, DeviceExaminePlanDetails DeviceExaminePlanDetails);
+
+
+    /**
+     * 瀵煎嚭璁惧鏍告煡璁″垝
+     * @param deviceExaminePlanId 璁惧鏍告煡璁″垝id
+     * @param response 鍝嶅簲
+     */
+    void exportDeviceExaminePlanDetail(Integer deviceExaminePlanId, HttpServletResponse response);
+
+    /**
+     * 鎵归噺淇敼璁惧鏍告煡璁″垝
+     * @param examinePlanDto
+     * @return
+     */
+    boolean updateDeviceExaminePlan(DeviceExaminePlanDto examinePlanDto);
+
+    /**
+     * 鏌ヨ璁惧鏍告煡璁″垝璇︽儏
+     * @param planId
+     * @return
+     */
+    DeviceExaminePlanDto getDeviceExaminePlan(Integer planId);
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/DeviceExamineRecordContrastDetailsService.java b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceExamineRecordContrastDetailsService.java
new file mode 100644
index 0000000..da272d0
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceExamineRecordContrastDetailsService.java
@@ -0,0 +1,16 @@
+package com.ruoyi.device.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.device.pojo.DeviceExamineRecordContrastDetails;
+
+/**
+ * <p>
+ * 璁惧鏍告煡璁板綍瀵规瘮璇︽儏琛� 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-16 07:14:57
+ */
+public interface DeviceExamineRecordContrastDetailsService extends IService<DeviceExamineRecordContrastDetails> {
+
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/DeviceExamineRecordContrastService.java b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceExamineRecordContrastService.java
new file mode 100644
index 0000000..9bcdc7b
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceExamineRecordContrastService.java
@@ -0,0 +1,46 @@
+package com.ruoyi.device.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.device.dto.DeviceExamineRecordContrastDto;
+import com.ruoyi.device.pojo.DeviceExamineRecordContrast;
+
+import jakarta.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-device/src/main/java/com/ruoyi/device/service/DeviceExamineRecordDetailService.java b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceExamineRecordDetailService.java
new file mode 100644
index 0000000..09fd611
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceExamineRecordDetailService.java
@@ -0,0 +1,16 @@
+package com.ruoyi.device.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.device.pojo.DeviceExamineRecordDetail;
+
+/**
+ * <p>
+ * 璁惧鏍告煡璁板綍璇︽儏琛� 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-16 07:15:11
+ */
+public interface DeviceExamineRecordDetailService extends IService<DeviceExamineRecordDetail> {
+
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/DeviceExamineRecordService.java b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceExamineRecordService.java
new file mode 100644
index 0000000..cb5fccf
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceExamineRecordService.java
@@ -0,0 +1,43 @@
+package com.ruoyi.device.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.device.dto.DeviceExamineRecordDto;
+import com.ruoyi.device.pojo.DeviceExamineRecord;
+
+import jakarta.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-device/src/main/java/com/ruoyi/device/service/DeviceExternalApplyService.java b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceExternalApplyService.java
new file mode 100644
index 0000000..a8eb317
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceExternalApplyService.java
@@ -0,0 +1,42 @@
+package com.ruoyi.device.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.device.pojo.DeviceExternalApply;
+
+import jakarta.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-device/src/main/java/com/ruoyi/device/service/DeviceImpowerDetailsService.java b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceImpowerDetailsService.java
new file mode 100644
index 0000000..a19e5df
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceImpowerDetailsService.java
@@ -0,0 +1,16 @@
+package com.ruoyi.device.service;
+
+import com.ruoyi.device.pojo.DeviceImpowerDetails;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * 璁惧閲忓�兼函婧愯鍒掕鎯呰〃 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 
+ * @since 2025-04-17 03:23:39
+ */
+public interface DeviceImpowerDetailsService extends IService<DeviceImpowerDetails> {
+
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/DeviceImpowerService.java b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceImpowerService.java
new file mode 100644
index 0000000..ce816b9
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceImpowerService.java
@@ -0,0 +1,71 @@
+package com.ruoyi.device.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.device.dto.DeviceImpowerDto;
+import com.ruoyi.device.pojo.DeviceImpower;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.device.pojo.DeviceImpower;
+import org.apache.ibatis.annotations.Param;
+
+import jakarta.servlet.http.HttpServletResponse;
+
+/**
+ * <p>
+ * 璁惧浣跨敤鎺堟潈琛� 鏈嶅姟绫�
+ * </p>
+ *
+ * @author
+ * @since 2025-04-17 03:23:23
+ */
+public interface DeviceImpowerService extends IService<DeviceImpower> {
+
+    /**
+     * 鍒嗛〉鏌ヨ浣跨敤鎺堟潈
+     * @param page 鍒嗛〉鍙傛暟
+     * @param itemParameter 浣跨敤鎺堟潈
+     * @return
+     */
+    Result<IPage<DeviceImpower>> selectDeviceImpowerByPage(@Param("page") Page page, @Param("itemParameter") DeviceImpowerDto itemParameter);
+
+    /**
+     * 鏂板浣跨敤鎺堟潈
+     * @param deviceImpowerDto 浣跨敤鎺堟潈
+     */
+    Result addImpower(DeviceImpowerDto deviceImpowerDto);
+
+    /**
+     * 淇敼浣跨敤鎺堟潈
+     * @param deviceImpowerDto 浣跨敤鎺堟潈
+     */
+    Result updateImpower(DeviceImpowerDto deviceImpowerDto);
+
+    /**
+     * 鍒犻櫎浣跨敤鎺堟潈
+     * @param deviceImpowerDto 浣跨敤鎺堟潈
+     */
+    Result deleteImpower(DeviceImpowerDto deviceImpowerDto);
+
+    /**
+     * 鏌ヨ浣跨敤鎺堟潈璇︽儏
+     */
+    Result<DeviceImpowerDto> getImpowerDetail(Integer impowerId);
+
+    /**
+     * 鎻愪氦鎵瑰噯
+     * @param deviceImpowerDto
+     * @return
+     */
+    Result submitReviewImpowerStatus(DeviceImpowerDto deviceImpowerDto);
+
+    /**
+     * 浣跨敤鎺堟潈瀹℃牳
+     */
+    Result reviewImpowerStatus(DeviceImpowerDto deviceImpowerDto);
+
+    /**
+     * 浣跨敤鎺堟潈瀵煎嚭
+     */
+    void exportDeviceImpowerDto(Integer impowerId, HttpServletResponse response);
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/DeviceInspectionRecordDetailsService.java b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceInspectionRecordDetailsService.java
new file mode 100644
index 0000000..4fd6270
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceInspectionRecordDetailsService.java
@@ -0,0 +1,16 @@
+package com.ruoyi.device.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.device.pojo.DeviceInspectionRecordDetails;
+
+/**
+ * <p>
+ *  鏈嶅姟绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-16 04:27:32
+ */
+public interface DeviceInspectionRecordDetailsService extends IService<DeviceInspectionRecordDetails> {
+
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/DeviceInspectionRecordService.java b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceInspectionRecordService.java
new file mode 100644
index 0000000..600a5dc
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceInspectionRecordService.java
@@ -0,0 +1,70 @@
+package com.ruoyi.device.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.device.dto.DeviceInspectionRecordDto;
+import com.ruoyi.device.pojo.DeviceInspectionRecord;
+
+import jakarta.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(Page page, DeviceInspectionRecordDto deviceInspectionRecord);
+
+
+    /**
+     * 鏌ヨ鐐规璇︽儏
+     * @param inspectionRecordId
+     * @return
+     */
+    Result getDeviceInspectionRecord(Integer inspectionRecordId);
+
+    /**
+     * 鏂板璁惧鐐规璁板綍
+     *
+     * @param deviceInspectionRecord 璁惧鐐规璁板綍
+     */
+    Result addDeviceInspectionRecord(DeviceInspectionRecordDto deviceInspectionRecord);
+
+    /**
+     * 淇敼璁惧鐐规璁板綍
+     * @param deviceInspectionRecord 璁惧鐐规璁板綍
+     */
+    Result updateInspectionRecordAndDetails(DeviceInspectionRecordDto deviceInspectionRecord);
+
+    /**
+     * 鍒犻櫎璁惧鐐规璁板綍
+     * @param deviceInspectionRecord 璁惧鐐规璁板綍
+     */
+    Result deleteDeviceInspectionRecordOrDetails(DeviceInspectionRecordDto deviceInspectionRecord);
+
+    /**
+     * 澶嶆牳鐐规璁板綍
+     * @param deviceExamineRecordDto
+     * @return
+     */
+    Result reviewDeviceInspectionRecord(DeviceInspectionRecordDto deviceExamineRecordDto);
+
+    /**
+     * 瀵煎嚭璁惧鐐规璁板綍
+     *
+     * @param deviceInspectionRecordId 璁惧鐐规璁板綍id
+     * @param response
+     */
+    Result exportDeviceInspectionRecord(Integer deviceInspectionRecordId, HttpServletResponse response);
+
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/DeviceInstructionService.java b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceInstructionService.java
new file mode 100644
index 0000000..7932e3c
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceInstructionService.java
@@ -0,0 +1,25 @@
+package com.ruoyi.device.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.device.dto.DeviceInstructionDto;
+import com.ruoyi.device.dto.DeviceOperationInstructionDto;
+import com.ruoyi.device.pojo.DeviceInstruction;
+
+import java.util.Map;
+
+/**
+ * <p>
+ * 浣滀笟鎸囧涔︽坊鍔犲彈鎺ф枃浠惰〃 鏈嶅姟绫�
+ * </p>
+ *
+ * @author
+ * @since 2024-12-04 10:29:18
+ */
+public interface DeviceInstructionService extends IService<DeviceInstruction> {
+
+    IPage<DeviceOperationInstructionDto> pageByPageQueryOfHomeworkInstructions(Page page, DeviceOperationInstructionDto operationInstructionDto);
+
+    void newHomeworkGuidebookAdded(DeviceInstructionDto instructionDto);
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/DeviceMaintenancePlanDetailsService.java b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceMaintenancePlanDetailsService.java
new file mode 100644
index 0000000..04fb233
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceMaintenancePlanDetailsService.java
@@ -0,0 +1,17 @@
+package com.ruoyi.device.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.device.pojo.DeviceMaintenancePlanDetails;
+
+/**
+ * <p>
+ * 璁惧淇濆吇璁″垝璇︽儏琛� 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-16 06:11:46
+ */
+public interface DeviceMaintenancePlanDetailsService extends IService<DeviceMaintenancePlanDetails> {
+
+
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/DeviceMaintenancePlanService.java b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceMaintenancePlanService.java
new file mode 100644
index 0000000..cfa3ab3
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceMaintenancePlanService.java
@@ -0,0 +1,79 @@
+package com.ruoyi.device.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.device.dto.DeviceMaintenancePlanDto;
+import com.ruoyi.device.pojo.DeviceMaintenancePlan;
+
+import jakarta.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(Page 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 submitReviewMaintenancePlanStatus(DeviceMaintenancePlanDto deviceMaintenancePlanDto);
+
+    /**
+     * 瀹℃牳璁惧淇濆吇璁″垝鐘舵��
+     * @param deviceMaintenancePlanDto 璁惧淇濆吇璁″垝
+     * @return
+     */
+    Result reviewMaintenancePlanStatus(DeviceMaintenancePlanDto deviceMaintenancePlanDto);
+
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/DeviceMaintenanceService.java b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceMaintenanceService.java
new file mode 100644
index 0000000..b6658a3
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceMaintenanceService.java
@@ -0,0 +1,30 @@
+package com.ruoyi.device.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.device.dto.DeviceMaintenanceDto;
+import com.ruoyi.device.pojo.DeviceMaintenance;
+
+import jakarta.servlet.http.HttpServletResponse;
+
+/**
+ * 璁惧缁存姢淇濆吇
+ */
+public interface DeviceMaintenanceService extends IService<DeviceMaintenance> {
+
+    /**
+     * 璁惧缁存姢鍒嗛〉鏌ヨ
+     * @return
+     */
+    IPage<DeviceMaintenanceDto> selectDeviceMaintenancePage(Page page, DeviceMaintenanceDto deviceMaintenance);
+
+    /**
+     * 瀵煎嚭璁惧缁存姢淇濆吇
+     * @param deviceId
+     * @param response
+     * @return
+     */
+    void exportDeviceMaintenance(Integer deviceId, HttpServletResponse response);
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/DeviceMetricRecordService.java b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceMetricRecordService.java
new file mode 100644
index 0000000..0cd8675
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceMetricRecordService.java
@@ -0,0 +1,16 @@
+package com.ruoyi.device.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.device.pojo.DeviceMetricRecord;
+
+/**
+ * <p>
+ * 璁惧鏍″噯 - 鏍″噯璁板綍 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 
+ * @since 2024-09-27 10:20:01
+ */
+public interface DeviceMetricRecordService extends IService<DeviceMetricRecord> {
+
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/DeviceMetricsCopyService.java b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceMetricsCopyService.java
new file mode 100644
index 0000000..1839fe1
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceMetricsCopyService.java
@@ -0,0 +1,16 @@
+package com.ruoyi.device.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.device.pojo.DeviceMetricsCopy;
+
+/**
+ * <p>
+ * 璁惧鏍″噯 - 鏍″噯璁板綍 - 鏍″噯鏉$洰 鏈嶅姟绫�
+ * </p>
+ *
+ * @author
+ * @since 2024-09-27 10:20:11
+ */
+public interface DeviceMetricsCopyService extends IService<DeviceMetricsCopy> {
+
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/DeviceOperationInstructionService.java b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceOperationInstructionService.java
new file mode 100644
index 0000000..5447a98
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceOperationInstructionService.java
@@ -0,0 +1,20 @@
+package com.ruoyi.device.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.device.dto.DeviceOperationInstructionDto;
+import com.ruoyi.device.pojo.OperationInstruction;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 璁惧 - 浣滀笟鎸囧涔� 娣诲姞鍙楁帶鏂囦欢 瀛� 鏈嶅姟绫�
+ * </p>
+ *
+ * @author
+ * @since 2024-12-04 10:43:32
+ */
+public interface DeviceOperationInstructionService extends IService<OperationInstruction> {
+
+    List<DeviceOperationInstructionDto> homeworkGuidebookEditor(Integer instructionId);
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/DeviceRecordService.java b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceRecordService.java
new file mode 100644
index 0000000..7366e74
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceRecordService.java
@@ -0,0 +1,31 @@
+package com.ruoyi.device.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.device.dto.DeviceRecordDto;
+import com.ruoyi.device.pojo.DeviceRecord;
+
+import jakarta.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-device/src/main/java/com/ruoyi/device/service/DeviceScrappedService.java b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceScrappedService.java
new file mode 100644
index 0000000..2aa6237
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceScrappedService.java
@@ -0,0 +1,43 @@
+package com.ruoyi.device.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.device.pojo.DeviceScrapped;
+
+import jakarta.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-device/src/main/java/com/ruoyi/device/service/DeviceService.java b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceService.java
new file mode 100644
index 0000000..5258d6c
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceService.java
@@ -0,0 +1,62 @@
+package com.ruoyi.device.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.common.core.domain.entity.User;
+import com.ruoyi.device.dto.DeviceCollectionDto;
+import com.ruoyi.device.dto.DeviceDto;
+import com.ruoyi.device.pojo.Device;
+import org.springframework.web.multipart.MultipartFile;
+
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 璁惧(Device)琛ㄦ湇鍔℃帴鍙�
+ */
+public interface DeviceService extends IService<Device> {
+
+
+    IPage<DeviceDto> selectDeviceParameter(Page page, DeviceDto itemParameter, Boolean laboratoryNameIsNull);
+
+    int addDeviceParameter(Device itemParameter);
+
+    int delDeviceParameter(Integer id);
+
+    int upDeviceParameter(Device itemParameter);
+
+    List<Device> selectEquipmentOverview();
+
+    List<Device> authorizedPerson();
+
+    List<Device> search(Integer status, String deviceName, String specificationModel, String largeCategory);
+
+    List<Device> selectDeviceByCategory(String inspectionItem, String inspectionItemSubclass,String laboratory);
+
+    DeviceDto selectDeviceByCode(Integer id);
+
+    Result<?> dataAcquisition(HttpServletRequest request, DeviceCollectionDto dto);
+
+    List<Map<String, Object>> treeDevice(String deviceName);
+
+    /**
+     * 瀵煎嚭璁惧鍒楄〃
+     * @param deviceId
+     * @param response
+     */
+    void exportDeviceFile(Integer deviceId, HttpServletResponse response);
+
+    /**
+     * 瀵煎嚭璁惧宸ュ叿鏄庣粏
+     * @param response
+     */
+    void exportEquipmentDetails(HttpServletResponse response);
+
+    void downloadImportTemplate(HttpServletResponse response);
+
+    int importDevice(MultipartFile file);
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/DeviceStateService.java b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceStateService.java
new file mode 100644
index 0000000..f18cf47
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceStateService.java
@@ -0,0 +1,31 @@
+package com.ruoyi.device.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.device.dto.DeviceStateDto;
+import com.ruoyi.device.pojo.DeviceState;
+
+import jakarta.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-device/src/main/java/com/ruoyi/device/service/DeviceTraceabilityManagementDetailsService.java b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceTraceabilityManagementDetailsService.java
new file mode 100644
index 0000000..d990e19
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceTraceabilityManagementDetailsService.java
@@ -0,0 +1,16 @@
+package com.ruoyi.device.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.device.pojo.DeviceTraceabilityManagementDetails;
+
+/**
+ * <p>
+ * 璁惧閲忓�兼函婧愯鍒掕鎯呰〃 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-20 02:27:58
+ */
+public interface DeviceTraceabilityManagementDetailsService extends IService<DeviceTraceabilityManagementDetails> {
+
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/DeviceTraceabilityManagementService.java b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceTraceabilityManagementService.java
new file mode 100644
index 0000000..5fc9c57
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceTraceabilityManagementService.java
@@ -0,0 +1,71 @@
+package com.ruoyi.device.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.device.dto.DeviceTraceabilityManagementDto;
+import com.ruoyi.device.pojo.DeviceTraceabilityManagement;
+import org.apache.ibatis.annotations.Param;
+
+import jakarta.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(@Param("page") Page page, @Param("itemParameter") 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);
+
+    /**
+     * 鎻愪氦鎵瑰噯
+     * @param deviceTraceabilityManagementDto
+     * @return
+     */
+    Result submitReviewTraceabilityManagementStatus(DeviceTraceabilityManagementDto deviceTraceabilityManagementDto);
+
+    /**
+     * 閲忓�兼函婧愯鍒掑鏍�
+     */
+    Result reviewTraceabilityManagementStatus(DeviceTraceabilityManagementDto deviceTraceabilityManagementDto);
+
+    /**
+     * 閲忓�兼函婧愯鍒掑鍑�
+     */
+    Result exportDeviceTraceabilityManagementDto(Integer traceabilityManagementId, HttpServletResponse response);
+
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/IDeviceMetricService.java b/cnas-device/src/main/java/com/ruoyi/device/service/IDeviceMetricService.java
new file mode 100644
index 0000000..fc6ed49
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/IDeviceMetricService.java
@@ -0,0 +1,7 @@
+package com.ruoyi.device.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.device.pojo.DeviceMetric;
+
+public interface IDeviceMetricService extends IService<DeviceMetric> {
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/impl/CollectBridgeServiceImpl.java b/cnas-device/src/main/java/com/ruoyi/device/service/impl/CollectBridgeServiceImpl.java
new file mode 100644
index 0000000..a1acb6e
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/impl/CollectBridgeServiceImpl.java
@@ -0,0 +1,107 @@
+package com.ruoyi.device.service.impl;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.device.mapper.CollectBridgeMapper;
+import com.ruoyi.device.pojo.CollectBridge;
+import com.ruoyi.device.service.CollectBridgeService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.time.Duration;
+import java.time.Instant;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+
+/**
+ * 鏁板瓧鐢垫ˉ閲囬泦
+ *
+ * @author zhuo
+ * @since 2025-02-19
+ */
+@Service
+@Slf4j
+public class CollectBridgeServiceImpl extends ServiceImpl<CollectBridgeMapper, CollectBridge> implements CollectBridgeService {
+
+    /**
+     * 濉厖閲囬泦鏁版嵁
+     * @param jsonObject
+     */
+    @Override
+    public void addBridgeValue(JSONObject jsonObject) {
+        JSONArray dataArray = jsonObject.getJSONArray("data");
+        for (int i = 0; i < dataArray.size(); i++) {
+            JSONObject listInfo = dataArray.getJSONObject(i);
+            // 瀛樺偍鏁版嵁
+            String dataStream = listInfo.getString("dataStream");
+            if (dataStream.equals("DQCS.DQCS.SN")) {
+                JSONArray dataPoints = listInfo.getJSONArray("dataPoints");
+                JSONObject pointsJSONObject = dataPoints.getJSONObject(0);
+                String entrustCode = pointsJSONObject.getString("value");
+                // 瑙f瀽鏃堕棿鎴�
+                Instant instant = Instant.ofEpochMilli(pointsJSONObject.getLong("time"));
+                LocalDateTime collectDate = LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
+
+                // 鍏堝瓨鍌ㄧ紪鍙�, 鍚庣画瀛樺偍鍊�
+                CollectBridge collectBridge = new CollectBridge();
+                collectBridge.setEntrustCode(entrustCode);
+                collectBridge.setCollectDate(collectDate);
+                baseMapper.insert(collectBridge);
+
+            }
+            // 瀵勫瓨鍣ㄥ湴鍧�绛変簬64鑾峰彇缁撴灉鍊�
+            if (dataStream.equals("DQCS.DQCS.64")) {
+                JSONArray dataPoints = listInfo.getJSONArray("dataPoints");
+                JSONObject pointsJSONObject = dataPoints.getJSONObject(0);
+                String value = pointsJSONObject.getString("value");
+
+                if (value.equals("64")) {
+                    for (int j = 0; j < dataArray.size(); j++) {
+                        JSONObject listInfo2 = dataArray.getJSONObject(j);
+                        String dataStream2 = listInfo2.getString("dataStream");
+                        // 瀵勫瓨鍣ㄥ湴鍧�绛変簬64鑾峰彇缁撴灉鍊�
+                        if (dataStream2.equals("DQCS.DQCS.DZZ")) {
+                            JSONArray dataPoints2 = listInfo2.getJSONArray("dataPoints");
+                            JSONObject pointsJSONObject2 = dataPoints2.getJSONObject(0);
+                            String collectValue = pointsJSONObject2.getString("value");
+
+                            // 瑙f瀽鏃堕棿鎴�
+                            Instant instant = Instant.ofEpochMilli(pointsJSONObject2.getLong("time"));
+                            LocalDateTime collectDate = LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
+
+                            // 鏌ヨ鏈�鏂颁竴鏉℃暟鎹�
+                            CollectBridge collectBridge = baseMapper.selectOne(Wrappers.<CollectBridge>lambdaQuery()
+                                    .orderByDesc(CollectBridge::getCollectDate)
+                                    .last("limit 1"));
+
+                            // 鍒ゆ柇涓ゆ潯鏁版嵁鏄惁鐩稿樊鍦�10鍒嗛挓涔嬪唴鍜屾湁娌℃湁缂栧彿
+                            if (isWithinTenMinutes(collectDate, collectBridge.getCollectDate()) &&
+                                    StringUtils.isNotBlank(collectBridge.getEntrustCode())) {
+                                // 淇敼妫�楠屽��
+                                collectBridge.setCollectValue(collectValue);
+                                baseMapper.updateById(collectBridge);
+                            } else {
+                                // 鍙瓨鍌ㄥ��
+                                CollectBridge bridge = new CollectBridge();
+                                bridge.setCollectValue(collectValue);
+                                bridge.setCollectDate(collectDate);
+                                baseMapper.insert(bridge);
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    public static boolean isWithinTenMinutes(LocalDateTime dateTime1, LocalDateTime dateTime2) {
+        Duration duration = Duration.between(dateTime1, dateTime2);
+        long minutesDifference = Math.abs(duration.toMinutes());
+        return minutesDifference <= 10;
+    }
+
+}
+
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/impl/DataConfigServiceImpl.java b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DataConfigServiceImpl.java
new file mode 100644
index 0000000..b7a30f7
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DataConfigServiceImpl.java
@@ -0,0 +1,104 @@
+package com.ruoyi.device.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+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.ruoyi.common.core.domain.Result;
+import com.ruoyi.device.dto.DataConfigDto;
+import com.ruoyi.device.mapper.DataConfigMapper;
+import com.ruoyi.device.mapper.DeviceMapper;
+import com.ruoyi.device.pojo.DataConfig;
+import com.ruoyi.device.pojo.Device;
+import com.ruoyi.device.service.DataConfigService;
+import lombok.AllArgsConstructor;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * <p>
+ *  鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-07-13 12:23:00
+ */
+@Service
+@AllArgsConstructor
+public class DataConfigServiceImpl extends ServiceImpl<DataConfigMapper, DataConfig> implements DataConfigService {
+
+    private DeviceMapper deviceMapper;
+
+    private DataConfigMapper dataConfigMapper;
+
+    /**
+     * 缁存姢璁惧鏂囦欢閰嶇疆
+     * @param dataConfigList
+     */
+    @Override
+    public void saveDeviceFileConfiguration(DataConfigDto dataConfigList) {
+        if (dataConfigList.getDeviceId() == null) {
+            throw new RuntimeException("缂哄皯璁惧Id");
+        }
+
+        Device device = new Device();
+        BeanUtils.copyProperties(dataConfigList, device);
+        device.setId(dataConfigList.getDeviceId());
+        deviceMapper.updateById(device);
+    }
+
+    /**
+     * 鏁伴噰閰嶇疆
+     * @param dataConfigList
+     */
+    @Override
+    public void saveDataAcquisitionConfiguration(DataConfigDto dataConfigList) {
+        if (dataConfigList.getDeviceId() == null) {
+            throw new RuntimeException("缂哄皯璁惧id");
+        }
+
+        for (DataConfig dataConfig : dataConfigList.getDataConfigList()) {
+            if (dataConfig.getStructureItemParameterId() == null) {
+                throw new RuntimeException("缂哄皯妫�楠岄」id");
+            }
+            dataConfig.setDeviceId(dataConfigList.getDeviceId());
+        }
+
+        this.saveOrUpdateBatch(dataConfigList.getDataConfigList());
+
+    }
+
+    @Override
+    public Result<?> queryDataAcquisitionConfiguration(DataConfig dataConfig) {
+        return Result.success(dataConfigMapper.selectDataConfigList(dataConfig.getDeviceId()));
+
+    }
+
+    /**
+     * 鏌ヨ妫�楠岄」鏁伴噰閰嶇疆
+     * @param dataConfig
+     * @return
+     */
+    @Override
+    public Result<?> queryProductConfiguration(DataConfig dataConfig) {
+        if (dataConfig.getStructureItemParameterId() == null) {
+            throw new RuntimeException("缂哄皯妫�娴嬮」id");
+        }
+        List<DataConfig> list = baseMapper.selectList(Wrappers.<DataConfig>lambdaQuery().eq(DataConfig::getStructureItemParameterId, dataConfig.getStructureItemParameterId()));
+        return Result.success(list);
+    }
+
+    /**
+     * 鏌ヨ浜嗙粦瀹氫絾鏄病鏈夐厤缃殑妫�楠岄」
+     * @param deviceId
+     * @return
+     */
+    @Override
+    public IPage<DataConfig> getNoConfigProduct(Page page, Integer deviceId) {
+        return baseMapper.getNoConfigProduct(page, deviceId);
+    }
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceAcceptanceFileServiceImpl.java b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceAcceptanceFileServiceImpl.java
new file mode 100644
index 0000000..aa4577c
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceAcceptanceFileServiceImpl.java
@@ -0,0 +1,20 @@
+package com.ruoyi.device.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.device.mapper.DeviceAcceptanceFileMapper;
+import com.ruoyi.device.pojo.DeviceAcceptanceFile;
+import com.ruoyi.device.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-device/src/main/java/com/ruoyi/device/service/impl/DeviceAcceptanceServiceImpl.java b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceAcceptanceServiceImpl.java
new file mode 100644
index 0000000..34b4e3c
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceAcceptanceServiceImpl.java
@@ -0,0 +1,160 @@
+package com.ruoyi.device.service.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.deepoove.poi.XWPFTemplate;
+import com.deepoove.poi.config.Configure;
+import com.ruoyi.common.utils.QueryWrappers;
+import com.ruoyi.device.mapper.DeviceAcceptanceFileMapper;
+import com.ruoyi.device.mapper.DeviceAcceptanceMapper;
+import com.ruoyi.device.mapper.DeviceMapper;
+import com.ruoyi.device.pojo.Device;
+import com.ruoyi.device.pojo.DeviceAcceptance;
+import com.ruoyi.device.pojo.DeviceAcceptanceFile;
+import com.ruoyi.device.service.DeviceAcceptanceService;
+import com.ruoyi.framework.exception.ErrorException;
+import com.ruoyi.inspect.util.HackLoopTableRenderPolicy;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
+
+import jakarta.annotation.Resource;
+import jakarta.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();
+            inputStream.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException("瀵煎嚭澶辫触");
+        }
+    }
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceAccidentReportServiceImpl.java b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceAccidentReportServiceImpl.java
new file mode 100644
index 0000000..4f4a327
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceAccidentReportServiceImpl.java
@@ -0,0 +1,190 @@
+package com.ruoyi.device.service.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.deepoove.poi.XWPFTemplate;
+import com.deepoove.poi.config.Configure;
+import com.ruoyi.common.core.domain.entity.User;
+import com.ruoyi.common.utils.QueryWrappers;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.device.dto.DeviceAccidentReportDto;
+import com.ruoyi.device.mapper.DeviceAccidentReportMapper;
+import com.ruoyi.device.mapper.DeviceMapper;
+import com.ruoyi.device.pojo.Device;
+import com.ruoyi.device.pojo.DeviceAccidentReport;
+import com.ruoyi.device.service.DeviceAccidentReportService;
+import com.ruoyi.inspect.util.UserUtils;
+import com.ruoyi.system.mapper.UserMapper;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletResponse;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URLEncoder;
+import java.time.LocalDate;
+import java.util.HashMap;
+
+/**
+ * <p>
+ * 璁惧浜嬫晠鎶ュ憡鍗� 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-17 06:31:12
+ */
+@Service
+public class DeviceAccidentReportServiceImpl extends ServiceImpl<DeviceAccidentReportMapper, DeviceAccidentReport> implements DeviceAccidentReportService {
+
+    @Resource
+    private UserMapper userMapper;
+
+
+    @Resource
+    private DeviceMapper deivceMapper;
+
+    /**
+     * 璁惧浜嬫晠鎶ュ憡鍒楄〃
+     * @param page
+     * @param deviceAccidentReport
+     * @return
+     */
+    @Override
+    public IPage<DeviceAccidentReport> pageDeviceAccidentReport(Page page, DeviceAccidentReport deviceAccidentReport) {
+        return baseMapper.pageDeviceAccidentReport(page, QueryWrappers.queryWrappers(deviceAccidentReport));
+    }
+
+    /**
+     * 鏂板璁惧浜嬫晠鎶ュ憡
+     * @param deviceAccidentReport
+     * @return
+     */
+    @Override
+    public boolean addDeviceAccidentReport(DeviceAccidentReport deviceAccidentReport) {
+        DeviceAccidentReport accidentReport = new DeviceAccidentReport();
+        User user = userMapper.selectById(SecurityUtils.getUserId().intValue());
+        switch (deviceAccidentReport.getFlowType()) {
+            case 0:
+                // 鎶ュ憡
+                BeanUtils.copyProperties(deviceAccidentReport, accidentReport);
+                accidentReport.setDescriptionOfAccident(deviceAccidentReport.getDescriptionOfAccident());
+                accidentReport.setReportUserId(user.getId());
+                accidentReport.setReportUser(user.getName());
+                accidentReport.setReportDate(LocalDate.now());
+
+                // 璇勪及浜轰俊鎭�
+                User assessorUser = userMapper.selectById(deviceAccidentReport.getAssessorUserId());
+                accidentReport.setAssessorUserId(assessorUser.getId());
+                accidentReport.setAssessorUser(assessorUser.getName());
+
+                baseMapper.insert(accidentReport);
+                break;
+            case 1:
+                accidentReport.setAccidentReportId(deviceAccidentReport.getAccidentReportId());
+                // 璇勪及
+                accidentReport.setAssessorOpinion(deviceAccidentReport.getAssessorOpinion());
+                accidentReport.setAssessorDate(LocalDate.now());
+
+                // 閮ㄩ棬璐熻矗浜�
+                User departmentHeadUser = userMapper.selectById(deviceAccidentReport.getDepartmentHeadUserId());
+                accidentReport.setDepartmentHeadUserId(departmentHeadUser.getId());
+                accidentReport.setDepartmentHeadUser(departmentHeadUser.getName());
+
+                baseMapper.updateById(accidentReport);
+
+                break;
+            case 2:
+                accidentReport.setAccidentReportId(deviceAccidentReport.getAccidentReportId());
+                // 閮ㄩ棬璐熻矗浜烘剰瑙�
+                accidentReport.setDepartmentHeadOpinion(deviceAccidentReport.getDepartmentHeadOpinion());
+                accidentReport.setDepartmentHeadDate(LocalDate.now());
+
+                // 鎶�鏈礋璐d汉淇℃伅
+                User technicalDirectorUser = userMapper.selectById(deviceAccidentReport.getTechnicalDirectorUserId());
+                accidentReport.setTechnicalDirectorUserId(technicalDirectorUser.getId());
+                accidentReport.setTechnicalDirectorUser(technicalDirectorUser.getName());
+
+                baseMapper.updateById(accidentReport);
+
+                break;
+            case 3:
+                accidentReport.setAccidentReportId(deviceAccidentReport.getAccidentReportId());
+                // 鎶�鏈礋璐d汉鎰忚
+                accidentReport.setTechnicalDirectorOpinion(deviceAccidentReport.getTechnicalDirectorOpinion());
+                accidentReport.setTechnicalDirectorDate(LocalDate.now());
+
+                // 涓讳换淇℃伅
+                User directorHeadUser = userMapper.selectById(deviceAccidentReport.getDirectorHeadUserId());
+                accidentReport.setDirectorHeadUserId(directorHeadUser.getId());
+                accidentReport.setDirectorHeadUser(directorHeadUser.getName());
+
+                baseMapper.updateById(accidentReport);
+
+                break;
+            case 4:
+                accidentReport.setAccidentReportId(deviceAccidentReport.getAccidentReportId());
+                // 涓讳换鎰忚
+                accidentReport.setDirectorHeadOpinion(deviceAccidentReport.getDirectorHeadOpinion());
+                accidentReport.setDirectorHeadDate(LocalDate.now());
+
+                accidentReport.setIsFinish(1);
+                baseMapper.updateById(accidentReport);
+                break;
+        }
+        return true;
+    }
+
+    /**
+     * 瀵煎嚭璁惧浜嬫晠鎶ュ憡
+     * @param accidentReportId 璁惧浜嬫晠鎶ュ憡id
+     * @param response 鍝嶅簲
+     */
+    @Override
+    public void exportDeviceAccidentReport(Integer accidentReportId, HttpServletResponse response) {
+        // 鏌ヨ浜嬫晠鎶ュ憡
+        DeviceAccidentReportDto deviceAccidentReport = baseMapper.selectDeviceAccidentReportById(accidentReportId);
+
+        Device device = deivceMapper.selectById(deviceAccidentReport.getDeviceId());
+        device = device == null ? new Device() : device;
+
+        // 鑾峰彇璺緞
+        InputStream inputStream = this.getClass().getResourceAsStream("/static/word/device-accident-report.docx");
+        Configure configure = Configure.builder()
+                .build();
+        Device finalDevice = device;
+        XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
+                new HashMap<String, Object>() {{
+                    put("deviceAccidentReport", deviceAccidentReport);
+                    put("device", finalDevice);
+                    // 鎶ュ憡浜虹鍚�
+                    put("reportUserUrl", UserUtils.getFinalUserSignatureUrl(deviceAccidentReport.getReportUserId()));
+                    // 璇勪及浜虹鍚�
+                    put("assessorUserUrl", UserUtils.getFinalUserSignatureUrl(deviceAccidentReport.getAssessorUserId()));
+                    // 閮ㄩ棬璐熻矗浜虹鍚�
+                    put("departmentHeadUserUrl", UserUtils.getFinalUserSignatureUrl(deviceAccidentReport.getDepartmentHeadUserId()));
+                    // 鎶�鏈礋璐d汉绛惧悕
+                    put("technicalDirectorUserUrl", UserUtils.getFinalUserSignatureUrl(deviceAccidentReport.getTechnicalDirectorUserId()));
+                    // 涓讳换绛惧悕
+                    put("directorHeadUserUrl", UserUtils.getFinalUserSignatureUrl(deviceAccidentReport.getDepartmentHeadUserId()));
+                }});
+
+        try {
+            response.setContentType("application/msword");
+            String deviceName = device.getDeviceName() == null ? "" : device.getDeviceName();
+            String fileName = URLEncoder.encode(
+                    deviceName + "璁惧浜嬫晠鎶ュ憡鍗�", "UTF-8");
+            response.setHeader("Content-disposition",
+                    "attachment;filename=" + fileName + ".docx");
+            OutputStream os = response.getOutputStream();
+            template.write(os);
+            os.flush();
+            os.close();
+            inputStream.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException("瀵煎嚭澶辫触");
+        }
+    }
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceBorrowServiceImpl.java b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceBorrowServiceImpl.java
new file mode 100644
index 0000000..a402359
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceBorrowServiceImpl.java
@@ -0,0 +1,116 @@
+package com.ruoyi.device.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.ruoyi.common.core.domain.entity.User;
+import com.ruoyi.common.numgen.NumberGenerator;
+import com.ruoyi.common.utils.QueryWrappers;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.device.mapper.DeviceBorrowMapper;
+import com.ruoyi.device.mapper.DeviceLogMapper;
+import com.ruoyi.device.pojo.DeviceBorrow;
+import com.ruoyi.device.pojo.DeviceLog;
+import com.ruoyi.device.service.DeviceBorrowService;
+import com.ruoyi.system.mapper.UserMapper;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import jakarta.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
+    private DeviceBorrowMapper deviceBorrowMapper;
+
+    @Resource
+    private DeviceLogMapper deviceLogMapper;
+
+    @Resource
+    private UserMapper userMapper;
+
+    @Autowired
+    private NumberGenerator<DeviceBorrow> numberGenerator;
+
+    @Override
+    public IPage<DeviceBorrow> deviceBorrowPage(Page page, DeviceBorrow deviceBorrow) {
+        return deviceBorrowMapper.deviceBorrowPage(page, QueryWrappers.queryWrappers(deviceBorrow));
+    }
+
+    @Override
+    public int saveDeviceBorrow(DeviceBorrow deviceBorrow) {
+        Integer userId = SecurityUtils.getUserId().intValue();
+        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-device/src/main/java/com/ruoyi/device/service/impl/DeviceBreakdownMaintenanceServiceImpl.java b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceBreakdownMaintenanceServiceImpl.java
new file mode 100644
index 0000000..24bd8be
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceBreakdownMaintenanceServiceImpl.java
@@ -0,0 +1,153 @@
+package com.ruoyi.device.service.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.deepoove.poi.XWPFTemplate;
+import com.deepoove.poi.config.Configure;
+import com.ruoyi.common.core.domain.entity.User;
+import com.ruoyi.common.utils.QueryWrappers;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.device.dto.DeviceBreakdownMaintenance;
+import com.ruoyi.device.mapper.DeviceBreakdownMaintenanceMapper;
+import com.ruoyi.device.mapper.DeviceMapper;
+import com.ruoyi.device.pojo.Device;
+import com.ruoyi.device.service.DeviceBreakdownMaintenanceService;
+import com.ruoyi.inspect.util.UserUtils;
+import com.ruoyi.system.mapper.UserMapper;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletResponse;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URLEncoder;
+import java.time.LocalDate;
+import java.util.HashMap;
+
+/**
+ * <p>
+ * 璁惧鏁呴殰缁翠慨琛� 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-17 04:50:57
+ */
+@Service
+public class DeviceBreakdownMaintenanceServiceImpl extends ServiceImpl<DeviceBreakdownMaintenanceMapper, DeviceBreakdownMaintenance> implements DeviceBreakdownMaintenanceService {
+
+    @Resource
+    private UserMapper userMapper;
+    @Resource
+    private DeviceMapper deivceMapper;
+
+    /**
+     * 璁惧鏁呴殰缁翠慨鍒楄〃
+     * @param page
+     * @param deviceBreakdownMaintenance
+     * @return
+     */
+    @Override
+    public IPage<DeviceBreakdownMaintenance> pageDeviceBreakdownMaintenance(Page page, DeviceBreakdownMaintenance deviceBreakdownMaintenance) {
+        return baseMapper.pageDeviceBreakdownMaintenance(page, QueryWrappers.queryWrappers(deviceBreakdownMaintenance));
+    }
+
+    /**
+     * 鏂板璁惧鏁呴殰缁翠慨
+     * @param deviceBreakdownMaintenance
+     * @return
+     */
+    @Override
+    public boolean addDeviceBreakdownMaintenance(DeviceBreakdownMaintenance deviceBreakdownMaintenance) {
+        DeviceBreakdownMaintenance breakdownMaintenance = new DeviceBreakdownMaintenance();
+        //褰撳墠鐧诲綍鐢ㄦ埛
+        User user = userMapper.selectById(SecurityUtils.getUserId().intValue());
+
+        switch (deviceBreakdownMaintenance.getFlowType()) {
+            case 0:
+                BeanUtils.copyProperties(deviceBreakdownMaintenance, breakdownMaintenance);
+                // 鐢宠
+                breakdownMaintenance.setDamageOrMalfunction(deviceBreakdownMaintenance.getDamageOrMalfunction());
+                breakdownMaintenance.setApplicantUserId(user.getId());
+                breakdownMaintenance.setApplicantUser(user.getName());
+                breakdownMaintenance.setRepairDate(deviceBreakdownMaintenance.getRepairDate());
+
+                // 澶勭悊浜轰俊鎭�
+                User departmentHeadUser = userMapper.selectById(deviceBreakdownMaintenance.getDepartmentHeadUserId());
+                breakdownMaintenance.setApplicantUserId(departmentHeadUser.getId());
+                breakdownMaintenance.setApplicantUser(departmentHeadUser.getName());
+
+                baseMapper.insert(breakdownMaintenance);
+                break;
+            case 1:
+                breakdownMaintenance.setMaintenanceId(deviceBreakdownMaintenance.getMaintenanceId());
+                // 鐢宠閮ㄩ棬璐熻矗浜烘剰瑙�
+                breakdownMaintenance.setDepartmentHeadOpinion(deviceBreakdownMaintenance.getDepartmentHeadOpinion());
+                breakdownMaintenance.setDepartmentHeadDate(LocalDate.now());
+
+                baseMapper.updateById(breakdownMaintenance);
+                break;
+            case 2:
+                breakdownMaintenance.setMaintenanceId(deviceBreakdownMaintenance.getMaintenanceId());
+                // 璁¢噺瀹ゆ剰瑙�
+                breakdownMaintenance.setMaintenanceRecord(deviceBreakdownMaintenance.getMaintenanceRecord());
+                breakdownMaintenance.setMaintenanceUser(deviceBreakdownMaintenance.getMaintenanceUser());
+                breakdownMaintenance.setMaintenanceDate(deviceBreakdownMaintenance.getMaintenanceDate());
+
+                breakdownMaintenance.setIsFinish(1);
+
+                baseMapper.updateById(breakdownMaintenance);
+                break;
+        }
+        return true;
+    }
+
+    /**
+     * 瀵煎嚭璁惧鏁呴殰缁翠慨
+     * @param maintenanceId 璁惧鏁呴殰缁翠慨id
+     * @param response 鍝嶅簲
+     */
+    @Override
+    public void exportDeviceBreakdownMaintenance(Integer maintenanceId, HttpServletResponse response) {
+        // 鏌ヨ澶栭儴璁惧鐢宠
+        DeviceBreakdownMaintenance deviceBreakdownMaintenance = baseMapper.selectById(maintenanceId);
+
+        Device device = null;
+        if (deviceBreakdownMaintenance.getDeviceId() != null) {
+            device = deivceMapper.selectById(deviceBreakdownMaintenance.getDeviceId());
+            device = device == null ? new Device() : device;
+        }
+        // 鑾峰彇璺緞
+        InputStream inputStream = this.getClass().getResourceAsStream("/static/word/device-breakdown-maintenance.docx");
+        Configure configure = Configure.builder()
+                .build();
+        Device finalDevice = device;
+        XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
+                new HashMap<String, Object>() {{
+                    put("deviceBreakdownMaintenance", deviceBreakdownMaintenance);
+                    put("device", finalDevice);
+                    // 鐢宠浜虹鍚�
+                    put("applicantUrl", UserUtils.getFinalUserSignatureUrl(deviceBreakdownMaintenance.getApplicantUserId()));
+                    // 閮ㄩ棬璐熻矗浜虹鍚�
+                    put("headUrl", UserUtils.getFinalUserSignatureUrl(deviceBreakdownMaintenance.getDepartmentHeadUserId()));
+                }});
+
+        try {
+            response.setContentType("application/msword");
+            String deviceName = device.getDeviceName() == null ? "" : device.getDeviceName();
+            String fileName = URLEncoder.encode(
+                    deviceName + "璁惧鏁呴殰缁翠慨鐢宠琛�", "UTF-8");
+            response.setHeader("Content-disposition",
+                    "attachment;filename=" + fileName + ".docx");
+            OutputStream os = response.getOutputStream();
+            template.write(os);
+            os.flush();
+            os.close();
+            inputStream.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException("瀵煎嚭澶辫触");
+        }
+    }
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceCalibrationPlanDetailServiceImpl.java b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceCalibrationPlanDetailServiceImpl.java
new file mode 100644
index 0000000..8c4b2da
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceCalibrationPlanDetailServiceImpl.java
@@ -0,0 +1,20 @@
+package com.ruoyi.device.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.device.mapper.DeviceCalibrationPlanDetailMapper;
+import com.ruoyi.device.pojo.DeviceCalibrationPlanDetail;
+import com.ruoyi.device.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-device/src/main/java/com/ruoyi/device/service/impl/DeviceCalibrationPlanServiceImpl.java b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceCalibrationPlanServiceImpl.java
new file mode 100644
index 0000000..c119452
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceCalibrationPlanServiceImpl.java
@@ -0,0 +1,357 @@
+package com.ruoyi.device.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.ruoyi.common.constant.MenuJumpPathConstants;
+import com.ruoyi.common.core.domain.entity.InformationNotification;
+import com.ruoyi.common.core.domain.entity.User;
+import com.ruoyi.common.utils.QueryWrappers;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.common.utils.WxCpUtils;
+import com.ruoyi.device.dto.DeviceCalibrationPlanDetailDto;
+import com.ruoyi.device.dto.DeviceCalibrationPlanDto;
+import com.ruoyi.device.excel.upload.DeviceCalibrationPlanDetailUpload;
+import com.ruoyi.device.mapper.DeviceCalibrationPlanDetailMapper;
+import com.ruoyi.device.mapper.DeviceCalibrationPlanMapper;
+import com.ruoyi.device.pojo.DeviceCalibrationPlan;
+import com.ruoyi.device.pojo.DeviceCalibrationPlanDetail;
+import com.ruoyi.device.service.DeviceCalibrationPlanDetailService;
+import com.ruoyi.device.service.DeviceCalibrationPlanService;
+import com.ruoyi.inspect.util.HackLoopTableRenderPolicy;
+import com.ruoyi.inspect.util.UserUtils;
+import com.ruoyi.system.mapper.UserMapper;
+import com.ruoyi.system.service.InformationNotificationService;
+import org.springframework.beans.BeanUtils;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.multipart.MultipartFile;
+
+import jakarta.annotation.Resource;
+import jakarta.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 ThreadPoolTaskExecutor threadPoolTaskExecutor;
+    @Resource
+    private InformationNotificationService informationNotificationService;
+    @Resource
+    private UserMapper userMapper;
+
+
+    /**
+     * 鏂板璁惧鏍″噯璁″垝
+     * @param calibrationPlanDto
+     * @return
+     */
+    @Override
+    public boolean addDeviceCalibrationPlan(DeviceCalibrationPlanDto calibrationPlanDto) {
+        // 褰撳墠鐧诲綍鐢ㄦ埛
+        Integer userId = SecurityUtils.getUserId().intValue();
+        // 缂栧埗鏃ユ湡
+        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 = SecurityUtils.getUserId().intValue();
+        // 鏂囦欢鍚嶇О
+        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 submiatRatifyDeviceCalibrationPlan(DeviceCalibrationPlan deviceCalibrationPlan) {
+        baseMapper.update(null, Wrappers.<DeviceCalibrationPlan>lambdaUpdate()
+                .eq(DeviceCalibrationPlan::getPlanId, deviceCalibrationPlan.getPlanId())
+                .set(DeviceCalibrationPlan::getRatifyUserId, deviceCalibrationPlan.getRatifyUserId())
+                .set(DeviceCalibrationPlan::getRatifyRemark, null)
+                .set(DeviceCalibrationPlan::getRatifyStatus, null)
+                .set(DeviceCalibrationPlan::getRatifyTime, null)
+        );
+
+        DeviceCalibrationPlan calibrationPlan = baseMapper.selectById(deviceCalibrationPlan.getPlanId());
+
+        // 鍙戦�佹秷鎭�
+        Integer userId = SecurityUtils.getUserId().intValue();
+        User user = userMapper.selectById(userId);
+        // 娑堟伅鍙戦��
+        InformationNotification info = new InformationNotification();
+        // 鍙戦�佷汉
+        info.setCreateUser(user.getName());
+        info.setMessageType("6");
+        info.setTheme("CNAS璁惧鏍″噯璁″垝鎵瑰噯閫氱煡");
+        info.setContent(calibrationPlan.getPlanName() + "鐨勮澶囨牎鍑嗚鍒掑緟鎵瑰噯");
+        info.setSenderId(userId);
+        // 鎺ユ敹浜�
+        info.setConsigneeId(deviceCalibrationPlan.getRatifyUserId());
+        info.setJumpPath(MenuJumpPathConstants.DEVICE);
+        informationNotificationService.addInformationNotification(info);
+
+        // 鍙戦�佷紒涓氬井淇¢�氱煡
+        threadPoolTaskExecutor.execute(() -> {
+            // 鏌ヨ鎺ユ敹浜�
+            User personnel = userMapper.selectById(deviceCalibrationPlan.getPlanId());
+
+            String message = "";
+            message += "CNAS璁惧鏍″噯璁″垝鎵瑰噯閫氱煡";
+            message += "\n璇峰幓璧勬簮绠$悊-璁惧涓�灞傜洰褰�-璁惧鏍″噯璁″垝濉啓";
+            message += "\n" + calibrationPlan.getPlanName() + "鐨勬牎鍑嗚鍒掑緟鎵瑰噯";
+            //鍙戦�佷紒涓氬井淇℃秷鎭�氱煡
+            try {
+                WxCpUtils.inform(personnel.getAccount(), message, null);
+            } catch (Exception e) {
+                throw new RuntimeException(e);
+            }
+        });
+        return true;
+    }
+
+    /**
+     * 璁惧鏍″噯璁″垝鎵瑰噯
+     * @param deviceCalibrationPlan
+     * @return
+     */
+    @Override
+    public boolean ratifyDeviceCalibrationPlan(DeviceCalibrationPlan deviceCalibrationPlan) {
+        baseMapper.update(null, Wrappers.<DeviceCalibrationPlan>lambdaUpdate()
+                .eq(DeviceCalibrationPlan::getPlanId, deviceCalibrationPlan.getPlanId())
+                .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)
+                .orderByAsc(DeviceCalibrationPlanDetail::getPlanDate));
+        // 璁剧疆搴忓彿 鍜� 鏃堕棿
+        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() == null ? null : deviceCalibrationPlanDetail.getLastDate().format(formatter));
+            deviceCalibrationPlanDetailDto.setPlanDateStr(deviceCalibrationPlanDetail.getPlanDate() == null ? null : 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();
+            inputStream.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException("瀵煎嚭澶辫触");
+        }
+    }
+
+    /**
+     * 鎵归噺缂栬緫璁惧鏍″噯
+     * @param calibrationPlanDto
+     * @return
+     */
+    @Override
+    public boolean updateDeviceCalibrationPlan(DeviceCalibrationPlanDto calibrationPlanDto) {
+        // 褰撳墠鐧诲綍鐢ㄦ埛
+        Integer userId = SecurityUtils.getUserId().intValue();
+        // 缂栧埗鏃ユ湡
+        calibrationPlanDto.setWriteUserId(userId);
+        calibrationPlanDto.setWriteTime(LocalDateTime.now());
+        baseMapper.updateById(calibrationPlanDto);
+
+        // 鍒犻櫎鍘熸湰鐨勮鎯�
+        deviceCalibrationPlanDetailService.remove(Wrappers.<DeviceCalibrationPlanDetail>lambdaQuery().eq(DeviceCalibrationPlanDetail::getPlanId, calibrationPlanDto.getPlanId()));
+
+        // 娣诲姞璇︽儏
+        if (CollectionUtils.isNotEmpty(calibrationPlanDto.getCalibrationPlanDetailList())) {
+            for (DeviceCalibrationPlanDetail calibrationPlanDetail : calibrationPlanDto.getCalibrationPlanDetailList()) {
+                calibrationPlanDetail.setPlanId(calibrationPlanDto.getPlanId());
+            }
+            deviceCalibrationPlanDetailService.saveBatch(calibrationPlanDto.getCalibrationPlanDetailList());
+        }
+        return true;
+    }
+
+    /**
+     * 鏌ヨ璁惧鏍″噯璇︽儏
+     * @param planId
+     * @return
+     */
+    @Override
+    public DeviceCalibrationPlanDto getDeviceCalibrationPlan(Integer planId) {
+        DeviceCalibrationPlan calibrationPlan = baseMapper.selectById(planId);
+        DeviceCalibrationPlanDto deviceCalibrationPlanDto = new DeviceCalibrationPlanDto();
+        BeanUtils.copyProperties(calibrationPlan, deviceCalibrationPlanDto);
+        // 鏌ヨ璇︽儏
+        List<DeviceCalibrationPlanDetail> list = deviceCalibrationPlanDetailService.list(Wrappers.<DeviceCalibrationPlanDetail>lambdaQuery()
+                .eq(DeviceCalibrationPlanDetail::getPlanId, planId)
+                .orderByAsc(DeviceCalibrationPlanDetail::getPlanDate));
+
+        deviceCalibrationPlanDto.setCalibrationPlanDetailList(list);
+        return deviceCalibrationPlanDto;
+    }
+
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceDocumentsServiceImpl.java b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceDocumentsServiceImpl.java
new file mode 100644
index 0000000..2e24439
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceDocumentsServiceImpl.java
@@ -0,0 +1,14 @@
+package com.ruoyi.device.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.device.mapper.DeviceDocumentsMapper;
+import com.ruoyi.device.pojo.DeviceDocuments;
+import com.ruoyi.device.service.DeviceDocumentsService;
+import org.springframework.stereotype.Service;
+
+/**
+ * 璁惧妗f
+ */
+@Service
+public class DeviceDocumentsServiceImpl extends ServiceImpl<DeviceDocumentsMapper, DeviceDocuments> implements DeviceDocumentsService {
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceExaminePlanDetailsServiceImpl.java b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceExaminePlanDetailsServiceImpl.java
new file mode 100644
index 0000000..c7fcca5
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceExaminePlanDetailsServiceImpl.java
@@ -0,0 +1,20 @@
+package com.ruoyi.device.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.device.mapper.DeviceExaminePlanDetailsMapper;
+import com.ruoyi.device.pojo.DeviceExaminePlanDetails;
+import com.ruoyi.device.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-device/src/main/java/com/ruoyi/device/service/impl/DeviceExaminePlanServiceImpl.java b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceExaminePlanServiceImpl.java
new file mode 100644
index 0000000..4a4d45b
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceExaminePlanServiceImpl.java
@@ -0,0 +1,349 @@
+package com.ruoyi.device.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.ruoyi.common.constant.MenuJumpPathConstants;
+import com.ruoyi.common.core.domain.entity.InformationNotification;
+import com.ruoyi.common.core.domain.entity.User;
+import com.ruoyi.common.utils.QueryWrappers;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.common.utils.WxCpUtils;
+import com.ruoyi.device.dto.DeviceExaminePlanDetailsDto;
+import com.ruoyi.device.dto.DeviceExaminePlanDto;
+import com.ruoyi.device.excel.upload.DeviceExaminePlanUpload;
+import com.ruoyi.device.mapper.DeviceExaminePlanDetailsMapper;
+import com.ruoyi.device.mapper.DeviceExaminePlanMapper;
+import com.ruoyi.device.mapper.DeviceMapper;
+import com.ruoyi.device.pojo.Device;
+import com.ruoyi.device.pojo.DeviceExaminePlan;
+import com.ruoyi.device.pojo.DeviceExaminePlanDetails;
+import com.ruoyi.device.service.DeviceExaminePlanDetailsService;
+import com.ruoyi.device.service.DeviceExaminePlanService;
+import com.ruoyi.framework.exception.ErrorException;
+import com.ruoyi.inspect.util.HackLoopTableRenderPolicy;
+import com.ruoyi.inspect.util.UserUtils;
+import com.ruoyi.system.mapper.UserMapper;
+import com.ruoyi.system.service.InformationNotificationService;
+import org.springframework.beans.BeanUtils;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.multipart.MultipartFile;
+
+import jakarta.annotation.Resource;
+import jakarta.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 ThreadPoolTaskExecutor threadPoolTaskExecutor;
+    @Resource
+    private InformationNotificationService informationNotificationService;
+    @Resource
+    private DeviceMapper deviceMapper;
+    @Resource
+    private UserMapper userMapper;
+
+    /**
+     * 鏂板璁惧鏍告煡璁″垝
+     * @param examinePlanDto
+     * @return
+     */
+    @Override
+    public boolean addDeviceExaminePlan(DeviceExaminePlanDto examinePlanDto) {
+        // 褰撳墠鐧诲綍鐢ㄦ埛
+        Integer userId = SecurityUtils.getUserId().intValue();
+        // 鏂囦欢鍚嶇О
+        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 = SecurityUtils.getUserId().intValue();
+        // 鏂囦欢鍚嶇О
+        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 submitRatifyDeviceExaminePlan(DeviceExaminePlan deviceExaminePlan) {
+        baseMapper.update(null, Wrappers.<DeviceExaminePlan>lambdaUpdate()
+                .eq(DeviceExaminePlan::getPlanId, deviceExaminePlan.getPlanId())
+                .set(DeviceExaminePlan::getRatifyUserId, deviceExaminePlan.getRatifyUserId())
+                .set(DeviceExaminePlan::getRatifyRemark, null)
+                .set(DeviceExaminePlan::getRatifyStatus, null)
+                .set(DeviceExaminePlan::getRatifyTime, null)
+        );
+
+        DeviceExaminePlan examinePlan = baseMapper.selectById(deviceExaminePlan.getPlanId());
+
+        // 鍙戦�佹秷鎭�
+        Integer userId = SecurityUtils.getUserId().intValue();
+        User user = userMapper.selectById(userId);
+        // 娑堟伅鍙戦��
+        InformationNotification info = new InformationNotification();
+        // 鍙戦�佷汉
+        info.setCreateUser(user.getName());
+        info.setMessageType("6");
+        info.setTheme("CNAS璁惧鏍告煡璁″垝鎵瑰噯閫氱煡");
+        info.setContent(examinePlan.getPlanName() + "鐨勮澶囨牳鏌ヨ鍒掑緟鎵瑰噯");
+        info.setSenderId(userId);
+        // 鎺ユ敹浜�
+        info.setConsigneeId(examinePlan.getRatifyUserId());
+        info.setJumpPath(MenuJumpPathConstants.DEVICE);
+        informationNotificationService.addInformationNotification(info);
+
+        // 鍙戦�佷紒涓氬井淇¢�氱煡
+        threadPoolTaskExecutor.execute(() -> {
+            // 鏌ヨ鎺ユ敹浜�
+            User personnel = userMapper.selectById(examinePlan.getRatifyUserId());
+
+            String message = "";
+            message += "CNAS璁惧鏍告煡璁″垝鎵瑰噯閫氱煡";
+            message += "\n璇峰幓璧勬簮绠$悊-璁惧涓�灞傜洰褰�-璁惧鏍告煡璁″垝濉啓";
+            message += "\n" + examinePlan.getPlanName() + "鐨勬牎鍑嗘牳鏌ュ垝寰呮壒鍑�";
+            //鍙戦�佷紒涓氬井淇℃秷鎭�氱煡
+            try {
+                WxCpUtils.inform(personnel.getAccount(), message, null);
+            } catch (Exception e) {
+                throw new RuntimeException(e);
+            }
+        });
+        return false;
+    }
+
+    /**
+     * 璁惧鏍告煡璁″垝鎵瑰噯
+     * @param deviceExaminePlan
+     * @return
+     */
+    @Override
+    public boolean ratifyDeviceExaminePlan(DeviceExaminePlan deviceExaminePlan) {
+        // 褰撳墠鐧诲綍鐢ㄦ埛
+        baseMapper.update(null, Wrappers.<DeviceExaminePlan>lambdaUpdate()
+                .eq(DeviceExaminePlan::getPlanId, deviceExaminePlan.getPlanId())
+                .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<DeviceExaminePlanDetailsDto> 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)
+                .orderByAsc(DeviceExaminePlanDetails::getCheckTime));
+        // 璁剧疆搴忓彿
+        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();
+            inputStream.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException("瀵煎嚭澶辫触");
+        }
+    }
+
+    @Override
+    public boolean updateDeviceExaminePlan(DeviceExaminePlanDto examinePlanDto) {
+        // 褰撳墠鐧诲綍鐢ㄦ埛
+        Integer userId = SecurityUtils.getUserId().intValue();
+        // 鏂囦欢鍚嶇О
+        examinePlanDto.setWriteUserId(userId);
+        examinePlanDto.setWriteTime(LocalDateTime.now());
+        baseMapper.updateById(examinePlanDto);
+
+        deviceExaminePlanDetailsService.remove(Wrappers.<DeviceExaminePlanDetails>lambdaQuery()
+                .eq(DeviceExaminePlanDetails::getPlanId, examinePlanDto.getPlanId()));
+
+        // 娣诲姞璇︽儏
+        if (CollectionUtils.isNotEmpty(examinePlanDto.getExaminePlanDetailsList())) {
+            for (DeviceExaminePlanDetails deviceExaminePlanDetails : examinePlanDto.getExaminePlanDetailsList()) {
+                deviceExaminePlanDetails.setPlanId(examinePlanDto.getPlanId());
+            }
+            deviceExaminePlanDetailsService.saveBatch(examinePlanDto.getExaminePlanDetailsList());
+        }
+        return true;
+    }
+
+    @Override
+    public DeviceExaminePlanDto getDeviceExaminePlan(Integer planId) {
+        DeviceExaminePlan examinePlan = baseMapper.selectById(planId);
+        DeviceExaminePlanDto deviceExaminePlanDto = new DeviceExaminePlanDto();
+        BeanUtils.copyProperties(examinePlan, deviceExaminePlanDto);
+        // 鏌ヨ璇︽儏
+        List<DeviceExaminePlanDetails> list = deviceExaminePlanDetailsService.list(Wrappers.<DeviceExaminePlanDetails>lambdaQuery()
+                .eq(DeviceExaminePlanDetails::getPlanId, planId)
+                .orderByAsc(DeviceExaminePlanDetails::getCheckTime));
+        deviceExaminePlanDto.setExaminePlanDetailsList(list);
+
+        return deviceExaminePlanDto;
+    }
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceExamineRecordContrastDetailsServiceImpl.java b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceExamineRecordContrastDetailsServiceImpl.java
new file mode 100644
index 0000000..db6c58a
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceExamineRecordContrastDetailsServiceImpl.java
@@ -0,0 +1,20 @@
+package com.ruoyi.device.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.device.mapper.DeviceExamineRecordContrastDetailsMapper;
+import com.ruoyi.device.pojo.DeviceExamineRecordContrastDetails;
+import com.ruoyi.device.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-device/src/main/java/com/ruoyi/device/service/impl/DeviceExamineRecordContrastServiceImpl.java b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceExamineRecordContrastServiceImpl.java
new file mode 100644
index 0000000..193ab7a
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceExamineRecordContrastServiceImpl.java
@@ -0,0 +1,194 @@
+package com.ruoyi.device.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.ruoyi.common.core.domain.entity.User;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.device.dto.DeviceExamineRecordContrastDetailsDto;
+import com.ruoyi.device.dto.DeviceExamineRecordContrastDto;
+import com.ruoyi.device.mapper.DeviceExaminePlanDetailsMapper;
+import com.ruoyi.device.mapper.DeviceExamineRecordContrastMapper;
+import com.ruoyi.device.pojo.DeviceExaminePlanDetails;
+import com.ruoyi.device.pojo.DeviceExamineRecordContrast;
+import com.ruoyi.device.pojo.DeviceExamineRecordContrastDetails;
+import com.ruoyi.device.service.DeviceExamineRecordContrastDetailsService;
+import com.ruoyi.device.service.DeviceExamineRecordContrastService;
+import com.ruoyi.framework.exception.ErrorException;
+import com.ruoyi.inspect.util.HackLoopTableRenderPolicy;
+import com.ruoyi.inspect.util.UserUtils;
+import com.ruoyi.system.mapper.UserMapper;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import jakarta.annotation.Resource;
+import jakarta.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 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 = SecurityUtils.getUserId().intValue();
+            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();
+            inputStream.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException("瀵煎嚭澶辫触");
+        }
+    }
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceExamineRecordDetailServiceImpl.java b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceExamineRecordDetailServiceImpl.java
new file mode 100644
index 0000000..1ef62d5
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceExamineRecordDetailServiceImpl.java
@@ -0,0 +1,20 @@
+package com.ruoyi.device.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.device.mapper.DeviceExamineRecordDetailMapper;
+import com.ruoyi.device.pojo.DeviceExamineRecordDetail;
+import com.ruoyi.device.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-device/src/main/java/com/ruoyi/device/service/impl/DeviceExamineRecordServiceImpl.java b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceExamineRecordServiceImpl.java
new file mode 100644
index 0000000..790f995
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceExamineRecordServiceImpl.java
@@ -0,0 +1,238 @@
+package com.ruoyi.device.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.ruoyi.common.constant.MenuJumpPathConstants;
+import com.ruoyi.common.core.domain.entity.InformationNotification;
+import com.ruoyi.common.core.domain.entity.User;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.common.utils.WxCpUtils;
+import com.ruoyi.device.dto.DeviceExamineRecordDto;
+import com.ruoyi.device.mapper.DeviceExaminePlanDetailsMapper;
+import com.ruoyi.device.mapper.DeviceExamineRecordMapper;
+import com.ruoyi.device.mapper.DeviceMapper;
+import com.ruoyi.device.pojo.Device;
+import com.ruoyi.device.pojo.DeviceExaminePlanDetails;
+import com.ruoyi.device.pojo.DeviceExamineRecord;
+import com.ruoyi.device.pojo.DeviceExamineRecordDetail;
+import com.ruoyi.device.service.DeviceExamineRecordDetailService;
+import com.ruoyi.device.service.DeviceExamineRecordService;
+import com.ruoyi.framework.exception.ErrorException;
+import com.ruoyi.inspect.util.HackLoopTableRenderPolicy;
+import com.ruoyi.inspect.util.UserUtils;
+import com.ruoyi.system.mapper.UserMapper;
+import com.ruoyi.system.service.InformationNotificationService;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import jakarta.annotation.Resource;
+import jakarta.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 UserMapper userMapper;
+    @Resource
+    private ThreadPoolTaskExecutor threadPoolTaskExecutor;
+
+    @Resource
+    private InformationNotificationService informationNotificationService;
+
+    /**
+     * 鏌ヨ鏍告煡璁板綍
+     *
+     * @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 = SecurityUtils.getUserId().intValue();
+            User user = userMapper.selectById(SecurityUtils.getUserId());
+            deviceExamineRecordDto.setCheckerUserId(userId);
+            deviceExamineRecordDto.setCheckerUser(user.getName());
+
+            // 鏌ヨ瀹℃煡浜篿d
+            if (deviceExamineRecordDto.getReviewUserId() != null) {
+                User reviewUser = userMapper.selectById(deviceExamineRecordDto.getReviewUserId());
+                deviceExamineRecordDto.setReviewUser(reviewUser.getName());
+
+                // 娑堟伅鍙戦��
+                InformationNotification info = new InformationNotification();
+                // 鍙戦�佷汉
+                info.setCreateUser(user.getName());
+                info.setMessageType("6");
+                info.setTheme("CNAS璁惧鏍告煡璁″垝寰呮壒鍑�");
+                info.setContent("璁惧缂栧彿涓�: " + deviceExamineRecordDto.getDeviceNumber() + " 璁惧鏍告煡璁″垝寰呭鎵�");
+                info.setSenderId(userId);
+                // 鎺ユ敹浜�
+                info.setConsigneeId(deviceExamineRecordDto.getReviewUserId());
+                info.setJumpPath(MenuJumpPathConstants.DEVICE);
+                informationNotificationService.addInformationNotification(info);
+
+                // 鍙戦�佷紒涓氬井淇¢�氱煡
+                threadPoolTaskExecutor.execute(() -> {
+                    // 鏌ヨ鍙戦�佷汉
+                    User people = userMapper.selectById(deviceExamineRecordDto.getReviewUserId());
+                    String message = "";
+                    message += "CNAS璁惧鏍告煡璁″垝寰呮壒鍑�";
+                    message += "\n璇峰幓璧勬簮瑕佹眰-璁惧-璁惧鏍告煡璁″垝瀹℃壒";
+                    message += "\n" + "璁惧缂栧彿涓�: " + deviceExamineRecordDto.getDeviceNumber() + "璁惧鏍告煡璁″垝寰呭鎵�";
+                    //鍙戦�佷紒涓氬井淇℃秷鎭�氱煡
+                    try {
+                        WxCpUtils.inform(people.getAccount(), message, null);
+                    } catch (Exception e) {
+                        throw new RuntimeException(e);
+                    }
+                });
+            }
+
+        }
+        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();
+            inputStream.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException("瀵煎嚭澶辫触");
+        }
+    }
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceExternalApplyServiceImpl.java b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceExternalApplyServiceImpl.java
new file mode 100644
index 0000000..6129e7c
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceExternalApplyServiceImpl.java
@@ -0,0 +1,162 @@
+package com.ruoyi.device.service.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.deepoove.poi.XWPFTemplate;
+import com.deepoove.poi.config.Configure;
+import com.ruoyi.common.core.domain.entity.User;
+import com.ruoyi.common.utils.QueryWrappers;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.device.mapper.DeviceExternalApplyMapper;
+import com.ruoyi.device.pojo.DeviceExternalApply;
+import com.ruoyi.device.service.DeviceExternalApplyService;
+import com.ruoyi.inspect.util.UserUtils;
+import com.ruoyi.system.mapper.UserMapper;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+
+import jakarta.annotation.Resource;
+import jakarta.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;
+
+    /**
+     * 鍒╃敤澶栭儴璁惧鐢宠鍒楄〃
+     * @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(SecurityUtils.getUserId().intValue());
+        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();
+            inputStream.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException("瀵煎嚭澶辫触");
+        }
+    }
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceImpowerDetailsServiceImpl.java b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceImpowerDetailsServiceImpl.java
new file mode 100644
index 0000000..6ce1670
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceImpowerDetailsServiceImpl.java
@@ -0,0 +1,20 @@
+package com.ruoyi.device.service.impl;
+
+import com.ruoyi.device.pojo.DeviceImpowerDetails;
+import com.ruoyi.device.mapper.DeviceImpowerDetailsMapper;
+import com.ruoyi.device.service.DeviceImpowerDetailsService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 璁惧閲忓�兼函婧愯鍒掕鎯呰〃 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 
+ * @since 2025-04-17 03:23:39
+ */
+@Service
+public class DeviceImpowerDetailsServiceImpl extends ServiceImpl<DeviceImpowerDetailsMapper, DeviceImpowerDetails> implements DeviceImpowerDetailsService {
+
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceImpowerServiceImpl.java b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceImpowerServiceImpl.java
new file mode 100644
index 0000000..ae3b60d
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceImpowerServiceImpl.java
@@ -0,0 +1,299 @@
+package com.ruoyi.device.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.deepoove.poi.XWPFTemplate;
+import com.deepoove.poi.config.Configure;
+import com.ruoyi.common.constant.MenuJumpPathConstants;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.common.core.domain.entity.InformationNotification;
+import com.ruoyi.common.core.domain.entity.User;
+import com.ruoyi.common.utils.QueryWrappers;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.common.utils.WxCpUtils;
+import com.ruoyi.device.dto.DeviceImpowerDetailsDto;
+import com.ruoyi.device.dto.DeviceImpowerDto;
+import com.ruoyi.device.mapper.DeviceImpowerDetailsMapper;
+import com.ruoyi.device.pojo.DeviceImpower;
+import com.ruoyi.device.mapper.DeviceImpowerMapper;
+import com.ruoyi.device.pojo.DeviceImpower;
+import com.ruoyi.device.pojo.DeviceImpowerDetails;
+import com.ruoyi.device.service.DeviceImpowerService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.device.service.DeviceImpowerDetailsService;
+import com.ruoyi.inspect.util.HackLoopTableRenderPolicy;
+import com.ruoyi.inspect.util.UserUtils;
+import com.ruoyi.system.mapper.UserMapper;
+import com.ruoyi.system.service.InformationNotificationService;
+import org.apache.commons.collections4.CollectionUtils;
+import org.springframework.beans.BeanUtils;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletResponse;
+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;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ * 璁惧浣跨敤琛� 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author
+ * @since 2025-04-17 03:23:23
+ */
+@Service
+@Transactional(rollbackFor = Exception.class)
+public class DeviceImpowerServiceImpl extends ServiceImpl<DeviceImpowerMapper, DeviceImpower> implements DeviceImpowerService {
+
+
+    @Resource
+    private DeviceImpowerDetailsService deviceImpowerDetailsService;
+
+    @Resource
+    private DeviceImpowerDetailsMapper deviceImpowerDetailsMapper;
+    @Resource
+    private ThreadPoolTaskExecutor threadPoolTaskExecutor;
+    @Resource
+    private InformationNotificationService informationNotificationService;
+
+    @Resource
+    private UserMapper userMapper;
+
+    /**
+     * 鍒嗛〉鏌ヨ璁惧浣跨敤
+     *
+     * @param page
+     * @return
+     */
+    @Override
+    public Result<IPage<DeviceImpower>> selectDeviceImpowerByPage(Page page, DeviceImpowerDto deviceImpowerDto) {
+        IPage<DeviceImpower> iPage = baseMapper.selectDeviceParameterPage(page, QueryWrappers.queryWrappers(deviceImpowerDto));
+        return Result.success(iPage);
+    }
+
+
+    /**
+     * 鏂板璁惧浣跨敤
+     *
+     * @param deviceImpowerDto 璁惧浣跨敤
+     */
+    @Override
+    public Result addImpower(DeviceImpowerDto deviceImpowerDto) {
+        Integer userId = SecurityUtils.getUserId().intValue();
+        User user = userMapper.selectById(userId);
+        deviceImpowerDto.setCompilerId(userId);
+        deviceImpowerDto.setCompiler(user.getName());
+        deviceImpowerDto.setDatePreparation(LocalDateTime.now());
+
+        // 鏌ヨ瀹℃牳浜篿d
+        if (deviceImpowerDto.getAuditId() != null) {
+            User auditUser = userMapper.selectById(deviceImpowerDto.getAuditId());
+            deviceImpowerDto.setAudit(auditUser.getName());
+        }
+        this.saveOrUpdate(deviceImpowerDto);
+
+        // 璇︽儏璧嬪�煎苟淇濆瓨
+        List<DeviceImpowerDetailsDto> deviceImpowerDetails = deviceImpowerDto.getDeviceImpowerDetails();
+        if (CollectionUtils.isNotEmpty(deviceImpowerDetails)) { // 璇︽儏涓嶄负绌�
+            List<DeviceImpowerDetails> collect = deviceImpowerDetails.stream().map(detailsDto -> {
+                detailsDto.setImpowerId(deviceImpowerDto.getImpowerId()); // 浣跨敤ID
+                DeviceImpowerDetails details = new DeviceImpowerDetails();
+                BeanUtils.copyProperties(detailsDto, details);
+                return details;
+            }).collect(Collectors.toList());
+            deviceImpowerDetailsService.saveBatch(collect);
+        }
+
+        return Result.success();
+    }
+
+    /**
+     * 淇敼璁惧浣跨敤
+     *
+     * @param deviceImpowerDto 璁惧浣跨敤
+     */
+    @Override
+    public Result updateImpower(DeviceImpowerDto deviceImpowerDto) {
+        // 鏌ヨ瀹℃牳浜篿d
+        if (deviceImpowerDto.getAuditId() != null) {
+            User auditUser = userMapper.selectById(deviceImpowerDto.getAuditId());
+            deviceImpowerDto.setAudit(auditUser.getName());
+        }
+        this.saveOrUpdate(deviceImpowerDto);
+
+        // 鍒犻櫎鍘熸湰鐨勮鎯�
+        deviceImpowerDetailsService.remove(Wrappers.<DeviceImpowerDetails>lambdaQuery().eq(DeviceImpowerDetails::getImpowerId, deviceImpowerDto.getImpowerId()));
+        // 璇︽儏璧嬪�煎苟淇濆瓨
+        List<DeviceImpowerDetailsDto> deviceImpowerDetails = deviceImpowerDto.getDeviceImpowerDetails();
+        if (CollectionUtils.isNotEmpty(deviceImpowerDetails)) { // 璇︽儏涓嶄负绌�
+            List<DeviceImpowerDetails> collect = deviceImpowerDetails.stream().map(detailsDto -> {
+                detailsDto.setImpowerId(deviceImpowerDto.getImpowerId()); // 浣跨敤ID
+                DeviceImpowerDetails details = new DeviceImpowerDetails();
+                BeanUtils.copyProperties(detailsDto, details);
+                return details;
+            }).collect(Collectors.toList());
+            deviceImpowerDetailsService.saveBatch(collect);
+        }
+        return Result.success();
+    }
+
+    /**
+     * 鍒犻櫎璁惧浣跨敤
+     *
+     * @param deviceImpowerDto 璁惧浣跨敤
+     */
+    @Override
+    public Result deleteImpower(DeviceImpowerDto deviceImpowerDto) {
+        this.removeById(deviceImpowerDto);
+        deviceImpowerDetailsService.remove(Wrappers.<DeviceImpowerDetails>lambdaQuery().eq(DeviceImpowerDetails::getImpowerId, deviceImpowerDto.getImpowerId()));
+        return Result.success();
+    }
+
+    /**
+     * 鏌ヨ璁惧浣跨敤璇︽儏
+     *
+     * @param impowerId 璁惧浣跨敤id
+     */
+    @Override
+    public Result<DeviceImpowerDto> getImpowerDetail(Integer impowerId) {
+        // 鏌ヨ璁惧浣跨敤
+        DeviceImpower deviceImpower = baseMapper.selectById(impowerId);
+        // 鏌ヨ璇︽儏
+        DeviceImpowerDto deviceImpowerDto = new DeviceImpowerDto();
+        BeanUtils.copyProperties(deviceImpower, deviceImpowerDto);
+        deviceImpowerDto.setDeviceImpowerDetails(deviceImpowerDetailsMapper.deviceImpowerDetailsList(impowerId));
+        return Result.success(deviceImpowerDto);
+    }
+
+    /**
+     * 鎻愪氦鎵瑰噯
+     * @param deviceImpowerDto
+     * @return
+     */
+    @Override
+    public Result submitReviewImpowerStatus(DeviceImpowerDto deviceImpowerDto) {
+        User audit = userMapper.selectById(deviceImpowerDto.getAuditId());
+        this.update(Wrappers.<DeviceImpower>lambdaUpdate()
+                .eq(DeviceImpower::getImpowerId, deviceImpowerDto.getImpowerId())
+                .set(DeviceImpower::getAuditId, audit.getId())
+                .set(DeviceImpower::getAudit, audit.getName())
+                .set(DeviceImpower::getAuditDate, null)
+                .set(DeviceImpower::getStatus, null)
+                .set(DeviceImpower::getAuditRemark, null));
+
+        DeviceImpower deviceImpower = baseMapper.selectById(deviceImpowerDto.getImpowerId());
+
+//        // 鍙戦�佹秷鎭�
+//        Integer userId = SecurityUtils.getUserId().intValue();
+//        User user = userMapper.selectById(userId);
+//        // 娑堟伅鍙戦��
+//        InformationNotification info = new InformationNotification();
+//        // 鍙戦�佷汉
+//        info.setCreateUser(user.getName());
+//        info.setMessageType("6");
+//        info.setTheme("CNAS璁惧浣跨敤鎵瑰噯閫氱煡");
+//        info.setContent(deviceImpower.getPlanYear() + "骞寸殑璁惧浣跨敤寰呮壒鍑�");
+//        info.setSenderId(userId);
+//        // 鎺ユ敹浜�
+//        info.setConsigneeId(audit.getId());
+//        info.setJumpPath(MenuJumpPathConstants.DEVICE);
+//        informationNotificationService.addInformationNotification(info);
+//
+//        // 鍙戦�佷紒涓氬井淇¢�氱煡
+//        threadPoolTaskExecutor.execute(() -> {
+//            String message = "";
+//            message += "CNAS璁惧浣跨敤鏍搁�氱煡";
+//            message += "\n璇峰幓璧勬簮绠$悊-璁惧涓�灞傜洰褰�-璁惧浣跨敤濉啓";
+//            message += "\n" + deviceImpower.getPlanYear() + "骞寸殑璁惧浣跨敤寰呮壒鍑�";
+//            //鍙戦�佷紒涓氬井淇℃秷鎭�氱煡
+//            try {
+//                WxCpUtils.inform(audit.getAccount(), message, null);
+//            } catch (Exception e) {
+//                throw new RuntimeException(e);
+//            }
+//        });
+        return Result.success();
+    }
+
+    /**
+     *
+     *
+     * @param deviceImpowerDto
+     */
+    @Override
+    public Result reviewImpowerStatus(DeviceImpowerDto deviceImpowerDto) {
+        LambdaUpdateWrapper<DeviceImpower> wrapper = Wrappers.<DeviceImpower>lambdaUpdate()
+                .eq(DeviceImpower::getImpowerId, deviceImpowerDto.getImpowerId())
+                .set(DeviceImpower::getAuditDate, LocalDateTime.now())
+                .set(DeviceImpower::getStatus, deviceImpowerDto.getStatus())        // 瀹℃牳鐘舵��
+                .set(DeviceImpower::getAuditRemark, deviceImpowerDto.getAuditRemark());// 瀹℃牳澶囨敞
+
+        this.update(wrapper); // 鏇存柊
+        return Result.success();
+    }
+
+    /**
+     * 瀵煎嚭璁惧浣跨敤
+     *
+     * @param impowerId 璁惧浣跨敤id
+     */
+    @Override
+    public void exportDeviceImpowerDto(Integer impowerId, HttpServletResponse response) {
+        // 鏌ヨ璁惧浣跨敤鎺堟潈璁″垝
+        DeviceImpower deviceImpower = baseMapper.selectById(impowerId);
+        DeviceImpowerDto deviceImpowerDto = new DeviceImpowerDto();
+        BeanUtils.copyProperties(deviceImpower, deviceImpowerDto);
+        // 鏍煎紡鍖栨棩鏈熶腑鑻辨枃
+        DateTimeFormatter formatterCH = DateTimeFormatter.ofPattern("yyyy 骞� MM 鏈� dd 鏃�");
+        DateTimeFormatter formatterEN = DateTimeFormatter.ofPattern("yyyy 'Year' MM 'Month' dd 'Day'");
+        deviceImpowerDto.setAuditDateCH(deviceImpower.getAuditDate() == null ? null : deviceImpower.getAuditDate().format(formatterCH));
+        deviceImpowerDto.setAuditDateEN(deviceImpower.getAuditDate() == null ? null : deviceImpower.getAuditDate().format(formatterEN));
+
+        // 鏌ヨ璁惧淇濆吇璁″垝璇︽儏
+        List<DeviceImpowerDetailsDto> deviceImpowerDetailsDtoList = deviceImpowerDetailsMapper.deviceImpowerDetailsList(impowerId);
+        // 璁剧疆搴忓彿
+        deviceImpowerDetailsDtoList.forEach(deviceImpowerDetails -> {
+            deviceImpowerDetails.setIndex(deviceImpowerDetailsDtoList.indexOf(deviceImpowerDetails) + 1);
+        });
+
+        // 鑾峰彇璺緞
+        InputStream inputStream = this.getClass().getResourceAsStream("/static/word/device-impower.docx");
+        Configure configure = Configure.builder()
+                .bind("deviceImpowerDetailsDtoList", new HackLoopTableRenderPolicy())
+                .build();
+        XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
+                new HashMap<String, Object>() {{
+                    put("deviceImpower", deviceImpowerDto);
+                    put("deviceImpowerDetailsDtoList", deviceImpowerDetailsDtoList);
+                    // 鎺堟潈浜哄湴鍧�
+                    put("auditUrl", UserUtils.getFinalUserSignatureUrl(deviceImpower.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();
+            inputStream.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException("瀵煎嚭澶辫触");
+        }
+    }
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceInspectionRecordDetailsServiceImpl.java b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceInspectionRecordDetailsServiceImpl.java
new file mode 100644
index 0000000..9058081
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceInspectionRecordDetailsServiceImpl.java
@@ -0,0 +1,20 @@
+package com.ruoyi.device.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.device.mapper.DeviceInspectionRecordDetailsMapper;
+import com.ruoyi.device.pojo.DeviceInspectionRecordDetails;
+import com.ruoyi.device.service.DeviceInspectionRecordDetailsService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-16 04:27:32
+ */
+@Service
+public class DeviceInspectionRecordDetailsServiceImpl extends ServiceImpl<DeviceInspectionRecordDetailsMapper, DeviceInspectionRecordDetails> implements DeviceInspectionRecordDetailsService {
+
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceInspectionRecordServiceImpl.java b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceInspectionRecordServiceImpl.java
new file mode 100644
index 0000000..ea2697b
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceInspectionRecordServiceImpl.java
@@ -0,0 +1,225 @@
+package com.ruoyi.device.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.deepoove.poi.XWPFTemplate;
+import com.deepoove.poi.config.Configure;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.common.core.domain.entity.User;
+import com.ruoyi.common.utils.QueryWrappers;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.device.dto.DeviceInspectionRecordDto;
+import com.ruoyi.device.mapper.DeviceInspectionRecordMapper;
+import com.ruoyi.device.mapper.DeviceMapper;
+import com.ruoyi.device.pojo.Device;
+import com.ruoyi.device.pojo.DeviceInspectionRecord;
+import com.ruoyi.device.pojo.DeviceInspectionRecordDetails;
+import com.ruoyi.device.service.DeviceInspectionRecordDetailsService;
+import com.ruoyi.device.service.DeviceInspectionRecordService;
+import com.ruoyi.inspect.util.HackLoopTableRenderPolicy;
+import com.ruoyi.inspect.util.UserUtils;
+import com.ruoyi.system.mapper.UserMapper;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletResponse;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URLEncoder;
+import java.time.format.DateTimeFormatter;
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * <p>
+ * 璁惧鐐规璁板綍琛� 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-16 04:25:14
+ */
+@Service
+@Transactional(rollbackFor = Exception.class)
+public class DeviceInspectionRecordServiceImpl extends ServiceImpl<DeviceInspectionRecordMapper, DeviceInspectionRecord> implements DeviceInspectionRecordService {
+    @Resource
+    private UserMapper userMapper;
+    @Resource
+    private DeviceMapper deviceMapper;
+    @Resource
+    private DeviceInspectionRecordDetailsService deviceInspectionRecordDetailsService;
+    @Resource
+    private DeviceInspectionRecordMapper deviceInspectionRecordMapper;
+
+    /**
+     * 鍒嗛〉鏌ヨ璁惧鐐规璁板綍
+     *
+     * @param page 褰撳墠椤电爜
+     */
+    @Override
+    public Result<IPage<DeviceInspectionRecord>> getDeviceInspectionRecordByPage(Page page, DeviceInspectionRecordDto deviceInspectionRecordDto) {
+        IPage<DeviceInspectionRecord> iPage = deviceInspectionRecordMapper.selectDeviceParameterPage(page, QueryWrappers.queryWrappers(deviceInspectionRecordDto));
+        return Result.success(iPage);
+    }
+
+
+    /**
+     * 鏌ヨ鐐规璇︽儏
+     * @param inspectionRecordId
+     * @return
+     */
+    @Override
+    public Result getDeviceInspectionRecord(Integer inspectionRecordId) {
+        DeviceInspectionRecord deviceInspectionRecord = baseMapper.selectById(inspectionRecordId);
+        DeviceInspectionRecordDto dto = new DeviceInspectionRecordDto();
+        BeanUtils.copyProperties(deviceInspectionRecord, dto);
+        List<DeviceInspectionRecordDetails> list = deviceInspectionRecordDetailsService.list(Wrappers.<DeviceInspectionRecordDetails>lambdaQuery().eq(DeviceInspectionRecordDetails::getInspectionRecordId, inspectionRecordId));
+        dto.setDetails(list);
+        return Result.success(dto);
+    }
+
+    /**
+     * 鏂板璁惧鐐规璁板綍
+     *
+     * @param deviceInspectionRecord 璁惧鐐规璁板綍
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Result addDeviceInspectionRecord(DeviceInspectionRecordDto deviceInspectionRecord) {
+
+        Integer userId = SecurityUtils.getUserId().intValue();
+        User user = userMapper.selectById(userId);
+        deviceInspectionRecord.setRecorderId(userId);
+        deviceInspectionRecord.setRecorder(user.getName());
+
+        // 鏌ヨ澶嶆牳浜篿d
+        if (deviceInspectionRecord.getReviewerId() != null) {
+            User reviewUser = userMapper.selectById(deviceInspectionRecord.getReviewerId());
+            deviceInspectionRecord.setReviewer(reviewUser.getName());
+        }
+        this.saveOrUpdate(deviceInspectionRecord);
+        if (CollectionUtils.isNotEmpty(deviceInspectionRecord.getDetails())) {
+            for (DeviceInspectionRecordDetails detail : deviceInspectionRecord.getDetails()) {
+                detail.setInspectionRecordId(deviceInspectionRecord.getInspectionRecordId());
+            }
+            deviceInspectionRecordDetailsService.saveBatch( deviceInspectionRecord.getDetails());
+        }
+
+        return Result.success();
+    }
+
+
+    /**
+     * 淇敼璁惧鐐规璁板綍
+     *
+     * @param deviceInspectionRecord 璁惧鐐规璁板綍
+     */
+    @Override
+    public Result updateInspectionRecordAndDetails(DeviceInspectionRecordDto deviceInspectionRecord) {
+        // 鏌ヨ澶嶆牳浜篿d
+        if (deviceInspectionRecord.getReviewerId() != null) {
+            User reviewUser = userMapper.selectById(deviceInspectionRecord.getReviewerId());
+            deviceInspectionRecord.setReviewer(reviewUser.getName());
+        }
+        this.saveOrUpdate(deviceInspectionRecord);
+        deviceInspectionRecordDetailsService.remove(Wrappers.<DeviceInspectionRecordDetails>lambdaQuery().eq(DeviceInspectionRecordDetails::getInspectionRecordId, deviceInspectionRecord.getInspectionRecordId()));
+        if (CollectionUtils.isNotEmpty(deviceInspectionRecord.getDetails())) {
+            for (DeviceInspectionRecordDetails detail : deviceInspectionRecord.getDetails()) {
+                detail.setInspectionRecordId(deviceInspectionRecord.getInspectionRecordId());
+            }
+            deviceInspectionRecordDetailsService.saveBatch( deviceInspectionRecord.getDetails());
+        }
+        return Result.success();
+    }
+
+    /**
+     * 鍒犻櫎璁惧鐐规璁板綍
+     *
+     * @param deviceInspectionRecord 璁惧鐐规璁板綍
+     */
+    @Override
+    public Result deleteDeviceInspectionRecordOrDetails(DeviceInspectionRecordDto deviceInspectionRecord) {
+        this.removeById(deviceInspectionRecord);
+        deviceInspectionRecordDetailsService.remove(Wrappers.<DeviceInspectionRecordDetails>lambdaQuery().eq(DeviceInspectionRecordDetails::getInspectionRecordId, deviceInspectionRecord.getInspectionRecordId()));
+        return Result.success();
+    }
+
+    /**
+     * 澶嶆牳鐐规璁板綍
+     * @param dto
+     * @return
+     */
+    @Override
+    public Result reviewDeviceInspectionRecord(DeviceInspectionRecordDto dto) {
+        LambdaUpdateWrapper<DeviceInspectionRecord> wrapper = Wrappers.<DeviceInspectionRecord>lambdaUpdate()
+                .eq(DeviceInspectionRecord::getInspectionRecordId, dto.getInspectionRecordId())
+                .set(DeviceInspectionRecord::getStatus, dto.getStatus())
+                .set(DeviceInspectionRecord::getReviewerRemark, dto.getReviewerRemark());
+
+        // 涓�0娓呴櫎瀹℃牳浜�
+        if (dto.getStatus().equals(0)) {
+            wrapper.set(DeviceInspectionRecord::getReviewerId, null)
+                    .set(DeviceInspectionRecord::getReviewer, null);
+        }
+        this.update(wrapper);
+
+        return Result.success();
+    }
+
+    /**
+     * 瀵煎嚭璁惧鐐规璁板綍
+     *
+     * @param deviceInspectionRecordId 璁惧鐐规璁板綍id
+     * @param response                 鍝嶅簲
+     */
+    @Override
+    public Result exportDeviceInspectionRecord(Integer deviceInspectionRecordId, HttpServletResponse response) {
+        DeviceInspectionRecord deviceInspectionRecord = baseMapper.selectById(deviceInspectionRecordId);
+        DeviceInspectionRecordDto deviceInspectionRecordDto = new DeviceInspectionRecordDto();
+        BeanUtils.copyProperties(deviceInspectionRecord, deviceInspectionRecordDto);
+        DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+        deviceInspectionRecordDto.setTestDateString(deviceInspectionRecord.getTestDate() == null ? null : deviceInspectionRecord.getTestDate().format(dateFormatter));
+
+        List<DeviceInspectionRecordDetails> deviceInspectionRecordDetailsList = deviceInspectionRecordDetailsService.list(Wrappers.<DeviceInspectionRecordDetails>lambdaQuery().eq(DeviceInspectionRecordDetails::getInspectionRecordId, deviceInspectionRecordId));
+
+        Integer deviceId = deviceInspectionRecord.getDeviceId();
+
+        Device device = deviceMapper.selectById(deviceId);
+
+        // 鑾峰彇璺緞
+        InputStream inputStream = this.getClass().getResourceAsStream("/static/word/device-inspection-record.docx");
+        Configure configure = Configure.builder()
+                .bind("deviceInspectionRecordDetailsList", new HackLoopTableRenderPolicy())
+                .build();
+        XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
+                new HashMap<String, Object>() {{
+                    put("deviceInspectionRecord", deviceInspectionRecordDto);
+                    put("deviceInspectionRecordDetailsList", deviceInspectionRecordDetailsList);
+                    put("device", device);
+                    put("recorderUrl", UserUtils.getFinalUserSignatureUrl(deviceInspectionRecordDto.getRecorderId()));
+                    put("reviewerUrl", UserUtils.getFinalUserSignatureUrl(deviceInspectionRecordDto.getReviewerId()));
+                }});
+
+        try {
+            response.setContentType("application/msword");
+            String fileName = URLEncoder.encode(
+                    device.getDeviceName() + "鐐规璁板綍", "UTF-8");
+            response.setHeader("Content-disposition",
+                    "attachment;filename=" + fileName + ".docx");
+            OutputStream os = response.getOutputStream();
+            template.write(os);
+            os.flush();
+            os.close();
+            inputStream.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException("瀵煎嚭澶辫触");
+        }
+        return Result.success();
+    }
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceInstructionServiceImpl.java b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceInstructionServiceImpl.java
new file mode 100644
index 0000000..559be66
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceInstructionServiceImpl.java
@@ -0,0 +1,68 @@
+package com.ruoyi.device.service.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.common.numgen.NumberGenerator;
+import com.ruoyi.common.utils.QueryWrappers;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.device.dto.DeviceInstructionDto;
+import com.ruoyi.device.dto.DeviceOperationInstructionDto;
+import com.ruoyi.device.mapper.InstructionMapper;
+import com.ruoyi.device.pojo.DeviceInstruction;
+import com.ruoyi.device.service.DeviceInstructionService;
+import com.ruoyi.device.service.DeviceOperationInstructionService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.text.SimpleDateFormat;
+import java.time.LocalDateTime;
+import java.util.Date;
+import java.util.Locale;
+import java.util.Map;
+
+/**
+ * <p>
+ * 浣滀笟鎸囧涔︽坊鍔犲彈鎺ф枃浠惰〃 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author
+ * @since 2024-12-04 10:29:18
+ */
+@Service
+@Transactional(rollbackFor = Exception.class)
+public class DeviceInstructionServiceImpl extends ServiceImpl<InstructionMapper, DeviceInstruction> implements DeviceInstructionService {
+
+    @Autowired
+    private DeviceOperationInstructionService operationInstructionService;
+
+    @Autowired
+    private NumberGenerator<DeviceInstruction> numberGenerator;
+
+    @Override
+    public IPage<DeviceOperationInstructionDto> pageByPageQueryOfHomeworkInstructions(Page page, DeviceOperationInstructionDto operationInstructionDto) {
+        return baseMapper.pageByPageQueryOfHomeworkInstructions(page, QueryWrappers.queryWrappers(operationInstructionDto));
+    }
+
+    @Override
+    public void newHomeworkGuidebookAdded(DeviceInstructionDto instructionDto) {
+        if (ObjectUtils.isEmpty(instructionDto.getApplicationNumber())) {
+            String year = new SimpleDateFormat("yy", Locale.CHINESE).format(new Date());
+            String month = new SimpleDateFormat("MM", Locale.CHINESE).format(new Date());
+            String day = new SimpleDateFormat("dd", Locale.CHINESE).format(new Date());
+            String processNumber = numberGenerator.generateNumberWithPrefix(3, "WJSK" + year + month + day, DeviceInstruction::getApplicationNumber);
+            instructionDto.setApplicationNumber(processNumber);
+        }
+        saveOrUpdate(instructionDto);
+        if (ObjectUtils.isNotEmpty(instructionDto.getFeTempHumRecordList())) {
+            instructionDto.getFeTempHumRecordList().forEach(i -> {
+                i.setInstructionId(instructionDto.getId());
+                i.setUploader(SecurityUtils.getUserId().intValue());
+                i.setUpdateTime(LocalDateTime.now());
+            });
+            operationInstructionService.saveOrUpdateBatch(instructionDto.getFeTempHumRecordList());
+        }
+    }
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceMaintenanceImpl.java b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceMaintenanceImpl.java
new file mode 100644
index 0000000..82fb4c0
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceMaintenanceImpl.java
@@ -0,0 +1,197 @@
+package com.ruoyi.device.service.impl;
+
+import cn.hutool.core.util.StrUtil;
+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.deepoove.poi.data.Pictures;
+import com.ruoyi.common.core.domain.entity.SysDictData;
+import com.ruoyi.common.utils.QueryWrappers;
+import com.ruoyi.device.dto.DeviceImpowerDetailsDto;
+import com.ruoyi.device.dto.DeviceImpowerDto;
+import com.ruoyi.device.dto.DeviceMaintenanceDto;
+import com.ruoyi.device.mapper.DeviceMaintenanceMapper;
+import com.ruoyi.device.mapper.DeviceMapper;
+import com.ruoyi.device.pojo.Device;
+import com.ruoyi.device.pojo.DeviceImpower;
+import com.ruoyi.device.pojo.DeviceMaintenance;
+import com.ruoyi.device.service.DeviceMaintenanceService;
+import com.ruoyi.device.service.DeviceService;
+import com.ruoyi.inspect.util.HackLoopTableRenderPolicy;
+import com.ruoyi.inspect.util.UserUtils;
+import com.ruoyi.system.service.ISysDictDataService;
+import com.ruoyi.system.service.ISysDictTypeService;
+import lombok.AllArgsConstructor;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+import jakarta.annotation.Resource;
+import jakarta.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;
+
+/**
+ * 璁惧缁存姢淇濆吇
+ */
+@Service
+public class DeviceMaintenanceImpl extends ServiceImpl<DeviceMaintenanceMapper, DeviceMaintenance> implements DeviceMaintenanceService {
+    @Resource
+    private DeviceService deviceService;
+    @Resource
+    private ISysDictTypeService iSysDictTypeService;
+
+    @Value("${file.path}")
+    private String imgUrl;
+
+    /**
+     * 璁惧缁存姢鍒嗛〉鏌ヨ
+     * @return
+     */
+    @Override
+    public IPage<DeviceMaintenanceDto> selectDeviceMaintenancePage(Page page, DeviceMaintenanceDto deviceMaintenance) {
+        if (deviceMaintenance.getDeviceId() == null) {
+            return new Page();
+        }
+        return baseMapper.selectDeviceMaintenancePage(page, QueryWrappers.queryWrappers(deviceMaintenance));
+    }
+
+    /**
+     * 瀵煎嚭璁惧缁存姢淇濆吇
+     * @param deviceId
+     * @param response
+     */
+    @Override
+    public void exportDeviceMaintenance(Integer deviceId, HttpServletResponse response) {
+        // 鏌ヨ璁惧缁存姢淇濆吇
+        List<DeviceMaintenance> deviceMaintenanceList = baseMapper.selectList(Wrappers.<DeviceMaintenance>lambdaQuery()
+                .eq(DeviceMaintenance::getDeviceId, deviceId));
+
+        // 鑾峰彇鍒扮涓�涓澶囦娇鐢ㄦ巿鏉�
+        DeviceMaintenanceDto deviceMaintenanceDto = new DeviceMaintenanceDto();
+
+        List<SysDictData> sysDictDataList = null;
+        if (CollectionUtils.isNotEmpty(deviceMaintenanceList)) {
+            BeanUtils.copyProperties(deviceMaintenanceList.get(0), deviceMaintenanceDto);
+            // 鏌ヨ璁惧淇℃伅
+            Device device = deviceService.getById(deviceId);
+            deviceMaintenanceDto.setDeviceName(device.getDeviceName());
+            deviceMaintenanceDto.setManagementNumber(device.getManagementNumber());
+
+            //鏌ヨ缁存姢淇濆吇瀵煎嚭瀛楀吀鍊�
+            sysDictDataList = getDeviceMaintenanceDict(device);
+        }
+
+        // 娣诲姞瀛楀吀鏋氫妇鍊�
+        for (DeviceMaintenance deviceMaintenance : deviceMaintenanceList) {
+            StringBuilder maintenanceContent = new StringBuilder(deviceMaintenance.getMaintenanceContent());
+            if (CollectionUtils.isNotEmpty(sysDictDataList) && StringUtils.isNotBlank(deviceMaintenance.getMaintenanceContent())) {
+                maintenanceContent = new StringBuilder();
+                List<String> splitList = StrUtil.split(deviceMaintenance.getMaintenanceContent(), ',');
+                // 寰幆鍒ゆ柇鏄惁鏈変竴鏍穔ey
+                for (SysDictData sysDictData : sysDictDataList) {
+                    if (splitList.contains(sysDictData.getDictLabel())) {
+                        maintenanceContent.append("鈽�").append(sysDictData.getDictLabel()).append(" ");
+                    } else {
+                        maintenanceContent.append("鈻�").append(sysDictData.getDictLabel()).append(" ");
+                    }
+                }
+            }
+            deviceMaintenance.setMaintenanceContent(maintenanceContent.toString());
+            // 娣诲姞缁存姢浜哄浘鐗�
+            deviceMaintenance.setMaintenanceUserUrlRender(UserUtils.getFinalUserSignatureUrl(deviceMaintenance.getMaintenanceUserId()));
+
+        }
+
+
+        // 鑾峰彇璺緞
+        InputStream inputStream = this.getClass().getResourceAsStream("/static/word/device-maintenance.docx");
+        Configure configure = Configure.builder()
+                .bind("deviceMaintenances", new HackLoopTableRenderPolicy())
+                .build();
+        XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
+                new HashMap<String, Object>() {{
+                    put("device", deviceMaintenanceDto);
+                    put("deviceMaintenances", deviceMaintenanceList);
+                }});
+
+        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();
+            inputStream.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException("瀵煎嚭澶辫触");
+        }
+
+    }
+
+    /**
+     * ****鏌ヨ缁存姢淇濆吇瀵煎嚭瀛楀吀鍊�***
+     * @param device
+     */
+    private List<SysDictData> getDeviceMaintenanceDict(Device device) {
+        List<SysDictData> sysDictDataList = new ArrayList<>();
+        // 鏌ヨ缁存姢淇濆吇瀵煎嚭瀛楀吀鍊�
+        if (StringUtils.isNotBlank(device.getStoragePoint())) {
+            String dictType = null;
+            switch (device.getStoragePoint()) {
+                case "鑰佸寲瀹�":
+                    dictType = "aging_maintenance_content";
+                    break;
+                case "鑰佸寲瀹為獙瀹�":
+                    dictType = "aging_maintenance_content";
+                    break;
+                case "鐢垫�ц兘瀹為獙瀹�":
+                    dictType = "electrical_maintenance_content";
+                    break;
+                case "鐜瀹為獙瀹�":
+                    dictType = "environmental_maintenance_content";
+                    break;
+                case "鐕冪儳瀹為獙瀹�":
+                    dictType = "burn_maintenance_content";
+                    break;
+                case "娣风偧瀹為獙瀹�":
+                    dictType = "mixing_maintenance_content";
+                    break;
+                case "妫�娴嬩腑蹇冪數鎬ц兘瀹為獙瀹�":
+                    dictType = "center_electrical_maintenance_content";
+                    break;
+                case "鎭掓俯浜�":
+                    dictType = "temperature2_maintenance_content";
+                    break;
+                case "鎭掓俯涓�":
+                    dictType = "temperature1_maintenance_content";
+                    break;
+                case "鍖栧瀹為獙瀹�":
+                    dictType = "chemistry_maintenance_content";
+                    break;
+                case "鍒舵牱瀹�":
+                    dictType = "sample_maintenance_content";
+                    break;
+                case "浣庢俯瀹為獙瀹�":
+                    dictType = "hypothermia_maintenance_content";
+                    break;
+            }
+            sysDictDataList = iSysDictTypeService.selectDictDataByType(dictType);
+        }
+        return sysDictDataList;
+    }
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceMaintenancePlanDetailsServiceImpl.java b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceMaintenancePlanDetailsServiceImpl.java
new file mode 100644
index 0000000..ae87e6e
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceMaintenancePlanDetailsServiceImpl.java
@@ -0,0 +1,20 @@
+package com.ruoyi.device.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.device.mapper.DeviceMaintenancePlanDetailsMapper;
+import com.ruoyi.device.pojo.DeviceMaintenancePlanDetails;
+import com.ruoyi.device.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-device/src/main/java/com/ruoyi/device/service/impl/DeviceMaintenancePlanServiceImpl.java b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceMaintenancePlanServiceImpl.java
new file mode 100644
index 0000000..81c5582
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceMaintenancePlanServiceImpl.java
@@ -0,0 +1,292 @@
+package com.ruoyi.device.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.deepoove.poi.XWPFTemplate;
+import com.deepoove.poi.config.Configure;
+import com.ruoyi.common.constant.MenuJumpPathConstants;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.common.core.domain.entity.InformationNotification;
+import com.ruoyi.common.core.domain.entity.User;
+import com.ruoyi.common.utils.QueryWrappers;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.common.utils.WxCpUtils;
+import com.ruoyi.device.dto.DeviceMaintenancePlanDetailsDto;
+import com.ruoyi.device.dto.DeviceMaintenancePlanDto;
+import com.ruoyi.device.mapper.DeviceMaintenancePlanDetailsMapper;
+import com.ruoyi.device.mapper.DeviceMaintenancePlanMapper;
+import com.ruoyi.device.pojo.DeviceMaintenancePlan;
+import com.ruoyi.device.pojo.DeviceMaintenancePlanDetails;
+import com.ruoyi.device.service.DeviceMaintenancePlanDetailsService;
+import com.ruoyi.device.service.DeviceMaintenancePlanService;
+import com.ruoyi.inspect.util.HackLoopTableRenderPolicy;
+import com.ruoyi.inspect.util.UserUtils;
+import com.ruoyi.system.mapper.UserMapper;
+import com.ruoyi.system.service.InformationNotificationService;
+import org.apache.commons.collections4.CollectionUtils;
+import org.springframework.beans.BeanUtils;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+import org.springframework.stereotype.Service;
+
+import jakarta.annotation.Resource;
+import jakarta.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 ThreadPoolTaskExecutor threadPoolTaskExecutor;
+    @Resource
+    private InformationNotificationService informationNotificationService;
+    @Resource
+    private UserMapper userMapper;
+
+    /**
+     * 鍒嗛〉鏌ヨ璁惧淇濆吇璁″垝
+     *
+     * @param page
+     * @return
+     */
+    @Override
+    public Result<IPage<DeviceMaintenancePlan>> selectDeviceMaintenancePlanByPage(Page 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 = SecurityUtils.getUserId().intValue();
+        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(deviceMaintenancePlanDetail.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();
+            inputStream.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
+     * @return
+     */
+    @Override
+    public Result submitReviewMaintenancePlanStatus(DeviceMaintenancePlanDto deviceMaintenancePlanDto) {
+        User audit = userMapper.selectById(deviceMaintenancePlanDto.getAuditId());
+        this.update(Wrappers.<DeviceMaintenancePlan>lambdaUpdate()
+                .eq(DeviceMaintenancePlan::getMaintenancePlanId, deviceMaintenancePlanDto.getMaintenancePlanId())
+                .set(DeviceMaintenancePlan::getAuditId, audit.getId())
+                .set(DeviceMaintenancePlan::getAudit, audit.getName())
+                .set(DeviceMaintenancePlan::getStatus, null)
+                .set(DeviceMaintenancePlan::getAuditRemark, null)
+                .set(DeviceMaintenancePlan::getAuditDate, null)
+        );
+
+        DeviceMaintenancePlan deviceMaintenancePlan = baseMapper.selectById(deviceMaintenancePlanDto.getMaintenancePlanId());
+
+        // 鍙戦�佹秷鎭�
+        Integer userId = SecurityUtils.getUserId().intValue();
+        User user = userMapper.selectById(userId);
+        // 娑堟伅鍙戦��
+        InformationNotification info = new InformationNotification();
+        // 鍙戦�佷汉
+        info.setCreateUser(user.getName());
+        info.setMessageType("6");
+        info.setTheme("CNAS璁惧淇濆吇璁″垝瀹℃牳閫氱煡");
+        info.setContent(deviceMaintenancePlan.getPlanYear() + "骞寸殑璁惧淇濆吇璁″垝寰呭鏍�");
+        info.setSenderId(userId);
+        // 鎺ユ敹浜�
+        info.setConsigneeId(audit.getId());
+        info.setJumpPath(MenuJumpPathConstants.DEVICE);
+        informationNotificationService.addInformationNotification(info);
+
+        // 鍙戦�佷紒涓氬井淇¢�氱煡
+        threadPoolTaskExecutor.execute(() -> {
+            String message = "";
+            message += "CNAS璁惧淇濆吇璁″垝鏍搁�氱煡";
+            message += "\n璇峰幓璧勬簮绠$悊-璁惧涓�灞傜洰褰�-璁惧淇濆吇璁″垝濉啓";
+            message += "\n" + deviceMaintenancePlan.getPlanYear() + "骞寸殑璁惧淇濆吇璁″垝寰呮牳";
+            //鍙戦�佷紒涓氬井淇℃秷鎭�氱煡
+            try {
+                WxCpUtils.inform(audit.getAccount(), message, null);
+            } catch (Exception e) {
+                throw new RuntimeException(e);
+            }
+        });
+        return Result.success();
+    }
+
+    /**
+     * 瀹℃牳璁惧淇濆吇璁″垝
+     *
+     * @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())
+                .set(DeviceMaintenancePlan::getAuditDate, LocalDateTime.now());
+
+        this.update(wrapper); // 鏇存柊
+        return Result.success();
+    }
+
+
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceMetricRecordServiceImpl.java b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceMetricRecordServiceImpl.java
new file mode 100644
index 0000000..934f32f
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceMetricRecordServiceImpl.java
@@ -0,0 +1,20 @@
+package com.ruoyi.device.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.device.mapper.DeviceMetricRecordMapper;
+import com.ruoyi.device.pojo.DeviceMetricRecord;
+import com.ruoyi.device.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-device/src/main/java/com/ruoyi/device/service/impl/DeviceMetricServiceImpl.java b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceMetricServiceImpl.java
new file mode 100644
index 0000000..adfffd7
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceMetricServiceImpl.java
@@ -0,0 +1,11 @@
+package com.ruoyi.device.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.device.mapper.DeviceMetricMapper;
+import com.ruoyi.device.pojo.DeviceMetric;
+import com.ruoyi.device.service.IDeviceMetricService;
+import org.springframework.stereotype.Service;
+
+@Service
+public class DeviceMetricServiceImpl extends ServiceImpl<DeviceMetricMapper, DeviceMetric> implements IDeviceMetricService {
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceMetricsCopyServiceImpl.java b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceMetricsCopyServiceImpl.java
new file mode 100644
index 0000000..b40f600
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceMetricsCopyServiceImpl.java
@@ -0,0 +1,20 @@
+package com.ruoyi.device.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.device.mapper.DeviceMetricsCopyMapper;
+import com.ruoyi.device.pojo.DeviceMetricsCopy;
+import com.ruoyi.device.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-device/src/main/java/com/ruoyi/device/service/impl/DeviceOperationInstructionServiceImpl.java b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceOperationInstructionServiceImpl.java
new file mode 100644
index 0000000..5b0082f
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceOperationInstructionServiceImpl.java
@@ -0,0 +1,27 @@
+package com.ruoyi.device.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.device.dto.DeviceOperationInstructionDto;
+import com.ruoyi.device.mapper.OperationInstructionMapper;
+import com.ruoyi.device.pojo.OperationInstruction;
+import com.ruoyi.device.service.DeviceOperationInstructionService;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 璁惧 - 浣滀笟鎸囧涔� 娣诲姞鍙楁帶鏂囦欢 瀛� 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author
+ * @since 2024-12-04 10:43:32
+ */
+@Service
+public class DeviceOperationInstructionServiceImpl extends ServiceImpl<OperationInstructionMapper, OperationInstruction> implements DeviceOperationInstructionService {
+
+    @Override
+    public List<DeviceOperationInstructionDto> homeworkGuidebookEditor(Integer instructionId) {
+        return baseMapper.homeworkGuidebookEditor(instructionId);
+    }
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceRecordServiceImpl.java b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceRecordServiceImpl.java
new file mode 100644
index 0000000..75ac0af
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceRecordServiceImpl.java
@@ -0,0 +1,148 @@
+package com.ruoyi.device.service.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.deepoove.poi.XWPFTemplate;
+import com.deepoove.poi.config.Configure;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.device.dto.DeviceRecordDto;
+import com.ruoyi.device.excel.DeviceRecordExportWord;
+import com.ruoyi.device.mapper.DeviceMapper;
+import com.ruoyi.device.mapper.DeviceRecordMapper;
+import com.ruoyi.device.pojo.Device;
+import com.ruoyi.device.pojo.DeviceRecord;
+import com.ruoyi.device.service.DeviceRecordService;
+import com.ruoyi.inspect.util.HackLoopTableRenderPolicy;
+import com.ruoyi.system.domain.vo.SysRoleVo;
+import com.ruoyi.system.mapper.SysRoleMenuMapper;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+
+import jakarta.annotation.Resource;
+import jakarta.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 DeviceMapper deviceMapper;
+
+    @Resource
+    private SysRoleMenuMapper sysRoleMenuMapper;
+
+    @Override
+    public IPage<DeviceRecordDto> deviceRecordPage(Integer deviceId, Page page, String sampleCode, String managementNumber) {
+        // todo:浠呯湅鑷繁
+        Long userId = SecurityUtils.getUserId();
+        // 鑾峰彇鏉冮檺鍒ゆ柇鏄惁鏄粎鐪嬫垜
+        SysRoleVo sysRoleVo = sysRoleMenuMapper.selectRoleMenu("get:device:record", userId);
+
+        Integer testUserId = null;
+        //娌℃湁浠呯湅鎴戞潈闄愯烦杩�
+        if (sysRoleVo != null && sysRoleVo.getIsRersonal() != null && sysRoleVo.getIsRersonal().equals(1)) {
+            testUserId = SecurityUtils.getUserId().intValue();
+        }
+
+        return baseMapper.deviceRecordPage(deviceId, page, sampleCode, managementNumber, testUserId);
+    }
+
+
+    @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(" ");
+                if (startTimeSplit[0].equals(endTimeSplit[0])) {
+                    startTime = startTimeSplit[1];
+                    endTime = endTimeSplit[1];
+                } else {
+                    endTime = endTimeSplit[0] + '\n' + endTimeSplit[1];
+                    startTime = startTimeSplit[0] + '\n' + startTimeSplit[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();
+            inputStream.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException("瀵煎嚭澶辫触");
+        }
+    }
+
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceScrappedServiceImpl.java b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceScrappedServiceImpl.java
new file mode 100644
index 0000000..af0f4fe
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceScrappedServiceImpl.java
@@ -0,0 +1,180 @@
+package com.ruoyi.device.service.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.deepoove.poi.XWPFTemplate;
+import com.deepoove.poi.config.Configure;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.common.core.domain.entity.User;
+import com.ruoyi.common.utils.QueryWrappers;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.device.dto.DeviceScrappedDto;
+import com.ruoyi.device.mapper.DeviceMapper;
+import com.ruoyi.device.mapper.DeviceScrappedMapper;
+import com.ruoyi.device.pojo.Device;
+import com.ruoyi.device.pojo.DeviceScrapped;
+import com.ruoyi.device.service.DeviceScrappedService;
+import com.ruoyi.inspect.util.UserUtils;
+import com.ruoyi.system.mapper.UserMapper;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+
+import jakarta.annotation.Resource;
+import jakarta.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;
+
+
+    /**
+     * 璁惧鎶ュ簾鐢宠鍒楄〃
+     *
+     * @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(SecurityUtils.getUserId().intValue());
+        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();
+            inputStream.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException("瀵煎嚭澶辫触");
+        }
+        return Result.success();
+    }
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceServiceImpl.java b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceServiceImpl.java
new file mode 100644
index 0000000..14a060c
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceServiceImpl.java
@@ -0,0 +1,690 @@
+package com.ruoyi.device.service.impl;
+
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.json.JSONObject;
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.fastjson2.JSON;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.deepoove.poi.XWPFTemplate;
+import com.deepoove.poi.config.Configure;
+import com.ruoyi.basic.mapper.StructureItemParameterMapper;
+import com.ruoyi.basic.pojo.StructureItemParameter;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.common.core.domain.entity.SysDictData;
+import com.ruoyi.common.core.domain.entity.SysDept;
+import com.ruoyi.common.core.domain.entity.User;
+import com.ruoyi.common.utils.QueryWrappers;
+import com.ruoyi.device.dto.*;
+import com.ruoyi.device.excel.upload.DeviceImport;
+import com.ruoyi.device.mapper.CollectBridgeMapper;
+import com.ruoyi.device.mapper.DeviceMaintenanceMapper;
+import com.ruoyi.device.mapper.DeviceMapper;
+import com.ruoyi.device.mapper.DeviceMetricRecordMapper;
+import com.ruoyi.device.pojo.*;
+import com.ruoyi.device.service.DataConfigService;
+import com.ruoyi.device.service.DeviceService;
+import com.ruoyi.device.service.DeviceDocumentsService;
+import com.ruoyi.device.utils.DataAcquisition;
+import com.ruoyi.framework.exception.ErrorException;
+import com.ruoyi.inspect.mapper.InsSampleMapper;
+import com.ruoyi.inspect.pojo.InsProduct;
+import com.ruoyi.inspect.util.HackLoopTableRenderPolicy;
+import com.ruoyi.system.mapper.SysDictDataMapper;
+import com.ruoyi.system.mapper.SysDeptMapper;
+import com.ruoyi.system.mapper.UserMapper;
+import lombok.AllArgsConstructor;
+import org.apache.logging.log4j.util.Strings;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.math.BigDecimal;
+import java.net.URLEncoder;
+import java.text.SimpleDateFormat;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * 璁惧(Device)琛ㄦ湇鍔″疄鐜扮被
+ */
+@Service
+@AllArgsConstructor
+public class DeviceServiceImpl extends ServiceImpl<DeviceMapper, Device> implements DeviceService {
+
+    private DeviceMapper deviceMapper;
+
+    private UserMapper userMapper;
+
+    private SysDeptMapper sysDeptMapper;
+
+    private SysDictDataMapper sysDictDataMapper;
+
+    private StructureItemParameterMapper structureItemParameterMapper;
+
+    private DataConfigService dataConfigService;
+
+    private InsSampleMapper insSampleMapper;
+
+    private DeviceDocumentsService documentService;
+
+    private DeviceMetricRecordMapper deviceMetricRecordMapper;
+
+    private DeviceMaintenanceMapper deviceMaintenanceMapper;
+
+    private CollectBridgeMapper collectBridgeMapper;
+
+    @Override
+    public IPage<DeviceDto> selectDeviceParameter(Page page, DeviceDto itemParameter, Boolean laboratoryNameIsNull) {
+        IPage<DeviceDto> iPage = deviceMapper.selectDeviceParameterPage(page, QueryWrappers.queryWrappers(itemParameter), laboratoryNameIsNull);
+        return iPage;
+    }
+
+    @Override
+    public int addDeviceParameter(Device itemParameter) {
+        return deviceMapper.insert(itemParameter);
+    }
+
+    @Override
+    public int delDeviceParameter(Integer id) {
+        return deviceMapper.deleteById(id);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public int upDeviceParameter(Device itemParameter) {
+
+        return deviceMapper.updateById(itemParameter);
+    }
+
+    @Override
+    public List<Device> selectEquipmentOverview() {
+        return deviceMapper.selectEquipmentOverview(new Page(1, 10), QueryWrappers.queryWrappers(new Device()));
+    }
+
+    @Override
+    public List<Device> authorizedPerson() {
+        return deviceMapper.authorizedPerson();
+    }
+
+    @Override
+    public List<Device> search(Integer status, String deviceName, String specificationModel, String largeCategory) {
+        return deviceMapper.search(status, deviceName, specificationModel, largeCategory);
+    }
+
+    @Override
+    public List<Device> selectDeviceByCategory(String inspectionItem, String inspectionItemSubclass, String laboratory) {
+        List<Integer> id;
+
+        try {
+            id = structureItemParameterMapper.selectList(Wrappers.<StructureItemParameter>lambdaQuery()
+                    .eq(StructureItemParameter::getInspectionItem, inspectionItem)
+                    .eq(ObjectUtils.isNotEmpty(inspectionItemSubclass), StructureItemParameter::getInspectionItemSubclass, inspectionItemSubclass)
+                    .eq(ObjectUtils.isNotEmpty(laboratory), StructureItemParameter::getLaboratory, laboratory)
+                    .select(StructureItemParameter::getId)).stream().map(StructureItemParameter::getId).collect(Collectors.toList());
+        } catch (Exception e) {
+            return null;
+        }
+        List<Device> devices = deviceMapper.selectList(Wrappers.<Device>lambdaQuery()
+                .eq(Device::getDeviceStatus, 0)
+                .isNotNull(Device::getInsProductIds));
+        List<Device> devices2 = new ArrayList<>();
+        for (Device device : devices) {
+            String[] ids = device.getInsProductIds().split(",");
+            for (String i : ids) {
+                if (ObjectUtils.isNotEmpty(i)) {
+                    if (id.contains(Integer.parseInt(i))) {
+                        devices2.add(device);
+                        break;
+                    }
+                }
+            }
+        }
+        return devices2;
+    }
+
+    @Override
+    public DeviceDto selectDeviceByCode(Integer id) {
+        DeviceDto deviceDto = deviceMapper.selectDeviceByCode(id);
+        List<Integer> ids = new ArrayList<>();
+        if (Strings.isNotEmpty(deviceDto.getAuthorizedPerson())) {
+            if (deviceDto.getAuthorizedPerson().equals("null")) {
+                deviceDto.setAuthorizedPerson("[]");
+            }
+            ids = JSON.parseArray(deviceDto.getAuthorizedPerson(), Integer.class);
+        }
+        String name = "";
+        if (!ids.isEmpty()) {
+            name = userMapper.selectBatchIds(ids).stream().map(User::getName).collect(Collectors.joining(","));
+        }
+        deviceDto.setAuthorizedPersonName(name);
+        //鏌ヨ璁惧鏍″噯淇℃伅
+        DeviceMetricRecord calibrate = getDeviceMetricRecord(id, "calibrate");
+        deviceDto.setCalibrateNo(calibrate.getCertificateSerialNumber());
+
+        // 鍒颁簡鍋滅敤鏃ユ湡锛岃嚜鍔ㄥ皢鐘舵�佹敼涓哄仠鐢�
+        if (deviceDto.getNextCalibrationDate() != null) {
+            if (LocalDateTime.now().isAfter(deviceDto.getNextCalibrationDate())) {
+                // todo: 璁惧杩愯鐘舵�佸瓧鍏�
+//                List<Enums> enums = enumService.selectEnumByCategory("璁惧鐘舵��");
+//                List<Enums> status = enums.stream().filter(item -> item.getLabel().equals("鍋滅敤")).collect(Collectors.toList());
+//                deviceDto.setDeviceStatus(Integer.parseInt(status.get(0).getValue()));
+                deviceMapper.updateById(deviceDto);
+            }
+        }
+        return deviceDto;
+    }
+
+    /**
+     * 鏌ヨ璁惧鏍″噯/鏍告煡璁板綍
+     * @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());
+    }
+
+    @Override
+    public Result<?> dataAcquisition(HttpServletRequest request, DeviceCollectionDto dto) {
+
+        // 鏌ヨ妫�楠岄」
+        List<Integer> itemIds = dto.getItemIds();
+        if (CollectionUtils.isEmpty(itemIds)) {
+            throw new ErrorException("娌℃湁闇�瑕佹暟閲囩殑妫�楠岄」");
+        }
+        List<InsProduct> insProducts = insSampleMapper.selectProductResult(itemIds);
+
+        // 鏌ヨ妫�楠岄」缁戝畾鐨刬d
+        List<Integer> itemParameterIds = insProducts.stream().map(InsProduct::getStructureItemParameterId).collect(Collectors.toList());
+
+        Set<String> deviceCodeSet = new LinkedHashSet<>();
+        for (InsProduct product : insProducts) {
+            // 鏌ヨ璁惧
+            // 娣诲姞璁惧缂栧彿
+            if (product.getInsProductResult() != null) {
+                List<JSONObject> jsonObjects = JSON.parseArray(product.getInsProductResult().getEquipValue(), JSONObject.class);
+                for (JSONObject jsonObject : jsonObjects) {
+                    if (!"".equals(jsonObject.get("v") + "")) {
+                        List<String> v = StrUtil.split(jsonObject.get("v") + "", "锛�");
+                        deviceCodeSet.addAll(v);
+                    }
+                }
+            }
+        }
+        if (CollectionUtils.isEmpty(deviceCodeSet)) {
+            throw new ErrorException("鏈�夋嫨璁惧淇℃伅");
+        }
+        // 鑾峰彇璁惧闆嗗悎
+        List<Device> deviceList = baseMapper.selectList(Wrappers.<Device>lambdaQuery()
+                .in(Device::getManagementNumber, deviceCodeSet)
+                .isNotNull(Device::getIp)
+                .ne(Device::getIp, ""));
+
+        if (CollectionUtils.isEmpty(deviceList)) {
+            throw new ErrorException("鏃犺澶囬厤缃噰闆嗙粦瀹氫俊鎭�");
+        }
+
+        // 鏁伴噰杩斿洖淇℃伅
+        Map<String, Object> map = new HashMap<>();
+        for (Device device : deviceList) {
+            String ip = device.getIp();
+            // 鏍规嵁妫�楠岄」鑾峰彇config
+            List<DataConfig> list = dataConfigService.list(Wrappers.<DataConfig>lambdaQuery()
+                    .in(DataConfig::getStructureItemParameterId, itemParameterIds)
+                    .eq(DataConfig::getDeviceId, device.getId()));
+
+            // 鑾峰彇璁惧閰嶇疆绫�
+            // 鍒ゆ柇璁惧鏄惁鏄暟瀛楃洿妗�
+            if (device.getManagementNumber().equals("JCZX-ZB-ER02022")) {
+                map.putAll(dataCollectBridge(list, device, dto.getEntrustCode()));
+            } else {
+                map.putAll(DataAcquisition.dataAcquisitionEntrance(list, device, dto.getEntrustCode(), dto.getEntrustCode(), ip, insProducts.get(0).getCableTag()));
+            }
+        }
+
+
+        // 4銆侀�犲惊鐜鏁帮紝鍙備笌鍏紡璁$畻
+        if (ObjectUtils.isNotEmpty(map)) {
+            Map<String, Object> frequency = DataAcquisition.createFrequency(dto.getEntrustCode(), dto.getEntrustCode(), map);
+            return Result.success(frequency);
+        } else {
+            return Result.success(null);
+        }
+    }
+
+    /**
+     * 鑾峰彇鏁板瓧鐩存ˉ妫�娴嬩俊鎭�
+     * @return
+     */
+    public Map<String, ?> dataCollectBridge(List<DataConfig> dataConfig, Device device, String entrustCode) {
+        // 鎷兼帴鍚嶅瓧
+        Map<String, List<DataConfig>> userMap = dataConfig.stream()
+                .peek(i -> {
+                    String itemName = i.getInspectionItem();
+                    if (StringUtils.isNotBlank(i.getInspectionItemClass())) {
+                        itemName += "@" + i.getInspectionItemClass();
+                    }
+                    String name = i.getInspectionItem().equals(i.getInspectionItemSubclass()) ? itemName + "," : itemName + "," + i.getInspectionItemSubclass();
+
+                    // 娣诲姞妫�楠岄」鍚嶇О
+                    i.setInsProductItem(name);
+                })
+                .collect(Collectors.groupingBy(DataConfig::getInsProductItem));
+
+        Map<String, Object> map = new HashMap<>();
+
+        userMap.forEach((k, v) -> {
+            List<String> resultValue = new ArrayList<>();
+            // 鏌ヨ鐩存ˉ鐢垫祦鐢甸樆鏁伴噰鍊�
+            List<CollectBridge> collectBridges = collectBridgeMapper.selectList(Wrappers.<CollectBridge>lambdaQuery()
+                    .like(CollectBridge::getEntrustCode, entrustCode)
+                    .orderByAsc(CollectBridge::getCollectDate));
+
+            resultValue = collectBridges.stream().map(CollectBridge::getCollectValue).collect(Collectors.toList());
+
+            Map<String, Object> hashMap = new HashMap<>();
+            hashMap.put("equipName", device.getDeviceName());
+            hashMap.put("equipValue", device.getManagementNumber());
+            hashMap.put("result", resultValue);
+            map.put(k, hashMap);
+        });
+        return map;
+    }
+
+
+    @Override
+    public List<Map<String, Object>> treeDevice(String deviceName) {
+        List<Map<String, Object>> listMap = deviceMapper.treeDevice(deviceName);
+        return listMap;
+    }
+
+
+
+    @Override
+    public void exportDeviceFile(Integer deviceId, HttpServletResponse response) {
+
+        // 璁惧淇℃伅
+        Device device = baseMapper.selectById(deviceId);
+        // 璁惧妗f
+        List<DeviceDocuments> documentList = documentService.list(Wrappers.<DeviceDocuments>lambdaQuery().eq(DeviceDocuments::getDeviceId, deviceId));
+        // 璁惧鏍″噯琛�
+        List<DeviceMetricRecord> deviceMetricRecordList = deviceMetricRecordMapper.selectList(Wrappers.<DeviceMetricRecord>lambdaQuery().eq(DeviceMetricRecord::getDeviceId, deviceId));
+        // 璁惧缁翠慨琛�
+        List<DeviceMaintenance> deviceMaintenanceList = deviceMaintenanceMapper.selectList(Wrappers.<DeviceMaintenance>lambdaQuery().eq(DeviceMaintenance::getDeviceId, deviceId));
+
+
+        // 杩斿洖缁檞ord鐨勬暟鎹垪琛� 鍒嗕负宸﹀彸涓ゅ垪鏁版嵁
+        List<DocumentExportWordDto> documentExportWordDtoList = new ArrayList<>();
+        // 缁欐。妗堝姞搴忓彿 骞跺乏鍙冲垎涓哄乏鍙充袱鍒楀湪word涓樉绀�
+        extracted(documentList, documentExportWordDtoList);
+
+
+        // 灏嗘牎鍑嗚〃鍜岀淮淇〃鏀惧叆涓�涓璞′腑鏂逛究word琛ㄦ牸涓樉绀�
+        List<DeviceMetricRecordAndMaintenanceDto> deviceMetricRecordAndMaintenanceDtoList = getDeviceMetricRecordAndMaintenanceDtoList(deviceMetricRecordList, deviceMaintenanceList);
+
+
+        // 鑾峰彇璺緞
+        InputStream inputStream = this.getClass().getResourceAsStream("/static/word/device-document.docx");
+        Configure configure = Configure.builder()
+                .bind("document", new HackLoopTableRenderPolicy())
+                .bind("deviceMetricRecordAndMaintenanceDtoList", new HackLoopTableRenderPolicy())
+                .build();
+        XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
+                new HashMap<String, Object>() {{
+                    put("device", device);
+                    put("document", documentExportWordDtoList); // 妗f
+                    put("deviceMetricRecordAndMaintenanceDtoList", deviceMetricRecordAndMaintenanceDtoList); // 鏍″噯琛� 鍜� 缁翠慨琛�
+                }});
+
+        try {
+            response.setContentType("application/msword");
+            String fileName = URLEncoder.encode(
+                    device.getDeviceName() + "妗f", "UTF-8");
+            response.setHeader("Content-disposition",
+                    "attachment;filename=" + fileName + ".docx");
+            OutputStream os = response.getOutputStream();
+            template.write(os);
+            os.flush();
+            os.close();
+            inputStream.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException("瀵煎嚭澶辫触");
+        }
+    }
+
+    private List<DeviceMetricRecordAndMaintenanceDto> getDeviceMetricRecordAndMaintenanceDtoList(List<DeviceMetricRecord> deviceMetricRecordList, List<DeviceMaintenance> deviceMaintenanceList) {
+        // 璁惧鏍″噯琛ㄥ拰璁惧缁翠慨琛ㄧ殑闆嗗悎
+        List<DeviceMetricRecordAndMaintenanceDto> deviceMetricRecordAndMaintenanceDtoList = new ArrayList<>();
+        // 璁惧鏍″噯琛ㄥ拰璁惧缁翠慨琛ㄧ殑闀垮害鍙兘涓嶄竴鏍� 鍙栨渶澶у�� 涓嶅鐨勭敤绌烘暟鎹~鍏�
+        int metricRecordSize = deviceMetricRecordList.size();
+        int maintenanceSize = deviceMaintenanceList.size();
+        int size = Math.max(metricRecordSize, maintenanceSize);
+        // 缁� 鏍¢獙鍜岀淮淇璞� 璧嬪��
+        for (int i = 0; i < size; i++) {
+            // 鏍¢獙鍜岀淮淇璞�
+            DeviceMetricRecordAndMaintenanceDto deviceMetricRecordAndMaintenanceDto = new DeviceMetricRecordAndMaintenanceDto();
+            // 璁剧疆搴忓彿
+            deviceMetricRecordAndMaintenanceDto.setIndex(i + 1);
+
+            // 鏍″噯琛ㄦ暟鎹�
+            if (metricRecordSize > i) {
+                // 璁剧疆鏃ユ湡鏍煎紡
+                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+                // 鑾峰彇璁惧鏍″噯琛ㄦ暟鎹�
+                DeviceMetricRecord deviceMetricRecord = deviceMetricRecordList.get(i);
+                // 璁剧疆鏍″噯鏃ユ湡
+                deviceMetricRecordAndMaintenanceDto.setCalibrationDateString(sdf.format(deviceMetricRecord.getCalibrationDate()));
+                // 璁剧疆璇佷功缂栧彿
+                deviceMetricRecordAndMaintenanceDto.setCertificateNumber(deviceMetricRecord.getCertificateSerialNumber());
+                // 璁剧疆鏈夋晥鏈�
+                deviceMetricRecordAndMaintenanceDto.setValidityDateString(sdf.format(deviceMetricRecord.getNextCalibrationDate()));
+                // 璁剧疆鏍″噯鏈夋晥鏃ユ湡
+                deviceMetricRecordAndMaintenanceDto.setValidityDateString(sdf.format(deviceMetricRecord.getConfirmDate()));
+                // 璁剧疆妫�楠岀粨鏋�
+                deviceMetricRecordAndMaintenanceDto.setJudgement(deviceMetricRecord.getStatus());
+            }
+
+            // 缁翠慨琛ㄦ暟鎹�
+            if (maintenanceSize > i) {
+                // 鑾峰彇璁惧缁翠慨琛ㄦ暟鎹�
+                DeviceMaintenance deviceMaintenance = deviceMaintenanceList.get(i);
+                DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+                // 缁翠慨鏃ユ湡
+                deviceMetricRecordAndMaintenanceDto.setMaintenanceDateString(deviceMaintenance.getMaintenanceDate().format(dateTimeFormatter));
+                // 澶勭悊鏂规硶
+                deviceMetricRecordAndMaintenanceDto.setHandlingMethod(deviceMaintenance.getMaintenanceContent());
+                // 澶囨敞
+                deviceMetricRecordAndMaintenanceDto.setComments(deviceMaintenance.getRemark());
+            }
+
+            deviceMetricRecordAndMaintenanceDtoList.add(deviceMetricRecordAndMaintenanceDto);
+        }
+        return deviceMetricRecordAndMaintenanceDtoList;
+    }
+
+    /**
+     * 缁欐。妗堝姞搴忓彿 骞跺乏鍙冲垎涓哄乏鍙充袱鍒楀湪word涓樉绀�
+     *
+     * @param documentList              妗f鍒楄〃
+     * @param documentExportWordDtoList 杩斿洖缁檞ord鐨勬暟鎹垪琛�
+     */
+    private static void extracted(List<DeviceDocuments> documentList, List<DocumentExportWordDto> documentExportWordDtoList) {
+        // 缁欐。妗堝姞搴忓彿   骞朵笖鍒嗕负宸﹀彸涓や釜鍒楄〃鍦╳ord涓樉绀�
+        for (int i = 0; i < documentList.size(); i++) {
+            // 鍒涘缓word琛ㄦ牸涓竴琛岀殑鏁版嵁瀵硅薄
+            DocumentExportWordDto documentExportWordDto = new DocumentExportWordDto();
+            // 鑾峰彇妗f淇℃伅
+            DeviceDocuments document = documentList.get(i);
+            // 鏍煎紡鍖栨棩鏈�
+            DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+            // 鏍规嵁搴忓彿 鍒嗗埆鍔犲叆涓や釜鍒楄〃
+            if (i % 2 == 0) {
+                // 濂囨暟鍦ㄥ乏鍒�
+                documentExportWordDto.setIndex1(i + 1);
+                documentExportWordDto.setName1(document.getName());
+                documentExportWordDto.setQuantity1(document.getQuantity());
+                documentExportWordDto.setPageCount1(document.getPageCount());
+                documentExportWordDto.setArchiveDateString1(document.getProvideDate().format(dateTimeFormatter));
+            } else {
+                // 鍋舵暟鍦ㄥ彸鍒�
+                documentExportWordDto.setIndex2(i + 1);
+                documentExportWordDto.setName2(document.getName());
+                documentExportWordDto.setQuantity2(document.getQuantity());
+                documentExportWordDto.setPageCount2(document.getPageCount());
+                documentExportWordDto.setArchiveDateString2(document.getProvideDate().format(dateTimeFormatter));
+            }
+            // 鎶婁竴琛屾暟鎹璞″姞鍏ュ垪琛�
+            documentExportWordDtoList.add(documentExportWordDto);
+        }
+    }
+
+    @Override
+    public void exportEquipmentDetails(HttpServletResponse response) {
+        List<Device> deviceList = baseMapper.selectList(null);
+        List<DeviceExport> deviceExportList = new ArrayList<>();
+
+        int index = 1;
+        for (Device device : deviceList) {
+            Integer equipmentManager = device.getEquipmentManager();
+            String equipmentManagerName = null;
+            if (equipmentManager != null) {
+                User user = userMapper.selectById(equipmentManager);
+                if (user != null) {
+                    equipmentManagerName = user.getName();
+                }
+            }
+            DeviceExport deviceExport = new DeviceExport();
+            BeanUtils.copyProperties(device, deviceExport);
+            deviceExport.setIndex(index);
+            deviceExport.setEquipmentManagerName(equipmentManagerName);
+            deviceExportList.add(deviceExport);
+            index++;
+        }
+
+        // 鑾峰彇璺緞
+        InputStream inputStream = this.getClass().getResourceAsStream("/static/word/quipment-details.docx");
+        Configure configure = Configure.builder()
+                .bind("deviceList", new HackLoopTableRenderPolicy())
+                .build();
+        XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
+                new HashMap<String, Object>() {{
+                    put("deviceList", deviceExportList);
+                }});
+
+        try {
+            response.setContentType("application/msword");
+            String fileName = URLEncoder.encode(
+                    "浠櫒璁惧涓�瑙堣〃", "UTF-8");
+            response.setHeader("Content-disposition",
+                    "attachment;filename=" + fileName + ".docx");
+            OutputStream os = response.getOutputStream();
+            template.write(os);
+            os.flush();
+            os.close();
+            inputStream.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException("瀵煎嚭澶辫触");
+        }
+    }
+
+    @Override
+    public void downloadImportTemplate(HttpServletResponse response) {
+        response.reset();
+        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
+        response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");
+        try {
+            String fileName = URLEncoder.encode("璁惧瀵煎叆妯℃澘.xlsx", "UTF-8");
+            response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
+            EasyExcel.write(response.getOutputStream(), DeviceImport.class)
+                    .sheet("璁惧瀵煎叆妯℃澘")
+                    .doWrite(Collections.emptyList());
+        } catch (Exception e) {
+            throw new RuntimeException("璁惧瀵煎叆妯℃澘涓嬭浇澶辫触", e);
+        }
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public int importDevice(org.springframework.web.multipart.MultipartFile file) {
+        if (file == null || file.isEmpty()) {
+            throw new RuntimeException("璇烽�夋嫨闇�瑕佸鍏ョ殑Excel鏂囦欢");
+        }
+        String fileName = file.getOriginalFilename();
+        if (fileName == null || !fileName.toLowerCase(Locale.ROOT).endsWith(".xlsx")) {
+            throw new RuntimeException("浠呮敮鎸�.xlsx鏍煎紡鏂囦欢");
+        }
+
+        final List<DeviceImport> rows;
+        try {
+            rows = EasyExcel.read(file.getInputStream())
+                    .head(DeviceImport.class)
+                    .sheet()
+                    .doReadSync();
+        } catch (Exception e) {
+            throw new RuntimeException("Excel瑙f瀽澶辫触锛岃浣跨敤涓嬭浇鐨勫鍏ユā鏉�", e);
+        }
+        if (CollectionUtils.isEmpty(rows)) {
+            throw new RuntimeException("瀵煎叆鏂囦欢娌℃湁璁惧鏁版嵁");
+        }
+
+        Set<String> fileKeys = new HashSet<>();
+        for (int i = 0; i < rows.size(); i++) {
+            String managementNumber = required(rows.get(i).getManagementNumber(), i + 2, "绠$悊缂栧彿");
+            String deviceName = required(rows.get(i).getDeviceName(), i + 2, "浠櫒鍚嶇О");
+            String specificationModel = required(rows.get(i).getSpecificationModel(), i + 2, "瑙勬牸鍨嬪彿");
+            if (!fileKeys.add(deviceKey(deviceName, specificationModel, managementNumber))) {
+                throw new RuntimeException("绗�" + (i + 2) + "琛岋細浠櫒鍚嶇О+瑙勬牸鍨嬪彿+绠$悊缂栧彿鍦ㄦ枃浠朵腑閲嶅");
+            }
+        }
+        Set<String> existingKeys = baseMapper.selectList(Wrappers.<Device>lambdaQuery()
+                        .select(Device::getDeviceName, Device::getSpecificationModel, Device::getManagementNumber))
+                .stream().map(d -> deviceKey(d.getDeviceName(), d.getSpecificationModel(), d.getManagementNumber())).collect(Collectors.toSet());
+
+        Map<String, List<SysDept>> departmentMap = sysDeptMapper.selectDeptList(new SysDept()).stream()
+                .filter(item -> StringUtils.isNotBlank(item.getDeptName()))
+                .collect(Collectors.groupingBy(item -> item.getDeptName().trim()));
+        Map<String, List<User>> userMap = userMapper.selectList(Wrappers.<User>lambdaQuery()
+                        .isNotNull(User::getName).select(User::getId, User::getName))
+                .stream().collect(Collectors.groupingBy(item -> item.getName().trim()));
+        Map<String, String> statusMap = dictMap("device_status");
+        Map<String, String> typeMap = dictMap("device_type");
+
+        List<Device> devices = new ArrayList<>();
+        for (int i = 0; i < rows.size(); i++) {
+            int rowNumber = i + 2;
+            DeviceImport row = rows.get(i);
+            String managementNumber = required(row.getManagementNumber(), rowNumber, "绠$悊缂栧彿");
+            String deviceName = required(row.getDeviceName(), rowNumber, "浠櫒鍚嶇О");
+            String specificationModel = required(row.getSpecificationModel(), rowNumber, "瑙勬牸鍨嬪彿");
+            if (existingKeys.contains(deviceKey(deviceName, specificationModel, managementNumber))) {
+                throw new RuntimeException("绗�" + rowNumber + "琛岋細浠櫒鍚嶇О鈥�" + deviceName + "鈥�+瑙勬牸鍨嬪彿鈥�" + specificationModel + "鈥�+绠$悊缂栧彿鈥�" + managementNumber + "鈥濆凡瀛樺湪");
+            }
+
+            String laboratoryName = required(row.getLaboratoryName(), rowNumber, "鎵�灞為儴闂�");
+            List<SysDept> departments = departmentMap.get(laboratoryName);
+            if (CollectionUtils.isEmpty(departments) || departments.size() > 1) {
+                throw new RuntimeException("绗�" + rowNumber + "琛岋細鎵�灞為儴闂ㄢ��" + laboratoryName + "鈥濅笉瀛樺湪鎴栦笉鍞竴");
+            }
+
+            Device device = new Device();
+            device.setDeviceName(deviceName);
+            device.setSpecificationModel(specificationModel);
+            device.setManagementNumber(managementNumber);
+            device.setActivationDate(parseDate(row.getActivationDate()));
+            device.setSubordinateDepartmentsId(departments.get(0).getDeptId().intValue());
+            device.setDeviceStatus(Integer.valueOf(dictValue(statusMap, row.getDeviceStatus(), rowNumber, "褰撳墠鐘舵��", true)));
+            device.setCalibrationDate(required(row.getCalibrationDate(), rowNumber, "鏍″噯鍛ㄦ湡(鏈�)"));
+            device.setEnDeviceName(trim(row.getEnDeviceName()));
+            device.setManufacturer(trim(row.getManufacturer()));
+            device.setFactoryNo(trim(row.getFactoryNo()));
+            device.setAssetCode(trim(row.getAssetCode()));
+            device.setOrigin(trim(row.getOrigin()));
+            device.setAcquisitionDate(parseDate(row.getAcquisitionDate()));
+            device.setStoragePoint(trim(row.getStoragePoint()));
+            device.setTechnicalIndicators(trim(row.getTechnicalIndicators()));
+            device.setCalibrationServices(trim(row.getCalibrationServices()));
+            device.setLastCalibrationDate(parseDate(row.getLastCalibrationDate()));
+            device.setNextCalibrationDate(parseDate(row.getNextCalibrationDate()));
+            device.setLargeCategory(dictValue(typeMap, row.getLargeCategory(), rowNumber, "璁惧绫诲瀷", false));
+            device.setUnitPrice(parseDecimal(row.getUnitPrice(), rowNumber, "鍗曚环(涓囧厓)"));
+
+            String managerName = trim(row.getEquipmentManagerName());
+            if (StringUtils.isNotBlank(managerName)) {
+                List<User> users = userMap.get(managerName);
+                if (CollectionUtils.isEmpty(users) || users.size() > 1) {
+                    throw new RuntimeException("绗�" + rowNumber + "琛岋細璐熻矗浜衡��" + managerName + "鈥濅笉瀛樺湪鎴栦笉鍞竴");
+                }
+                device.setEquipmentManager(users.get(0).getId());
+            }
+            devices.add(device);
+        }
+        saveBatch(devices);
+        return devices.size();
+    }
+
+    private Map<String, String> dictMap(String dictType) {
+        return sysDictDataMapper.selectDictDataByType(dictType).stream()
+                .collect(Collectors.toMap(item -> item.getDictLabel().trim(), SysDictData::getDictValue, (first, second) -> first));
+    }
+
+    private String dictValue(Map<String, String> values, String input, int rowNumber, String column, boolean required) {
+        String text = trim(input);
+        if (StringUtils.isBlank(text)) {
+            if (required) {
+                throw new RuntimeException("绗�" + rowNumber + "琛岋細" + column + "涓嶈兘涓虹┖");
+            }
+            return null;
+        }
+        String value = values.get(text);
+        if (value == null && values.containsValue(text)) {
+            value = text;
+        }
+        if (value == null) {
+            throw new RuntimeException("绗�" + rowNumber + "琛岋細" + column + "鈥�" + text + "鈥濅笉鍦ㄧ郴缁熷瓧鍏镐腑");
+        }
+        return value;
+    }
+
+    private LocalDateTime parseDate(String input) {
+        String text = trim(input);
+        if (StringUtils.isBlank(text)) {
+            return null;
+        }
+        String datePart = text.replace('/', '-').split("\\s+")[0];
+        try {
+            return LocalDate.parse(datePart, DateTimeFormatter.ofPattern("yyyy-M-d")).atStartOfDay();
+        } catch (Exception e) {
+            return null;
+        }
+    }
+
+    private BigDecimal parseDecimal(String input, int rowNumber, String column) {
+        String text = trim(input);
+        if (StringUtils.isBlank(text)) {
+            return null;
+        }
+        try {
+            return new BigDecimal(text);
+        } catch (NumberFormatException e) {
+            throw new RuntimeException("绗�" + rowNumber + "琛岋細" + column + "蹇呴』鏄暟瀛�", e);
+        }
+    }
+
+    private String required(String input, int rowNumber, String column) {
+        String value = trim(input);
+        if (StringUtils.isBlank(value)) {
+            throw new RuntimeException("绗�" + rowNumber + "琛岋細" + column + "涓嶈兘涓虹┖");
+        }
+        return value;
+    }
+
+    private String deviceKey(String deviceName, String specificationModel, String managementNumber) {
+        return (deviceName == null ? "" : deviceName.trim()) + "|"
+                + (specificationModel == null ? "" : specificationModel.trim()) + "|"
+                + (managementNumber == null ? "" : managementNumber.trim());
+    }
+
+    private String trim(String value) {
+        return value == null ? null : value.trim();
+    }
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceStateServiceImpl.java b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceStateServiceImpl.java
new file mode 100644
index 0000000..4a0b914
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceStateServiceImpl.java
@@ -0,0 +1,160 @@
+package com.ruoyi.device.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.ruoyi.basic.mapper.LaboratoryMapper;
+import com.ruoyi.basic.pojo.Laboratory;
+import com.ruoyi.common.core.domain.entity.User;
+import com.ruoyi.device.dto.DeviceStateDto;
+import com.ruoyi.device.mapper.DeviceStateMapper;
+import com.ruoyi.device.pojo.DeviceState;
+import com.ruoyi.device.service.DeviceStateService;
+import com.ruoyi.framework.exception.ErrorException;
+import com.ruoyi.system.mapper.UserMapper;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+import jakarta.annotation.Resource;
+import jakarta.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();
+            inputStream.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException("瀵煎嚭澶辫触");
+        }
+    }
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceTraceabilityManagementDetailsServiceImpl.java b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceTraceabilityManagementDetailsServiceImpl.java
new file mode 100644
index 0000000..8e7763b
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceTraceabilityManagementDetailsServiceImpl.java
@@ -0,0 +1,20 @@
+package com.ruoyi.device.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.device.mapper.DeviceTraceabilityManagementDetailsMapper;
+import com.ruoyi.device.pojo.DeviceTraceabilityManagementDetails;
+import com.ruoyi.device.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-device/src/main/java/com/ruoyi/device/service/impl/DeviceTraceabilityManagementServiceImpl.java b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceTraceabilityManagementServiceImpl.java
new file mode 100644
index 0000000..4cba9bd
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceTraceabilityManagementServiceImpl.java
@@ -0,0 +1,292 @@
+package com.ruoyi.device.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.deepoove.poi.XWPFTemplate;
+import com.deepoove.poi.config.Configure;
+import com.ruoyi.common.constant.MenuJumpPathConstants;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.common.core.domain.entity.InformationNotification;
+import com.ruoyi.common.core.domain.entity.User;
+import com.ruoyi.common.utils.QueryWrappers;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.common.utils.WxCpUtils;
+import com.ruoyi.device.dto.DeviceTraceabilityManagementDetailsDto;
+import com.ruoyi.device.dto.DeviceTraceabilityManagementDto;
+import com.ruoyi.device.mapper.DeviceTraceabilityManagementDetailsMapper;
+import com.ruoyi.device.mapper.DeviceTraceabilityManagementMapper;
+import com.ruoyi.device.pojo.DeviceTraceabilityManagement;
+import com.ruoyi.device.pojo.DeviceTraceabilityManagementDetails;
+import com.ruoyi.device.service.DeviceTraceabilityManagementDetailsService;
+import com.ruoyi.device.service.DeviceTraceabilityManagementService;
+import com.ruoyi.inspect.util.HackLoopTableRenderPolicy;
+import com.ruoyi.inspect.util.UserUtils;
+import com.ruoyi.system.mapper.UserMapper;
+import com.ruoyi.system.service.InformationNotificationService;
+import org.apache.commons.collections4.CollectionUtils;
+import org.springframework.beans.BeanUtils;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+import org.springframework.stereotype.Service;
+
+import jakarta.annotation.Resource;
+import jakarta.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 ThreadPoolTaskExecutor threadPoolTaskExecutor;
+    @Resource
+    private InformationNotificationService informationNotificationService;
+
+    @Resource
+    private UserMapper userMapper;
+
+    /**
+     * 鍒嗛〉鏌ヨ璁惧閲忓�兼函婧愯鍒�
+     *
+     * @param page
+     * @return
+     */
+    @Override
+    public Result<IPage<DeviceTraceabilityManagement>> selectDeviceTraceabilityManagementByPage(Page 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 = SecurityUtils.getUserId().intValue();
+        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
+     * @return
+     */
+    @Override
+    public Result submitReviewTraceabilityManagementStatus(DeviceTraceabilityManagementDto deviceTraceabilityManagementDto) {
+        User audit = userMapper.selectById(deviceTraceabilityManagementDto.getAuditId());
+        this.update(Wrappers.<DeviceTraceabilityManagement>lambdaUpdate()
+                .eq(DeviceTraceabilityManagement::getTraceabilityManagementId, deviceTraceabilityManagementDto.getTraceabilityManagementId())
+                .set(DeviceTraceabilityManagement::getAuditId, audit.getId())
+                .set(DeviceTraceabilityManagement::getAudit, audit.getName())
+                .set(DeviceTraceabilityManagement::getAuditDate, null)
+                .set(DeviceTraceabilityManagement::getStatus, null)
+                .set(DeviceTraceabilityManagement::getAuditRemark, null));
+
+        DeviceTraceabilityManagement deviceTraceabilityManagement = baseMapper.selectById(deviceTraceabilityManagementDto.getTraceabilityManagementId());
+
+        // 鍙戦�佹秷鎭�
+        Integer userId = SecurityUtils.getUserId().intValue();
+        User user = userMapper.selectById(userId);
+        // 娑堟伅鍙戦��
+        InformationNotification info = new InformationNotification();
+        // 鍙戦�佷汉
+        info.setCreateUser(user.getName());
+        info.setMessageType("6");
+        info.setTheme("CNAS璁惧閲忓�兼函婧愯鍒掓壒鍑嗛�氱煡");
+        info.setContent(deviceTraceabilityManagement.getPlanYear() + "骞寸殑璁惧閲忓�兼函婧愯鍒掑緟鎵瑰噯");
+        info.setSenderId(userId);
+        // 鎺ユ敹浜�
+        info.setConsigneeId(audit.getId());
+        info.setJumpPath(MenuJumpPathConstants.DEVICE);
+        informationNotificationService.addInformationNotification(info);
+
+        // 鍙戦�佷紒涓氬井淇¢�氱煡
+        threadPoolTaskExecutor.execute(() -> {
+            String message = "";
+            message += "CNAS璁惧閲忓�兼函婧愯鍒掓牳閫氱煡";
+            message += "\n璇峰幓璧勬簮绠$悊-璁惧涓�灞傜洰褰�-璁惧閲忓�兼函婧愯鍒掑~鍐�";
+            message += "\n" + deviceTraceabilityManagement.getPlanYear() + "骞寸殑璁惧閲忓�兼函婧愯鍒掑緟鎵瑰噯";
+            //鍙戦�佷紒涓氬井淇℃秷鎭�氱煡
+            try {
+                WxCpUtils.inform(audit.getAccount(), message, null);
+            } catch (Exception e) {
+                throw new RuntimeException(e);
+            }
+        });
+        return Result.success();
+    }
+
+    /**
+     * 瀹℃牳璁惧閲忓�兼函婧愯鍒�
+     *
+     * @param deviceTraceabilityManagementDto 璁惧閲忓�兼函婧愯鍒�
+     */
+    @Override
+    public Result reviewTraceabilityManagementStatus(DeviceTraceabilityManagementDto deviceTraceabilityManagementDto) {
+        LambdaUpdateWrapper<DeviceTraceabilityManagement> wrapper = Wrappers.<DeviceTraceabilityManagement>lambdaUpdate()
+                .eq(DeviceTraceabilityManagement::getTraceabilityManagementId, deviceTraceabilityManagementDto.getTraceabilityManagementId())
+                .set(DeviceTraceabilityManagement::getAuditDate, LocalDateTime.now())
+                .set(DeviceTraceabilityManagement::getStatus, deviceTraceabilityManagementDto.getStatus())        // 瀹℃牳鐘舵��
+                .set(DeviceTraceabilityManagement::getAuditRemark, deviceTraceabilityManagementDto.getAuditRemark());// 瀹℃牳澶囨敞
+
+        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();
+            inputStream.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException("瀵煎嚭澶辫触");
+        }
+        return Result.success();
+    }
+
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/task/DeviceRecordSchedule.java b/cnas-device/src/main/java/com/ruoyi/device/task/DeviceRecordSchedule.java
new file mode 100644
index 0000000..24bc432
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/task/DeviceRecordSchedule.java
@@ -0,0 +1,104 @@
+package com.ruoyi.device.task;
+
+import com.ruoyi.common.core.domain.entity.User;
+import com.ruoyi.common.utils.WxCpUtils;
+import com.ruoyi.device.dto.DeviceRecordDto;
+import com.ruoyi.device.mapper.DeviceMapper;
+import com.ruoyi.device.mapper.DeviceRecordMapper;
+import com.ruoyi.device.pojo.Device;
+import com.ruoyi.device.pojo.DeviceRecord;
+import com.ruoyi.system.mapper.UserMapper;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+import org.springframework.stereotype.Component;
+
+import jakarta.annotation.Resource;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * 璁惧浣跨敤璁板綍鎻愰啋
+ */
+@Component
+public class DeviceRecordSchedule {
+
+    @Resource
+    private DeviceMapper deviceMapper;
+    @Resource
+    private DeviceRecordMapper deviceRecordMapper;
+    @Resource
+    private UserMapper userMapper;
+    @Resource
+    private ThreadPoolTaskExecutor threadPoolTaskExecutor;
+
+    /**
+     * 鎻愰啋濉啓璁惧浣跨敤璁板綍
+     */
+//    @Scheduled(cron = "0/5 * * * * *")
+    @Scheduled(cron = "0 0 9 * * 6") // 姣忓懆鍏墽琛屼竴娆�
+    public void task1() {
+        // 鏌ヨ鏈~鍐欑殑璁惧浣跨敤璁板綍
+        List<DeviceRecordDto> deviceRecords = deviceRecordMapper.selectNotFilled();
+        Map<Integer, List<DeviceRecordDto>> userPersonIdMap = deviceRecords.stream().collect(Collectors.groupingBy(DeviceRecord::getUsePersonId));
+        userPersonIdMap.forEach((userId, recordList) -> {
+            threadPoolTaskExecutor.execute(() -> {
+                // 浼佷笟寰俊閫氱煡濉啓璁惧浣跨敤璁板綍
+                User user = userMapper.selectById(userId);
+                String message = "";
+                message += "璁惧浣跨敤璁板綍鏈~鍐欐彁閱掗�氱煡";
+                for (DeviceRecordDto deviceRecord : recordList) {
+                    message += "\n璁惧鍚嶇О缂栧彿: " + deviceRecord.getDeviceName() + "-" + deviceRecord.getManagementNumber();
+                    message += "\n濮旀墭缂栧彿: " + deviceRecord.getSampleCode();
+                    message += "\n";
+                }
+                message += "\n璇峰幓濉啓璁惧浣跨敤璁板綍";
+
+                //鍙戦�佷紒涓氬井淇℃秷鎭�氱煡
+                try {
+                    WxCpUtils.inform(user.getAccount(), message, null);
+                } catch (Exception e) {
+                    throw new RuntimeException(e);
+                }
+
+            });
+        });
+    }
+
+
+    /**
+     * 姣忓ぉ9鐐规墽琛屼竴娆� 闄や簡鏄熸湡澶�
+     * 鍒ゆ柇鏄惁鏈夎澶囧埌杈炬牎鍑嗘湁鏁堟湡
+     */
+//    @Scheduled(cron = "0/10 * * * * *")
+    @Scheduled(cron = "0 0 9 * * 1-6") // 姣忓ぉ9鐐规墽琛屼竴娆� 闄や簡鏄熸湡澶�
+    public void task2() {
+        // 鏌ヨ鍒拌揪鏍″噯鏈夋晥鏈熺殑璁惧-鎻愬墠5澶�
+        List<Device> deviceList = deviceMapper.selectOverdueDevice();
+        Map<Integer, List<Device>> userPersonIdMap = deviceList.stream().collect(Collectors.groupingBy(Device::getEquipmentManager));
+        userPersonIdMap.forEach((userId, recordList) -> {
+            threadPoolTaskExecutor.execute(() -> {
+                // 浼佷笟寰俊閫氱煡濉啓璁惧浣跨敤璁板綍
+                User user = userMapper.selectById(userId);
+                String message = "";
+                message += "璁惧鍒拌揪鏍″噯鏈夋晥鏈�";
+                for (Device deviceRecord : recordList) {
+                    message += "\n璁惧鍚嶇О: " + deviceRecord.getDeviceName();
+                    message += "\n璁惧缂栧彿: " + deviceRecord.getManagementNumber();
+                    message += "\n鏍″噯鏈夋晥鏈�: " + deviceRecord.getActivationDate();
+                    message += "\n";
+                }
+                message += "\n璇峰幓杩涜璁惧鏍″噯";
+
+                //鍙戦�佷紒涓氬井淇℃秷鎭�氱煡
+                try {
+                    WxCpUtils.inform(user.getAccount(), message, null);
+                } catch (Exception e) {
+                    throw new RuntimeException(e);
+                }
+
+            });
+        });
+    }
+
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/utils/DataAcquisition.java b/cnas-device/src/main/java/com/ruoyi/device/utils/DataAcquisition.java
new file mode 100644
index 0000000..90a0573
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/utils/DataAcquisition.java
@@ -0,0 +1,861 @@
+package com.ruoyi.device.utils;
+
+import cn.hutool.core.io.IORuntimeException;
+import cn.hutool.http.HttpUtil;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.ruoyi.device.pojo.DataConfig;
+import com.ruoyi.device.pojo.Device;
+import com.ruoyi.framework.exception.ErrorException;
+
+import javax.script.ScriptEngine;
+import javax.script.ScriptEngineManager;
+import jakarta.servlet.http.HttpServletRequest;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.*;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.stream.Collectors;
+
+public class DataAcquisition {
+
+    private static final String HTTP = "http://";
+
+    private static final String GETFILE = ":9527/lims/getFile"; // 鑾峰彇鏂囦欢鎺ュ彛
+
+    private static final String MOVEFILE = ":9527/lims/moveFile"; // 鏂囦欢绉诲姩鍦板潃
+
+    private static final String splitIdentifier = "@-@"; // 鑷畾涔夊敮涓�鏍囪瘑鍒嗗壊绗�
+
+    public static final String frequency = "frequency";
+
+    /**
+     * 鏁伴噰鍏ュ彛
+     *
+     * @param dataConfig
+     * @param device
+     * @return
+     */
+    public static Map<String, Object> dataAcquisitionEntrance(List<DataConfig> dataConfig, Device device, String entrustCode, String sampleCode, String ip, String cableTag) {
+        // 鍒ゆ柇鏄惁鏄奖鍍忔祴閲忎华
+        if (device.getManagementNumber().equals("JCZX-ZB-OP07001")) {
+            if (device.getFileType().equals(".xlsx")) {
+                String url = device.getCollectUrl() + "\\" + sampleCode.replace("/", "");
+                if (StringUtils.isNotBlank(dataConfig.get(0).getAnotherName())) {
+                    url += dataConfig.get(0).getAnotherName() ;
+                }
+                url += ".xlsx";
+                device.setCollectUrl(url);
+            }
+        }
+        // 鍒ゆ柇鏄惁鏄數缂嗙噧鐑х儫瀵嗗害娴嬮噺绯荤粺
+        if (device.getManagementNumber().equals("JCZX-ZB-ZT03002")) {
+            if (device.getFileType().equals(".txt")) {
+                device.setCollectUrl(device.getCollectUrl() + "\\-" + sampleCode.replace("/", ""));
+            }
+        }
+        /**
+         * filePath 鏂囦欢閲囬泦璺緞
+         * fileExtension 鏂囦欢鍚庣紑
+         * entrustCode 濮旀墭缂栧彿
+         * sampleCode 鏍峰搧缂栧彿
+         * mdbEntrustCode mdb鏂囦欢闇�瑕侊細濮旀墭缂栧彿瀛楁 涓轰粈涔堟病鏈夊幓杩欎釜mdb鍓嶇紑鍛紵鍥犱负宸茬粡缁欏鎴风殑閮ㄥ垎鐢佃剳涓婂畨瑁呬簡閲囬泦鍣紝鑰岀敤鎴蜂笉鎺ュ彈閲嶆柊瀹夎閲囬泦鍣紝鎵�浠ュ氨娌℃湁鍘婚櫎
+         * mdbSampleCode mdb鏂囦欢闇�瑕侊細鏍峰搧缂栧彿瀛楁
+         */
+        String http = HTTP + ip + GETFILE +
+                "?filePath=" + device.getCollectUrl() +
+                "&fileExtension=" + device.getFileType() +
+                "&entrustCode=" + entrustCode +
+                "&sampleCode=" + sampleCode +
+                "&mdbEntrustCode=" + device.getEntrustCode() +
+                "&mdbSampleCode=" + device.getSampleCode() +
+                "&dbFileName=" + device.getDbFileName();
+        String result = null;
+        try {
+            result = HttpUtil.get(http);
+        } catch (IORuntimeException e) {
+            e.printStackTrace();
+            throw new ErrorException("鎵�鍦ㄧ數鑴戞湭瀹夎鎴栨湭鍚姩锛歀IMS鏂囦欢閲囬泦鍣紒");
+        }
+        JSONObject jsonObject = JSON.parseObject(result);
+        if (Objects.equals(jsonObject.get("code"), 1)) {
+            if (ObjectUtils.isEmpty(jsonObject.get("msg"))) {
+                throw new ErrorException("鏈煡璇㈠埌鏂囦欢锛佸彲鑳借璺緞锛�" + device.getCollectUrl() + "锛変笅骞舵病鏈夋墍闇�(" + device.getFileType() +")鏂囦欢锛�");
+            } else {
+                throw new ErrorException(jsonObject.get("msg") + "");
+            }
+        } else {
+            String data = jsonObject.get("data") + "";
+            // 鑰冭檻鍒颁竴涓娴嬮」鍙兘浼氬瓨鍦ㄥ涓暟閲囬厤缃紝鎵�浠ラ渶瑕佽繘琛屽垎缁�
+            Map<String, List<DataConfig>> userMap = dataConfig.stream()
+                    .peek(i -> {
+                        String itemName = i.getInspectionItem();
+                        if (StringUtils.isNotBlank(i.getInspectionItemClass())) {
+                            itemName += "@" + i.getInspectionItemClass();
+                        }
+                        String name = i.getInspectionItem().equals(i.getInspectionItemSubclass()) ? itemName + "," : itemName + "," + i.getInspectionItemSubclass();
+
+                        // 娣诲姞妫�楠岄」鍚嶇О
+                        i.setInsProductItem(name);
+                    })
+                    .collect(Collectors.groupingBy(DataConfig::getInsProductItem));
+            Map<String, Object> map;
+            switch (device.getFileType()) {
+                case ".docx":
+                    map = analysisString(data, userMap, device, entrustCode, sampleCode);
+                    break;
+                case ".xlsx":
+                    map = analysisList(data, userMap, device, entrustCode, sampleCode);
+                    break;
+                case ".txt":
+                    map = analysisTxt(data, userMap, device, entrustCode, sampleCode);
+                    break;
+                case ".csv":
+                    map = analysisList(data, userMap, device, entrustCode, sampleCode);
+                    break;
+                case ".mdb":
+                    // 鍒ゆ柇鏄惁鏄媺鍔涙満
+                    if (device.getManagementNumber().equals("JCZX-ZB-FF01014")) {
+                        map = analysisMdbByPull(data, userMap, device, cableTag);
+                    } else {
+                        map = analysisMdb(data, userMap, device);
+                    }
+                    break;
+                case ".db":
+                    map = analysisDb(data, userMap, device);
+                    break;
+                case ".png":
+                    map = readPngString(data, userMap, device);
+                    break;
+                default:
+                    map = null;
+                    break;
+            }
+            // 濡傛灉瀛樺湪瀛樺偍鍦板潃锛屽垯绉诲姩鍦板潃
+            if (ObjectUtils.isNotEmpty(device.getStorageUrl())) {
+                String s = HTTP + ip + MOVEFILE + "?startFilePath=" + device.getCollectUrl() + "&endFilePath=" + device.getStorageUrl() + "&fileType=" + device.getFileType();
+                HttpUtil.get(s);
+            }
+            return map;
+        }
+    }
+
+    public static Map<String, Object> createFrequency(String entrustCode, String sampleCode, Map<String, Object> map) {
+        Set<String> set = new LinkedHashSet<>();
+        map.forEach((key, value) -> {
+            String[] split = key.split(",");
+            String inspectionItem = split[0];
+            // 鍙鏈変竴涓笉涓虹┖灏眘et杩涘幓
+            if (ObjectUtils.isNotEmpty(value)) {
+                set.add(inspectionItem);
+            }
+        });
+        Map<String, Object> result = new HashMap<>();
+        for (String inspectionItemKey : set) {
+            Map<String, Object> hashMap = new HashMap<>();
+            map.forEach((key, value) -> {
+                String[] split = key.split(",");
+                String inspectionItem = split[0];
+                if (inspectionItemKey.equals(inspectionItem)) {
+                    if (split.length > 1) {
+                        hashMap.put(split[1], value);
+                    } else {
+                        hashMap.put("", value);
+                    }
+                }
+            });
+            String frequency = createKey(entrustCode, sampleCode, inspectionItemKey);
+            hashMap.put("frequency", frequency);
+            result.put(inspectionItemKey, hashMap);
+        }
+        return result;
+    }
+
+    public static String createKey(String entrustCode, String sampleCode, String inspectionItemKey) {
+
+        return "1";
+    }
+
+    /**
+     * 闇�瑕侀�氳繃X,Y杞村畾浣�
+     *
+     * @param data
+     * @param dataConfig
+     * @return
+     */
+    private static Map<String, Object> analysisDb(String data, Map<String, List<DataConfig>> dataConfig, Device device) {
+        JSONObject jsonObject = JSON.parseObject(data);
+        Map<String, Object> map = new HashMap<>();
+        if (jsonObject.isEmpty()) {
+            return map;
+        }
+        JSONArray dataList = JSONArray.parseArray(jsonObject.get("data").toString());
+        dataConfig.forEach((k, v) -> {
+            AtomicInteger numberOfDataEntries = new AtomicInteger();
+            List<Object> list = new ArrayList<>();
+            for (int config = 0; config < v.size(); config++) {
+                String refery = getRefer(v.get(config).getRefery());
+                for (int i = 0; i < dataList.size(); i++) {
+                    JSONObject jsonObject1 = JSON.parseObject(dataList.get(i).toString());
+                    Object o = jsonObject1.get(refery);
+                    if (ObjectUtils.isNotEmpty(o)) {
+                        numberOfDataEntries.addAndGet(1);
+                        list.add(o);
+                    }
+                }
+            }
+            // 鎷兼帴鏁伴噰閰嶇疆
+            List<Object> result = new ArrayList<>();
+            for (int i = 0; i < numberOfDataEntries.get(); i++) {
+                String aggregate = "";
+                for (int j = 0; j < v.size(); j++) {
+                    int index;
+                    if (j == 0) {
+                        index = i;
+                    } else {
+                        index = numberOfDataEntries.get() + i;
+                    }
+                    aggregate += list.get(index).toString() + ",";
+                }
+                int lastIndex = aggregate.lastIndexOf(",");
+                String substring = aggregate.substring(0, lastIndex);
+                result.add(substring);
+            }
+            // 杩涜鍏紡璁$畻
+            Object resultValue = calculationFormula(result, v.get(0), k, device);
+            map.put(k, resultValue);
+        });
+        return map;
+    }
+
+    /**
+     * @param data
+     * @param dataConfig
+     * @return
+     */
+    private static Map<String, Object> analysisMdb(String data, Map<String, List<DataConfig>> dataConfig, Device device) {
+        JSONObject jsonObject = JSON.parseObject(data);
+        Map<String, Object> map = new HashMap<>();
+        if (jsonObject.isEmpty()) {
+            return map;
+        }
+        JSONArray dataList = JSONArray.parseArray(jsonObject.get("data").toString());
+        dataConfig.forEach((k, v) -> {
+            DataConfig configVo = v.get(0);
+            AtomicInteger numberOfDataEntries = new AtomicInteger();
+            List<Object> list = new ArrayList<>();
+            for (int config = 0; config < v.size(); config++) {
+                String refery = getRefer(v.get(config).getRefery());
+                for (int i = 0; i < dataList.size(); i++) {
+                    JSONObject jsonObject1 = JSON.parseObject(dataList.get(i).toString());
+                    Object o = jsonObject1.get(refery);
+                    if (ObjectUtils.isNotEmpty(o)) {
+                        numberOfDataEntries.addAndGet(1);
+                        list.add(o);
+                    }
+                }
+            }
+            // 鎷兼帴鏁伴噰閰嶇疆
+            List<Object> result = new ArrayList<>();
+            for (int i = 0; i < numberOfDataEntries.get(); i++) {
+                String aggregate = "";
+                for (int j = 0; j < v.size(); j++) {
+                    int index;
+                    if (j == 0) {
+                        index = i;
+                    } else {
+                        index = numberOfDataEntries.get() + i;
+                    }
+                    aggregate += list.get(index).toString() + ",";
+                }
+                int lastIndex = aggregate.lastIndexOf(",");
+                String substring = aggregate.substring(0, lastIndex);
+                result.add(substring);
+
+            }
+            // 杩涜鍏紡璁$畻
+            Object resultValue = calculationFormula(result, v.get(0), k, device);
+            map.put(k, resultValue);
+        });
+        return map;
+    }
+
+
+    /**
+     * 鎷夊姏鏈烘暟閲�
+     *
+     * @param data
+     * @param dataConfig
+     * @return
+     */
+    private static Map<String, Object> analysisMdbByPull(String data, Map<String, List<DataConfig>> dataConfig, Device device, String cableTag) {
+        JSONObject jsonObject = JSON.parseObject(data);
+        Map<String, Object> map = new HashMap<>();
+        if (jsonObject.isEmpty()) {
+            return map;
+        }
+        JSONArray dataList = JSONArray.parseArray(jsonObject.get("data").toString());
+
+        dataConfig.forEach((k, v) -> {
+            List<Map<String, String>> resultValue = new ArrayList<>();
+
+            DataConfig configVo = v.get(0);
+            for (int i = 0; i < dataList.size(); i++) {
+                JSONObject jsonObject1 = JSON.parseObject(dataList.get(i).toString());
+                // 鑾峰彇鏃堕棿
+                String dDate = jsonObject1.getString("dDate");
+                String dTime = jsonObject1.getString("dTime");
+                DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSSSSS");
+
+                // 瑙f瀽绗竴涓棩鏈熸椂闂村瓧绗︿覆
+                LocalDateTime dateTime1 = LocalDateTime.parse(dDate, formatter);
+                // 鑾峰彇骞存湀鏃�
+                String yearMonthDay = dateTime1.toLocalDate().toString();
+
+                // 瑙f瀽绗簩涓棩鏈熸椂闂村瓧绗︿覆
+                LocalDateTime dateTime2 = LocalDateTime.parse(dTime, formatter);
+                // 鑾峰彇鏃跺垎
+                String hourMinute = dateTime2.toLocalTime().toString();
+                // 鎷兼帴骞存湀鏃ュ拰鏃跺垎
+                String mergedDateTime = yearMonthDay + " " + hourMinute;
+
+                // 鑾峰彇鍘氬害
+                String report = jsonObject1.getString("Report");
+                String thickness = extractValue(report, "鍘氬害:\\s*(\\S*?)~");
+
+                // 鑾峰彇鎷変几寮哄害浼搁暱鐜�
+                String result = "";
+                if (StringUtils.isNotBlank(configVo.getMatchingName()) && configVo.getMatchingName().contains("鎷変几寮哄害")) {
+                    result = extractValue(report, "鎷変几寮哄害:\\s*(\\S*?)~");
+
+                }
+                //鍒ゆ柇妫�楠屽瓙椤规槸鍚︽槸鎷変几寮哄害
+                if (StringUtils.isNotBlank(configVo.getMatchingName()) && configVo.getMatchingName().contains("浼搁暱鐜�")) {
+                    result = extractValue(report, "浼搁暱鐜�:\\s*(\\S*?)~");
+                }
+                Map<String, String> reportMap = new HashMap<>();
+                reportMap.put("mergedDateTime", mergedDateTime);
+                reportMap.put("thickness", thickness);
+                reportMap.put("result", result);
+                resultValue.add(reportMap);
+            }
+            Map<String, Object> hashMap = new HashMap<>();
+            hashMap.put("equipName", device.getDeviceName());
+            hashMap.put("equipValue", device.getManagementNumber());
+            hashMap.put("result", resultValue);
+            map.put(k, hashMap);
+        });
+        return map;
+    }
+
+    private static String extractValue(String input, String regex) {
+        Pattern pattern = Pattern.compile(regex);
+        Matcher matcher = pattern.matcher(input);
+        return matcher.find() ? matcher.group(1) : null;
+    }
+
+    private static Pattern SPATTERN = Pattern.compile("([-+])?\\d+(\\.\\d+)?");
+
+    /**
+     * 鍙渶X杞�
+     *
+     * @param data       閲囬泦鍒扮殑鏂囦欢瀛楃涓�
+     * @param dataConfig 鐢ㄦ埛閰嶇疆濂界殑x,y杞村畾浣嶆暟鎹笌鍙傜収鐗�
+     * @return
+     */
+    private static Map<String, Object> readPngString(String data, Map<String, List<DataConfig>> dataConfig, Device device) {
+        Map<String, Object> map = new HashMap<>();
+        dataConfig.forEach((k, v) -> {
+            List<Object> list = new ArrayList<>();
+            for (int config = 0; config < v.size(); config++) {
+                String referx = getRefer(v.get(config).getReferx());
+                String result = null;
+                // 閫氳繃\n灏嗗瓧绗︿覆鍒嗗壊涓鸿
+                String[] aColumnY = data.split("\n");
+                List<String> list1 = new ArrayList<>();
+                // 璇ュ惊鐜緱鍑虹敤鎴烽厤缃殑y杞�
+                for (int i = 0; i < aColumnY.length; i++) {
+                    String addDataWithSpaces = referx.replaceAll("", " ");
+                    int x = getXOrY(v.get(config).getX(), k, "X");
+                    if (aColumnY[i].contains(addDataWithSpaces)) {
+                        Matcher matcher = SPATTERN.matcher(aColumnY[i]);
+                        while (matcher.find()) {
+                            String group = matcher.group();
+                            list1.add(group);
+                        }
+                    }
+                    if (ObjectUtils.isNotEmpty(list1)) {
+                        result = list1.get(x);
+                    }
+                }
+                if (ObjectUtils.isNotEmpty(result)) {
+                    list.add(result);
+                }
+            }
+            // 杩涜鍏紡璁$畻
+            Object resultValue = calculationFormula(list, v.get(0), k, device);
+            map.put(k, resultValue);
+        });
+        return map;
+    }
+
+    /**
+     * 浠庢枃浠朵腑鎻愬彇鍑烘潵鐨勬枃瀛楋紝濡傛灉鏈夊叕寮忥紝杩涜鍏紡璁$畻锛屽惁鍒欏彇鍒楄〃绗竴涓��
+     *
+     * @param list       鎻愬彇鍑虹殑鏁板瓧
+     * @param dataConfig 瀛樺偍鍏紡鐨勫璞�
+     * @return
+     */
+    private static Object calculationFormula(List<Object> list, DataConfig dataConfig, String insProductItem, Device device) {
+        if (list.size() == 0) {
+            Map<String, Object> hashMap = new HashMap<>();
+            hashMap.put("equipName", device.getDeviceName());
+            hashMap.put("equipValue", device.getManagementNumber());
+            hashMap.put("result", null);
+            return hashMap;
+        }
+        ArrayList<Object> listResult = new ArrayList<>();
+        Map<String, Object> hashMap = new HashMap<>();
+        // 濡傛灉涓嶄负绌猴紝杩涜鍏紡璁$畻
+        if (ObjectUtils.isNotEmpty(dataConfig.getFormula())) {
+            // 鍚﹀垯锛氭病鏈夊叕寮忎唬琛ㄤ笉闇�瑕佽绠楋紝鐩存帴鎻愬彇List閲岄潰鐨勬暟鎹�
+            if (ObjectUtils.isEmpty(device.getEntrustCode()) && ObjectUtils.isEmpty(device.getSampleCode())) {
+                String s = calculationFormulaList(list, dataConfig.getFormula());
+                listResult.add(s);
+            } else {
+                list.forEach(i -> {
+                    List<Object> strings = Arrays.asList(i.toString().split(","));
+                    String s = calculationFormulaList(strings, dataConfig.getFormula());
+                    listResult.add(s);
+                });
+            }
+        } else {
+            listResult.addAll(list);
+        }
+        // 涓轰簡缁欏墠绔仛鏁版嵁鍖哄垎
+        if (listResult.size() > 1) {
+            hashMap.put("result", listResult);
+        } else {
+            hashMap.put("result", listResult.get(0).toString());
+        }
+        hashMap.put("equipName", device.getDeviceName());
+        hashMap.put("equipValue", device.getManagementNumber());
+        return hashMap;
+    }
+
+    /**
+     * 瑙f瀽String鏁版嵁
+     *
+     * @param data       閲囬泦鍒扮殑鏂囦欢瀛楃涓�
+     * @param dataConfig 鐢ㄦ埛閰嶇疆濂界殑x,y杞村畾浣嶆暟鎹笌鍙傜収鐗�
+     * @return
+     */
+    private static Map<String, Object> analysisTxt(String data, Map<String, List<DataConfig>> dataConfig,
+                                                   Device device, String entrustCode, String sampleCode) {
+        Map<String, Object> map = new HashMap<>();
+        dataConfig.forEach((k, v) -> {
+            List<Object> list = new ArrayList<>();
+            // 濮旀墭缂栧彿涓庢牱鍝佺紪鍙蜂笉瀛樺湪锛屽畾锛�1銆乊瀹氳寖鍥达紝X瀹氭í鍧愭爣锛�2銆佸彧瀛樺湪Y锛�3銆佸彧瀛樺湪X
+            if (ObjectUtils.isEmpty(device.getEntrustCode()) && ObjectUtils.isEmpty(device.getSampleCode())) {
+                // 鍒ゆ柇鏄惁鏄儫瀵嗗害
+                if (device.getManagementNumber().equals("JCZX-ZB-ZT03002")) {
+                    // 鎸夎鍒嗗壊鏁版嵁
+                    String[] lines = data.split("\n");
+
+                    // 鎻愬彇鏈�鍚庝竴琛岀殑绗竴涓暟瀛�
+                    String lastLine = lines[lines.length - 1];
+                    String firstNumber = lastLine.split("\t")[0];
+                    list.add(firstNumber);
+                } else {
+                    list = analyzeData(data, v, k, ",");
+                }
+                // 濮旀墭缂栧彿涓庢牱鍝佺紪鍙峰瓨鍦�
+            } else if (ObjectUtils.isNotEmpty(device.getEntrustCode()) && ObjectUtils.isNotEmpty(device.getSampleCode())) {
+                list = analyzeDataEntrustCodAndSampleCode(data, v, k, ",", device, entrustCode, sampleCode);
+            }
+            // 杩涜鍏紡璁$畻
+            Object resultValue = calculationFormula(list, v.get(0), k, device);
+            map.put(k, resultValue);
+        });
+        return map;
+    }
+
+    /**
+     * @param data       閲囬泦鍒扮殑鏂囦欢瀛楃涓�
+     * @param dataConfig 鐢ㄦ埛閰嶇疆濂界殑x,y杞村畾浣嶆暟鎹笌鍙傜収鐗�
+     * @return
+     */
+    private static Map<String, Object> analysisString(String data, Map<String, List<DataConfig>> dataConfig, Device device,
+                                                      String entrustCode, String sampleCode) {
+        String processingDataAfterSpaces = data
+                .replaceAll("  +", splitIdentifier)
+                .replaceAll("\r", "")
+                .replaceAll(" ", "");
+        Map<String, Object> map = new HashMap<>();
+        dataConfig.forEach((k, v) -> {
+            List<Object> list = new ArrayList<>();
+            // 濮旀墭缂栧彿涓庢牱鍝佺紪鍙蜂笉瀛樺湪锛屽畾锛�1銆乊瀹氳寖鍥达紝X瀹氭í鍧愭爣锛�2銆佸彧瀛樺湪Y锛�3銆佸彧瀛樺湪X
+            if (ObjectUtils.isEmpty(device.getEntrustCode()) && ObjectUtils.isEmpty(device.getSampleCode())) {
+                list = analyzeData(processingDataAfterSpaces, v, k, splitIdentifier);
+                // 濮旀墭缂栧彿涓庢牱鍝佺紪鍙峰瓨鍦�
+            } else if (ObjectUtils.isNotEmpty(device.getEntrustCode()) && ObjectUtils.isNotEmpty(device.getSampleCode())) {
+                list = analyzeDataEntrustCodAndSampleCode(processingDataAfterSpaces, v, k, splitIdentifier, device, entrustCode, sampleCode);
+            }
+            // 杩涜鍏紡璁$畻
+            Object resultValue = calculationFormula(list, v.get(0), k, device);
+            map.put(k, resultValue);
+        });
+        return map;
+    }
+
+    /**
+     * 鍙朮锛孻涓や釜瀹氫綅
+     *
+     * @param data       閲囬泦鍒扮殑鏂囦欢瀛楃涓�
+     * @param dataConfig 鐢ㄦ埛閰嶇疆濂界殑x,y杞村畾浣嶆暟鎹笌鍙傜収鐗�
+     * @return
+     */
+    public static Map<String, Object> analysisList(String data, Map<String, List<DataConfig>> dataConfig,
+                                                   Device device, String entrustCode, String sampleCode) {
+        Map<String, Object> map = new HashMap<>();
+        dataConfig.forEach((k, v) -> {
+            List<Object> list = new ArrayList<>();
+            // 濮旀墭缂栧彿涓庢牱鍝佺紪鍙蜂笉瀛樺湪锛屽畾锛�1銆乊瀹氳寖鍥达紝X瀹氭í鍧愭爣锛�2銆佸彧瀛樺湪Y锛�3銆佸彧瀛樺湪X
+            if (ObjectUtils.isEmpty(device.getEntrustCode()) && ObjectUtils.isEmpty(device.getSampleCode())) {
+                list = analyzeData(data, v, k, splitIdentifier);
+                // 濮旀墭缂栧彿涓庢牱鍝佺紪鍙峰瓨鍦�
+            } else if (ObjectUtils.isNotEmpty(device.getEntrustCode()) && ObjectUtils.isNotEmpty(device.getSampleCode())) {
+                list = analyzeDataEntrustCodAndSampleCode(data, v, k, splitIdentifier, device, entrustCode, sampleCode);
+            }
+            // 杩涜鍏紡璁$畻
+            Object resultValue = calculationFormula(list, v.get(0), k, device);
+            map.put(k, resultValue);
+        });
+        return map;
+    }
+
+    private static List<Object> analyzeDataEntrustCodAndSampleCode(String data, List<DataConfig> v, String k, String splitIdentifier,
+                                                                   Device device, String entrustCodeValue, String sampleCodeValue) {
+        entrustCodeValue = entrustCodeValue.replaceAll(" ", "");
+        sampleCodeValue = sampleCodeValue.replaceAll(" ", "");
+        // 鏈�缁堢粨鏋�
+        List<Object> list = new ArrayList<>();
+        int numberOfDataEntries = 0;
+        // 鍙杄ntrustCode涓巗ampleCode鎵�鍦ㄤ綅
+        for (int config = 0; config < v.size(); config++) {
+            numberOfDataEntries = 0;
+            Integer entrustCodeY = null;
+            Integer sampleCodeY = null;
+            Integer referYCoordinate = null;
+            String refery = getRefer(v.get(config).getRefery());
+            String entrustCode = getRefer(device.getEntrustCode()); // 濮旀墭缂栧彿瀛楁
+            String sampleCode = getRefer(device.getSampleCode()); // 鏍峰搧缂栧彿瀛楁
+            if (ObjectUtils.isEmpty(refery)) {
+                continue;
+            }
+            // 鍘婚櫎鎵�鏈夌殑绌烘牸锛岄�氳繃\n灏嗗瓧绗︿覆鍒嗗壊涓鸿
+            String[] aColumnY = data.replaceAll(" ", "").split("\n");
+            for (int i = 0; i < aColumnY.length; i++) {
+                // 濡傛灉閫氳繃鍒ゆ柇锛屽畾浣嶅埌Y杞�
+                if (aColumnY[i].contains(entrustCode) && aColumnY[i].contains(sampleCode)) {
+                    String[] aLine = aColumnY[i].split(splitIdentifier);
+                    for (int j = 0; j < aLine.length; j++) {
+                        if (aLine[j].contains(entrustCode)) {
+                            entrustCodeY = j;
+                        }
+                        if (aLine[j].contains(sampleCode) ) {
+                            sampleCodeY = j;
+                        }
+                        if (aLine[j].contains(refery)) {
+                            referYCoordinate = j;
+                        }
+                    }
+                }
+                if (ObjectUtils.isNotEmpty(entrustCodeY) && ObjectUtils.isNotEmpty(sampleCodeY) && ObjectUtils.isNotEmpty(referYCoordinate)) {
+                    String[] aLine = aColumnY[i].split(splitIdentifier);
+                    try {
+                        if (aLine[entrustCodeY].contains(entrustCodeValue) && aLine[sampleCodeY].contains(sampleCodeValue)) {
+                            String result = aLine[referYCoordinate];
+                            // 闃叉璁$畻鍏紡鐨勬椂鍊欏嚭鐜帮細[null] 杩欑鏁版嵁
+                            if (ObjectUtils.isNotEmpty(result)) {
+                                numberOfDataEntries += 1;
+                                list.add(result);
+                            }
+                        }
+                    } catch (Exception e) {}
+                }
+            }
+        }
+        // 鎷兼帴鏁伴噰閰嶇疆
+        List<Object> result = new ArrayList<>();
+        for (int i = 0; i < numberOfDataEntries; i++) {
+            String aggregate = "";
+            for (int j = 0; j < v.size(); j++) {
+                int index;
+                if (j == 0) {
+                    index = i;
+                } else {
+                    index = numberOfDataEntries + i;
+                }
+                aggregate += list.get(index).toString() + ",";
+            }
+            int lastIndex = aggregate.lastIndexOf(",");
+            String substring = aggregate.substring(0, lastIndex);
+            result.add(substring);
+        }
+        return result;
+    }
+
+    // 鐢变簬鍦ㄦ柟娉曚腑浼氬ぇ閲忕殑鍒ゆ柇锛屾墍浠ュ仛涓�涓柟娉�
+    private static int getXOrY(String value, String k, String tips) {
+        try {
+            return Integer.parseInt(value);
+        } catch (NumberFormatException e) {
+            throw new ErrorException(k + "锛氭湭閰嶇疆" + tips + "鍧愭爣杞寸殑鍊硷紒");
+        }
+    }
+
+    // 闃叉鍙傜収鐗╀负绌烘姤閿欙紝杩涜鍒ゆ柇濡傛灉涓虹┖璧嬪�肩┖瀛楃
+    private static String getRefer(String refer) {
+        return ObjectUtils.isNotEmpty(refer) ? refer.replaceAll(" ", "") : "";
+    }
+
+    /**
+     * 濮旀墭缂栧彿涓庢牱鍝佺紪鍙烽兘涓虹┖鎵ц
+     *
+     * @param data
+     * @param v
+     * @param k
+     * @param split
+     * @return
+     */
+    public static List<Object> analyzeData(String data, List<DataConfig> v, String k, String split) {
+        List<Object> list = new ArrayList<>();
+        for (int config = 0; config < v.size(); config++) {
+            // 鍙栦袱涓敤鎴烽厤缃殑鍙傜収鐗�
+            String referx = getRefer(v.get(config).getReferx());
+            String refery = getRefer(v.get(config).getRefery());
+            if (ObjectUtils.isEmpty(refery) && ObjectUtils.isEmpty(referx)) {
+                continue;
+            }
+            // 鏈�缁堢粨鏋�
+            List<Object> result = new ArrayList<>();
+            // 閫氳繃\n灏嗗瓧绗︿覆鍒嗗壊涓鸿
+            String[] aColumnY = data.replaceAll(" ", "").split("\n");
+            Integer end = null;
+            // 閲囬泦鏁版嵁锛歒杞�
+            for (int i = 0; i < aColumnY.length; i++) {
+                // 濡傛灉Y鍙傜収涓嶄负绌轰笌X鍙傜収涓虹┖鍒欐墽琛岋紝鍚屾椂璇ヨ鍖呭惈Y鍙傜収
+                if (ObjectUtils.isNotEmpty(refery) && ObjectUtils.isEmpty(referx) && aColumnY[i].contains(refery)) {
+                    // 鍙朰鍧愭爣鍊�
+                    int y = getXOrY(v.get(config).getY(), k, "Y");
+                    String[] aLineX = aColumnY[i].split(split);
+                    for (int j = 0; j < aLineX.length; j++) {
+                        if (aLineX[j].contains(refery)) {
+                            String[] split1 = new String[0];
+                            try {
+                                split1 = aColumnY[i + y].split(split);
+                            } catch (Exception e) {
+                                throw new ErrorException(k + "锛歒杞村畾浣嶈秴鍑猴紒");
+                            }
+                            try {
+                                result.add(split1[j]);
+                            } catch (Exception e) {
+                                throw new ErrorException(k + "锛歑杞村畾浣嶈秴鍑猴紒");
+                            }
+                        }
+                    }
+                    // 濡傛灉Y鍙傜収涓嶄负绌轰笌X鍙傜収涓嶄负绌哄垯鎵ц,姝ゅY瀹氬尯鍩�
+                } else if (ObjectUtils.isNotEmpty(refery) && ObjectUtils.isNotEmpty(referx)) {
+                    // 鍙杧鐨勫�硷紝闃叉鎶ラ敊
+                    int x = getXOrY(v.get(config).getX(), k, "X");
+                    // 鍙朰鍧愭爣鍊�
+                    int y = getXOrY(v.get(config).getY(), k, "Y");
+                    // 缂撳瓨Y鐨勭粨鏉熷��
+                    if (ObjectUtils.isEmpty(end) && aColumnY[i].contains(refery)) {
+                        end = i + y;
+                    }
+                    // 鍒ゆ柇鏄惁鍦ㄥ弬鐓х墿涓鸿捣鍒帮紝Y鍧愭爣鍊间负鏈�缁堣寖鍥�
+                    if (ObjectUtils.isNotEmpty(end) && i <= end) {
+                        String[] aLineX = aColumnY[i].split(split);
+                        for (int j = 0; j < aLineX.length; j++) {
+                            if (aLineX[j].contains(referx)) {
+                                try {
+                                    result.add(aLineX[j + x]);
+                                } catch (Exception e) {
+                                    throw new ErrorException(k + "锛歑杞村畾浣嶈秴鍑猴紒");
+                                }
+                                break;
+                            }
+                        }
+                    }
+                    // 濡傛灉X鍙傜収涓嶄负绌哄悓鏃惰琛屽寘鍚玐鍙傜収锛屽垯鎵ц涓嬮潰鐨勪唬鐮�
+                } else if (aColumnY[i].contains(referx) && ObjectUtils.isEmpty(refery)) {
+                    String[] aLineX = aColumnY[i].split(split);
+                    // 鍙杧鐨勫�硷紝闃叉鎶ラ敊
+                    int x = getXOrY(v.get(config).getX(), k, "X");
+                    for (int j = 0; j < aLineX.length; j++) {
+                        if (aLineX[j].contains(referx)) {
+                            try {
+                                result.add(aLineX[j + x]);
+                            } catch (Exception e) {
+                                throw new ErrorException(k + "锛歑杞村畾浣嶈秴鍑猴紒");
+                            }
+                        }
+                    }
+                }
+            }
+            // 闃叉璁$畻鍏紡鐨勬椂鍊欏嚭鐜帮細[null] 杩欑鏁版嵁
+            if (ObjectUtils.isNotEmpty(result)) {
+//                String formatProcessing = getFormatProcessing(result);
+                list.addAll(result);
+            }
+        }
+        return list;
+    }
+
+    public static String getFormatProcessing(String value) {
+        value = value.replaceAll("%", "");
+        if (value.contains("=")) {
+            String[] split = value.split("=");
+            return split[split.length - 1];
+        } else if (value.contains(":")) {
+            String[] split = value.split(":");
+            return split[split.length - 1];
+        } else {
+            return value;
+        }
+    }
+
+    public static String getIp(HttpServletRequest request) {
+        String ipAddress = request.getRemoteAddr();
+        // 闃叉鍥炵幆鍦板潃鍙樹负IPv6
+        return ipAddress.equals("0:0:0:0:0:0:0:1") ? "127.0.0.1" : ipAddress;
+    }
+
+    public static String calculationFormulaList(List<Object> list, String formula) {
+        //棣栧厛灏唋ist杞崲涓篵igdecmic
+        List<BigDecimal> bigDecimalList = list.stream()
+                .map(obj -> {
+                    return new BigDecimal((obj).toString());
+                }).collect(Collectors.toList());
+
+        //灏嗕腑鏂囩殑(杞崲鑻辨枃鐨�())
+        formula = formula.replace("锛�", "(")
+                .replace("锛�", ")")
+                .replace("锛�", ",");
+        //鐒跺悗鎻愬彇鍏紡
+        String strs = formula.substring(0, formula.indexOf("("));
+        String upperStr = strs.toUpperCase();
+        if (upperStr.matches(".*\\d.*")) {
+            upperStr = "";
+        }
+        //鐒跺悗鑾峰彇鏈�澶栭潰鎷彿閲岄潰鐨勫��,鍐嶆牴鎹�","鍒嗗壊
+        int start = formula.indexOf("(");
+        int end = -1;
+        int a = 0;
+        for (int i = start; i < formula.length(); i++) {
+            char c = formula.charAt(i);
+            if (c == '(') {
+                a++;
+            } else if (c == ')') {
+                a--;
+                if (a == 0) {
+                    end = i;
+                }
+            }
+        }
+        if (start == -1 || end == -1) {
+            throw new ErrorException("鍏紡鎷彿涓嶅尮閰�: " + formula);
+        }
+
+        String argumentsStr = formula.substring(start + 1, end);
+        List<String> arguments = new ArrayList<>();
+        int bracketCount = 0;
+        StringBuilder currentArgument = new StringBuilder();
+        for (char c : argumentsStr.toCharArray()) {
+            if (c == ',' && bracketCount == 0) {
+                arguments.add(currentArgument.toString());
+                currentArgument.setLength(0);
+            } else {
+                if (c == '(') bracketCount++;
+                if (c == ')') bracketCount--;
+                currentArgument.append(c);
+            }
+        }
+        arguments.add(currentArgument.toString());
+        String[] bracketStrs = arguments.toArray(new String[0]);
+        List<BigDecimal> results = new ArrayList<>();
+        for (String expr : bracketStrs) {
+            Pattern pattern = Pattern.compile("([A-Z])(\\d+)");
+            Matcher matcher = pattern.matcher(expr);
+            StringBuffer sb = new StringBuffer();
+            while (matcher.find()) {
+                String letter = matcher.group(1);
+                int index = Integer.parseInt(matcher.group(2)) - 1; // 灏�1-based杞负0-based
+                if (index < bigDecimalList.size()) {
+                    matcher.appendReplacement(sb, bigDecimalList.get(index).toString());
+                } else {
+                    throw new RuntimeException("鍏紡涓殑涓嬫爣 " + index + " 瓒呭嚭鑼冨洿");
+                }
+            }
+            matcher.appendTail(sb);
+
+            // 璁$畻琛ㄨ揪寮�
+            ScriptEngine engine = new ScriptEngineManager().getEngineByName("JavaScript");
+            try {
+                Object result = engine.eval(sb.toString());
+                results.add(new BigDecimal(result.toString()));
+            } catch (Exception e) {
+                throw new IllegalArgumentException("鏃犳硶璁$畻鍏紡: " + sb, e);
+            }
+        }
+        // 鏍规嵁鍑芥暟鍚嶇О杩涜鐩稿簲璁$畻
+        BigDecimal finalResult;
+        if (upperStr.equals("") || upperStr == null) {
+            finalResult = results.get(0);
+        } else {
+            switch (upperStr) {
+                case "MAX":
+                    finalResult = results.stream().max(BigDecimal::compareTo)
+                            .orElseThrow(() -> new IllegalArgumentException("鏃犳硶璁$畻MAX鍊�"));
+                    break;
+                case "MIN":
+                    finalResult = results.stream().min(BigDecimal::compareTo)
+                            .orElseThrow(() -> new IllegalArgumentException("鏃犳硶璁$畻MIN鍊�"));
+                    break;
+                case "SUM":
+                    finalResult = results.stream().reduce(BigDecimal.ZERO, BigDecimal::add);
+                    break;
+                case "ABS":
+                    finalResult = results.stream().map(BigDecimal::abs).reduce(BigDecimal.ZERO, BigDecimal::add);
+                    break;
+                case "AVERAGE":
+                    finalResult = results.stream().reduce(BigDecimal.ZERO, BigDecimal::divide)
+                            .divide(BigDecimal.valueOf(results.size()), 2, BigDecimal.ROUND_HALF_UP);
+                    break;
+                case "MEDIAN":
+                    int size = results.size();
+                    if (size % 2 == 1) {
+                        finalResult = results.get(size / 2);
+                    } else {
+                        BigDecimal sum = results.get(size / 2 - 1).add(results.get(size / 2));
+                        finalResult = sum.divide(BigDecimal.valueOf(2), 2, BigDecimal.ROUND_HALF_UP);
+                    }
+                    break;
+                default:
+                    throw new UnsupportedOperationException("鏆備笉鏀寔鍑芥暟: " + upperStr);
+            }
+        }
+
+        return finalResult.toString();
+        // 鍚﹀垯锛氭病鏈夊叕寮忎唬琛ㄤ笉闇�瑕佽绠楋紝鐩存帴鎻愬彇List閲岄潰鐨勬暟鎹�
+    }
+
+}
diff --git a/cnas-device/src/main/resources/mapper/DataConfigMapper.xml b/cnas-device/src/main/resources/mapper/DataConfigMapper.xml
new file mode 100644
index 0000000..b5dac74
--- /dev/null
+++ b/cnas-device/src/main/resources/mapper/DataConfigMapper.xml
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.device.mapper.DataConfigMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.ruoyi.device.pojo.DataConfig">
+        <id column="id" property="id" />
+        <result column="formula" property="formula" />
+        <result column="referx" property="referx" />
+        <result column="refery" property="refery" />
+        <result column="x" property="x" />
+        <result column="y" property="y" />
+    </resultMap>
+
+    <select id="selectDataConfigList" resultType="com.ruoyi.device.dto.DeviceConfigDtoPage">
+        SELECT ddc.*,
+               d.device_name,
+               sip.sample
+        FROM device_data_config ddc
+                 left join device d on ddc.device_id = d.id
+                 left join structure_item_parameter sip on sip.id = ddc.structure_item_parameter_id
+        where d.id = #{deviceId}
+        order by ddc.id desc
+    </select>
+
+    <select id="deleteDataConfig" resultType="integer">
+        SELECT ddc.id
+        FROM device d
+                 left join structure_item_parameter ip on not FIND_IN_SET(ip.id, d.ins_product_ids)
+                 inner join device_data_config ddc on ddc.device_id = d.id and ddc.structure_item_parameter_id = ip.id
+    </select>
+    <select id="getNoConfigProduct" resultType="com.ruoyi.device.pojo.DataConfig">
+        SELECT d.id device_id,
+               ip.inspection_item,
+               ip.inspection_item_class,
+               ip.inspection_item_subclass                          ,
+               ip.sample,
+               ip.id                                                                          structureItemParameterId,
+               ddc.id
+        FROM structure_item_parameter ip
+                 left join device d on FIND_IN_SET(d.id, ip.device_ids)
+                 left join device_data_config ddc on ddc.device_id = d.id and ddc.structure_item_parameter_id = ip.id
+        where d.id = #{deviceId}
+          and ddc.id is null
+        order by ip.sample
+    </select>
+</mapper>
diff --git a/cnas-device/src/main/resources/mapper/DeviceAcceptanceMapper.xml b/cnas-device/src/main/resources/mapper/DeviceAcceptanceMapper.xml
new file mode 100644
index 0000000..45071c4
--- /dev/null
+++ b/cnas-device/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.ruoyi.device.mapper.DeviceAcceptanceMapper">
+
+    <!-- 璁惧楠屾敹鍒楄〃 -->
+    <select id="pageDeviceAcceptance" resultType="com.ruoyi.device.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-device/src/main/resources/mapper/DeviceAccidentReportMapper.xml b/cnas-device/src/main/resources/mapper/DeviceAccidentReportMapper.xml
new file mode 100644
index 0000000..2bbfce0
--- /dev/null
+++ b/cnas-device/src/main/resources/mapper/DeviceAccidentReportMapper.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.device.mapper.DeviceAccidentReportMapper">
+
+    <!-- 璁惧浜嬫晠鎶ュ憡鍒楄〃 -->
+    <select id="pageDeviceAccidentReport" resultType="com.ruoyi.device.pojo.DeviceAccidentReport">
+        select * from (
+        select *
+        from device_accident_report
+        order by create_time desc
+        ) a
+        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
+            ${ew.customSqlSegment}
+        </if>
+    </select>
+    <select id="selectDeviceAccidentReportById" resultType="com.ruoyi.device.dto.DeviceAccidentReportDto">
+        select
+            d.*,
+            date_format(d.accident_date,'%Y-%m-%d') accidentDateStr, -- 鏃堕棿
+            date_format(d.report_date,'%Y-%m-%d') reportDateStr, -- 鎶ュ憡浜哄~鍐欐椂闂�
+            date_format(d.assessor_date,'%Y-%m-%d') assessorDateStr, -- 璇勪及浜哄~鍐欐椂闂�
+            date_format(d.department_head_date,'%Y-%m-%d') departmentHeadDateStr, -- 閮ㄩ棬璐熻矗浜哄~鍐欐椂闂�
+            date_format(d.technical_director_date,'%Y-%m-%d') technicalDirectorDateStr, -- 鎶�鏈礋璐d汉濉啓鏃堕棿
+            date_format(d.director_head_date,'%Y-%m-%d') directorHeadDateStr -- 涓讳换濉啓鏃堕棿
+        from device_accident_report d
+        where d.accident_report_id = #{accidentReportId}
+    </select>
+
+</mapper>
diff --git a/cnas-device/src/main/resources/mapper/DeviceBorrowMapper.xml b/cnas-device/src/main/resources/mapper/DeviceBorrowMapper.xml
new file mode 100644
index 0000000..4b62f5b
--- /dev/null
+++ b/cnas-device/src/main/resources/mapper/DeviceBorrowMapper.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.device.mapper.DeviceBorrowMapper">
+
+    <select id="deviceBorrowPage" resultType="com.ruoyi.device.pojo.DeviceBorrow">
+        select * from (
+        select db.*,device_name
+        from device_borrow db
+        left join 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.ruoyi.device.pojo.DeviceBorrow">
+        select db.*,device_name
+        from device_borrow db
+                 left join device on db.device_id=device.id
+        where device_id=#{deviceId}
+    </select>
+</mapper>
diff --git a/cnas-device/src/main/resources/mapper/DeviceBreakdownMaintenanceMapper.xml b/cnas-device/src/main/resources/mapper/DeviceBreakdownMaintenanceMapper.xml
new file mode 100644
index 0000000..4877ecf
--- /dev/null
+++ b/cnas-device/src/main/resources/mapper/DeviceBreakdownMaintenanceMapper.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.device.mapper.DeviceBreakdownMaintenanceMapper">
+
+    <!--璁惧鏁呴殰缁翠慨鍒楄〃-->
+    <select id="pageDeviceBreakdownMaintenance" resultType="com.ruoyi.device.dto.DeviceBreakdownMaintenance">
+        select * from (
+        select *
+        from device_breakdown_maintenance
+        order by create_time desc
+        ) a
+        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
+            ${ew.customSqlSegment}
+        </if>
+    </select>
+
+</mapper>
diff --git a/cnas-device/src/main/resources/mapper/DeviceCalibrationPlanDetailMapper.xml b/cnas-device/src/main/resources/mapper/DeviceCalibrationPlanDetailMapper.xml
new file mode 100644
index 0000000..d6bce8c
--- /dev/null
+++ b/cnas-device/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.ruoyi.device.mapper.DeviceCalibrationPlanDetailMapper">
+
+    <!-- 璁惧鏍″噯璁″垝璇︽儏鍒楄〃 -->
+    <select id="pageDeviceCalibrationPlanDetail" resultType="com.ruoyi.device.pojo.DeviceCalibrationPlanDetail">
+        select * from (
+        select *
+        from device_calibration_plan_detail
+        order by plan_date asc
+        ) a
+        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
+            ${ew.customSqlSegment}
+        </if>
+    </select>
+
+</mapper>
diff --git a/cnas-device/src/main/resources/mapper/DeviceCalibrationPlanMapper.xml b/cnas-device/src/main/resources/mapper/DeviceCalibrationPlanMapper.xml
new file mode 100644
index 0000000..bf7cf39
--- /dev/null
+++ b/cnas-device/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.ruoyi.device.mapper.DeviceCalibrationPlanMapper">
+
+    <!-- 璁惧鏍″噯璁″垝鍒楄〃 -->
+    <select id="pageDeviceCalibrationPlan" resultType="com.ruoyi.device.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-device/src/main/resources/mapper/DeviceExaminePlanDetailsMapper.xml b/cnas-device/src/main/resources/mapper/DeviceExaminePlanDetailsMapper.xml
new file mode 100644
index 0000000..9eb714c
--- /dev/null
+++ b/cnas-device/src/main/resources/mapper/DeviceExaminePlanDetailsMapper.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.device.mapper.DeviceExaminePlanDetailsMapper">
+
+
+    <!--璁惧鏍告煡璁″垝璇︽儏鍒楄〃-->
+    <select id="pageDeviceExaminePlanDetail" resultType="com.ruoyi.device.dto.DeviceExaminePlanDetailsDto">
+        select * from (
+        select
+            d.plan_details_id,
+            d.plan_id,
+            d.device_id,
+            d.device_number,
+            d.device_name,
+            d.check_time,
+            d.check_index,
+            d.check_method,
+            d.how_results,
+            d.check_charger_user_id,
+            CASE WHEN d.check_charger_user='' or d.check_charger_user is null THEN u.name
+                ELSE d.check_charger_user END AS check_charger_user,
+            d.remark,
+            d.create_user,
+            d.create_time,
+            d.update_user,
+            d.update_time,
+        CASE
+        WHEN dc.review_status = 0 THEN 3
+        WHEN dc.review_status = 1 THEN 2
+        WHEN dc.record_id IS NOT NULL THEN 1
+        ELSE 0 END record_status,
+        CASE
+        WHEN dd.review_status = 0 THEN 3
+        WHEN dd.review_status = 1 THEN 2
+        WHEN dd.record_contrast_id IS NOT NULL THEN 1
+        ELSE 0 END record_contrast_status
+        from device_examine_plan_details d
+        left join user u on u.id = d.check_charger_user_id
+        left join device_examine_record dc on d.plan_details_id = dc.plan_details_id
+        left join device_examine_record_contrast dd on dd.plan_details_id = dc.plan_details_id
+        order by check_time asc
+        ) a
+        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
+            ${ew.customSqlSegment}
+        </if>
+    </select>
+
+</mapper>
diff --git a/cnas-device/src/main/resources/mapper/DeviceExaminePlanMapper.xml b/cnas-device/src/main/resources/mapper/DeviceExaminePlanMapper.xml
new file mode 100644
index 0000000..cf4b0ae
--- /dev/null
+++ b/cnas-device/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.ruoyi.device.mapper.DeviceExaminePlanMapper">
+
+    <!-- 璁惧鏍告煡璁″垝鍒楄〃 -->
+    <select id="deviceExaminePlanDetailsMapper" resultType="com.ruoyi.device.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.ruoyi.device.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-device/src/main/resources/mapper/DeviceExamineRecordContrastMapper.xml b/cnas-device/src/main/resources/mapper/DeviceExamineRecordContrastMapper.xml
new file mode 100644
index 0000000..e41b339
--- /dev/null
+++ b/cnas-device/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.ruoyi.device.mapper.DeviceExamineRecordContrastMapper">
+
+    <!-- 鏌ヨ鏍告煡瀵规瘮璁板綍 -->
+    <select id="getExamineRecordContrast" resultType="com.ruoyi.device.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.ruoyi.device.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-device/src/main/resources/mapper/DeviceExamineRecordMapper.xml b/cnas-device/src/main/resources/mapper/DeviceExamineRecordMapper.xml
new file mode 100644
index 0000000..4dd397b
--- /dev/null
+++ b/cnas-device/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.ruoyi.device.mapper.DeviceExamineRecordMapper">
+
+    <select id="getExamineRecord" resultType="com.ruoyi.device.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.ruoyi.device.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-device/src/main/resources/mapper/DeviceExternalApplyMapper.xml b/cnas-device/src/main/resources/mapper/DeviceExternalApplyMapper.xml
new file mode 100644
index 0000000..b3419fb
--- /dev/null
+++ b/cnas-device/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.ruoyi.device.mapper.DeviceExternalApplyMapper">
+
+    <!--鍒╃敤澶栭儴璁惧鐢宠鍒楄〃-->
+    <select id="pageDeviceExternalApply" resultType="com.ruoyi.device.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.ruoyi.device.pojo.DeviceExternalApply">
+        select
+            dea.*
+        from device_external_apply dea
+        where dea.external_apply_id = #{externalApplyId}
+    </select>
+
+</mapper>
diff --git a/cnas-device/src/main/resources/mapper/DeviceImpowerDetailsMapper.xml b/cnas-device/src/main/resources/mapper/DeviceImpowerDetailsMapper.xml
new file mode 100644
index 0000000..18b36c6
--- /dev/null
+++ b/cnas-device/src/main/resources/mapper/DeviceImpowerDetailsMapper.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.ruoyi.device.mapper.DeviceImpowerDetailsMapper">
+
+    <!-- 鏌ヨ璁惧浣跨敤璇︽儏 -->
+    <select id="deviceImpowerDetailsList" resultType="com.ruoyi.device.dto.DeviceImpowerDetailsDto">
+        select
+            did.*,
+            d.device_name,
+            d.specification_model,
+            d.management_number
+        from device_impower_details did
+                 left join device d on did.device_id = d.id
+        where did.impower_id = #{impowerId}
+    </select>
+</mapper>
diff --git a/cnas-device/src/main/resources/mapper/DeviceImpowerMapper.xml b/cnas-device/src/main/resources/mapper/DeviceImpowerMapper.xml
new file mode 100644
index 0000000..dc9a454
--- /dev/null
+++ b/cnas-device/src/main/resources/mapper/DeviceImpowerMapper.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.device.mapper.DeviceImpowerMapper">
+
+
+    <select id="selectDeviceParameterPage" resultType="com.ruoyi.device.pojo.DeviceImpower">
+        select
+        *
+        from device_impower
+        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
+            ${ew.customSqlSegment}
+        </if>
+    </select>
+</mapper>
diff --git a/cnas-device/src/main/resources/mapper/DeviceInspectionRecordMapper.xml b/cnas-device/src/main/resources/mapper/DeviceInspectionRecordMapper.xml
new file mode 100644
index 0000000..8540d74
--- /dev/null
+++ b/cnas-device/src/main/resources/mapper/DeviceInspectionRecordMapper.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.device.mapper.DeviceInspectionRecordMapper">
+
+
+    <select id="selectDeviceParameterPage" resultType="com.ruoyi.device.pojo.DeviceInspectionRecord">
+        select * from ( SELECT *
+        from device_inspection_record ) a
+        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
+            ${ew.customSqlSegment}
+        </if>
+    </select>
+</mapper>
diff --git a/cnas-device/src/main/resources/mapper/DeviceMaintenanceMapper.xml b/cnas-device/src/main/resources/mapper/DeviceMaintenanceMapper.xml
new file mode 100644
index 0000000..b6ab4cc
--- /dev/null
+++ b/cnas-device/src/main/resources/mapper/DeviceMaintenanceMapper.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.ruoyi.device.mapper.DeviceMaintenanceMapper">
+
+
+    <!-- 璁惧缁存姢鍒嗛〉鏌ヨ -->
+    <select id="selectDeviceMaintenancePage" resultType="com.ruoyi.device.dto.DeviceMaintenanceDto">
+        select * from (
+        select db.*,
+        d.device_name,
+        d.management_number
+        from device_maintenance db
+        left join device d on db.device_id = d.id)a
+        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
+            ${ew.customSqlSegment}
+        </if>
+        order by maintenance_date desc
+    </select>
+</mapper>
diff --git a/cnas-device/src/main/resources/mapper/DeviceMaintenancePlanDetailsMapper.xml b/cnas-device/src/main/resources/mapper/DeviceMaintenancePlanDetailsMapper.xml
new file mode 100644
index 0000000..aeb49ce
--- /dev/null
+++ b/cnas-device/src/main/resources/mapper/DeviceMaintenancePlanDetailsMapper.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.ruoyi.device.mapper.DeviceMaintenancePlanDetailsMapper">
+
+
+    <select id="deviceInspectionRecordDetailsList"
+            resultType="com.ruoyi.device.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-device/src/main/resources/mapper/DeviceMaintenancePlanMapper.xml b/cnas-device/src/main/resources/mapper/DeviceMaintenancePlanMapper.xml
new file mode 100644
index 0000000..2f8aac5
--- /dev/null
+++ b/cnas-device/src/main/resources/mapper/DeviceMaintenancePlanMapper.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.ruoyi.device.mapper.DeviceMaintenancePlanMapper">
+
+    <!-- 鏍规嵁璁惧id鏌ヨ璁惧鐨勪繚鍏昏鍒� -->
+    <select id="selectDeviceParameterPage" resultType="com.ruoyi.device.pojo.DeviceMaintenancePlan">
+        select
+            *
+        from device_maintenance_plan
+        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
+            ${ew.customSqlSegment}
+        </if>
+    </select>
+    <select id="selectMaintenancePlanById" resultType="com.ruoyi.device.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-device/src/main/resources/mapper/DeviceMapper.xml b/cnas-device/src/main/resources/mapper/DeviceMapper.xml
new file mode 100644
index 0000000..5460a17
--- /dev/null
+++ b/cnas-device/src/main/resources/mapper/DeviceMapper.xml
@@ -0,0 +1,196 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.device.mapper.DeviceMapper">
+    <select id="selectDeviceParameter" resultType="com.ruoyi.device.pojo.Device">
+        select * from(
+        select id,
+        large_category,
+        date_production,
+        equipment_manager,
+        authorized_person,
+        device_name,
+        internal_code,
+        asset_code,
+        calibration_date,
+        scrap_time,
+        acceptance_records,
+        subclass,
+        factory_no,
+        acquisition_date,
+        accurate_measurement,
+        specification_model,
+        device_status,
+        storage_point,
+        activation_date,
+        latest_traceability,
+        down_time,
+        maintenance_records,
+        manufacturer,
+        detection_type,
+        _costs,
+        calibration_certicate,
+        create_user,
+        create_time,
+        update_user,
+        update_time,
+        status
+        from device
+        ) a
+        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
+            ${ew.customSqlSegment}
+        </if>
+    </select>
+    <select id="selectEquipmentOverview" resultType="com.ruoyi.device.pojo.Device">
+        select * from(
+        select id,
+        device_name,
+        specification_model,
+        device_status,
+        create_user,
+        status,
+        update_time
+        from device
+        ) a
+        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
+            ${ew.customSqlSegment}
+        </if>
+    </select>
+    <select id="authorizedPerson" resultType="com.ruoyi.device.pojo.Device">
+        select id,
+               authorized_person
+        from device
+    </select>
+    <select id="search" resultType="com.ruoyi.device.pojo.Device">
+        select *
+        from device
+        <where>
+            <if test="deviceName!=null and deviceName!=''">
+                and device_name like concat('%',#{deviceName},'%')
+            </if>
+            <if test="status!=null and status!=''">
+                and device_status = status
+            </if>
+            <if test="specificationModel!=null and specificationModel!= ''">
+                and specification_model = #{specificationModel}
+            </if>
+            <if test="largeCategory!=null">
+                and large_category = #{largeCategory}
+            </if>
+            <if test="largeCategory == 'null'">
+                and (large_category = '' or large_category is null)
+            </if>
+        </where>
+    </select>
+
+    <select id="selectDeviceImage" resultType="com.ruoyi.device.pojo.Device">
+        select (image_upload, create_user, create_time) values (#{image_upload}
+             , #{createUser}
+             , #{createTime})
+    </select>
+
+    <select id="selectDeviceParameterPage" resultType="com.ruoyi.device.dto.DeviceDto">
+        select * from(
+        SELECT
+        d.*,
+        cmr.calibration_date as last_calibration_date_two,
+        cmr.next_calibration_date as next_calibration_date_two,
+        GROUP_CONCAT(distinct inspection_item SEPARATOR ';') AS insProductItem,
+        u.name ,
+        sd.dept_name AS laboratory_name
+        FROM
+        device d
+        LEFT JOIN `user` u ON u.id = d.equipment_manager
+        LEFT JOIN sys_dept sd ON sd.dept_id = d.subordinate_departments_id AND sd.del_flag = '0'
+        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">
+                sd.dept_name is null
+            </if>
+            AND cmr.type = 'calibrate' or cmr.type is null or cmr.type = ''
+        </where>
+        GROUP BY
+        d.id,
+        u.name, sd.dept_name
+        ) a
+        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
+            ${ew.customSqlSegment}
+        </if>
+    </select>
+
+    <select id="getInspectionItemSubclass" resultType="map">
+        SELECT ip.inspection_item,
+               if(ip.inspection_item_subclass is not null and ip.inspection_item_subclass != '',
+                  ip.inspection_item_subclass, ip.inspection_item) inspection_item_subclass
+        FROM ins_product ip
+        where ip.ins_sample_id = #{id}
+    </select>
+    <resultMap id="treeDeviceDto" type="map">
+        <result property="label" column="laboratory_name"/>
+        <result property="value" column="value" />
+        <collection property="children" resultMap="storagePointMap" javaType="List"/>
+    </resultMap>
+
+    <resultMap id="storagePointMap" type="map">
+        <result property="value" column="value"/>
+        <result property="label" column="storage_point"/>
+        <collection property="children" resultMap="deviceNameMap" javaType="List"/>
+    </resultMap>
+
+    <resultMap id="deviceNameMap" type="map">
+        <result property="value" column="id"/>
+        <result property="label" column="device_name"/>
+        <result property="activationDate" column="activation_date"/>
+        <result property="managementNumber" column="management_number"/>
+    </resultMap>
+
+    <select id="treeDevice" resultMap="treeDeviceDto">
+        select
+        d.id,
+        case when sd.dept_name is null || sd.dept_name ='' then '鍏朵粬' else sd.dept_name end as laboratory_name,
+        case when d.storage_point is null || d.storage_point ='' then '鍏朵粬' else d.storage_point end as storage_point,
+        d.device_name,
+        d.management_number,
+        null as value,
+        d.activation_date
+        from device d
+        LEFT JOIN sys_dept sd ON sd.dept_id = d.subordinate_departments_id AND sd.del_flag = '0'
+        <where>
+            <if test="deviceName!=null and deviceName!=''">
+                and device_name like concat('%',#{deviceName},'%')
+            </if>
+        </where>
+    </select>
+
+    <select id="selectDeviceByCode" resultType="com.ruoyi.device.dto.DeviceDto">
+        SELECT d.*,
+               GROUP_CONCAT(DISTINCT inspection_item SEPARATOR ';') AS ins_product_item,
+               sd.dept_name AS laboratory_name,
+               u1.name                                                 equipmentManager_name,
+               u2.name                                                 authorized_person_name
+        FROM device d
+                 LEFT JOIN structure_item_parameter sip ON FIND_IN_SET(sip.id, d.ins_product_ids)
+                 LEFT JOIN sys_dept sd ON d.subordinate_departments_id = sd.dept_id AND sd.del_flag = '0'
+                 LEFT JOIN user u1 ON u1.id = d.equipment_manager
+                 LEFT JOIN user u2 ON u2.id = d.authorized_person
+        WHERE d.id = #{id}
+
+        GROUP BY d.id,
+                 sd.dept_name,
+                 u1.name,
+                 u2.name
+    </select>
+
+    <!-- 鏌ヨ鍒拌揪鏍″噯鏈夋晥鏈熺殑璁惧-鎻愬墠5澶� -->
+    <select id="selectOverdueDevice" resultType="com.ruoyi.device.pojo.Device">
+        SELECT *
+        FROM device
+        WHERE
+        -- 绛涢�夊嚭 activation_date 鍦ㄥ綋鍓嶆棩鏈熷墠浜斿ぉ鍐呯殑鏁版嵁
+        activation_date BETWEEN now() AND now() + INTERVAL 5 DAY
+        -- 绛涢�夊嚭 activation_date 宸茬粡瓒呰繃褰撳墠鏃ユ湡鐨勬暟鎹�
+        OR activation_date &lt; now()
+    </select>
+</mapper>
diff --git a/cnas-device/src/main/resources/mapper/DeviceScrappedMapper.xml b/cnas-device/src/main/resources/mapper/DeviceScrappedMapper.xml
new file mode 100644
index 0000000..9bc7595
--- /dev/null
+++ b/cnas-device/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.ruoyi.device.mapper.DeviceScrappedMapper">
+
+    <!-- 璁惧鎶ュ簾鐢宠鍒楄〃 -->
+    <select id="pageDeviceScrapped" resultType="com.ruoyi.device.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.ruoyi.device.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-device/src/main/resources/mapper/DeviceStateMapper.xml b/cnas-device/src/main/resources/mapper/DeviceStateMapper.xml
new file mode 100644
index 0000000..3423111
--- /dev/null
+++ b/cnas-device/src/main/resources/mapper/DeviceStateMapper.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.device.mapper.DeviceStateMapper">
+
+
+    <select id="getDeviceStatePage" resultType="com.ruoyi.device.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-device/src/main/resources/mapper/DeviceTraceabilityManagementDetailsMapper.xml b/cnas-device/src/main/resources/mapper/DeviceTraceabilityManagementDetailsMapper.xml
new file mode 100644
index 0000000..6fc4960
--- /dev/null
+++ b/cnas-device/src/main/resources/mapper/DeviceTraceabilityManagementDetailsMapper.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.device.mapper.DeviceTraceabilityManagementDetailsMapper">
+
+    <select id="deviceTraceabilityManagementDetailsList"
+            resultType="com.ruoyi.device.dto.DeviceTraceabilityManagementDetailsDto">
+        select
+            dtmd.*,
+            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-device/src/main/resources/mapper/DeviceTraceabilityManagementMapper.xml b/cnas-device/src/main/resources/mapper/DeviceTraceabilityManagementMapper.xml
new file mode 100644
index 0000000..cf7c861
--- /dev/null
+++ b/cnas-device/src/main/resources/mapper/DeviceTraceabilityManagementMapper.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.ruoyi.device.mapper.DeviceTraceabilityManagementMapper">
+
+    <select id="selectDeviceParameterPage" resultType="com.ruoyi.device.pojo.DeviceTraceabilityManagement">
+        select
+        *
+        from device_traceability_management
+        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
+            ${ew.customSqlSegment}
+        </if>
+    </select>
+    <select id="selectDeviceTraceabilityManagementById"
+            resultType="com.ruoyi.device.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-device/src/main/resources/mapper/InsOrderDeviceRecordMapper.xml b/cnas-device/src/main/resources/mapper/InsOrderDeviceRecordMapper.xml
new file mode 100644
index 0000000..8a5e3cf
--- /dev/null
+++ b/cnas-device/src/main/resources/mapper/InsOrderDeviceRecordMapper.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.device.mapper.DeviceRecordMapper">
+
+    <select id="deviceRecordPage" resultType="com.ruoyi.device.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.ruoyi.device.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.ruoyi.device.dto.DeviceRecordDto">
+        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>
+        ORDER BY dr.use_start_date asc
+    </select>
+</mapper>
diff --git a/cnas-device/src/main/resources/mapper/InstructionMapper.xml b/cnas-device/src/main/resources/mapper/InstructionMapper.xml
new file mode 100644
index 0000000..8404014
--- /dev/null
+++ b/cnas-device/src/main/resources/mapper/InstructionMapper.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.ruoyi.device.mapper.InstructionMapper">
+    <select id="pageByPageQueryOfHomeworkInstructions" resultType="com.ruoyi.device.dto.DeviceOperationInstructionDto">
+        SELECT
+        doi.*,di.*,
+        d.device_name deviceName,
+        d.management_number deviceNumber,
+        d.specification_model deviceModel,
+        u.name uploaderName,
+        u1.name approverName
+        FROM
+        device_operation_instruction doi
+        LEFT JOIN device_instruction di ON di.id = doi.instruction_id
+        left join device d on d.id = doi.device_id
+        left join user u on u.id = doi.uploader
+        left join user u1 on u1.id = doi.approver_id
+        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
+            ${ew.customSqlSegment}
+        </if>
+    </select>
+</mapper>
diff --git a/cnas-device/src/main/resources/mapper/OperationInstructionMapper.xml b/cnas-device/src/main/resources/mapper/OperationInstructionMapper.xml
new file mode 100644
index 0000000..5679e35
--- /dev/null
+++ b/cnas-device/src/main/resources/mapper/OperationInstructionMapper.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.device.mapper.OperationInstructionMapper">
+
+    <select id="homeworkGuidebookEditor" resultType="com.ruoyi.device.dto.DeviceOperationInstructionDto">
+        SELECT
+            doi.*,d.device_name, d.management_number device_number, d.specification_model device_model
+        FROM
+            device_operation_instruction doi
+                left join device d on d.id = doi.device_id
+        where doi.instruction_id = #{instructionId}
+    </select>
+</mapper>
diff --git a/cnas-device/src/main/resources/static/word/acceptance-certificate.docx b/cnas-device/src/main/resources/static/word/acceptance-certificate.docx
new file mode 100644
index 0000000..c4412dd
--- /dev/null
+++ b/cnas-device/src/main/resources/static/word/acceptance-certificate.docx
Binary files differ
diff --git a/cnas-device/src/main/resources/static/word/device-accident-report.docx b/cnas-device/src/main/resources/static/word/device-accident-report.docx
new file mode 100644
index 0000000..6263ba9
--- /dev/null
+++ b/cnas-device/src/main/resources/static/word/device-accident-report.docx
Binary files differ
diff --git a/cnas-device/src/main/resources/static/word/device-breakdown-maintenance.docx b/cnas-device/src/main/resources/static/word/device-breakdown-maintenance.docx
new file mode 100644
index 0000000..595edc5
--- /dev/null
+++ b/cnas-device/src/main/resources/static/word/device-breakdown-maintenance.docx
Binary files differ
diff --git a/cnas-device/src/main/resources/static/word/device-calibration-plan.docx b/cnas-device/src/main/resources/static/word/device-calibration-plan.docx
new file mode 100644
index 0000000..fc32f72
--- /dev/null
+++ b/cnas-device/src/main/resources/static/word/device-calibration-plan.docx
Binary files differ
diff --git a/cnas-device/src/main/resources/static/word/device-document.docx b/cnas-device/src/main/resources/static/word/device-document.docx
new file mode 100644
index 0000000..d9e1d51
--- /dev/null
+++ b/cnas-device/src/main/resources/static/word/device-document.docx
Binary files differ
diff --git a/cnas-device/src/main/resources/static/word/device-external-apply.docx b/cnas-device/src/main/resources/static/word/device-external-apply.docx
new file mode 100644
index 0000000..8df765b
--- /dev/null
+++ b/cnas-device/src/main/resources/static/word/device-external-apply.docx
Binary files differ
diff --git a/cnas-device/src/main/resources/static/word/device-impower.docx b/cnas-device/src/main/resources/static/word/device-impower.docx
new file mode 100644
index 0000000..a1275a8
--- /dev/null
+++ b/cnas-device/src/main/resources/static/word/device-impower.docx
Binary files differ
diff --git a/cnas-device/src/main/resources/static/word/device-inspection-record.docx b/cnas-device/src/main/resources/static/word/device-inspection-record.docx
new file mode 100644
index 0000000..2c7a4f4
--- /dev/null
+++ b/cnas-device/src/main/resources/static/word/device-inspection-record.docx
Binary files differ
diff --git a/cnas-device/src/main/resources/static/word/device-maintenance.docx b/cnas-device/src/main/resources/static/word/device-maintenance.docx
new file mode 100644
index 0000000..267a258
--- /dev/null
+++ b/cnas-device/src/main/resources/static/word/device-maintenance.docx
Binary files differ
diff --git a/cnas-device/src/main/resources/static/word/device-scrapped.docx b/cnas-device/src/main/resources/static/word/device-scrapped.docx
new file mode 100644
index 0000000..96dfdd8
--- /dev/null
+++ b/cnas-device/src/main/resources/static/word/device-scrapped.docx
Binary files differ
diff --git a/cnas-device/src/main/resources/static/word/device-status.docx b/cnas-device/src/main/resources/static/word/device-status.docx
new file mode 100644
index 0000000..5753f22
--- /dev/null
+++ b/cnas-device/src/main/resources/static/word/device-status.docx
Binary files differ
diff --git a/cnas-device/src/main/resources/static/word/examine-plan-detail.docx b/cnas-device/src/main/resources/static/word/examine-plan-detail.docx
new file mode 100644
index 0000000..118c324
--- /dev/null
+++ b/cnas-device/src/main/resources/static/word/examine-plan-detail.docx
Binary files differ
diff --git a/cnas-device/src/main/resources/static/word/examine-record.docx b/cnas-device/src/main/resources/static/word/examine-record.docx
new file mode 100644
index 0000000..2462971
--- /dev/null
+++ b/cnas-device/src/main/resources/static/word/examine-record.docx
Binary files differ
diff --git a/cnas-device/src/main/resources/static/word/incident-report.docx b/cnas-device/src/main/resources/static/word/incident-report.docx
new file mode 100644
index 0000000..c190287
--- /dev/null
+++ b/cnas-device/src/main/resources/static/word/incident-report.docx
Binary files differ
diff --git a/cnas-device/src/main/resources/static/word/maintenance-plan.docx b/cnas-device/src/main/resources/static/word/maintenance-plan.docx
new file mode 100644
index 0000000..d4e69a0
--- /dev/null
+++ b/cnas-device/src/main/resources/static/word/maintenance-plan.docx
Binary files differ
diff --git a/cnas-device/src/main/resources/static/word/maintenance-records.docx b/cnas-device/src/main/resources/static/word/maintenance-records.docx
new file mode 100644
index 0000000..ba8c9f8
--- /dev/null
+++ b/cnas-device/src/main/resources/static/word/maintenance-records.docx
Binary files differ
diff --git a/cnas-device/src/main/resources/static/word/quipment-details.docx b/cnas-device/src/main/resources/static/word/quipment-details.docx
new file mode 100644
index 0000000..d244180
--- /dev/null
+++ b/cnas-device/src/main/resources/static/word/quipment-details.docx
Binary files differ
diff --git a/cnas-device/src/main/resources/static/word/review-examine-record-contrast.docx b/cnas-device/src/main/resources/static/word/review-examine-record-contrast.docx
new file mode 100644
index 0000000..dd48c97
--- /dev/null
+++ b/cnas-device/src/main/resources/static/word/review-examine-record-contrast.docx
Binary files differ
diff --git a/cnas-device/src/main/resources/static/word/traceability-management-details.docx b/cnas-device/src/main/resources/static/word/traceability-management-details.docx
new file mode 100644
index 0000000..cb6d3b9
--- /dev/null
+++ b/cnas-device/src/main/resources/static/word/traceability-management-details.docx
Binary files differ
diff --git a/cnas-device/src/main/resources/static/word/use-record.docx b/cnas-device/src/main/resources/static/word/use-record.docx
new file mode 100644
index 0000000..00632d7
--- /dev/null
+++ b/cnas-device/src/main/resources/static/word/use-record.docx
Binary files differ
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/controller/ClientSatisfactionController.java b/cnas-manage/src/main/java/com/ruoyi/manage/controller/ClientSatisfactionController.java
new file mode 100644
index 0000000..b5b0102
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/controller/ClientSatisfactionController.java
@@ -0,0 +1,140 @@
+package com.ruoyi.manage.controller;
+
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.common.utils.JackSonUtil;
+import com.ruoyi.manage.mapper.ClientSatisfactionAnalyseFileMapper;
+import com.ruoyi.manage.pojo.ClientSatisfaction;
+import com.ruoyi.manage.pojo.ClientSatisfactionAnalyseFile;
+import com.ruoyi.manage.service.ClientSatisfactionService;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import jakarta.servlet.http.HttpServletResponse;
+import java.util.Map;
+
+
+/**
+ * 瀹㈡埛婊℃剰搴�
+ *
+ * @author zhuo
+ * @since 2024-11-09
+ */
+@Tag(name = "瀹㈡埛婊℃剰搴﹁皟鏌�")
+@AllArgsConstructor
+@RestController
+@RequestMapping("/clientSatisfaction")
+public class ClientSatisfactionController {
+
+    private ClientSatisfactionService clientSatisfactionService;
+    private ClientSatisfactionAnalyseFileMapper clientSatisfactionAnalyseFileMapper;
+
+    /**
+     * 瀹㈡埛婊℃剰搴﹁皟鏌ュ垪琛�
+     * @param
+     * @return
+     */
+    @Operation(summary = "瀹㈡埛婊℃剰搴﹁皟鏌ュ垪琛�")
+    @GetMapping("/pageClientSatisfaction")
+    public Result<IPage<ClientSatisfaction>> pageClientSatisfaction(Page page,ClientSatisfaction clientSatisfaction) throws Exception {
+        return Result.success(clientSatisfactionService.pageClientSatisfaction(page, clientSatisfaction));
+    }
+
+    /**
+     * 瀹㈡埛婊℃剰搴﹁皟鏌ユ柊澧�
+     * @return
+     */
+    @Operation(summary = "瀹㈡埛婊℃剰搴﹁皟鏌ユ柊澧�")
+    @PostMapping("/addClientSatisfaction")
+    public Result addClientSatisfaction(@RequestBody ClientSatisfaction clientSatisfaction){
+        return Result.success(clientSatisfactionService.save(clientSatisfaction));
+    }
+
+    /**
+     * 瀹㈡埛婊℃剰搴﹁皟鏌ヤ慨鏀�
+     * @return
+     */
+    @Operation(summary = "瀹㈡埛婊℃剰搴﹁皟鏌ユ柊澧�")
+    @PostMapping("/updateClientSatisfaction")
+    public Result updateClientSatisfaction(@RequestBody ClientSatisfaction clientSatisfaction){
+        return Result.success(clientSatisfactionService.updateById(clientSatisfaction));
+    }
+
+    /**
+     * 瀹㈡埛婊℃剰搴﹁皟鏌ヤ慨鏀�
+     * @return
+     */
+
+    @Operation(summary = "瀹㈡埛婊℃剰搴﹁皟鏌ユ柊澧�")
+    @DeleteMapping("/delClientSatisfaction")
+    public Result updateClientSatisfaction(Integer clientSatisfactionId){
+        return Result.success(clientSatisfactionService.removeById(clientSatisfactionId));
+    }
+
+    /**
+     * 瀹㈡埛婊℃剰搴﹀鍑�
+     * @param clientSatisfactionId
+     * @param response
+     * @return
+     */
+
+    @Operation(summary = "瀹㈡埛婊℃剰瀵煎嚭")
+    @GetMapping("/exportWordClientSatisfaction")
+    public Result exportWordClientSatisfaction(Integer clientSatisfactionId, HttpServletResponse response){
+        clientSatisfactionService.exportWordClientSatisfaction(clientSatisfactionId, response);
+        return Result.success();
+    }
+
+    /**
+     * 纭瀹㈡埛婊℃剰搴�
+     * @param clientSatisfaction 瑕佷慨鏀瑰鎴锋弧鎰忓害鐨勭姸鎬佸璞�
+     * @param userId 淇敼浜篿d
+     */
+
+    @Operation(summary = "纭瀹㈡埛婊℃剰搴�")
+    @PostMapping("/confirmClientSatisfaction")
+    public void confirmClientSatisfaction(@RequestBody ClientSatisfaction clientSatisfaction, Integer userId){
+        clientSatisfactionService.confirmClientSatisfaction(clientSatisfaction, userId);
+    }
+
+    /**
+     * 鏂板瀹㈡埛鍒嗘瀽闄勪欢
+     * @param file
+     * @return
+     */
+
+    @Operation(summary = "鏂板鎴峰垎鏋愰檮浠�")
+    @PostMapping("/uploadAnalyseFile")
+    public Result<?> uploadAnalyseFile(MultipartFile file) {
+        return Result.success(clientSatisfactionService.uploadAnalyseFile(file));
+    }
+
+
+    /**
+     * 鏌ヨ鎴峰垎鏋愰檮浠�
+     * @return
+     */
+
+    @Operation(summary = "鏌ヨ鎴峰垎鏋愰檮浠�")
+    @GetMapping("/pageAnalyseFile")
+    public Result<IPage<ClientSatisfactionAnalyseFile>> pageAnalyseFile(Page page, ClientSatisfactionAnalyseFile analyseFile) {
+        return Result.success(clientSatisfactionService.pageAnalyseFile(page, analyseFile));
+    }
+
+    /**
+     * 鍒犻櫎鎴峰垎鏋愰檮浠�
+     * @return
+     */
+
+    @Operation(summary = "鍒犻櫎鎴峰垎鏋愰檮浠�")
+    @DeleteMapping("/delAnalyseFile")
+    public Result delAnalyseFile(Integer analyseFileId){
+        return Result.success(clientSatisfactionAnalyseFileMapper.deleteById(analyseFileId));
+    }
+}
+
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/controller/InternalCheckController.java b/cnas-manage/src/main/java/com/ruoyi/manage/controller/InternalCheckController.java
new file mode 100644
index 0000000..034cbc4
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/controller/InternalCheckController.java
@@ -0,0 +1,116 @@
+package com.ruoyi.manage.controller;
+
+
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.deepoove.poi.data.style.*;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.common.utils.JackSonUtil;
+import com.ruoyi.manage.dto.InternalCheckDto;
+import com.ruoyi.manage.pojo.InternalCheck;
+import com.ruoyi.manage.service.InternalCheckService;
+import com.deepoove.poi.data.style.*;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+
+import jakarta.servlet.http.HttpServletResponse;
+import java.util.Map;
+
+
+/**
+ * 鍐呭妫�鏌ヨ〃
+ *
+ * @author zhuo
+ * @since 2024-11-11
+ */
+@Tag(name = "鍐呭妫�鏌�")
+@AllArgsConstructor
+@RestController
+@RequestMapping("/internalCheck")
+public class InternalCheckController {
+
+    private InternalCheckService internalCheckService;
+
+    /**
+     * 鍐呭妫�鏌ュ垎椤垫煡璇�
+     * @param
+     * @return
+     */
+
+    @Operation(summary = "鍐呭妫�鏌ュ垎椤垫煡璇�")
+    @GetMapping("/pageInternalCheck")
+    public Result<IPage<InternalCheckDto>> pageInternalCheck(Page page,InternalCheck internalCheck) throws Exception {
+        return Result.success(internalCheckService.pageInternalCheck(page, internalCheck));
+    }
+
+    /**
+     * 鍐呭妫�鏌ユ柊澧�
+     * @return
+     */
+
+    @Operation(summary = "鍐呭妫�鏌ユ柊澧�")
+    @PostMapping("/addInternalCheck")
+    public Result addInternalCheck(@RequestBody InternalCheckDto internalCheck){
+        return Result.success(internalCheckService.addInternalCheck(internalCheck));
+    }
+
+    /**
+     * 鍐呭妫�鏌ヤ慨鏀�
+     * @return
+     */
+
+    @Operation(summary = "鍐呭妫�鏌ヤ慨鏀�")
+    @PostMapping("/updateInternalCheck")
+    public Result updateInternalCheck(@RequestBody InternalCheckDto internalCheck){
+        return Result.success(internalCheckService.updateInternalCheck(internalCheck));
+    }
+
+    /**
+     * 鍐呭妫�鏌ュ垹闄�
+     * @return
+     */
+
+    @Operation(summary = "鍐呭妫�鏌ュ垹闄�")
+    @DeleteMapping("/delInternalCheck")
+    public Result delInternalCheck(Integer checkId){
+        return Result.success(internalCheckService.delInternalCheck(checkId));
+    }
+
+    /**
+     * 鍐呭妫�鏌ユ煡鐪嬭鎯�
+     * @return
+     */
+
+    @Operation(summary = "鍐呭妫�鏌ユ煡鐪嬭鎯�")
+    @GetMapping("/getInternalCheckOne")
+    public Result<InternalCheckDto> getInternalCheckOne(Integer checkId){
+        return Result.success(internalCheckService.getInternalCheckOne(checkId));
+    }
+
+
+    /**
+     * 鍐呭妫�鏌ユ壒鍑�
+     * @return
+     */
+    @Operation(summary = "鍐呭妫�鏌ユ壒鍑�")
+    @PostMapping("/ratifyInternalCheck")
+    public Result ratifyInternalCheck(@RequestBody InternalCheckDto internalCheck){
+        return Result.success(internalCheckService.ratifyInternalCheck(internalCheck));
+    }
+
+    /**
+     * 瀵煎嚭鍐呭妫�鏌�
+     * @return
+     */
+
+    @Operation(summary = "瀵煎嚭鍐呭妫�鏌�")
+    @GetMapping("/exportInternalCheck")
+    public void exportInternalCheck(Integer checkId, HttpServletResponse response){
+        internalCheckService.exportInternalCheck(checkId, response);
+    }
+
+}
+
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/controller/InternalCorrectController.java b/cnas-manage/src/main/java/com/ruoyi/manage/controller/InternalCorrectController.java
new file mode 100644
index 0000000..a736d46
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/controller/InternalCorrectController.java
@@ -0,0 +1,119 @@
+package com.ruoyi.manage.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.deepoove.poi.data.style.*;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.common.utils.JackSonUtil;
+import com.ruoyi.manage.mapper.InternalCorrectFileMapper;
+import com.ruoyi.manage.pojo.InternalCorrect;
+import com.ruoyi.manage.pojo.InternalCorrectFile;
+import com.ruoyi.manage.service.InternalCorrectService;
+import com.deepoove.poi.data.style.*;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import jakarta.servlet.http.HttpServletResponse;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 鍐呭绠$悊绾犳澶勭悊琛� 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-13 04:00:15
+ */
+@Tag(name = "鍐呭绾犳鎺柦")
+@AllArgsConstructor
+@RestController
+@RequestMapping("/internalCorrect")
+public class InternalCorrectController {
+
+    private InternalCorrectService internalCorrectService;
+    private InternalCorrectFileMapper internalCorrectFileMapper;
+
+    /**
+     * 鏂板鍐呭绠$悊绾犳澶勭悊淇℃伅
+     * @return
+     */
+
+    @Operation(summary = "鏂板鍐呭绠$悊绾犳澶勭悊")
+    @PostMapping("/addInternalCorrect")
+    public Result addInternalCorrect(@RequestBody InternalCorrect internalCorrect){
+        return Result.success(internalCorrectService.addInternalCorrect(internalCorrect));
+    }
+
+    /**
+     * 鏌ヨ鍐呭绠$悊绾犳澶勭悊
+     * @return
+     */
+
+    @Operation(summary = "鏌ヨ鍐呭绠$悊绾犳澶勭悊")
+    @GetMapping("/getInternalCorrect")
+    public Result<InternalCorrect> getInternalCorrect(Integer correctId){
+        return Result.success(internalCorrectService.getInternalCorrect(correctId));
+    }
+
+    /**
+     * 鏌ヨ鍐呭绠$悊绾犳鎺柦鍒楄〃
+     * @return
+     */
+
+    @Operation(summary = "鏌ヨ鍐呭绠$悊绾犳鎺柦鍒楄〃")
+    @GetMapping("/pageInternalCorrect")
+    public Result<IPage<InternalCorrect>> pageInternalCorrect(Page page, InternalCorrect detailsCorrect) {
+        return Result.success(internalCorrectService.pageInternalCorrect(page, detailsCorrect));
+    }
+
+    /**
+     * 鏂板鍐呭绠$悊绾犳鎺柦闄勪欢
+     * @param correctId
+     * @param file
+     * @return
+     */
+
+    @Operation(summary = "鏂板鍐呭绠$悊绾犳鎺柦闄勪欢")
+    @PostMapping("/uploadInternalCorrectFile")
+    public Result<?> uploadInternalCorrectFile(Integer correctId, MultipartFile file) {
+        return Result.success(internalCorrectService.uploadInternalCorrectFile(correctId, file));
+    }
+
+
+    /**
+     * 鏌ヨ鍐呭绠$悊绾犳鎺柦闄勪欢
+     * @return
+     */
+
+    @Operation(summary = "鏌ヨ鍐呭绠$悊绾犳鎺柦闄勪欢")
+    @GetMapping("/getInternalCorrectFileList")
+    public Result<List<InternalCorrectFile>> getInternalCorrectFileList(Integer correctId){
+        return Result.success(internalCorrectService.getInternalCorrectFileList(correctId));
+    }
+
+    /**
+     * 鍒犻櫎鍐呭绠$悊绾犳鎺柦闄勪欢
+     * @return
+     */
+
+    @Operation(summary = "鍒犻櫎鍐呭绠$悊绾犳鎺柦闄勪欢")
+    @DeleteMapping("/delInternalCorrectFile")
+    public Result delInternalCorrectFile(Integer correctFileId){
+        return Result.success(internalCorrectFileMapper.deleteById(correctFileId));
+    }
+
+    /**
+     * 瀵煎嚭绾犳鎺柦
+     * @return
+     */
+
+    @Operation(summary = "瀵煎嚭绾犳鎺柦")
+    @GetMapping("/exportInternalCorrect")
+    public void exportInternalCorrect(Integer correctId, HttpServletResponse response){
+        internalCorrectService.exportInternalCorrect(correctId, response);
+    }
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/controller/InternalImplementController.java b/cnas-manage/src/main/java/com/ruoyi/manage/controller/InternalImplementController.java
new file mode 100644
index 0000000..cd7b1a0
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/controller/InternalImplementController.java
@@ -0,0 +1,117 @@
+package com.ruoyi.manage.controller;
+
+
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.deepoove.poi.data.style.*;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.common.utils.JackSonUtil;
+
+import com.ruoyi.manage.dto.InternalImplementDto;
+import com.ruoyi.manage.pojo.InternalImplement;
+import com.ruoyi.manage.service.InternalImplementService;
+import com.deepoove.poi.data.style.*;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+
+import jakarta.servlet.http.HttpServletResponse;
+import java.util.Map;
+
+
+/**
+ * 鍐呭瀹炴柦璁″垝
+ *
+ * @author zhuo
+ * @since 2024-11-11
+ */
+@Tag(name = "鍐呭瀹炴柦璁″垝")
+@AllArgsConstructor
+@RestController
+@RequestMapping("/internalImplement")
+public class InternalImplementController {
+
+    private InternalImplementService internalImplementService;
+
+    /**
+     * 鍐呭瀹炴柦璁″垝鍒嗛〉鏌ヨ
+     * @param
+     * @return
+     */
+
+    @Operation(summary = "鍐呭瀹炴柦璁″垝鍒嗛〉鏌ヨ")
+    @GetMapping("/pageInternalImplement")
+    public Result<IPage<InternalImplementDto>> pageInternalImplement(Page page,InternalImplement internalImplement) throws Exception {
+        return Result.success(internalImplementService.pageInternalImplement(page, internalImplement));
+    }
+
+    /**
+     * 鍐呭瀹炴柦璁″垝鏂板
+     * @return
+     */
+
+    @Operation(summary = "鍐呭瀹炴柦璁″垝鏂板")
+    @PostMapping("/addInternalImplement")
+    public Result addInternalImplement(@RequestBody InternalImplementDto internalImplement){
+        return Result.success(internalImplementService.addInternalImplement(internalImplement));
+    }
+
+    /**
+     * 鍐呭瀹炴柦璁″垝淇敼
+     * @return
+     */
+
+    @Operation(summary = "鍐呭瀹炴柦璁″垝淇敼")
+    @PostMapping("/updateInternalImplement")
+    public Result updateInternalImplement(@RequestBody InternalImplementDto internalImplement){
+        return Result.success(internalImplementService.updateInternalImplement(internalImplement));
+    }
+
+    /**
+     * 鍐呭瀹炴柦璁″垝鍒犻櫎
+     * @return
+     */
+
+    @Operation(summary = "鍐呭瀹炴柦璁″垝鍒犻櫎")
+    @DeleteMapping("/delInternalImplement")
+    public Result delInternalImplement(Integer implementId){
+        return Result.success(internalImplementService.delInternalImplement(implementId));
+    }
+
+    /**
+     * 鍐呭瀹炴柦璁″垝鏌ョ湅璇︽儏
+     * @return
+     */
+
+    @Operation(summary = "鍐呭瀹炴柦璁″垝鏌ョ湅璇︽儏")
+    @GetMapping("/getInternalImplementOne")
+    public Result<InternalImplementDto> getInternalImplementOne(Integer implementId){
+        return Result.success(internalImplementService.getInternalImplementOne(implementId));
+    }
+
+
+    /**
+     * 鍐呭瀹炴柦璁″垝鎵瑰噯
+     * @return
+     */
+    @Operation(summary = "鍐呭瀹炴柦璁″垝鎵瑰噯")
+    @PostMapping("/ratifyInternalImplement")
+    public Result ratifyInternalImplement(@RequestBody InternalImplementDto internalImplement){
+        return Result.success(internalImplementService.ratifyInternalImplement(internalImplement));
+    }
+
+    /**
+     * 瀵煎嚭鍐呭瀹炴柦璁″垝
+     * @return
+     */
+
+    @Operation(summary = "瀵煎嚭鍐呭瀹炴柦璁″垝")
+    @GetMapping("/exportInternalImplement")
+    public void exportInternalImplement(Integer implementId, HttpServletResponse response){
+        internalImplementService.exportInternalImplement(implementId, response);
+    }
+
+}
+
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/controller/InternalMeetingController.java b/cnas-manage/src/main/java/com/ruoyi/manage/controller/InternalMeetingController.java
new file mode 100644
index 0000000..e81c526
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/controller/InternalMeetingController.java
@@ -0,0 +1,103 @@
+package com.ruoyi.manage.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.deepoove.poi.data.style.*;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.common.utils.JackSonUtil;
+import com.ruoyi.manage.dto.InternalMeetingDto;
+import com.ruoyi.manage.pojo.InternalMeeting;
+import com.ruoyi.manage.service.InternalMeetingService;
+import com.deepoove.poi.data.style.*;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+
+import jakarta.servlet.http.HttpServletResponse;
+import java.util.Map;
+
+/**
+ * <p>
+ * 鍐呭浼氳琛� 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-12 02:50:44
+ */
+@Tag(name = "鍐呭浼氳")
+@AllArgsConstructor
+@RestController
+@RequestMapping("/internalMeeting")
+public class InternalMeetingController {
+
+    private InternalMeetingService internalMeetingService;
+
+    /**
+     * 鍐呭浼氳鍒嗛〉鏌ヨ
+     * @param
+     * @return
+     */
+
+    @Operation(summary = "鍐呭浼氳鍒嗛〉鏌ヨ")
+    @GetMapping("/pageInternalMeeting")
+    public Result<IPage<InternalMeetingDto>> pageInternalMeeting(Page page,InternalMeeting internalMeeting) throws Exception {
+        return Result.success(internalMeetingService.pageInternalMeeting(page, internalMeeting));
+    }
+
+    /**
+     * 鍐呭浼氳鏂板
+     * @return
+     */
+
+    @Operation(summary = "鍐呭浼氳鏂板")
+    @PostMapping("/addInternalMeeting")
+    public Result addInternalMeeting(@RequestBody InternalMeetingDto internalMeeting){
+        return Result.success(internalMeetingService.addInternalMeeting(internalMeeting));
+    }
+
+    /**
+     * 鍐呭浼氳淇敼
+     * @return
+     */
+
+    @Operation(summary = "鍐呭浼氳淇敼")
+    @PostMapping("/updateInternalMeeting")
+    public Result updateInternalMeeting(@RequestBody InternalMeetingDto internalMeeting){
+        return Result.success(internalMeetingService.updateInternalMeeting(internalMeeting));
+    }
+
+    /**
+     * 鍐呭浼氳鍒犻櫎
+     * @return
+     */
+
+    @Operation(summary = "鍐呭浼氳鍒犻櫎")
+    @DeleteMapping("/delInternalMeeting")
+    public Result delInternalMeeting(Integer meetingId){
+        return Result.success(internalMeetingService.delInternalMeeting(meetingId));
+    }
+
+    /**
+     * 鍐呭浼氳鏌ョ湅璇︽儏
+     * @return
+     */
+
+    @Operation(summary = "鍐呭浼氳鏌ョ湅璇︽儏")
+    @GetMapping("/getInternalMeetingOne")
+    public Result<InternalMeetingDto> getInternalMeetingOne(Integer meetingId){
+        return Result.success(internalMeetingService.getInternalMeetingOne(meetingId));
+    }
+
+    /**
+     * 瀵煎嚭鍐呭浼氳
+     * @return
+     */
+
+    @Operation(summary = "瀵煎嚭鍐呭浼氳")
+    @GetMapping("/exportInternalMeeting")
+    public void exportInternalMeeting(Integer meetingId, HttpServletResponse response){
+        internalMeetingService.exportInternalMeeting(meetingId, response);
+    }
+
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/controller/InternalPlanController.java b/cnas-manage/src/main/java/com/ruoyi/manage/controller/InternalPlanController.java
new file mode 100644
index 0000000..ff6c6cb
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/controller/InternalPlanController.java
@@ -0,0 +1,125 @@
+package com.ruoyi.manage.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.deepoove.poi.data.style.*;
+
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.common.utils.JackSonUtil;
+import com.ruoyi.manage.dto.InternalPlanDto;
+import com.ruoyi.manage.pojo.InternalPlan;
+import com.ruoyi.manage.service.InternalPlanService;
+import com.deepoove.poi.data.style.*;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+
+import jakarta.servlet.http.HttpServletResponse;
+import java.util.Map;
+
+/**
+ * <p>
+ * 鍐呭骞村害璁″垝 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 
+ * @since 2024-11-13 03:27:47
+ */
+@Tag(name = "鍐呭骞村害璁″垝")
+@AllArgsConstructor
+@RestController
+@RequestMapping("/internalPlan")
+public class InternalPlanController {
+
+
+    private InternalPlanService internalPlanService;
+
+    /**
+     * 鍐呭骞村害璁″垝鍒嗛〉鏌ヨ
+     * @param
+     * @return
+     */
+
+    @Operation(summary = "鍐呭骞村害璁″垝鍒嗛〉鏌ヨ")
+    @GetMapping("/pageInternalPlan")
+    public Result<IPage<InternalPlanDto>> pageInternalPlan(Page page,InternalPlan internalPlan) throws Exception {
+        return Result.success(internalPlanService.pageInternalPlan(page, internalPlan));
+    }
+
+    /**
+     * 鍐呭骞村害璁″垝鏂板
+     * @return
+     */
+
+    @Operation(summary = "鍐呭骞村害璁″垝鏂板")
+    @PostMapping("/addInternalPlan")
+    public Result addInternalPlan(@RequestBody InternalPlanDto internalPlan){
+        return Result.success(internalPlanService.addInternalPlan(internalPlan));
+    }
+
+    /**
+     * 鍐呭骞村害璁″垝淇敼
+     * @return
+     */
+
+    @Operation(summary = "鍐呭骞村害璁″垝淇敼")
+    @PostMapping("/updateInternalPlan")
+    public Result updateInternalPlan(@RequestBody InternalPlanDto internalPlan){
+        return Result.success(internalPlanService.updateInternalPlan(internalPlan));
+    }
+
+    /**
+     * 鍐呭骞村害璁″垝鍒犻櫎
+     * @return
+     */
+
+    @Operation(summary = "鍐呭骞村害璁″垝鍒犻櫎")
+    @DeleteMapping("/delInternalPlan")
+    public Result delInternalPlan(Integer planId){
+        return Result.success(internalPlanService.delInternalPlan(planId));
+    }
+
+    /**
+     * 鍐呭骞村害璁″垝鏌ョ湅璇︽儏
+     * @return
+     */
+
+    @Operation(summary = "鍐呭骞村害璁″垝鏌ョ湅璇︽儏")
+    @GetMapping("/getInternalPlanOne")
+    public Result<InternalPlanDto> getInternalPlanOne(Integer planId){
+        return Result.success(internalPlanService.getInternalPlanOne(planId));
+    }
+
+
+    /**
+     * 鍐呭骞村害璁″垝瀹℃牳
+     * @return
+     */
+    @Operation(summary = "鍐呭骞村害璁″垝瀹℃牳")
+    @PostMapping("/examineInternalPlan")
+    public Result examineInternalPlan(@RequestBody InternalPlanDto internalPlanDto){
+        return Result.success(internalPlanService.examineInternalPlan(internalPlanDto));
+    }
+
+    /**
+     * 鍐呭骞村害璁″垝鎵瑰噯
+     * @return
+     */
+    @Operation(summary = "鍐呭瀹炴柦璁″垝鎵瑰噯")
+    @PostMapping("/ratifyInternalPlan")
+    public Result ratifyInternalPlan(@RequestBody InternalPlanDto internalPlanDto){
+        return Result.success(internalPlanService.ratifyInternalPlan(internalPlanDto));
+    }
+
+    /**
+     * 瀵煎嚭鍐呭骞村害璁″垝
+     * @return
+     */
+
+    @Operation(summary = "瀵煎嚭鍐呭骞村害璁″垝")
+    @GetMapping("/exportInternalPlan")
+    public void exportInternalPlan(Integer planId, HttpServletResponse response){
+        internalPlanService.exportInternalImplement(planId, response);
+    }
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/controller/InternalReportController.java b/cnas-manage/src/main/java/com/ruoyi/manage/controller/InternalReportController.java
new file mode 100644
index 0000000..d3df1d3
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/controller/InternalReportController.java
@@ -0,0 +1,124 @@
+package com.ruoyi.manage.controller;
+
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.deepoove.poi.data.style.*;
+
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.common.utils.JackSonUtil;
+import com.ruoyi.manage.pojo.InternalReport;
+import com.ruoyi.manage.service.InternalReportService;
+import com.deepoove.poi.data.style.*;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+
+import jakarta.servlet.http.HttpServletResponse;
+import java.util.Map;
+
+
+/**
+ * 鍐呭鎶ュ憡琛�
+ *
+ * @author makejava
+ * @since 2024-11-11
+ */
+@Tag(name = "鍐呭鎶ュ憡")
+@AllArgsConstructor
+@RestController
+@RequestMapping("/internalReport")
+public class InternalReportController {
+
+    private InternalReportService internalReportService;
+
+    /**
+     * 鍐呭鎶ュ憡鍒嗛〉鏌ヨ
+     * @param
+     * @return
+     */
+
+    @Operation(summary = "鍐呭鎶ュ憡鍒嗛〉鏌ヨ")
+    @GetMapping("/pageInternalReport")
+    public Result<IPage<InternalReport>> pageInternalReport(Page page,InternalReport internalReport) throws Exception {
+        return Result.success(internalReportService.pageInternalReport(page, internalReport));
+    }
+
+    /**
+     * 鍐呭鎶ュ憡鏂板
+     * @return
+     */
+
+    @Operation(summary = "鍐呭鎶ュ憡鏂板")
+    @PostMapping("/addInternalReport")
+    public Result addInternalReport(@RequestBody InternalReport internalReport){
+        return Result.success(internalReportService.save(internalReport));
+    }
+
+    /**
+     * 鍐呭鎶ュ憡淇敼
+     * @return
+     */
+
+    @Operation(summary = "鍐呭鎶ュ憡淇敼")
+    @PostMapping("/updateInternalReport")
+    public Result updateInternalReport(@RequestBody InternalReport internalReport){
+        return Result.success(internalReportService.updateById(internalReport));
+    }
+
+    /**
+     * 鍐呭鎶ュ憡鍒犻櫎
+     * @return
+     */
+
+    @Operation(summary = "鍐呭鎶ュ憡鍒犻櫎")
+    @DeleteMapping("/delInternalReport")
+    public Result delInternalReport(Integer reportId){
+        return Result.success(internalReportService.removeById(reportId));
+    }
+
+    /**
+     * 鍐呭鎶ュ憡鏌ョ湅璇︽儏
+     * @return
+     */
+
+    @Operation(summary = "鍐呭鎶ュ憡鏌ョ湅璇︽儏")
+    @GetMapping("/getInternalReportOne")
+    public Result<InternalReport> getInternalReportOne(Integer reportId){
+        return Result.success(internalReportService.getById(reportId));
+    }
+
+    /**
+     * 鍐呭妫�鏌ュ鏍�
+     * @return
+     */
+    @Operation(summary = "鍐呭妫�鏌ュ鏍�")
+    @PostMapping("/examineInternalReport")
+    public Result examineInternalReport(@RequestBody InternalReport internalReport){
+        return Result.success(internalReportService.ratifyInternalCheck(internalReport));
+    }
+
+    /**
+     * 鍐呭鎶ュ憡璐ㄩ噺璐熻矗浜哄~鍐�
+     * @return
+     */
+    @Operation(summary = "鍐呭鎶ュ憡璐ㄩ噺璐熻矗浜哄~鍐�")
+    @PostMapping("/qualityInternalReport")
+    public Result qualityInternalReport(@RequestBody InternalReport internalReport){
+        return Result.success(internalReportService.qualityInternalReport(internalReport));
+    }
+
+    /**
+     * 瀵煎嚭鍐呭鎶ュ憡
+     * @return
+     */
+
+    @Operation(summary = "瀵煎嚭鍐呭鎶ュ憡")
+    @GetMapping("/exportInternalReport")
+    public void exportInternalReport(Integer reportId, HttpServletResponse response){
+        internalReportService.exportInternalReport(reportId, response);
+    }
+
+}
+
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/controller/ManageControlPlanListController.java b/cnas-manage/src/main/java/com/ruoyi/manage/controller/ManageControlPlanListController.java
new file mode 100644
index 0000000..fb0c5bb
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/controller/ManageControlPlanListController.java
@@ -0,0 +1,134 @@
+package com.ruoyi.manage.controller;
+
+import com.alibaba.excel.EasyExcel;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.alibaba.excel.read.listener.PageReadListener;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.framework.exception.ErrorException;
+import com.ruoyi.manage.pojo.ManageControlPlanList;
+import com.ruoyi.manage.service.ManageControlPlanListService;
+import com.ruoyi.manage.vo.ManageControlPlanListVo;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
+import org.apache.poi.ss.formula.functions.T;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.time.LocalDateTime;
+import java.util.Map;
+
+/**
+ * <p>
+ * 閲嶅ぇ椋庨櫓鍥犵礌鍒嗘瀽鍙婃帶鍒惰鍒掓竻鍗� 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-15 02:58:30
+ */
+@Tag(name = "閲嶅ぇ椋庨櫓鍥犵礌鍒嗘瀽鍙婃帶鍒惰鍒掓竻鍗�")
+@RestController
+@RequestMapping("/manageControlPlanList")
+public class ManageControlPlanListController {
+
+
+    @Resource
+    private ManageControlPlanListService manageControlPlanListService;
+
+
+
+    @Operation(summary = "鍒嗛〉鏌ヨ")
+    @GetMapping("/getPageList")
+    public Result<IPage<ManageControlPlanListVo>> getPageList(Page page) {
+        return Result.success(manageControlPlanListService.getPageList(page));
+    }
+
+    @Operation(summary = "鎵瑰噯")
+    @PostMapping("/approvalOfControlPlanChecklist")
+    public Result<?> approvalOfControlPlanChecklist(@RequestBody Map<String, Integer> param){
+        Integer approve = param.get("approve");
+        Integer status= param.get("status");
+        manageControlPlanListService.update(Wrappers.<ManageControlPlanList>lambdaUpdate()
+                .set(ManageControlPlanList::getApprove, approve)
+                .set(ManageControlPlanList::getApproveStatus, status)
+                .set(ManageControlPlanList::getApproveDate, LocalDateTime.now()));
+        return Result.success();
+    }
+
+    @Operation(summary = "瀹℃壒")
+    @PostMapping("/riskAnalysisApprovalOfControlPlanChecklist")
+    public Result<?> riskAnalysisApprovalOfControlPlanChecklist(@RequestBody Map<String, Integer> param){
+        Integer approval = param.get("approval");
+        Integer status= param.get("status");
+        manageControlPlanListService.update(Wrappers.<ManageControlPlanList>lambdaUpdate()
+                .set(ManageControlPlanList::getApproval, approval)
+                .set(ManageControlPlanList::getApprovalStatus, status)
+                .set(ManageControlPlanList::getApprovalDate, LocalDateTime.now()));
+        return Result.success();
+    }
+
+    @PostMapping("/importControlPlanList")
+    public void importControlPlanList(MultipartFile file) throws IOException {
+        boolean excelFile = isExcelFile(file);
+        if (!excelFile) {
+            throw new ErrorException("璇峰鍏xcel鏂囦欢锛�");
+        }
+        EasyExcel.read(file.getInputStream(), ManageControlPlanList.class, new PageReadListener<ManageControlPlanList>(dataList -> {
+            Integer userId = SecurityUtils.getUserId().intValue();
+            dataList.forEach(i -> {
+                i.setEditor(userId);
+                i.setEditorDate(LocalDateTime.now());
+                i.setApproveStatus(0);
+                i.setApprovalStatus(0);
+            });
+            manageControlPlanListService.saveOrUpdateBatch(dataList);
+        })).sheet().doRead();
+    }
+
+    @Operation(summary = "鏂板")
+    @PostMapping("/analysisOfMajorRiskFactorsAdded")
+    public void analysisOfMajorRiskFactorsAdded(@RequestBody ManageControlPlanList manageControlPlanList) {
+        Integer userId = SecurityUtils.getUserId().intValue();
+        manageControlPlanList.setEditor(userId);
+        manageControlPlanList.setEditorDate(LocalDateTime.now());
+        manageControlPlanListService.saveOrUpdate(manageControlPlanList);
+    }
+
+    @Operation(summary = "鍒犻櫎")
+    @DeleteMapping("/deleteSignificantRiskFactorAnalysis")
+    public void deleteSignificantRiskFactorAnalysis(Integer id) {
+        manageControlPlanListService.removeById(id);
+    }
+
+    /**
+     *
+     * @return
+     */
+
+    @Operation(summary = "閲嶅ぇ椋庨櫓鍥犵礌鍒嗘瀽鍙婃帶鍒惰鍒掓竻鍗�")
+    @GetMapping("/exportSignificantRiskFactors")
+    public void exportSignificantRiskFactors(HttpServletResponse response){
+        manageControlPlanListService.exportPersonTraining(response);
+    }
+
+    public static boolean isExcelFile(MultipartFile file) {
+        if (file.isEmpty()) {
+            return false;
+        }
+        String originalFilename = file.getOriginalFilename();
+        if (originalFilename == null) {
+            return false;
+        }
+        String[] parts = originalFilename.split("\\.");
+        if (parts.length == 0) {
+            return false;
+        }
+        String fileExtension = parts[parts.length - 1].toLowerCase();
+        return fileExtension.equals("xls") || fileExtension.equals("xlsx");
+    }
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/controller/ManageDocumentAlterController.java b/cnas-manage/src/main/java/com/ruoyi/manage/controller/ManageDocumentAlterController.java
new file mode 100644
index 0000000..6889d7a
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/controller/ManageDocumentAlterController.java
@@ -0,0 +1,89 @@
+package com.ruoyi.manage.controller;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.common.utils.JackSonUtil;
+
+import com.deepoove.poi.data.style.*;
+
+import com.ruoyi.manage.pojo.ManageDocumentAlter;
+import com.ruoyi.manage.service.ManageDocumentAlterService;
+import com.deepoove.poi.data.style.*;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletResponse;
+import java.util.Map;
+
+/**
+ * <p>
+ * 鏂囦欢鍙樻洿 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 
+ * @since 2024-11-11 11:04:01
+ */
+@Tag(name = "绠$悊浣撶郴鏂囦欢鐨勬帶鍒�")
+@RestController
+@RequestMapping("/manageDocumentAlter")
+public class ManageDocumentAlterController {
+
+    @Resource
+    private ManageDocumentAlterService manageDocumentAlterService;
+
+    @Operation(summary = "鍒嗛〉鏌ヨ鏂囦欢鍙樻洿")
+    @GetMapping("/pageManageDocumentAlter")
+    public Result pageManageDocumentAlter(Page page,ManageDocumentAlter manageDocumentAlter) throws Exception {
+        return Result.success(manageDocumentAlterService.pageManageDocumentAlter(page, manageDocumentAlter));
+    }
+
+    @Operation(summary = "鍒犻櫎鏂囦欢鍙樻洿")
+    @DeleteMapping("/delManageDocumentAlter")
+    public Result delManageDocumentAlter(Integer id){
+        return Result.success(manageDocumentAlterService.delManageDocumentAlter(id));
+    }
+
+
+    @Operation(summary = "鏌ョ湅鏂囦欢鍙樻洿")
+    @GetMapping("/getManageDocumentAlter")
+    public Result getManageDocumentAlter(Integer id){
+        return Result.success(manageDocumentAlterService.getManageDocumentAlter(id));
+    }
+
+    @Operation(summary = "鏂板鏂囦欢鍙樻洿")
+    @PostMapping("/addManageDocumentAlter")
+    public Result addManageDocumentAlter(ManageDocumentAlter manageDocumentAlter){
+        return Result.success(manageDocumentAlterService.addManageDocumentAlter(manageDocumentAlter));
+    }
+
+
+    @Operation(summary = "缂栬緫鏂囦欢鍙樻洿")
+    @PostMapping("/doManageDocumentAlter")
+    public Result doManageDocumentAlter(ManageDocumentAlter manageDocumentAlter){
+        return Result.success(manageDocumentAlterService.doManageDocumentAlter(manageDocumentAlter));
+    }
+
+
+    @Operation(summary = "瀹℃牳鏂囦欢鍙樻洿")
+    @PostMapping("/checkManageDocumentAlter")
+    public Result checkManageDocumentAlter(ManageDocumentAlter manageDocumentAlter){
+        return Result.success(manageDocumentAlterService.checkManageDocumentAlter(manageDocumentAlter));
+    }
+
+
+    @Operation(summary = "瀹℃牳鏌ョ湅闄勪欢")
+    @GetMapping("/checkManageDocumentAlterPdf")
+    public void checkManageDocumentAlterPdf(Long id, HttpServletResponse response)throws Exception {
+        manageDocumentAlterService.checkManageDocumentAlterPdf(id,response);
+    }
+
+    @Operation(summary = "瀵煎嚭鏂囦欢鍙樻洿")
+    @GetMapping("/exportManageDocumentAlter")
+    public void exportManageDocumentAlter(ManageDocumentAlter manageDocumentAlter,HttpServletResponse response) throws Exception {
+        manageDocumentAlterService.exportManageDocumentAlter(manageDocumentAlter,response);
+    }
+
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/controller/ManageDocumentCancelController.java b/cnas-manage/src/main/java/com/ruoyi/manage/controller/ManageDocumentCancelController.java
new file mode 100644
index 0000000..932c0ec
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/controller/ManageDocumentCancelController.java
@@ -0,0 +1,83 @@
+package com.ruoyi.manage.controller;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+
+import com.deepoove.poi.data.style.*;
+
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.common.utils.JackSonUtil;
+import com.ruoyi.manage.pojo.ManageDocumentCancel;
+import com.ruoyi.manage.service.ManageDocumentCancelService;
+import com.deepoove.poi.data.style.*;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
+import org.springframework.web.bind.annotation.*;
+
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletResponse;
+import java.util.Map;
+
+/**
+ * <p>
+ * 鏂囦欢浣滃簾 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-09 02:37:35
+ */
+@Tag(name = "绠$悊浣撶郴鏂囦欢鐨勬帶鍒�")
+@RestController
+@RequestMapping("/manageDocumentCancel")
+public class ManageDocumentCancelController {
+
+    @Resource
+    private ManageDocumentCancelService manageDocumentCancelService;
+
+    @Operation(summary = "鍒嗛〉鏌ヨ鏂囦欢浣滃簾")
+    @GetMapping("/pageManageDocumentCancel")
+    public Result pageManageDocumentCancel(Page page,ManageDocumentCancel manageDocumentCancel) throws Exception {
+        return Result.success(manageDocumentCancelService.pageManageDocumentCancel(page, manageDocumentCancel));
+    }
+
+    @Operation(summary = "鏂板鏂囦欢浣滃簾")
+    @PostMapping("/addManageDocumentCancel")
+    public Result addManageDocumentCancel(@RequestBody ManageDocumentCancel manageDocumentCancel) {
+        return Result.success(manageDocumentCancelService.addManageDocumentCancel(manageDocumentCancel));
+    }
+
+
+    @Operation(summary = "瀹℃牳鏂囦欢浣滃簾")
+    @PostMapping("/checkManageDocumentCancel")
+    public Result checkManageDocumentCancel(@RequestBody Map<String, Object> param) {
+        Integer id = (Integer) param.get("id");
+        String state = (String) param.get("state");
+        return Result.success(manageDocumentCancelService.checkManageDocumentCancel(id, state));
+    }
+
+    @Operation(summary = "鍒犻櫎鏂囦欢浣滃簾")
+    @DeleteMapping("/delManageDocumentCancel")
+    public Result delManageDocumentCancel(Integer id) {
+        return Result.success(manageDocumentCancelService.delManageDocumentCancel(id));
+    }
+
+
+    @Operation(summary = "鏌ョ湅鏂囦欢浣滃簾")
+    @GetMapping("/getManageDocumentCancel")
+    public Result getManageDocumentCancel(Integer id) {
+        return Result.success(manageDocumentCancelService.getManageDocumentCancel(id));
+    }
+
+
+    @Operation(summary = "缂栬緫鏂囦欢浣滃簾")
+    @PostMapping("/doManageDocumentCancel")
+    public Result doManageDocumentCancel(@RequestBody ManageDocumentCancel manageDocumentCancel) {
+        return Result.success(manageDocumentCancelService.doManageDocumentCancel(manageDocumentCancel));
+    }
+
+    @Operation(summary = "瀵煎嚭鏂囦欢浣滃簾")
+    @GetMapping("/exportManageDocumentCancel")
+    public void exportManageDocumentCancel(ManageDocumentCancel manageDocumentCancel,HttpServletResponse response) throws Exception {
+        manageDocumentCancelService.exportManageDocumentCancel(manageDocumentCancel,response);
+    }
+
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/controller/ManageDocumentControlledController.java b/cnas-manage/src/main/java/com/ruoyi/manage/controller/ManageDocumentControlledController.java
new file mode 100644
index 0000000..a9c1c9d
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/controller/ManageDocumentControlledController.java
@@ -0,0 +1,82 @@
+package com.ruoyi.manage.controller;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+
+import com.deepoove.poi.data.style.*;
+
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.common.utils.JackSonUtil;
+import com.ruoyi.manage.pojo.ManageDocumentControlled;
+import com.ruoyi.manage.service.ManageDocumentControlledService;
+import com.deepoove.poi.data.style.*;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
+import org.springframework.web.bind.annotation.*;
+
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletResponse;
+import java.util.Map;
+
+/**
+ * <p>
+ * 鏂囦欢鍙楁帶 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-08 02:54:44
+ */
+@Tag(name = "绠$悊浣撶郴鏂囦欢鐨勬帶鍒�")
+@RestController
+@RequestMapping("/manageDocumentControlled")
+public class ManageDocumentControlledController {
+
+    @Resource
+    private ManageDocumentControlledService manageDocumentControlledService;
+
+    @Operation(summary = "鍒嗛〉鏌ヨ鏂囦欢鍙楁帶")
+    @GetMapping("/pageManageDocumentControlled")
+    public Result pageManageDocumentControlled(Page page,ManageDocumentControlled manageDocumentControlled) throws Exception {
+        return Result.success(manageDocumentControlledService.pageManageDocumentControlled(page, manageDocumentControlled));
+    }
+
+    @Operation(summary = "鏂板鏂囦欢鍙楁帶")
+    @PostMapping("/addManageDocumentControlled")
+    public Result addManageDocumentControlled(ManageDocumentControlled manageDocumentControlled){
+        return Result.success(manageDocumentControlledService.addManageDocumentControlled(manageDocumentControlled));
+    }
+
+
+    @Operation(summary = "鏌ョ湅鏂囦欢鍙楁帶")
+    @GetMapping("/getManageDocumentControlled")
+    public Result getManageDocumentControlled(Long id){
+        return Result.success(manageDocumentControlledService.getManageDocumentControlled(id));
+    }
+
+
+    @Operation(summary = "缂栬緫鏂囦欢鍙楁帶")
+    @PostMapping("/doManageDocumentControlled")
+    public Result doManageDocumentControlled(ManageDocumentControlled manageDocumentControlled){
+        return Result.success(manageDocumentControlledService.doManageDocumentControlled(manageDocumentControlled));
+    }
+
+    @Operation(summary = "鍒犻櫎鏂囦欢鍙楁帶")
+    @DeleteMapping("/delManageDocumentControlled")
+    public Result delManageDocumentControlled(Long id){
+        return Result.success(manageDocumentControlledService.delManageDocumentControlled(id));
+    }
+
+
+    @Operation(summary = "瀹℃牳鏂囦欢鍙楁帶")
+    @PostMapping("/checkManageDocumentControlled")
+    public Result checkManageDocumentControlled(ManageDocumentControlled manageDocumentControlled){
+        return Result.success(manageDocumentControlledService.checkManageDocumentControlled(manageDocumentControlled));
+    }
+
+
+    @Operation(summary = "瀹℃牳鏌ョ湅闄勪欢")
+    @GetMapping("/checkManageDocumentControlledPdf")
+    public void checkManageDocumentControlledPdf(Long id, HttpServletResponse response)throws Exception {
+        manageDocumentControlledService.checkManageDocumentControlledPdf(id,response);
+    }
+
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/controller/ManageDocumentIssueRecycleController.java b/cnas-manage/src/main/java/com/ruoyi/manage/controller/ManageDocumentIssueRecycleController.java
new file mode 100644
index 0000000..98f5e45
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/controller/ManageDocumentIssueRecycleController.java
@@ -0,0 +1,84 @@
+package com.ruoyi.manage.controller;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+
+import com.deepoove.poi.data.style.*;
+
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.common.utils.JackSonUtil;
+import com.ruoyi.manage.dto.ManageDocumentIssueRecycleDto;
+import com.ruoyi.manage.pojo.ManageDocumentIssueRecycle;
+import com.ruoyi.manage.service.ManageDocumentIssueRecycleService;
+import com.deepoove.poi.data.style.*;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
+import org.springframework.web.bind.annotation.*;
+
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletResponse;
+import java.util.Map;
+
+/**
+ * <p>
+ * 鏂囦欢鍙戞斁鍥炴敹 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 
+ * @since 2024-11-09 09:18:24
+ */
+@Tag(name = "绠$悊浣撶郴鏂囦欢鐨勬帶鍒�")
+@RestController
+@RequestMapping("/manageDocumentIssueRecycle")
+public class ManageDocumentIssueRecycleController {
+
+    @Resource
+    private ManageDocumentIssueRecycleService manageDocumentIssueRecycleService;
+
+    @Operation(summary = "鍒嗛〉鏌ヨ鏂囦欢鍙戞斁鍥炴敹")
+    @GetMapping("/pageManageDocumentIssueRecycle")
+    public Result pageManageDocumentIssueRecycle(Page page,ManageDocumentIssueRecycleDto  manageDocumentIssueRecycleDto) throws Exception {
+        return Result.success(manageDocumentIssueRecycleService.pageManageDocumentIssueRecycle(page, manageDocumentIssueRecycleDto));
+    }
+
+    @Operation(summary = "鏂板鏂囦欢鍙戞斁鍥炴敹")
+    @PostMapping("/addManageDocumentIssueRecycle")
+    public Result addManageDocumentIssueRecycle(ManageDocumentIssueRecycle manageDocumentIssueRecycle){
+        return Result.success(manageDocumentIssueRecycleService.addManageDocumentIssueRecycle(manageDocumentIssueRecycle));
+    }
+
+    @Operation(summary = "鍒犻櫎鏂囦欢鍙戞斁鍥炴敹")
+    @DeleteMapping("/delManageDocumentIssueRecycle")
+    public Result delManageDocumentIssueRecycle(Long id){
+        return Result.success(manageDocumentIssueRecycleService.delManageDocumentIssueRecycle(id));
+    }
+
+
+    @Operation(summary = "鏌ョ湅鏂囦欢鍙戞斁鍥炴敹")
+    @GetMapping("/getManageDocumentIssueRecycle")
+    public Result getManageDocumentIssueRecycle(Long id){
+        return Result.success(manageDocumentIssueRecycleService.getManageDocumentIssueRecycle(id));
+    }
+
+
+    @Operation(summary = "缂栬緫鏂囦欢鍙戞斁鍥炴敹")
+    @PostMapping("/doManageDocumentIssueRecycle")
+    public Result doManageDocumentIssueRecycle(@RequestBody ManageDocumentIssueRecycle manageDocumentIssueRecycle){
+        return Result.success(manageDocumentIssueRecycleService.doManageDocumentIssueRecycle(manageDocumentIssueRecycle));
+    }
+
+
+    @Operation(summary = "瀹℃牳鏂囦欢鍙戞斁鍥炴敹")
+    @PostMapping("/checkManageDocumentIssueRecycle")
+    public Result checkManageDocumentIssueRecycle(@RequestBody ManageDocumentIssueRecycle manageDocumentIssueRecycle){
+        return Result.success(manageDocumentIssueRecycleService.checkManageDocumentIssueRecycle(manageDocumentIssueRecycle.getId(),manageDocumentIssueRecycle.getDocumentState()));
+    }
+
+    @Operation(summary = "瀵煎嚭鏂囦欢鍙戞斁鍥炴敹")
+    @GetMapping("/exportManageDocumentIssueRecycle")
+    public void exportManageDocumentIssueRecycle(ManageDocumentIssueRecycleDto manageDocumentIssueRecycleDto, HttpServletResponse response) throws Exception {
+        manageDocumentIssueRecycleService.exportManageDocumentIssueRecycle(manageDocumentIssueRecycleDto,response);
+    }
+
+
+
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/controller/ManageDocumentListController.java b/cnas-manage/src/main/java/com/ruoyi/manage/controller/ManageDocumentListController.java
new file mode 100644
index 0000000..da18c1f
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/controller/ManageDocumentListController.java
@@ -0,0 +1,76 @@
+package com.ruoyi.manage.controller;
+
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.read.builder.ExcelReaderBuilder;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+
+
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.common.utils.JackSonUtil;
+import com.ruoyi.manage.excel.ManageDocumentListListener;
+import com.ruoyi.manage.pojo.ManageDocumentList;
+import com.ruoyi.manage.service.ManageDocumentListService;
+import com.deepoove.poi.data.style.*;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import jakarta.annotation.Resource;
+import java.io.IOException;
+import java.util.Map;
+
+/**
+ * <p>
+ * 鏂囦欢娓呭崟
+ 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-08 11:08:11
+ */
+@Tag(name = "绠$悊浣撶郴鏂囦欢鐨勬帶鍒�")
+@RestController
+@RequestMapping("/manageDocumentList")
+public class ManageDocumentListController {
+
+    @Resource
+    private ManageDocumentListService manageDocumentListService;
+
+    @Operation(summary = "鍒嗛〉鏌ヨ鏂囦欢娓呭崟")
+    @GetMapping("/pageManageDocumentList")
+    public Result pageManageDocumentList(Page page,ManageDocumentList manageDocumentList) throws Exception {
+        return Result.success(manageDocumentListService.pageManageDocumentList(page, manageDocumentList));
+    }
+
+    @Operation(summary = "缂栬緫鏂囦欢娓呭崟")
+    @PostMapping("/doManageDocumentList")
+    public Result doManageDocumentList(@RequestBody ManageDocumentList manageDocumentList) {
+        return Result.success(manageDocumentListService.updateById(manageDocumentList));
+    }
+
+    @Operation(summary = "鍒犻櫎鏂囦欢娓呭崟")
+    @DeleteMapping("/delManageDocumentList")
+    public Result delManageDocumentList(Integer id) {
+        return Result.success(manageDocumentListService.removeById(id));
+    }
+
+    @Operation(summary = "涓婁紶闄勪欢-鏂囦欢娓呭崟")
+    @PostMapping("/uploadFileManageDocumentList")
+    public Result uploadFileManageDocumentList(Integer id, MultipartFile file) {
+        return Result.success(manageDocumentListService.uploadFile(id,file));
+    }
+
+    @Operation(summary = "瀵煎叆鏂囦欢娓呭崟鍒楄〃")
+    @PostMapping("/exportManageDocumentList")
+    public Result exportManageDocumentList(MultipartFile file) {
+        try {
+            // 琛ㄥご鏍¢獙妯℃澘鏄惁姝g‘
+            EasyExcel.read(file.getInputStream(), ManageDocumentList.class, new ManageDocumentListListener(manageDocumentListService)).sheet().doRead();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return Result.success();
+    }
+
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/controller/ManageMeetingController.java b/cnas-manage/src/main/java/com/ruoyi/manage/controller/ManageMeetingController.java
new file mode 100644
index 0000000..d351a7d
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/controller/ManageMeetingController.java
@@ -0,0 +1,66 @@
+package com.ruoyi.manage.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.manage.dto.ManageMeetingDto;
+import com.ruoyi.manage.service.ManageMeetingService;
+import com.deepoove.poi.data.style.*;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
+import org.springframework.web.bind.annotation.*;
+
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletResponse;
+
+/**
+ * <p>
+ *  鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-11 09:33:47
+ */
+@Tag(name = "绠$悊璇勫浼氳")
+@RestController
+@RequestMapping("/manageMeeting")
+public class ManageMeetingController {
+
+    @Resource
+    private ManageMeetingService manageMeetingService;
+
+    @Operation(summary = "绠$悊璇勫浼氳璁板綍鏌ヨ")
+    @GetMapping("/getPageMeeting")
+    public Result<IPage<ManageMeetingDto>> getPageMeeting(Page page, String startTime, String endTime, String place) throws Exception {
+        IPage<ManageMeetingDto> ipage = manageMeetingService.page(page,startTime,endTime,place);
+        return Result.success(ipage);
+    }
+
+    @Operation(summary = "鏂板浼氳璁板綍")
+    @PostMapping("/addMeeting")
+    public Result addMeeting(@RequestBody ManageMeetingDto dto){
+        manageMeetingService.addMeeting(dto);
+        return Result.success();
+    }
+
+    @Operation(summary = "缂栬緫浼氳璁板綍")
+    @PostMapping("/modifyMeeting")
+    public Result modifyMeeting(@RequestBody ManageMeetingDto manageMeetingDto){
+        return Result.success(manageMeetingService.modifyMeeting(manageMeetingDto));
+    }
+
+    @Operation(summary = "鍒犻櫎浼氳璁板綍")
+    @DeleteMapping("/deleteMeeting")
+    public Result deleteMeeting(Integer id){
+        return Result.success(manageMeetingService.removeById(id));
+    }
+
+
+    @Operation(summary = "涓嬭浇浼氳璁板綍")
+    @GetMapping("/exportMeeting")
+    public void exportMeeting(Integer id, HttpServletResponse response){
+        manageMeetingService.exportMeeting(id,response);
+    }
+
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/controller/ManageMeetingParticipantsController.java b/cnas-manage/src/main/java/com/ruoyi/manage/controller/ManageMeetingParticipantsController.java
new file mode 100644
index 0000000..b5958d3
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/controller/ManageMeetingParticipantsController.java
@@ -0,0 +1,53 @@
+package com.ruoyi.manage.controller;
+
+
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.manage.pojo.ManageMeetingParticipants;
+import com.ruoyi.manage.service.ManageMeetingParticipantsService;
+import com.ruoyi.manage.vo.MeetingParticipantsDetailsVo;
+import com.deepoove.poi.data.style.*;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
+import org.springframework.web.bind.annotation.*;
+
+import jakarta.annotation.Resource;
+import java.util.List;
+
+/**
+ * <p>
+ *  鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-11 09:34:27
+ */
+@Tag(name = "绠$悊璇勫浼氳")
+@RestController
+@RequestMapping("/manageMeetingParticipants")
+public class ManageMeetingParticipantsController {
+
+    @Resource
+    private ManageMeetingParticipantsService manageMeetingParticipantsService;
+
+
+    @Operation(summary = "鏌ヨ浼氳璁板綍鍙備細浜哄憳")
+    @GetMapping("/getParticipants")
+    public Result<MeetingParticipantsDetailsVo> getParticipants(Integer id){
+        return Result.success(manageMeetingParticipantsService.getParticipants(id));
+    }
+
+    @Operation(summary = "鏂板浼氳璁板綍鍙備細浜哄憳")
+    @PostMapping("/add")
+    public Result addParticipants(@RequestBody List<ManageMeetingParticipants> list){
+        manageMeetingParticipantsService.saveBatch(list);
+        return Result.success();
+    }
+
+    @Operation(summary = "鍒犻櫎浼氳璁板綍鍙備細浜哄憳")
+    @DeleteMapping("/delete")
+    public Result deleteParticipants(List<Integer> ids){
+        manageMeetingParticipantsService.removeByIds(ids);
+        return Result.success();
+    }
+
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/controller/ManageRecordAuditController.java b/cnas-manage/src/main/java/com/ruoyi/manage/controller/ManageRecordAuditController.java
new file mode 100644
index 0000000..47fa373
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/controller/ManageRecordAuditController.java
@@ -0,0 +1,75 @@
+package com.ruoyi.manage.controller;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+
+import com.deepoove.poi.data.style.*;
+
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.common.utils.JackSonUtil;
+import com.ruoyi.manage.pojo.ManageRecordAudit;
+import com.ruoyi.manage.service.ManageRecordAuditService;
+import com.deepoove.poi.data.style.*;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
+import org.springframework.web.bind.annotation.*;
+
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletResponse;
+import java.util.Map;
+
+/**
+ * <p>
+ * 鏂囦欢淇鐢宠瀹℃壒璁板綍 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-14 10:29:18
+ */
+@Tag(name = "璁板綍鐨勬帶鍒�")
+@RestController
+@RequestMapping("/manageRecordAudit")
+public class ManageRecordAuditController {
+
+    @Resource
+    private ManageRecordAuditService manageRecordAuditService;
+
+    @Operation(summary = "鍒嗛〉鏌ヨ鏂囦欢淇鐢宠瀹℃壒璁板綍")
+    @GetMapping("/pageManageRecordAudit")
+    public Result pageManageRecordAudit(Page page,ManageRecordAudit manageRecordAudit) throws Exception {
+        return Result.success(manageRecordAuditService.pageManageRecordAudit(page, manageRecordAudit));
+    }
+
+    @Operation(summary = "鏂板鏂囦欢淇鐢宠瀹℃壒璁板綍")
+    @PostMapping("/addManageRecordAudit")
+    public Result addManageRecordAudit(ManageRecordAudit manageRecordAudit){
+        return Result.success(manageRecordAuditService.addManageRecordAudit(manageRecordAudit));
+    }
+
+
+    @Operation(summary = "缂栬緫鏂囦欢淇鐢宠瀹℃壒璁板綍")
+    @PostMapping("/doManageRecordAudit")
+    public Result doManageRecordAudit(ManageRecordAudit manageRecordAudit){
+        return Result.success(manageRecordAuditService.doManageRecordAudit(manageRecordAudit));
+    }
+
+    @Operation(summary = "鍒犻櫎鏂囦欢淇鐢宠瀹℃壒璁板綍")
+    @DeleteMapping("/delManageRecordAudit")
+    public Result delManageRecordAudit(Integer id){
+        return Result.success(manageRecordAuditService.removeById(id));
+    }
+
+    @Operation(summary = "鎵瑰噯鏂囦欢淇鐢宠瀹℃壒璁板綍")
+    @PostMapping("/ratifyManageRecordAudit")
+    public Result ratifyManageRecordAudit(@RequestBody Map<String, Integer> param){
+        Integer id = param.get("id");
+        return Result.success(manageRecordAuditService.ratifyManageRecordAudit(id));
+    }
+
+    @Operation(summary = "瀵煎嚭鏂囦欢淇鐢宠瀹℃壒璁板綍")
+    @GetMapping("/exportOutManageRecordAudit")
+    public Result exportOutManageRecordAudit(ManageRecordAudit manageRecordAudit, HttpServletResponse response) {
+        return Result.success(manageRecordAuditService.exportOutManageRecordAudit(manageRecordAudit,response));
+    }
+
+
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/controller/ManageRecordCancelController.java b/cnas-manage/src/main/java/com/ruoyi/manage/controller/ManageRecordCancelController.java
new file mode 100644
index 0000000..51471e6
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/controller/ManageRecordCancelController.java
@@ -0,0 +1,87 @@
+package com.ruoyi.manage.controller;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+
+import com.deepoove.poi.data.style.*;
+
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.common.utils.JackSonUtil;
+import com.ruoyi.manage.pojo.ManageRecordCancel;
+import com.ruoyi.manage.service.ManageRecordCancelService;
+import com.deepoove.poi.data.style.*;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletResponse;
+import java.time.LocalDate;
+import java.util.Map;
+
+/**
+ * <p>
+ * 浣滃簾鏂囦欢閿�榄傝褰� 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-13 01:27:22
+ */
+@Tag(name = "璁板綍鐨勬帶鍒�")
+@RestController
+@RequestMapping("/manageRecordCancel")
+public class ManageRecordCancelController {
+
+    @Resource
+    private ManageRecordCancelService manageRecordCancelService;
+
+    @Operation(summary = "鍒嗛〉鏌ヨ浣滃簾鏂囦欢閿�姣佽褰�")
+    @GetMapping("/pageManageRecordCancel")
+    public Result pageManageRecordCancel(Page page,ManageRecordCancel manageRecordCancel) throws Exception {
+        return Result.success(manageRecordCancelService.pageManageRecordCancel(page, manageRecordCancel));
+    }
+
+    @Operation(summary = "鏂板浣滃簾鏂囦欢閿�姣佽褰�")
+    @PostMapping("/addManageRecordCancel")
+    public Result addManageRecordCancel(@RequestBody ManageRecordCancel manageRecordCancel){
+        manageRecordCancel.setCreateTime(LocalDate.now());
+        return Result.success(manageRecordCancelService.save(manageRecordCancel));
+    }
+
+
+    @Operation(summary = "缂栬緫浣滃簾鏂囦欢閿�姣佽褰�")
+    @PostMapping("/doManageRecordCancel")
+    public Result doManageRecordCancel(@RequestBody ManageRecordCancel manageRecordCancel){
+        return Result.success(manageRecordCancelService.updateById(manageRecordCancel));
+    }
+
+    @Operation(summary = "鍒犻櫎浣滃簾鏂囦欢閿�姣佽褰�")
+    @DeleteMapping("/delManageRecordCancel")
+    public Result delManageRecordCancel(Integer id){
+        return Result.success(manageRecordCancelService.removeById(id));
+    }
+
+    @Operation(summary = "鎵瑰噯浣滃簾鏂囦欢閿�姣佽褰�")
+    @PostMapping("/ratifyManageRecordCancel")
+    public Result ratifyManageRecordCancel(@RequestBody Map<String, Object> param){
+        Integer id = (Integer) param.get("id");
+        String ratifyState = (String) param.get("ratifyState");
+        return Result.success(manageRecordCancelService.ratifyManageRecordCancel(id,ratifyState));
+    }
+
+    @Operation(summary = "瀵煎嚭浣滃簾鏂囦欢閿�姣佽褰�")
+    @GetMapping("/exportOutManageRecordCancel")
+    public Result exportOutManageRecordCancel(ManageRecordCancel manageRecordCancel, HttpServletResponse response) throws Exception {
+        return Result.success(manageRecordCancelService.exportOutManageRecordCancel(manageRecordCancel,response));
+    }
+
+    @Operation(summary = "瀵煎叆浣滃簾鏂囦欢閿�姣佽褰�")
+    @PostMapping("/exportInManageRecordCancel")
+    public Result exportInManageRecordCancel(MultipartFile file){
+        try {
+            return Result.success(manageRecordCancelService.exportInManageRecordCancel(file));
+        }catch (Exception e){
+            return Result.fail(e.getMessage());
+        }
+    }
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/controller/ManageRecordCheckController.java b/cnas-manage/src/main/java/com/ruoyi/manage/controller/ManageRecordCheckController.java
new file mode 100644
index 0000000..cb105e0
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/controller/ManageRecordCheckController.java
@@ -0,0 +1,90 @@
+package com.ruoyi.manage.controller;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+
+import com.deepoove.poi.data.style.*;
+
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.common.utils.JackSonUtil;
+import com.ruoyi.manage.pojo.ManageRecordCheck;
+import com.ruoyi.manage.service.ManageRecordCheckService;
+import com.deepoove.poi.data.style.*;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletResponse;
+import java.util.Map;
+
+/**
+ * <p>
+ * 鏂囦欢瀹℃壒璁板綍(鍚慨璁㈠悗鍐嶆瀹℃壒璁板綍) 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-12 02:31:36
+ */
+@Tag(name = "璁板綍鐨勬帶鍒�")
+@RestController
+@RequestMapping("/manageRecordCheck")
+public class ManageRecordCheckController {
+
+    @Resource
+    private ManageRecordCheckService manageRecordCheckService;
+
+    @Operation(summary = "鍒嗛〉鏌ヨ鏂囦欢瀹℃壒璁板綍")
+    @GetMapping("/pageManageRecordCheck")
+    public Result pageManageRecordCheck(Page page,ManageRecordCheck manageRecordCheck) throws Exception {
+        return Result.success(manageRecordCheckService.pageManageRecordCheck(page, manageRecordCheck));
+    }
+
+    @Operation(summary = "鏂板鏂囦欢瀹℃壒璁板綍")
+    @PostMapping("/addManageRecordCheck")
+    public Result addManageRecordCheck(@RequestBody ManageRecordCheck manageRecordCheck) {
+        return Result.success(manageRecordCheckService.save(manageRecordCheck));
+    }
+
+
+    @Operation(summary = "缂栬緫鏂囦欢瀹℃壒璁板綍")
+    @PostMapping("/doManageRecordCheck")
+    public Result doManageRecordCheck(@RequestBody ManageRecordCheck manageRecordCheck) {
+        return Result.success(manageRecordCheckService.updateById(manageRecordCheck));
+    }
+
+    @Operation(summary = "鍒犻櫎鏂囦欢瀹℃壒璁板綍")
+    @DeleteMapping("/delManageRecordCheck")
+    public Result delManageRecordCheck(Integer id) {
+        return Result.success(manageRecordCheckService.removeById(id));
+    }
+
+    @Operation(summary = "瀹℃牳鏂囦欢瀹℃壒璁板綍")
+    @PostMapping("/checkManageRecordCheck")
+    public Result checkManageRecordCheck(@RequestBody Map<String, Object> param) {
+        Integer id = (Integer) param.get("id");
+        String checkState = (String) param.get("checkState");
+        return Result.success(manageRecordCheckService.checkManageRecordCheck(id,checkState));
+    }
+
+    @Operation(summary = "鎵瑰噯鏂囦欢瀹℃壒璁板綍")
+    @PostMapping("/ratifyManageRecordCheck")
+    public Result ratifyManageRecordCheck(@RequestBody Map<String, Object> param) {
+        Integer id = (Integer) param.get("id");
+        String ratifyState = (String) param.get("ratifyState");
+        return Result.success(manageRecordCheckService.ratifyManageRecordCheck(id,ratifyState));
+    }
+
+    @Operation(summary = "瀵煎嚭鏂囦欢瀹℃壒璁板綍")
+    @GetMapping("/exportOutManageRecordCheck")
+    public Result exportOutManageRecordCheck(ManageRecordCheck manageRecordCheck, HttpServletResponse response) throws Exception {
+        return Result.success(manageRecordCheckService.exportOutManageRecordCheck(manageRecordCheck,response));
+    }
+
+    @Operation(summary = "瀵煎叆鏂囦欢瀹℃壒璁板綍")
+    @PostMapping("/exportInManageRecordCheck")
+    public Result exportInManageRecordCheck(MultipartFile file){
+        return Result.success(manageRecordCheckService.exportInManageRecordCheck(file));
+    }
+
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/controller/ManageRecordIntervalsController.java b/cnas-manage/src/main/java/com/ruoyi/manage/controller/ManageRecordIntervalsController.java
new file mode 100644
index 0000000..cd49f08
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/controller/ManageRecordIntervalsController.java
@@ -0,0 +1,74 @@
+package com.ruoyi.manage.controller;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+
+import com.deepoove.poi.data.style.*;
+
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.common.utils.JackSonUtil;
+import com.ruoyi.manage.pojo.ManageRecordIntervals;
+import com.ruoyi.manage.service.ManageRecordIntervalsService;
+import com.deepoove.poi.data.style.*;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletResponse;
+import java.util.Map;
+
+/**
+ * <p>
+ * 鏂囦欢瀹氭湡瀹℃煡璁板綍 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 
+ * @since 2024-11-13 10:54:31
+ */
+@Tag(name = "璁板綍鐨勬帶鍒�")
+@RestController
+@RequestMapping("/manageRecordIntervals")
+public class ManageRecordIntervalsController {
+
+    @Resource
+    private ManageRecordIntervalsService manageRecordIntervalsService;
+
+    @Operation(summary = "鍒嗛〉鏌ヨ鏂囦欢瀹氭湡瀹℃煡璁板綍")
+    @GetMapping("/pageManageRecordIntervals")
+    public Result pageManageRecordIntervals(Page page,ManageRecordIntervals manageRecordIntervals) throws Exception {
+        return Result.success(manageRecordIntervalsService.pageManageRecordIntervals(page, manageRecordIntervals));
+    }
+
+    @Operation(summary = "鏂板鏂囦欢瀹氭湡瀹℃煡璁板綍")
+    @PostMapping("/addManageRecordIntervals")
+    public Result addManageRecordIntervals(@RequestBody ManageRecordIntervals manageRecordIntervals) {
+        return Result.success(manageRecordIntervalsService.addManageRecordIntervals(manageRecordIntervals));
+    }
+
+
+    @Operation(summary = "缂栬緫鏂囦欢瀹氭湡瀹℃煡璁板綍")
+    @PostMapping("/doManageRecordIntervals")
+    public Result doManageRecordIntervals(@RequestBody ManageRecordIntervals manageRecordIntervals) {
+        return Result.success(manageRecordIntervalsService.updateById(manageRecordIntervals));
+    }
+
+    @Operation(summary = "鍒犻櫎鏂囦欢瀹氭湡瀹℃煡璁板綍")
+    @DeleteMapping("/delManageRecordIntervals")
+    public Result delManageRecordIntervals(Integer id) {
+        return Result.success(manageRecordIntervalsService.delManageRecordIntervals(id));
+    }
+
+    @Operation(summary = "瀵煎嚭鏂囦欢瀹氭湡瀹℃煡璁板綍")
+    @GetMapping("/exportOutManageRecordIntervals")
+    public Result exportOutManageRecordIntervals(ManageRecordIntervals manageRecordIntervals, HttpServletResponse response) throws Exception {
+        return Result.success(manageRecordIntervalsService.exportOutManageRecordIntervals(manageRecordIntervals,response));
+    }
+
+    @Operation(summary = "瀵煎叆鏂囦欢瀹氭湡瀹℃煡璁板綍")
+    @PostMapping("/exportInManageRecordIntervals")
+    public Result exportInManageRecordIntervals(MultipartFile file){
+        return Result.success(manageRecordIntervalsService.exportInManageRecordIntervals(file));
+    }
+
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/controller/ManageRecordIntervalsTotalController.java b/cnas-manage/src/main/java/com/ruoyi/manage/controller/ManageRecordIntervalsTotalController.java
new file mode 100644
index 0000000..d457282
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/controller/ManageRecordIntervalsTotalController.java
@@ -0,0 +1,55 @@
+package com.ruoyi.manage.controller;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+
+
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.common.utils.JackSonUtil;
+import com.ruoyi.manage.pojo.ManageRecordIntervalsTotal;
+import com.ruoyi.manage.service.ManageRecordIntervalsTotalService;
+import com.deepoove.poi.data.style.*;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
+import org.springframework.web.bind.annotation.*;
+
+import jakarta.annotation.Resource;
+import java.util.Map;
+
+/**
+ * <p>
+ * 鏂囦欢瀹氭湡瀹℃煡璁板綍鎬诲巻鍙茶褰曡〃 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-15 01:12:11
+ */
+@Tag(name = "璁板綍鐨勬帶鍒�")
+@RestController
+@RequestMapping("/manageRecordIntervalsTotal")
+public class ManageRecordIntervalsTotalController {
+
+    @Resource
+    private ManageRecordIntervalsTotalService manageRecordIntervalsTotalService;
+
+    @Operation(summary = "鏌ヨ鏂囦欢瀹氭湡瀹℃煡璁板綍鍘嗗彶鍒楄〃")
+    @GetMapping("/pageManageRecordIntervalsTotal")
+    public Result pageManageRecordIntervalsTotal(Page page,ManageRecordIntervalsTotal manageRecordIntervalsTotal) throws Exception {
+        return Result.success(manageRecordIntervalsTotalService.pageManageRecordIntervalsTotal(page, manageRecordIntervalsTotal));
+    }
+
+    @Operation(summary = "鎻愪氦鏂囦欢瀹氭湡瀹℃煡璁板綍鍘嗗彶鍒楄〃")
+    @PostMapping("/submitManageRecordIntervalsTotal")
+    public Result submitManageRecordIntervalsTotal(@RequestBody Map<String, Integer> param) {
+        Integer id = param.get("id");
+        return Result.success(manageRecordIntervalsTotalService.submitManageRecordIntervalsTotal(id));
+    }
+
+    @Operation(summary = "鎵瑰噯鏂囦欢瀹氭湡瀹℃煡璁板綍鍘嗗彶鍒楄〃")
+    @PostMapping("/ratifyManageRecordIntervalsTotal")
+    public Result ratifyManageRecordIntervalsTotal(@RequestBody Map<String, Object> param) {
+        Integer id = (Integer) param.get("id");
+        String ratifyState = (String) param.get("ratifyState");
+        return Result.success(manageRecordIntervalsTotalService.ratifyManageRecordIntervalsTotal(id, ratifyState));
+    }
+
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/controller/ManageRecordIssueRecycleController.java b/cnas-manage/src/main/java/com/ruoyi/manage/controller/ManageRecordIssueRecycleController.java
new file mode 100644
index 0000000..99ab189
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/controller/ManageRecordIssueRecycleController.java
@@ -0,0 +1,74 @@
+package com.ruoyi.manage.controller;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+
+import com.deepoove.poi.data.style.*;
+
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.common.utils.JackSonUtil;
+import com.ruoyi.manage.pojo.ManageRecordIssueRecycle;
+import com.ruoyi.manage.service.ManageRecordIssueRecycleService;
+import com.deepoove.poi.data.style.*;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletResponse;
+import java.util.Map;
+
+/**
+ * <p>
+ * 鎵�鏈夋枃浠�(鍐呫�佸閮ㄦ枃浠�)鐨勫彂鏀句笌鍥炴敹璁板綍 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-13 09:11:05
+ */
+@Tag(name = "璁板綍鐨勬帶鍒�")
+@RestController
+@RequestMapping("/manageRecordIssueRecycle")
+public class ManageRecordIssueRecycleController {
+
+    @Resource
+    private ManageRecordIssueRecycleService manageRecordIssueRecycleService;
+
+    @Operation(summary = "鍒嗛〉鏌ヨ鎵�鏈夋枃浠剁殑鍙戞斁涓庡洖鏀惰褰�")
+    @GetMapping("/pageManageRecordIssueRecycle")
+    public Result pageManageRecordIssueRecycle(Page page,ManageRecordIssueRecycle manageRecordIssueRecycle) throws Exception {
+        return Result.success(manageRecordIssueRecycleService.pageManageRecordIssueRecycle(page, manageRecordIssueRecycle));
+    }
+
+    @Operation(summary = "鍒犻櫎鎵�鏈夋枃浠剁殑鍙戞斁涓庡洖鏀惰褰�")
+    @DeleteMapping("/delManageRecordIssueRecycle")
+    public Result delManageRecordIssueRecycle(Integer id){
+        return Result.success(manageRecordIssueRecycleService.removeById(id));
+    }
+
+    @Operation(summary = "鏂板鎵�鏈夋枃浠剁殑鍙戞斁涓庡洖鏀惰褰�")
+    @PostMapping("/addManageRecordIssueRecycle")
+    public Result addManageRecordIssueRecycle(@RequestBody ManageRecordIssueRecycle manageRecordIssueRecycle){
+        return Result.success(manageRecordIssueRecycleService.addManageRecordIssueRecycle(manageRecordIssueRecycle));
+    }
+
+
+    @Operation(summary = "缂栬緫鎵�鏈夋枃浠剁殑鍙戞斁涓庡洖鏀惰褰�")
+    @PostMapping("/doManageRecordIssueRecycle")
+    public Result doManageRecordIssueRecycle(@RequestBody ManageRecordIssueRecycle manageRecordIssueRecycle){
+        return Result.success(manageRecordIssueRecycleService.doManageRecordIssueRecycle(manageRecordIssueRecycle));
+    }
+
+    @Operation(summary = "瀵煎嚭鎵�鏈夋枃浠剁殑鍙戞斁涓庡洖鏀惰褰�")
+    @GetMapping("/exportOutManageRecordIssueRecycle")
+    public Result exportOutManageRecordIssueRecycle(ManageRecordIssueRecycle manageRecordIssueRecycle, HttpServletResponse response) {
+        return Result.success(manageRecordIssueRecycleService.exportOutManageRecordIssueRecycle(manageRecordIssueRecycle,response));
+    }
+
+    @Operation(summary = "瀵煎叆鎵�鏈夋枃浠剁殑鍙戞斁涓庡洖鏀惰褰�")
+    @PostMapping("/exportInManageRecordIssueRecycle")
+    public Result exportInManageRecordIssueRecycle(MultipartFile file){
+        return Result.success(manageRecordIssueRecycleService.exportInManageRecordIssueRecycle(file));
+    }
+
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/controller/ManageRecordTotalController.java b/cnas-manage/src/main/java/com/ruoyi/manage/controller/ManageRecordTotalController.java
new file mode 100644
index 0000000..65b9f2c
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/controller/ManageRecordTotalController.java
@@ -0,0 +1,55 @@
+package com.ruoyi.manage.controller;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+
+
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.common.utils.JackSonUtil;
+import com.ruoyi.manage.pojo.ManageRecordTotal;
+import com.ruoyi.manage.service.ManageRecordTotalService;
+import com.deepoove.poi.data.style.*;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
+import org.springframework.web.bind.annotation.*;
+
+import jakarta.annotation.Resource;
+import java.util.Map;
+
+/**
+ * <p>
+ * 澶栨潵鏂囦欢纭璁板綍鎬诲巻鍙茶褰曡〃 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 
+ * @since 2024-11-12 10:30:08
+ */
+@Tag(name = "璁板綍鐨勬帶鍒�")
+@RestController
+@RequestMapping("/manageRecordTotal")
+public class ManageRecordTotalController {
+
+    @Resource
+    private ManageRecordTotalService manageRecordTotalService;
+
+    @Operation(summary = "鏌ヨ澶栨潵鏂囦欢纭璁板綍鍘嗗彶鍒楄〃")
+    @GetMapping("/pageManageRecordTotal")
+    public Result pageManageRecordTotal(Page page, ManageRecordTotal manageRecordTotal) throws Exception {
+        return Result.success(manageRecordTotalService.pageManageRecordTotal(page, manageRecordTotal));
+    }
+
+    @Operation(summary = "鎻愪氦澶栨潵鏂囦欢纭璁板綍鍘嗗彶鍒楄〃")
+    @PostMapping("/submitManageRecordTotal")
+    public Result submitManageRecordTotal(@RequestBody Map<String, Integer> param) {
+        Integer id = param.get("id");
+        return Result.success(manageRecordTotalService.submitManageRecordTotal(id));
+    }
+
+    @Operation(summary = "鎵瑰噯澶栨潵鏂囦欢纭璁板綍鍘嗗彶鍒楄〃")
+    @PostMapping("/ratifyManageRecordTotal")
+    public Result ratifyManageRecordTotal(@RequestBody Map<String, Object> param) {
+        Integer id = (Integer) param.get("id");
+        String ratifyState = (String) param.get("ratifyState");
+        return Result.success(manageRecordTotalService.ratifyManageRecordTotal(id, ratifyState));
+    }
+
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/controller/ManageRecordVerifyController.java b/cnas-manage/src/main/java/com/ruoyi/manage/controller/ManageRecordVerifyController.java
new file mode 100644
index 0000000..ba56693
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/controller/ManageRecordVerifyController.java
@@ -0,0 +1,68 @@
+package com.ruoyi.manage.controller;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+
+import com.deepoove.poi.data.style.*;
+
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.common.utils.JackSonUtil;
+import com.ruoyi.manage.pojo.ManageRecordVerify;
+import com.ruoyi.manage.service.ManageRecordVerifyService;
+import com.deepoove.poi.data.style.*;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import jakarta.annotation.Resource;
+import java.util.Map;
+
+/**
+ * <p>
+ * 澶栨潵鏂囦欢纭璁板綍 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 
+ * @since 2024-11-12 10:29:44
+ */
+@Tag(name = "璁板綍鐨勬帶鍒�")
+@RestController
+@RequestMapping("/manageRecordVerify")
+public class ManageRecordVerifyController {
+
+    @Resource
+    private ManageRecordVerifyService manageRecordVerifyService;
+
+
+    @Operation(summary = "鏌ヨ澶栨潵鏂囦欢纭璁板綍璇︽儏")
+    @GetMapping("/pageManageRecordVerify")
+    public Result pageManageRecordVerify(Page page,ManageRecordVerify manageRecordVerify) throws Exception {
+        return Result.success(manageRecordVerifyService.pageManageRecordVerify(page, manageRecordVerify));
+    }
+
+    @Operation(summary = "鏂板澶栨潵鏂囦欢纭璁板綍")
+    @PostMapping("/addManageRecordVerify")
+    public Result addManageRecordVerify(@RequestBody ManageRecordVerify manageRecordVerify) {
+        return Result.success(manageRecordVerifyService.addManageRecordVerify(manageRecordVerify));
+    }
+
+    @Operation(summary = "鍒犻櫎澶栨潵鏂囦欢纭璁板綍")
+    @DeleteMapping("/delManageRecordVerify")
+    public Result delManageRecordVerify(Integer id) {
+        return Result.success(manageRecordVerifyService.delManageRecordVerify(id));
+    }
+
+
+    @Operation(summary = "淇敼澶栨潵鏂囦欢纭璁板綍")
+    @PostMapping("/doManageRecordVerify")
+    public Result doManageRecordVerify(@RequestBody ManageRecordVerify manageRecordVerify) {
+        return Result.success(manageRecordVerifyService.updateById(manageRecordVerify));
+    }
+
+    @Operation(summary = "瀵煎叆澶栨潵鏂囦欢纭璁板綍")
+    @PostMapping("/exportManageRecordVerify")
+    public Result exportManageRecordVerify(MultipartFile file) {
+        return Result.success(manageRecordVerifyService.exportManageRecordVerify(file));
+    }
+
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/controller/ManageReviewProgramController.java b/cnas-manage/src/main/java/com/ruoyi/manage/controller/ManageReviewProgramController.java
new file mode 100644
index 0000000..e11baf3
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/controller/ManageReviewProgramController.java
@@ -0,0 +1,68 @@
+package com.ruoyi.manage.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.manage.pojo.ManageReviewProgram;
+import com.ruoyi.manage.service.ManageReviewProgramService;
+import com.deepoove.poi.data.style.*;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
+import org.springframework.web.bind.annotation.*;
+
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletResponse;
+
+/**
+ * <p>
+ *  鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-09 03:05:42
+ */
+@Tag(name = "绠$悊璇勫璁″垝")
+@RestController
+@RequestMapping("/manageReviewProgram")
+public class ManageReviewProgramController {
+    @Resource
+    private ManageReviewProgramService manageReviewProgramService;
+
+
+    @Operation(summary = "鏌ヨ璇勫璁″垝")
+    @GetMapping("/getPageReviewProgram")
+    public Result<IPage<ManageReviewProgram>> getPageReviewProgram(Page page, String startTime,String endTime, String judgingLocation) {
+        IPage<ManageReviewProgram> ipage = manageReviewProgramService.page(page,startTime,endTime,judgingLocation);
+        return Result.success(ipage);
+    }
+
+
+    @Operation(summary = "鏂板璇勫璁″垝")
+    @PostMapping("/addReviewProgram")
+    public Result addReviewProgram(@RequestBody ManageReviewProgram manageReviewProgram){
+        return Result.success(manageReviewProgramService.addReviewProgram(manageReviewProgram));
+    }
+
+    @Operation(summary = "缂栬緫璇勫璁″垝")
+    @PostMapping("/modifyReviewProgram")
+    public Result modifyReviewProgram(@RequestBody ManageReviewProgram manageReviewProgram){
+        return Result.success(manageReviewProgramService.updateById(manageReviewProgram));
+    }
+
+    @Operation(summary = "鍒犻櫎璇勫璁″垝")
+    @DeleteMapping("/deleteReviewProgram")
+    public Result deleteReviewProgram( Integer id){
+        return Result.success(manageReviewProgramService.removeById(id));
+    }
+
+
+    @Operation(summary = "涓嬭浇璇勫璁″垝")
+    @GetMapping("/exportReviewProgram")
+    public void exportReviewProgram(Integer id, HttpServletResponse response){
+        manageReviewProgramService.exportReviewProgram(id,response);
+    }
+
+
+
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/controller/ManageReviewProgramFileController.java b/cnas-manage/src/main/java/com/ruoyi/manage/controller/ManageReviewProgramFileController.java
new file mode 100644
index 0000000..7366985
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/controller/ManageReviewProgramFileController.java
@@ -0,0 +1,46 @@
+package com.ruoyi.manage.controller;
+
+
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.manage.service.ManageReviewProgramFileService;
+import com.deepoove.poi.data.style.*;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import jakarta.annotation.Resource;
+
+/**
+ * <p>
+ *  鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-09 04:15:47
+ */
+@Tag(name = "绠$悊璇勫璁″垝鏂囦欢")
+@RestController
+@RequestMapping("/manageReviewProgramFile")
+public class ManageReviewProgramFileController {
+
+    @Resource
+    private ManageReviewProgramFileService manageReviewProgramFileService;
+
+    @Operation(summary = "鏌ヨ璇勫璁″垝鏂囦欢")
+    @GetMapping("/selectReviewProgramFile")
+    public Result selectReviewProgramFile(Integer id){
+        return Result.success(manageReviewProgramFileService.selectFile(id));
+    }
+
+
+    @Operation(summary = "鏂板璇勫璁″垝鏂囦欢")
+    @PostMapping("/addReviewProgramFile")
+    public Result addReviewProgramFile(MultipartFile file,Integer id){
+        manageReviewProgramFileService.addFile(file,id);
+        return Result.success();
+    }
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/controller/ManageReviewReportController.java b/cnas-manage/src/main/java/com/ruoyi/manage/controller/ManageReviewReportController.java
new file mode 100644
index 0000000..24449e9
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/controller/ManageReviewReportController.java
@@ -0,0 +1,63 @@
+package com.ruoyi.manage.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.manage.pojo.ManageReviewReport;
+import com.ruoyi.manage.service.ManageReviewReportService;
+import com.deepoove.poi.data.style.*;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
+import org.springframework.web.bind.annotation.*;
+
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletResponse;
+
+/**
+ * <p>
+ * 绠$悊璇勫鎶ュ憡 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 
+ * @since 2024-11-12 04:44:39
+ */
+@Tag(name = "绠$悊璇勫鎶ュ憡")
+@RestController
+@RequestMapping("/manageReviewReport")
+public class ManageReviewReportController {
+
+    @Resource
+    private ManageReviewReportService manageReviewReportService;
+
+    @Operation(summary = "鏌ヨ绠$悊璇勫鎶ュ憡")
+    @GetMapping("/getPageReviewReport")
+    public Result<IPage<ManageReviewReport>> getPageReviewReport(Page page, String startTime, String endTime, String place) {
+        IPage<ManageReviewReport> ipage = manageReviewReportService.page(page,startTime,endTime,place);
+        return Result.success(ipage);
+    }
+
+    @Operation(summary = "鏂板绠$悊璇勫鎶ュ憡")
+    @PostMapping("/addReviewReport")
+    public Result addReviewReport(@RequestBody ManageReviewReport manageReviewReport){
+        return Result.success(manageReviewReportService.save(manageReviewReport));
+    }
+
+    @Operation(summary = "缂栬緫绠$悊璇勫鎶ュ憡")
+    @PostMapping("/modifyReviewReport")
+    public Result modifyReviewReport(@RequestBody ManageReviewReport manageReviewReport){
+        return Result.success(manageReviewReportService.updateById(manageReviewReport));
+    }
+
+    @Operation(summary = "鍒犻櫎绠$悊璇勫鎶ュ憡")
+    @DeleteMapping("/deleteReviewReport")
+    public Result deleteReviewReport(Integer id){
+        return Result.success(manageReviewReportService.removeById(id));
+    }
+
+    @Operation(summary = "涓嬭浇绠$悊璇勫鎶ュ憡")
+    @GetMapping("/exportReviewReport")
+    public void exportReviewReport(Integer id , HttpServletResponse response){
+        manageReviewReportService.exportReviewReport(id,response);
+    }
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/controller/ManageRiskAssessmentResultsController.java b/cnas-manage/src/main/java/com/ruoyi/manage/controller/ManageRiskAssessmentResultsController.java
new file mode 100644
index 0000000..0bc7c34
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/controller/ManageRiskAssessmentResultsController.java
@@ -0,0 +1,134 @@
+package com.ruoyi.manage.controller;
+
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.enums.CellExtraTypeEnum;
+import com.alibaba.excel.read.listener.PageReadListener;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.deepoove.poi.data.style.*;
+
+
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.framework.exception.ErrorException;
+import com.ruoyi.manage.pojo.ManageRiskAssessmentResults;
+import com.ruoyi.manage.service.ManageRiskAssessmentResultsService;
+import com.ruoyi.manage.vo.ManageRiskAssessmentResultsVo;
+import com.deepoove.poi.data.style.*;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.time.LocalDateTime;
+import java.util.Map;
+
+/**
+ * <p>
+ * 鍗遍櫓鍥犵礌杈ㄨ瘑涓庨闄╄瘎浠风粨鏋滀竴瑙堣〃 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-15 02:58:51
+ */
+@Tag(name = "鍗遍櫓鍥犵礌杈ㄨ瘑涓庨闄╄瘎浠风粨鏋滀竴瑙堣〃")
+@RestController
+@RequestMapping("/manageRiskAssessmentResults")
+public class ManageRiskAssessmentResultsController {
+
+    @Resource
+    private ManageRiskAssessmentResultsService manageRiskAssessmentResultsService;
+
+    @Operation(summary = "鍒嗛〉鏌ヨ")
+    @GetMapping("/getPageResults")
+    public Result<IPage<ManageRiskAssessmentResultsVo>> getPageResults(Page page) {
+        IPage<ManageRiskAssessmentResultsVo> ipage = manageRiskAssessmentResultsService.getPageResults(page);
+        return Result.success(ipage);
+    }
+
+    @Operation(summary = "鎵瑰噯")
+    @PostMapping("/hazardIdentificationAndRiskApproval")
+    public Result<?> hazardIdentificationAndRiskApproval(@RequestBody Map<String, Integer> param) {
+        Integer approve = param.get("approve");
+        Integer status = param.get("status");
+        manageRiskAssessmentResultsService.update(Wrappers.<ManageRiskAssessmentResults>lambdaUpdate()
+                .set(ManageRiskAssessmentResults::getApprove, approve)
+                .set(ManageRiskAssessmentResults::getApproveStatus, status)
+                .set(ManageRiskAssessmentResults::getApproveDate, LocalDateTime.now()));
+        return Result.success();
+    }
+
+    @Operation(summary = "瀹℃壒")
+    @PostMapping("/dangerousRiskApproval")
+    public Result<?> dangerousRiskApproval(@RequestBody Map<String, Integer> param) {
+        Integer approval = param.get("approval");
+        Integer status = param.get("status");
+        manageRiskAssessmentResultsService.update(Wrappers.<ManageRiskAssessmentResults>lambdaUpdate()
+                .set(ManageRiskAssessmentResults::getApproval, approval)
+                .set(ManageRiskAssessmentResults::getApprovalStatus, status)
+                .set(ManageRiskAssessmentResults::getApprovalDate, LocalDateTime.now()));
+        return Result.success();
+    }
+
+    @Operation(summary = "瀵煎叆")
+    @PostMapping("/riskAssessmentImport")
+    public void riskAssessmentImport(MultipartFile file) throws IOException {
+        boolean excelFile = isExcelFile(file);
+        if (!excelFile) {
+            throw new ErrorException("璇峰鍏xcel鏂囦欢锛�");
+        }
+        EasyExcel.read(file.getInputStream(), ManageRiskAssessmentResults.class, new PageReadListener<ManageRiskAssessmentResults>(dataList -> {
+            Integer userId = SecurityUtils.getUserId().intValue();
+            dataList.forEach(i -> {
+                i.setEditor(userId);
+                i.setEditorDate(LocalDateTime.now());
+                i.setApproveStatus(0);
+                i.setApprovalStatus(0);
+            });
+            manageRiskAssessmentResultsService.saveOrUpdateBatch(dataList);
+        })).extraRead(CellExtraTypeEnum.MERGE).sheet().doRead();
+    }
+
+    @Operation(summary = "鏂板")
+    @PostMapping("/addNewRiskFactors")
+    public void addNewRiskFactors(@RequestBody ManageRiskAssessmentResults manageRiskAssessmentResults) {
+        Integer userId = SecurityUtils.getUserId().intValue();
+        manageRiskAssessmentResults.setEditor(userId);
+        manageRiskAssessmentResults.setEditorDate(LocalDateTime.now());
+        manageRiskAssessmentResultsService.saveOrUpdate(manageRiskAssessmentResults);
+    }
+
+    @Operation(summary = "鍒犻櫎")
+    @DeleteMapping("/removeRiskFactors")
+    public void removeRiskFactors(Integer id) {
+        manageRiskAssessmentResultsService.removeById(id);
+    }
+
+
+    @Operation(summary = "瀵煎嚭鍗遍櫓鍥犵礌杈ㄨ瘑涓庨闄╄瘎浠风粨鏋滀竴瑙�")
+    @GetMapping("/exportHazardFactorIdentification")
+    public void exportPersonTraining(HttpServletResponse response){
+        manageRiskAssessmentResultsService.exportPersonTraining(response);
+    }
+
+    public static boolean isExcelFile(MultipartFile file) {
+        if (file.isEmpty()) {
+            return false;
+        }
+        String originalFilename = file.getOriginalFilename();
+        if (originalFilename == null) {
+            return false;
+        }
+        String[] parts = originalFilename.split("\\.");
+        if (parts.length == 0) {
+            return false;
+        }
+        String fileExtension = parts[parts.length - 1].toLowerCase();
+        return fileExtension.equals("xls") || fileExtension.equals("xlsx");
+    }
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/dto/ClientSatisfactionDto.java b/cnas-manage/src/main/java/com/ruoyi/manage/dto/ClientSatisfactionDto.java
new file mode 100644
index 0000000..ef1baf9
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/dto/ClientSatisfactionDto.java
@@ -0,0 +1,50 @@
+package com.ruoyi.manage.dto;
+
+import com.ruoyi.manage.pojo.ClientSatisfaction;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * Author: yuan
+ * Date: 2024-12-16 鏄熸湡涓� 10:38:30
+ * Description: 瀹㈡埛婊℃剰搴﹁皟鏌ュ鍑篧ord
+ */
+@Data
+public class ClientSatisfactionDto extends ClientSatisfaction {
+
+    @Schema(description = "鏈嶅姟鎬佸害, 0:婊℃剰, 1:涓�鑸�, 2:涓嶆弧鎰�")
+    private String serviceAttitude0;
+
+    @Schema(description = "鏈嶅姟鎬佸害, 0:婊℃剰, 1:涓�鑸�, 2:涓嶆弧鎰�")
+    private String serviceAttitude1;
+
+    @Schema(description = "鏈嶅姟鎬佸害, 0:婊℃剰, 1:涓�鑸�, 2:涓嶆弧鎰�")
+    private String serviceAttitude2;
+
+    @Schema(description = "鎶�鏈兘鍔�, 0:婊℃剰, 1:涓�鑸�, 2:涓嶆弧鎰�")
+    private String technicalCompetence0;
+
+    @Schema(description = "鎶�鏈兘鍔�, 0:婊℃剰, 1:涓�鑸�, 2:涓嶆弧鎰�")
+    private String technicalCompetence1;
+
+    @Schema(description = "鎶�鏈兘鍔�, 0:婊℃剰, 1:涓�鑸�, 2:涓嶆弧鎰�")
+    private String technicalCompetence2;
+
+    @Schema(description = "妫�娴嬪伐浣�, 0:婊℃剰, 1:涓�鑸�, 2:涓嶆弧鎰�")
+    private String inspectionWork0;
+
+    @Schema(description = "妫�娴嬪伐浣�, 0:婊℃剰, 1:涓�鑸�, 2:涓嶆弧鎰�")
+    private String inspectionWork1;
+
+    @Schema(description = "妫�娴嬪伐浣�, 0:婊℃剰, 1:涓�鑸�, 2:涓嶆弧鎰�")
+    private String inspectionWork2;
+
+    @Schema(description = "鏀惰垂鍚堢悊鎬�, 0:婊℃剰, 1:涓�鑸�, 2:涓嶆弧鎰�")
+    private String reasonableFees0;
+
+    @Schema(description = "鏀惰垂鍚堢悊鎬�, 0:婊℃剰, 1:涓�鑸�, 2:涓嶆弧鎰�")
+    private String reasonableFees1;
+
+    @Schema(description = "鏀惰垂鍚堢悊鎬�, 0:婊℃剰, 1:涓�鑸�, 2:涓嶆弧鎰�")
+    private String reasonableFees2;
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/dto/InternalCheckDto.java b/cnas-manage/src/main/java/com/ruoyi/manage/dto/InternalCheckDto.java
new file mode 100644
index 0000000..8a23b4e
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/dto/InternalCheckDto.java
@@ -0,0 +1,19 @@
+package com.ruoyi.manage.dto;
+
+import com.ruoyi.manage.pojo.InternalCheck;
+import com.ruoyi.manage.pojo.InternalCheckDetail;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @Author zhuo
+ * @Date 2024/11/11
+ */
+@Data
+public class InternalCheckDto extends InternalCheck {
+
+    @Schema(description = "妫�鏌ヨ鎯�")
+    private List<InternalCheckDetail> checkDetailList;
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/dto/InternalCorrectDto.java b/cnas-manage/src/main/java/com/ruoyi/manage/dto/InternalCorrectDto.java
new file mode 100644
index 0000000..f7e9bf0
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/dto/InternalCorrectDto.java
@@ -0,0 +1,26 @@
+package com.ruoyi.manage.dto;
+
+import com.ruoyi.manage.pojo.InternalCorrect;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * @Author zhuo
+ * @Date 2024/11/19
+ */
+@Data
+public class InternalCorrectDto extends InternalCorrect {
+
+    @Schema(description = "鎻愬嚭鏃堕棿")
+    private String raiseTimeString;
+
+    @Schema(description = "鍘熷洜鍒嗘瀽鏃堕棿")
+    private String causeTimeString;
+
+    @Schema(description = "绾犳鏃堕棿")
+    private String correctTimeString;
+
+    @Schema(description = "楠岃瘉鏃堕棿")
+    private String validationTimeString;
+
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/dto/InternalImplementDto.java b/cnas-manage/src/main/java/com/ruoyi/manage/dto/InternalImplementDto.java
new file mode 100644
index 0000000..edaaedd
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/dto/InternalImplementDto.java
@@ -0,0 +1,19 @@
+package com.ruoyi.manage.dto;
+
+import com.ruoyi.manage.pojo.InternalImplement;
+import com.ruoyi.manage.pojo.InternalImplementDetail;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @Author zhuo
+ * @Date 2024/11/11
+ */
+@Data
+public class InternalImplementDto extends InternalImplement {
+
+    @Schema(description = "璁″垝璇︽儏")
+    private List<InternalImplementDetail> implementDetailList;
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/dto/InternalMeetingDto.java b/cnas-manage/src/main/java/com/ruoyi/manage/dto/InternalMeetingDto.java
new file mode 100644
index 0000000..3519069
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/dto/InternalMeetingDto.java
@@ -0,0 +1,22 @@
+package com.ruoyi.manage.dto;
+
+import com.ruoyi.manage.pojo.InternalMeeting;
+import com.ruoyi.manage.pojo.InternalMeetingDetail;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @Author zhuo
+ * @Date 2024/11/12
+ */
+@Data
+public class InternalMeetingDto extends InternalMeeting {
+
+    @Schema(description = "鍙傚姞浜�")
+    private List<InternalMeetingDetail> meetingDetailList;
+
+    @Schema(description = "鍙傚姞浜轰俊鎭�")
+    private String participantName;
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/dto/InternalMeetingParticipantDto.java b/cnas-manage/src/main/java/com/ruoyi/manage/dto/InternalMeetingParticipantDto.java
new file mode 100644
index 0000000..192fa7b
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/dto/InternalMeetingParticipantDto.java
@@ -0,0 +1,32 @@
+package com.ruoyi.manage.dto;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * 鍙傚姞浜哄憳瀵硅薄
+ *
+ * @Author zhuo
+ * @Date 2024/11/19
+ */
+@Data
+public class InternalMeetingParticipantDto {
+
+    @Schema(description = "鍙傚姞浜哄憳1")
+    private String userName1;
+
+    @Schema(description = "閮ㄩ棬1")
+    private String department1;
+
+    @Schema(description = "鍙傚姞浜哄憳2")
+    private String userName2;
+
+    @Schema(description = "閮ㄩ棬2")
+    private String department2;
+
+    @Schema(description = "鍙傚姞浜哄憳3")
+    private String userName3;
+
+    @Schema(description = "閮ㄩ棬3")
+    private String department3;
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/dto/InternalPlanDto.java b/cnas-manage/src/main/java/com/ruoyi/manage/dto/InternalPlanDto.java
new file mode 100644
index 0000000..3715f8e
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/dto/InternalPlanDto.java
@@ -0,0 +1,19 @@
+package com.ruoyi.manage.dto;
+
+import com.ruoyi.manage.pojo.InternalPlan;
+import com.ruoyi.manage.pojo.InternalPlanDetail;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @Author zhuo
+ * @Date 2024/11/13
+ */
+@Data
+public class InternalPlanDto extends InternalPlan {
+
+    @Schema(description = "璁″垝璇︽儏")
+    private List<InternalPlanDetail> planDetailList;
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/dto/ManageDocumentIssueRecycleDto.java b/cnas-manage/src/main/java/com/ruoyi/manage/dto/ManageDocumentIssueRecycleDto.java
new file mode 100644
index 0000000..ae0375d
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/dto/ManageDocumentIssueRecycleDto.java
@@ -0,0 +1,26 @@
+package com.ruoyi.manage.dto;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+
+import com.ruoyi.manage.pojo.ManageDocumentIssueRecycle;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+@Data
+@ExcelIgnoreUnannotated
+public class ManageDocumentIssueRecycleDto extends ManageDocumentIssueRecycle {
+
+    @Schema(description = "鍙戞斁浜�")
+    @ExcelProperty(value = "鍙戞斁浜�")
+    private String issueUserName;
+
+    @Schema(description = "鍥炴敹浜�")
+    @ExcelProperty(value = "鍥炴敹浜�")
+    private String recycleUserName;
+
+    @Schema(description = "鎺ユ敹浜�")
+    @ExcelProperty(value = "鎺ユ敹浜�")
+    private String receiveUserName;
+
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/dto/ManageMeetingDto.java b/cnas-manage/src/main/java/com/ruoyi/manage/dto/ManageMeetingDto.java
new file mode 100644
index 0000000..a32ec7b
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/dto/ManageMeetingDto.java
@@ -0,0 +1,16 @@
+package com.ruoyi.manage.dto;
+
+import com.ruoyi.manage.pojo.ManageMeeting;
+import com.ruoyi.manage.pojo.ManageMeetingParticipants;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class ManageMeetingDto extends ManageMeeting {
+
+    private List<ManageMeetingParticipants> list;
+
+    private String participant;
+
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/dto/ManageMeetingParticipantsDto.java b/cnas-manage/src/main/java/com/ruoyi/manage/dto/ManageMeetingParticipantsDto.java
new file mode 100644
index 0000000..67f19ce
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/dto/ManageMeetingParticipantsDto.java
@@ -0,0 +1,21 @@
+package com.ruoyi.manage.dto;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+@Data
+public class ManageMeetingParticipantsDto {
+
+    @Schema(description = "鍙傚姞浜哄憳1")
+    private String userName1;
+
+    @Schema(description = "閮ㄩ棬1")
+    private String department1;
+
+    @Schema(description = "鍙傚姞浜哄憳2")
+    private String userName2;
+
+    @Schema(description = "閮ㄩ棬2")
+    private String department2;
+
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/excel/ManageDocumentListListener.java b/cnas-manage/src/main/java/com/ruoyi/manage/excel/ManageDocumentListListener.java
new file mode 100644
index 0000000..362fee6
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/excel/ManageDocumentListListener.java
@@ -0,0 +1,63 @@
+package com.ruoyi.manage.excel;
+
+import com.alibaba.excel.context.AnalysisContext;
+import com.alibaba.excel.event.AnalysisEventListener;
+import com.ruoyi.common.exception.base.BaseException;
+import com.ruoyi.manage.pojo.ManageDocumentList;
+import com.ruoyi.manage.service.ManageDocumentListService;
+import lombok.Data;
+import org.springframework.util.CollectionUtils;
+
+import java.util.*;
+
+@Data
+public class ManageDocumentListListener extends AnalysisEventListener<ManageDocumentList> {
+    private static final int BATCH_COUNT = 1000;
+    List<ManageDocumentList> list = new ArrayList<>();
+
+    private ManageDocumentListService manageDocumentListService;
+
+    public ManageDocumentListListener(ManageDocumentListService manageDocumentListService) {
+        this.manageDocumentListService = manageDocumentListService;
+    }
+
+    @Override
+    public void invoke(ManageDocumentList data, AnalysisContext analysisContext) {
+        list.add(data);
+        if (list.size() >= BATCH_COUNT) {
+            save();
+            list.clear();
+        }
+    }
+
+    @Override
+    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
+        int size = list.size();
+        if(size == 0){
+            throw new BaseException("瀵煎叆鏁版嵁涓嶅緱涓虹┖");
+        }else {
+            save();
+        }
+    }
+
+    @Override
+    public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
+        // 鑾峰彇琛ㄥご淇℃伅
+        if(CollectionUtils.isEmpty(headMap) || headMap.size() != 8){
+            throw new RuntimeException("瀵煎叆妯℃澘鏈夎");
+        }
+        List<String> colums = Arrays.asList(
+                "搴忓彿", "鏂囦欢缂栧彿", "绫诲埆", "鍚嶇О",
+                "鏂囦欢鐗堟湰", "浣滆��", "鐢熸晥鏃ユ湡", "鏂囦欢鐘舵��"
+        );
+        for (int i = 0; i < colums.size(); i++) {
+            if(!headMap.get(i).equals(colums.get(i))){
+                throw new BaseException("瀵煎叆妯℃澘鏈夎");
+            }
+        }
+    }
+
+    private void save() {
+        manageDocumentListService.importExcel(list);
+    }
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/mapper/ClientSatisfactionAnalyseFileMapper.java b/cnas-manage/src/main/java/com/ruoyi/manage/mapper/ClientSatisfactionAnalyseFileMapper.java
new file mode 100644
index 0000000..cb26a77
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/mapper/ClientSatisfactionAnalyseFileMapper.java
@@ -0,0 +1,27 @@
+package com.ruoyi.manage.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.manage.pojo.ClientSatisfactionAnalyseFile;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * 瀹㈡埛婊℃剰搴﹀垎鏋愰檮浠�
+ *
+ * @author makejava
+ * @since 2024-11-09
+ */
+@Mapper
+public interface ClientSatisfactionAnalyseFileMapper extends BaseMapper<ClientSatisfactionAnalyseFile> {
+
+    /**
+     * 瀹㈡埛鍒嗘瀽闄勪欢鍒楄〃
+     * @param page
+     * @return
+     */
+    IPage<ClientSatisfactionAnalyseFile> pageAnalyseFile(Page page, @Param("ew") QueryWrapper<ClientSatisfactionAnalyseFile> ew);
+}
+
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/mapper/ClientSatisfactionMapper.java b/cnas-manage/src/main/java/com/ruoyi/manage/mapper/ClientSatisfactionMapper.java
new file mode 100644
index 0000000..182ce3c
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/mapper/ClientSatisfactionMapper.java
@@ -0,0 +1,36 @@
+package com.ruoyi.manage.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.manage.dto.ClientSatisfactionDto;
+import com.ruoyi.manage.pojo.ClientSatisfaction;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * 瀹㈡埛婊℃剰搴�
+ *
+ * @author zhuo
+ * @since 2024-11-09
+ */
+@Mapper
+public interface ClientSatisfactionMapper extends BaseMapper<ClientSatisfaction> {
+
+    /**
+     * 瀹㈡埛婊℃剰搴﹁皟鏌ュ垪琛�
+     * @param page
+     * @param ew
+     * @return
+     */
+    IPage<ClientSatisfaction> pageClientSatisfaction(Page page, @Param("ew") QueryWrapper<ClientSatisfaction> ew);
+
+    /**
+     * 瀹㈡埛婊℃剰搴﹀鍑�
+     * @param clientSatisfactionId
+     * @return
+     */
+    ClientSatisfactionDto exportWordClientSatisfaction(Integer clientSatisfactionId);
+}
+
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/mapper/InternalCheckDetailMapper.java b/cnas-manage/src/main/java/com/ruoyi/manage/mapper/InternalCheckDetailMapper.java
new file mode 100644
index 0000000..65c7b78
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/mapper/InternalCheckDetailMapper.java
@@ -0,0 +1,17 @@
+package com.ruoyi.manage.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.manage.pojo.InternalCheckDetail;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 鍐呭妫�鏌ヨ鎯呰〃
+ *
+ * @author zhuo
+ * @since 2024-11-11
+ */
+@Mapper
+public interface InternalCheckDetailMapper extends BaseMapper<InternalCheckDetail> {
+
+}
+
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/mapper/InternalCheckMapper.java b/cnas-manage/src/main/java/com/ruoyi/manage/mapper/InternalCheckMapper.java
new file mode 100644
index 0000000..97196d4
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/mapper/InternalCheckMapper.java
@@ -0,0 +1,28 @@
+package com.ruoyi.manage.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.manage.dto.InternalCheckDto;
+import com.ruoyi.manage.pojo.InternalCheck;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * 鍐呭妫�鏌ヨ〃
+ *
+ * @author zhuo
+ * @since 2024-11-11
+ */
+@Mapper
+public interface InternalCheckMapper extends BaseMapper<InternalCheck> {
+
+    /**
+     * 鍐呭妫�鏌ュ垎椤垫煡璇�
+     * @param page
+     * @return
+     */
+    IPage<InternalCheckDto> pageInternalCheck(Page page, @Param("ew") QueryWrapper<InternalCheck> ew);
+}
+
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/mapper/InternalCorrectFileMapper.java b/cnas-manage/src/main/java/com/ruoyi/manage/mapper/InternalCorrectFileMapper.java
new file mode 100644
index 0000000..fe9645f
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/mapper/InternalCorrectFileMapper.java
@@ -0,0 +1,18 @@
+package com.ruoyi.manage.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.manage.pojo.InternalCorrectFile;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ * 鍐呭绠$悊绾犳鎺柦闄勪欢琛� Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author
+ * @since 2024-11-13 04:00:38
+ */
+@Mapper
+public interface InternalCorrectFileMapper extends BaseMapper<InternalCorrectFile> {
+
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/mapper/InternalCorrectMapper.java b/cnas-manage/src/main/java/com/ruoyi/manage/mapper/InternalCorrectMapper.java
new file mode 100644
index 0000000..02f02f3
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/mapper/InternalCorrectMapper.java
@@ -0,0 +1,23 @@
+package com.ruoyi.manage.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.manage.pojo.InternalCorrect;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * <p>
+ * 鍐呭绠$悊绾犳澶勭悊琛� Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author
+ * @since 2024-11-13 04:00:15
+ */
+@Mapper
+public interface InternalCorrectMapper extends BaseMapper<InternalCorrect> {
+
+    IPage<InternalCorrect> pageInternalAccording(Page page, @Param("ew") QueryWrapper<InternalCorrect> ew);
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/mapper/InternalImplementDetailMapper.java b/cnas-manage/src/main/java/com/ruoyi/manage/mapper/InternalImplementDetailMapper.java
new file mode 100644
index 0000000..2382df7
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/mapper/InternalImplementDetailMapper.java
@@ -0,0 +1,17 @@
+package com.ruoyi.manage.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.manage.pojo.InternalImplementDetail;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 鍐呭瀹炴柦璁″垝璇︽儏
+ *
+ * @author zhuo
+ * @since 2024-11-11
+ */
+@Mapper
+public interface InternalImplementDetailMapper extends BaseMapper<InternalImplementDetail> {
+
+}
+
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/mapper/InternalImplementMapper.java b/cnas-manage/src/main/java/com/ruoyi/manage/mapper/InternalImplementMapper.java
new file mode 100644
index 0000000..b337b06
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/mapper/InternalImplementMapper.java
@@ -0,0 +1,28 @@
+package com.ruoyi.manage.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.manage.dto.InternalImplementDto;
+import com.ruoyi.manage.pojo.InternalImplement;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * 鍐呭瀹炴柦璁″垝
+ *
+ * @author zhuo
+ * @since 2024-11-11
+ */
+@Mapper
+public interface InternalImplementMapper extends BaseMapper<InternalImplement> {
+
+    /**
+     * 鍐呭瀹炴柦璁″垝鍒嗛〉鏌ヨ
+     * @param page
+     * @return
+     */
+    IPage<InternalImplementDto> pageInternalImplement(Page page, @Param("ew") QueryWrapper<InternalImplement> ew);
+}
+
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/mapper/InternalMeetingDetailMapper.java b/cnas-manage/src/main/java/com/ruoyi/manage/mapper/InternalMeetingDetailMapper.java
new file mode 100644
index 0000000..ed4ed42
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/mapper/InternalMeetingDetailMapper.java
@@ -0,0 +1,16 @@
+package com.ruoyi.manage.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.manage.pojo.InternalMeetingDetail;
+
+/**
+ * <p>
+ * 鍐呭浼氳璇︽儏琛� Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 
+ * @since 2024-11-12 02:56:13
+ */
+public interface InternalMeetingDetailMapper extends BaseMapper<InternalMeetingDetail> {
+
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/mapper/InternalMeetingMapper.java b/cnas-manage/src/main/java/com/ruoyi/manage/mapper/InternalMeetingMapper.java
new file mode 100644
index 0000000..82f87ba
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/mapper/InternalMeetingMapper.java
@@ -0,0 +1,27 @@
+package com.ruoyi.manage.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.manage.dto.InternalMeetingDto;
+import com.ruoyi.manage.pojo.InternalMeeting;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * <p>
+ * 鍐呭浼氳琛� Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 
+ * @since 2024-11-12 02:50:44
+ */
+public interface InternalMeetingMapper extends BaseMapper<InternalMeeting> {
+
+    /**
+     * 鍐呭浼氳鍒嗛〉鏌ヨ
+     * @param page
+     * @return
+     */
+    IPage<InternalMeetingDto> pageInternalMeeting(Page page, @Param("ew") QueryWrapper<InternalMeeting> ew);
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/mapper/InternalPlanDetailMapper.java b/cnas-manage/src/main/java/com/ruoyi/manage/mapper/InternalPlanDetailMapper.java
new file mode 100644
index 0000000..02a0734
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/mapper/InternalPlanDetailMapper.java
@@ -0,0 +1,18 @@
+package com.ruoyi.manage.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.manage.pojo.InternalPlanDetail;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ * 鍐呭骞村害璁″垝璇︽儏琛� Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author
+ * @since 2024-11-13 03:28:48
+ */
+@Mapper
+public interface InternalPlanDetailMapper extends BaseMapper<InternalPlanDetail> {
+
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/mapper/InternalPlanMapper.java b/cnas-manage/src/main/java/com/ruoyi/manage/mapper/InternalPlanMapper.java
new file mode 100644
index 0000000..60d3bab
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/mapper/InternalPlanMapper.java
@@ -0,0 +1,30 @@
+package com.ruoyi.manage.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.manage.dto.InternalPlanDto;
+import com.ruoyi.manage.pojo.InternalPlan;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * <p>
+ * 鍐呭骞村害璁″垝 Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 
+ * @since 2024-11-13 03:27:47
+ */
+@Mapper
+public interface InternalPlanMapper extends BaseMapper<InternalPlan> {
+
+    /**
+     * 鍐呭骞村害璁″垝鍒嗛〉鏌ヨ
+     * @param page
+     * @param ew
+     * @return
+     */
+    IPage<InternalPlanDto> pageInternalPlan(Page page, @Param("ew") QueryWrapper<InternalPlan> ew);
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/mapper/InternalReportMapper.java b/cnas-manage/src/main/java/com/ruoyi/manage/mapper/InternalReportMapper.java
new file mode 100644
index 0000000..00cb8eb
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/mapper/InternalReportMapper.java
@@ -0,0 +1,28 @@
+package com.ruoyi.manage.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.manage.pojo.InternalReport;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * 鍐呭鎶ュ憡琛�
+ *
+ * @author zhuo
+ * @since 2024-11-11
+ */
+@Mapper
+public interface InternalReportMapper extends BaseMapper<InternalReport> {
+
+    /**
+     * 鍐呭鎶ュ憡鍒嗛〉鏌ヨ
+     * @param page
+     * @param internalReportQueryWrapper
+     * @return
+     */
+    IPage<InternalReport> pageInternalReport(Page page, @Param("ew") QueryWrapper<InternalReport> internalReportQueryWrapper);
+}
+
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/mapper/ManageControlPlanListMapper.java b/cnas-manage/src/main/java/com/ruoyi/manage/mapper/ManageControlPlanListMapper.java
new file mode 100644
index 0000000..4ef7773
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/mapper/ManageControlPlanListMapper.java
@@ -0,0 +1,21 @@
+package com.ruoyi.manage.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.ruoyi.manage.pojo.ManageControlPlanList;
+import com.ruoyi.manage.vo.ManageControlPlanListVo;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * <p>
+ * 閲嶅ぇ椋庨櫓鍥犵礌鍒嗘瀽鍙婃帶鍒惰鍒掓竻鍗� Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 
+ * @since 2024-11-15 02:58:30
+ */
+public interface ManageControlPlanListMapper extends BaseMapper<ManageControlPlanList> {
+
+    IPage<ManageControlPlanListVo> getPageList(Page page, @Param("itSExporting") Boolean itSExporting);
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/mapper/ManageDocumentAlterMapper.java b/cnas-manage/src/main/java/com/ruoyi/manage/mapper/ManageDocumentAlterMapper.java
new file mode 100644
index 0000000..ffe8baa
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/mapper/ManageDocumentAlterMapper.java
@@ -0,0 +1,24 @@
+package com.ruoyi.manage.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.manage.pojo.ManageDocumentAlter;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * <p>
+ * 鏂囦欢鍙樻洿 Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 
+ * @since 2024-11-11 11:04:01
+ */
+public interface ManageDocumentAlterMapper extends BaseMapper<ManageDocumentAlter> {
+
+    IPage<ManageDocumentAlter> pageManageDocumentAlter(Page page, @Param("ew") QueryWrapper<ManageDocumentAlter> queryWrappers);
+
+    ManageDocumentAlter getManageDocumentAlter(Integer id);
+
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/mapper/ManageDocumentCancelMapper.java b/cnas-manage/src/main/java/com/ruoyi/manage/mapper/ManageDocumentCancelMapper.java
new file mode 100644
index 0000000..c97de36
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/mapper/ManageDocumentCancelMapper.java
@@ -0,0 +1,23 @@
+package com.ruoyi.manage.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.manage.pojo.ManageDocumentCancel;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * <p>
+ * 鏂囦欢浣滃簾 Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author
+ * @since 2024-11-09 02:37:35
+ */
+public interface ManageDocumentCancelMapper extends BaseMapper<ManageDocumentCancel> {
+
+    IPage<ManageDocumentCancel> pageManageDocumentCancel(Page page, @Param("ew") QueryWrapper<ManageDocumentCancel> queryWrappers);
+
+    ManageDocumentCancel getManageDocumentCancel(Integer id);
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/mapper/ManageDocumentControlledMapper.java b/cnas-manage/src/main/java/com/ruoyi/manage/mapper/ManageDocumentControlledMapper.java
new file mode 100644
index 0000000..7ae6501
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/mapper/ManageDocumentControlledMapper.java
@@ -0,0 +1,23 @@
+package com.ruoyi.manage.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.manage.pojo.ManageDocumentControlled;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * <p>
+ * 鏂囦欢鍙楁帶 Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 
+ * @since 2024-11-08 02:54:44
+ */
+public interface ManageDocumentControlledMapper extends BaseMapper<ManageDocumentControlled> {
+
+    IPage<ManageDocumentControlled> pageManageDocumentControlled(Page page, @Param("ew") QueryWrapper<ManageDocumentControlled> queryWrappers);
+
+    ManageDocumentControlled getManageDocumentControlled(Long id);
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/mapper/ManageDocumentIssueRecycleMapper.java b/cnas-manage/src/main/java/com/ruoyi/manage/mapper/ManageDocumentIssueRecycleMapper.java
new file mode 100644
index 0000000..1b9c6fa
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/mapper/ManageDocumentIssueRecycleMapper.java
@@ -0,0 +1,24 @@
+package com.ruoyi.manage.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.manage.dto.ManageDocumentIssueRecycleDto;
+import com.ruoyi.manage.pojo.ManageDocumentIssueRecycle;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * <p>
+ * 鏂囦欢鍙戞斁鍥炴敹 Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 
+ * @since 2024-11-09 09:18:24
+ */
+public interface ManageDocumentIssueRecycleMapper extends BaseMapper<ManageDocumentIssueRecycle> {
+
+    IPage<ManageDocumentIssueRecycleDto> pageManageDocumentIssueRecycle(Page page, @Param("ew") QueryWrapper<ManageDocumentIssueRecycleDto> queryWrappers);
+
+    ManageDocumentIssueRecycleDto getManageDocumentIssueRecycle(Long id);
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/mapper/ManageDocumentListMapper.java b/cnas-manage/src/main/java/com/ruoyi/manage/mapper/ManageDocumentListMapper.java
new file mode 100644
index 0000000..79de39a
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/mapper/ManageDocumentListMapper.java
@@ -0,0 +1,22 @@
+package com.ruoyi.manage.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.manage.pojo.ManageDocumentList;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * <p>
+ * 鏂囦欢娓呭崟
+ Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author
+ * @since 2024-11-08 11:08:11
+ */
+public interface ManageDocumentListMapper extends BaseMapper<ManageDocumentList> {
+
+    IPage<ManageDocumentList> pageManageDocumentList(Page page, @Param("ew") QueryWrapper<ManageDocumentList> queryWrappers);
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/mapper/ManageMeetingMapper.java b/cnas-manage/src/main/java/com/ruoyi/manage/mapper/ManageMeetingMapper.java
new file mode 100644
index 0000000..2f32c7e
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/mapper/ManageMeetingMapper.java
@@ -0,0 +1,22 @@
+package com.ruoyi.manage.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.ruoyi.manage.dto.ManageMeetingDto;
+import com.ruoyi.manage.pojo.ManageMeeting;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * <p>
+ *  Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author
+ * @since 2024-11-11 09:33:47
+ */
+public interface ManageMeetingMapper extends BaseMapper<ManageMeeting> {
+
+
+    IPage<ManageMeetingDto> page(Page page, @Param("startTime") String startTime, @Param("endTime") String endTime, @Param("place") String place);
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/mapper/ManageMeetingParticipantsMapper.java b/cnas-manage/src/main/java/com/ruoyi/manage/mapper/ManageMeetingParticipantsMapper.java
new file mode 100644
index 0000000..8aecf44
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/mapper/ManageMeetingParticipantsMapper.java
@@ -0,0 +1,16 @@
+package com.ruoyi.manage.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.manage.pojo.ManageMeetingParticipants;
+
+/**
+ * <p>
+ *  Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 
+ * @since 2024-11-11 09:34:27
+ */
+public interface ManageMeetingParticipantsMapper extends BaseMapper<ManageMeetingParticipants> {
+
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/mapper/ManageRecordAuditMapper.java b/cnas-manage/src/main/java/com/ruoyi/manage/mapper/ManageRecordAuditMapper.java
new file mode 100644
index 0000000..38ae1e9
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/mapper/ManageRecordAuditMapper.java
@@ -0,0 +1,21 @@
+package com.ruoyi.manage.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.manage.pojo.ManageRecordAudit;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * <p>
+ * 鏂囦欢淇鐢宠瀹℃壒璁板綍 Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author
+ * @since 2024-11-14 10:29:18
+ */
+public interface ManageRecordAuditMapper extends BaseMapper<ManageRecordAudit> {
+
+    IPage<ManageRecordAudit> pageManageRecordAudit(Page page, @Param("ew") QueryWrapper<ManageRecordAudit> queryWrappers);
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/mapper/ManageRecordCancelMapper.java b/cnas-manage/src/main/java/com/ruoyi/manage/mapper/ManageRecordCancelMapper.java
new file mode 100644
index 0000000..f0adcd9
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/mapper/ManageRecordCancelMapper.java
@@ -0,0 +1,21 @@
+package com.ruoyi.manage.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.manage.pojo.ManageRecordCancel;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * <p>
+ * 浣滃簾鏂囦欢閿�榄傝褰� Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 
+ * @since 2024-11-13 01:27:22
+ */
+public interface ManageRecordCancelMapper extends BaseMapper<ManageRecordCancel> {
+
+    IPage<ManageRecordCancel> pageManageRecordCancel(Page page, @Param("ew") QueryWrapper<ManageRecordCancel> queryWrappers);
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/mapper/ManageRecordCheckMapper.java b/cnas-manage/src/main/java/com/ruoyi/manage/mapper/ManageRecordCheckMapper.java
new file mode 100644
index 0000000..72fa458
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/mapper/ManageRecordCheckMapper.java
@@ -0,0 +1,21 @@
+package com.ruoyi.manage.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.manage.pojo.ManageRecordCheck;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * <p>
+ * 鏂囦欢瀹℃壒璁板綍(鍚慨璁㈠悗鍐嶆瀹℃壒璁板綍) Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 
+ * @since 2024-11-12 02:31:36
+ */
+public interface ManageRecordCheckMapper extends BaseMapper<ManageRecordCheck> {
+
+    IPage<ManageRecordCheck> pageManageRecordCheck(Page page, @Param("ew") QueryWrapper<ManageRecordCheck> queryWrappers);
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/mapper/ManageRecordIntervalsMapper.java b/cnas-manage/src/main/java/com/ruoyi/manage/mapper/ManageRecordIntervalsMapper.java
new file mode 100644
index 0000000..743436f
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/mapper/ManageRecordIntervalsMapper.java
@@ -0,0 +1,21 @@
+package com.ruoyi.manage.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.manage.pojo.ManageRecordIntervals;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * <p>
+ * 鏂囦欢瀹氭湡瀹℃煡璁板綍 Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author
+ * @since 2024-11-13 10:54:31
+ */
+public interface ManageRecordIntervalsMapper extends BaseMapper<ManageRecordIntervals> {
+
+    IPage<ManageRecordIntervals> pageManageRecordIntervals(Page page, @Param("ew") QueryWrapper<ManageRecordIntervals> queryWrappers);
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/mapper/ManageRecordIntervalsTotalMapper.java b/cnas-manage/src/main/java/com/ruoyi/manage/mapper/ManageRecordIntervalsTotalMapper.java
new file mode 100644
index 0000000..df92dca
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/mapper/ManageRecordIntervalsTotalMapper.java
@@ -0,0 +1,21 @@
+package com.ruoyi.manage.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.manage.pojo.ManageRecordIntervalsTotal;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * <p>
+ * 鏂囦欢瀹氭湡瀹℃煡璁板綍鎬诲巻鍙茶褰曡〃 Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author
+ * @since 2024-11-15 01:12:11
+ */
+public interface ManageRecordIntervalsTotalMapper extends BaseMapper<ManageRecordIntervalsTotal> {
+
+    IPage<ManageRecordIntervalsTotal> pageManageRecordIntervalsTotal(Page page, @Param("ew") QueryWrapper<ManageRecordIntervalsTotal> queryWrappers);
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/mapper/ManageRecordIssueRecycleMapper.java b/cnas-manage/src/main/java/com/ruoyi/manage/mapper/ManageRecordIssueRecycleMapper.java
new file mode 100644
index 0000000..be532a9
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/mapper/ManageRecordIssueRecycleMapper.java
@@ -0,0 +1,21 @@
+package com.ruoyi.manage.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.manage.pojo.ManageRecordIssueRecycle;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * <p>
+ * 鎵�鏈夋枃浠�(鍐呫�佸閮ㄦ枃浠�)鐨勫彂鏀句笌鍥炴敹璁板綍 Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author
+ * @since 2024-11-13 09:11:05
+ */
+public interface ManageRecordIssueRecycleMapper extends BaseMapper<ManageRecordIssueRecycle> {
+
+    IPage<ManageRecordIssueRecycle> pageManageRecordIssueRecycle(Page page, @Param("ew") QueryWrapper<ManageRecordIssueRecycle> queryWrappers);
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/mapper/ManageRecordTotalMapper.java b/cnas-manage/src/main/java/com/ruoyi/manage/mapper/ManageRecordTotalMapper.java
new file mode 100644
index 0000000..5950bd9
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/mapper/ManageRecordTotalMapper.java
@@ -0,0 +1,21 @@
+package com.ruoyi.manage.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.manage.pojo.ManageRecordTotal;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * <p>
+ * 澶栨潵鏂囦欢纭璁板綍鎬诲巻鍙茶褰曡〃 Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author
+ * @since 2024-11-12 10:30:08
+ */
+public interface ManageRecordTotalMapper extends BaseMapper<ManageRecordTotal> {
+
+    IPage<ManageRecordTotal> pageProcessTotaldeal(Page page, @Param("ew") QueryWrapper<ManageRecordTotal> queryWrappers);
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/mapper/ManageRecordVerifyMapper.java b/cnas-manage/src/main/java/com/ruoyi/manage/mapper/ManageRecordVerifyMapper.java
new file mode 100644
index 0000000..7461cec
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/mapper/ManageRecordVerifyMapper.java
@@ -0,0 +1,22 @@
+package com.ruoyi.manage.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.manage.pojo.ManageRecordVerify;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * <p>
+ * 澶栨潵鏂囦欢纭璁板綍 Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 
+ * @since 2024-11-12 10:29:44
+ */
+public interface ManageRecordVerifyMapper extends BaseMapper<ManageRecordVerify> {
+
+    IPage<ManageRecordVerify> pageManageRecordVerify(Page page, @Param("ew") QueryWrapper<ManageRecordVerify> queryWrappers);
+
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/mapper/ManageReviewProgramFileMapper.java b/cnas-manage/src/main/java/com/ruoyi/manage/mapper/ManageReviewProgramFileMapper.java
new file mode 100644
index 0000000..cdacef5
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/mapper/ManageReviewProgramFileMapper.java
@@ -0,0 +1,16 @@
+package com.ruoyi.manage.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.manage.pojo.ManageReviewProgramFile;
+
+/**
+ * <p>
+ *  Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author
+ * @since 2024-11-09 04:15:47
+ */
+public interface ManageReviewProgramFileMapper extends BaseMapper<ManageReviewProgramFile> {
+
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/mapper/ManageReviewProgramMapper.java b/cnas-manage/src/main/java/com/ruoyi/manage/mapper/ManageReviewProgramMapper.java
new file mode 100644
index 0000000..4a77c8b
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/mapper/ManageReviewProgramMapper.java
@@ -0,0 +1,21 @@
+package com.ruoyi.manage.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.ruoyi.manage.pojo.ManageReviewProgram;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * <p>
+ *  Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author
+ * @since 2024-11-09 03:05:42
+ */
+public interface ManageReviewProgramMapper extends BaseMapper<ManageReviewProgram> {
+
+
+    IPage<ManageReviewProgram> page(Page page, @Param("startTime") String startTime,@Param("endTime") String endTime,@Param("judgingLocation") String judgingLocation);
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/mapper/ManageReviewReportMapper.java b/cnas-manage/src/main/java/com/ruoyi/manage/mapper/ManageReviewReportMapper.java
new file mode 100644
index 0000000..a88400b
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/mapper/ManageReviewReportMapper.java
@@ -0,0 +1,21 @@
+package com.ruoyi.manage.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.ruoyi.manage.pojo.ManageReviewReport;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * <p>
+ * 绠$悊璇勫鎶ュ憡 Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author
+ * @since 2024-11-12 04:44:39
+ */
+public interface ManageReviewReportMapper extends BaseMapper<ManageReviewReport> {
+
+    IPage<ManageReviewReport> page(Page page, @Param("startTime") String startTime, @Param("endTime") String endTime, @Param("place") String place);
+
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/mapper/ManageRiskAssessmentResultsMapper.java b/cnas-manage/src/main/java/com/ruoyi/manage/mapper/ManageRiskAssessmentResultsMapper.java
new file mode 100644
index 0000000..7cd9776
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/mapper/ManageRiskAssessmentResultsMapper.java
@@ -0,0 +1,21 @@
+package com.ruoyi.manage.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.ruoyi.manage.pojo.ManageRiskAssessmentResults;
+import com.ruoyi.manage.vo.ManageRiskAssessmentResultsVo;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * <p>
+ * 鍗遍櫓鍥犵礌杈ㄨ瘑涓庨闄╄瘎浠风粨鏋滀竴瑙堣〃 Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author
+ * @since 2024-11-15 02:58:51
+ */
+public interface ManageRiskAssessmentResultsMapper extends BaseMapper<ManageRiskAssessmentResults> {
+
+    IPage<ManageRiskAssessmentResultsVo> getPageResults(Page page, @Param("itSExporting") Boolean itSExporting);
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/pojo/ClientSatisfaction.java b/cnas-manage/src/main/java/com/ruoyi/manage/pojo/ClientSatisfaction.java
new file mode 100644
index 0000000..f3c67e4
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/pojo/ClientSatisfaction.java
@@ -0,0 +1,95 @@
+package com.ruoyi.manage.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+/**
+ * 瀹㈡埛婊℃剰搴�
+ *
+ * @author zhuo
+ * @since 2024-11-09
+ */
+@Data
+@TableName("cnas_client_satisfaction")
+public class ClientSatisfaction {
+
+    @TableId(type = IdType.AUTO)
+    private Integer clientSatisfactionId;
+
+    @Schema(description = "鍗曚綅鍚嶇О")
+    private String unitName;
+
+    @Schema(description = "濮撳悕")
+    private String userName;
+
+    @Schema(description = "濉啓鏃ユ湡")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private LocalDate fillDate;
+
+    @Schema(description = "閮ㄩ棬")
+    private String department;
+
+    @Schema(description = "鑱旂郴鐢佃瘽")
+    private String contactNumber;
+
+    @Schema(description = "鏈嶅姟鎬佸害, 0:婊℃剰, 1:涓�鑸�, 2:涓嶆弧鎰�")
+    private Integer serviceAttitude;
+
+    @Schema(description = "鏈嶅姟鎬佸害寤鸿")
+    private String serviceAttitudeSuggestion;
+
+    @Schema(description = "鎶�鏈兘鍔�, 0:婊℃剰, 1:涓�鑸�, 2:涓嶆弧鎰�")
+    private Integer technicalCompetence;
+
+    @Schema(description = "鎶�鏈兘鍔涘缓璁�")
+    private String technicalCompetenceSuggestion;
+
+    @Schema(description = "妫�娴嬪伐浣�, 0:婊℃剰, 1:涓�鑸�, 2:涓嶆弧鎰�")
+    private Integer inspectionWork;
+
+    @Schema(description = "妫�娴嬪伐浣滃缓璁�")
+    private String inspectionWorkSuggestion;
+
+    @Schema(description = "鏀惰垂鍚堢悊鎬�, 0:婊℃剰, 1:涓�鑸�, 2:涓嶆弧鎰�")
+    private Integer reasonableFees;
+
+    @Schema(description = "鏀惰垂鍚堢悊鎬у缓璁�")
+    private String reasonableFeesSuggestion;
+
+    @Schema(description = "纭浜�")
+    private String confirmPerson;
+
+    @Schema(description = "纭浜篒d")
+    private Integer confirmPersonId;
+
+    @Schema(description = "纭鐘舵��, 0:鏈‘璁�, 1:纭")
+    private Integer confirmStatus;
+
+    @Schema(description = "澶囨敞(瀵规垜浠殑甯屾湜)")
+    private String remark;
+
+    @Schema(description = "鍒涘缓浜�")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @Schema(description = "鍒涘缓鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @Schema(description = "淇敼浜�")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    @Schema(description = "淇敼鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+
+}
+
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/pojo/ClientSatisfactionAnalyseFile.java b/cnas-manage/src/main/java/com/ruoyi/manage/pojo/ClientSatisfactionAnalyseFile.java
new file mode 100644
index 0000000..3358a57
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/pojo/ClientSatisfactionAnalyseFile.java
@@ -0,0 +1,54 @@
+package com.ruoyi.manage.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+/**
+ * 瀹㈡埛婊℃剰搴﹀垎鏋愰檮浠�
+ *
+ * @author zhuo
+ * @since 2024-11-09
+ */
+@Data
+@TableName("cnas_client_satisfaction_analyse_file")
+public class ClientSatisfactionAnalyseFile {
+
+    @TableId(type = IdType.AUTO)
+    private Integer analyseFileId;
+
+    @Schema(description = "绫诲瀷:1鍥剧墖/2鏂囦欢")
+    private Integer type;
+
+    @Schema(description = "闄勪欢璺緞")
+    private String fileUrl;
+
+    @Schema(description = "闄勪欢鍚嶇О")
+    private String fileName;
+
+    @Schema(description = "鍒涘缓浜篿d")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @Schema(description = "鍒涘缓鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @Schema(description = "淇敼浜�")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    @Schema(description = "淇敼鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+
+    @Schema(description = "鍒涘缓浜�")
+    @TableField(select = false,exist = false)
+    private String userName;
+}
+
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/pojo/InternalCheck.java b/cnas-manage/src/main/java/com/ruoyi/manage/pojo/InternalCheck.java
new file mode 100644
index 0000000..742cb35
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/pojo/InternalCheck.java
@@ -0,0 +1,80 @@
+package com.ruoyi.manage.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+/**
+ * 鍐呭妫�鏌ヨ〃
+ *
+ * @author zhuo
+ * @since 2024-11-11
+ */
+@Data
+@TableName("cnas_internal_check")
+public class InternalCheck {
+
+    @TableId(type = IdType.AUTO)
+    private Integer checkId;
+
+    @Schema(description = "閮ㄩ棬")
+    private String department;
+
+    @Schema(description = "閮ㄩ棬璐熻矗浜�")
+    private String departmentHead;
+
+    @Schema(description = "瀹℃牳鍛�")
+    private String auditor;
+
+    @Schema(description = "瀹℃牳鏃ユ湡")
+    private String reviewDate;
+
+    @Schema(description = "缂栧埗浜篿d")
+    private Integer writeUserId;
+
+    @Schema(description = "缂栧埗浜�")
+    private String writeUserName;
+
+    @Schema(description = "缂栧埗鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime writeTime;
+
+    @Schema(description = "鎵瑰噯浜篿d")
+    private Integer ratifyUserId;
+
+    @Schema(description = "鎵瑰噯浜�")
+    private String ratifyUserName;
+
+    @Schema(description = "鎵瑰噯鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime ratifyTime;
+
+    @Schema(description = "鎵瑰噯鐘舵��, 0 涓嶉�氳繃, 1閫氳繃")
+    private Integer ratifyStatus;
+
+    @Schema(description = "鎵瑰噯鍐呭")
+    private String ratifyRemark;
+
+    @Schema(description = "鍒涘缓浜�")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @Schema(description = "鍒涘缓鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @Schema(description = "淇敼浜�")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    @Schema(description = "淇敼鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+
+}
+
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/pojo/InternalCheckDetail.java b/cnas-manage/src/main/java/com/ruoyi/manage/pojo/InternalCheckDetail.java
new file mode 100644
index 0000000..39650c8
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/pojo/InternalCheckDetail.java
@@ -0,0 +1,63 @@
+package com.ruoyi.manage.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+/**
+ * 鍐呭妫�鏌ヨ鎯呰〃
+ *
+ * @author zhuo
+ * @since 2024-11-11
+ */
+@Data
+@TableName("cnas_internal_check_detail")
+public class InternalCheckDetail {
+
+    @TableId(type = IdType.AUTO)
+    private Integer checkDetailId;
+
+    @Schema(description = "妫�鏌ヤ富琛╥d")
+    private Integer checkId;
+
+    @Schema(description = "瑕佺礌鏉℃")
+    private String element;
+
+    @Schema(description = "瀹℃牳鍐呭")
+    private String content;
+
+    @Schema(description = "瀹℃牳鏂瑰紡")
+    private String method;
+
+    @Schema(description = "瀹℃牳缁撴灉璁板綍")
+    private String resultRecords;
+
+    @Schema(description = "涓嶇鍚堟�ц川")
+    private String nonNature;
+
+    @Schema(description = "鍒涘缓浜�")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @Schema(description = "鍒涘缓鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @Schema(description = "淇敼浜�")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    @Schema(description = "淇敼鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+
+    // 瀵煎嚭浣跨敤
+    @TableField(select = false, exist = false)
+    private Integer index;
+}
+
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/pojo/InternalCorrect.java b/cnas-manage/src/main/java/com/ruoyi/manage/pojo/InternalCorrect.java
new file mode 100644
index 0000000..7cccc9b
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/pojo/InternalCorrect.java
@@ -0,0 +1,114 @@
+package com.ruoyi.manage.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 鍐呭绠$悊绾犳澶勭悊琛�
+ * </p>
+ *
+ * @author 
+ * @since 2024-11-13 04:00:15
+ */
+@Data
+@TableName("cnas_internal_correct")
+@Schema(description = "鍐呭绠$悊绾犳澶勭悊琛�")
+public class InternalCorrect {
+
+    @TableId(value = "correct_id", type = IdType.AUTO)
+    private Integer correctId;
+
+    @Schema(description = "涓嶅悎鏍兼弿杩�")
+    private String raiseResult;
+
+    @Schema(description = "vde涓撳鍙戠幇")
+    private String vdeRaiseResult;
+
+    @Schema(description = "鎻愬嚭閮ㄩ棬")
+    private String raiseDepartment;
+
+    @Schema(description = "鎻愬嚭浜篿d")
+    private Integer raiseUserId;
+
+    @Schema(description = "鎻愬嚭浜�")
+    private String raiseUserName;
+
+    @Schema(description = "鎻愬嚭鏃堕棿")
+    private LocalDate raiseTime;
+
+    @Schema(description = "鍘熷洜鍒嗘瀽")
+    private String causeResult;
+
+    @Schema(description = "鍘熷洜鍒嗘瀽璐d换閮ㄩ棬")
+    private String causeDepartment;
+
+    @Schema(description = "鍘熷洜鍒嗘瀽浜篿d")
+    private Integer causeUserId;
+
+    @Schema(description = "鍘熷洜鍒嗘瀽浜�")
+    private String causeUserName;
+
+    @Schema(description = "鍘熷洜鍒嗘瀽鏃堕棿")
+    private LocalDate causeTime;
+
+    @Schema(description = "绾犳鎺柦")
+    private String correctResult;
+
+    @Schema(description = "鎻愬嚭閮ㄩ棬纭")
+    private String raiseDepartmentAffirm;
+
+    @Schema(description = "绾犳璐d换閮ㄩ棬")
+    private String correctDepartment;
+
+    @Schema(description = "绾犳浜篿d")
+    private Integer correctUserId;
+
+    @Schema(description = "绾犳")
+    private String correctUserName;
+
+    @Schema(description = "绾犳鏃堕棿")
+    private LocalDate correctTime;
+
+    @Schema(description = "楠岃瘉缁撴灉")
+    private String validationResult;
+
+    @Schema(description = "楠岃瘉閮ㄩ棬")
+    private String validationDepartment;
+
+    @Schema(description = "楠岃瘉浜篿d")
+    private Integer validationUserId;
+
+    @Schema(description = "楠岃瘉浜�")
+    private String validationUserName;
+
+    @Schema(description = "楠岃瘉鏃堕棿")
+    private LocalDate validationTime;
+
+    @Schema(description = "鏄惁缁撴潫, 0: 鏈粨鏉�, 1:宸茬粨鏉�")
+    private Integer isFinish;
+
+    @Schema(description = "鍒涘缓浜�")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @Schema(description = "鍒涘缓鏃堕棿")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @Schema(description = "淇敼浜�")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    @Schema(description = "淇敼鏃堕棿")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+
+    @TableField(exist = false,select = false)
+    @Schema(description = "娴佺▼, 0:涓嶇鍚堝伐浣滄儏鍐佃褰�, 1澶勭悊鎺柦, 2:绾犳鎺柦, 3:鏄惁閫氱煡瀹㈡埛鍙仮澶嶅伐浣�")
+    private Integer flowType;
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/pojo/InternalCorrectFile.java b/cnas-manage/src/main/java/com/ruoyi/manage/pojo/InternalCorrectFile.java
new file mode 100644
index 0000000..63c7722
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/pojo/InternalCorrectFile.java
@@ -0,0 +1,52 @@
+package com.ruoyi.manage.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 鍐呭绠$悊绾犳鎺柦闄勪欢琛�
+ * </p>
+ *
+ * @author 
+ * @since 2024-11-13 04:00:38
+ */
+@Data
+@TableName("cnas_internal_correct_file")
+@Schema(description = "鍐呭绠$悊绾犳鎺柦闄勪欢琛�")
+public class InternalCorrectFile {
+
+    @TableId(type = IdType.AUTO)
+    private Integer correctFileId;
+
+    @Schema(description = "鍐呭绾犳鎺柦id")
+    private Integer correctId;
+
+    @Schema(description = "绫诲瀷:1鍥剧墖/2鏂囦欢")
+    private Integer type;
+
+    @Schema(description = "闄勪欢璺緞")
+    private String fileUrl;
+
+    @Schema(description = "闄勪欢鍚嶇О")
+    private String fileName;
+
+    @Schema(description = "鍒涘缓浜�")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @Schema(description = "鍒涘缓鏃堕棿")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @Schema(description = "淇敼浜�")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    @Schema(description = "淇敼鏃堕棿")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/pojo/InternalImplement.java b/cnas-manage/src/main/java/com/ruoyi/manage/pojo/InternalImplement.java
new file mode 100644
index 0000000..089fd6f
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/pojo/InternalImplement.java
@@ -0,0 +1,107 @@
+package com.ruoyi.manage.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+/**
+ * 鍐呭瀹炴柦璁″垝
+ *
+ * @author zhuo
+ * @since 2024-11-11
+ */
+@Data
+@TableName("cnas_internal_implement")
+public class InternalImplement {
+
+    @TableId(type = IdType.AUTO)
+    private Integer implementId;
+
+    @Schema(description = "瀹℃牳鐩殑")
+    private String purposes;
+
+    @Schema(description = "瀹℃牳鎬ц川")
+    private String nature;
+
+    @Schema(description = "瀹℃牳鑼冨洿")
+    private String scope;
+
+    @Schema(description = "瀹℃牳渚濇嵁")
+    private String basis;
+
+    @Schema(description = "瀹℃牳缁勯暱")
+    private String teamLeader;
+
+    @Schema(description = "鍐呭鍛�")
+    private String internalAuditor;
+
+    @Schema(description = "瀹℃牳鏃堕棿")
+    private String reviewDate;
+
+    @Schema(description = "瀹℃牳鏂规硶")
+    private String auditMethod;
+
+    @Schema(description = "浼氳寮�濮嬫椂闂�")
+    private String firstMeetingTime;
+
+    @Schema(description = "鏈浼氳鏃堕棿")
+    private String lastMeetingTime;
+
+    @Schema(description = "瀹℃牳鎶ュ憡鎻愪氦鏃ユ湡")
+    private String submitTime;
+
+    @Schema(description = "瀹℃牳鎶ュ憡鍙戞斁鑼冨洿")
+    private String submitScope;
+
+    @Schema(description = "澶囨敞")
+    private String remark;
+
+    @Schema(description = "缂栧埗浜篿d")
+    private Integer writeUserId;
+
+    @Schema(description = "缂栧埗浜�")
+    private String writeUserName;
+
+    @Schema(description = "缂栧埗鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime writeTime;
+
+    @Schema(description = "鎵瑰噯浜篿d")
+    private Integer ratifyUserId;
+
+    @Schema(description = "鎵瑰噯浜�")
+    private String ratifyUserName;
+
+    @Schema(description = "鎵瑰噯鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime ratifyTime;
+
+    @Schema(description = "鎵瑰噯鐘舵��, 0 涓嶉�氳繃, 1閫氳繃")
+    private Integer ratifyStatus;
+
+    @Schema(description = "鎵瑰噯鍐呭")
+    private String ratifyRemark;
+
+    @Schema(description = "鍒涘缓浜�")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @Schema(description = "鍒涘缓鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @Schema(description = "淇敼浜�")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    @Schema(description = "淇敼鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+
+}
+
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/pojo/InternalImplementDetail.java b/cnas-manage/src/main/java/com/ruoyi/manage/pojo/InternalImplementDetail.java
new file mode 100644
index 0000000..459df88
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/pojo/InternalImplementDetail.java
@@ -0,0 +1,63 @@
+package com.ruoyi.manage.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+/**
+ * 鍐呭瀹炴柦璁″垝璇︽儏
+ *
+ * @author makejava
+ * @since 2024-11-11
+ */
+@Data
+@TableName("cnas_internal_implement_detail")
+public class InternalImplementDetail {
+
+    @TableId(type = IdType.AUTO)
+    private Integer implementDetailId;
+
+    @Schema(description = "瀹炴柦璁″垝涓昏〃id")
+    private Integer implementId;
+
+    @Schema(description = "鏃堕棿")
+    private String implement;
+
+    @Schema(description = "閮ㄩ棬")
+    private String department;
+
+    @Schema(description = "璐d换浜�")
+    private String responsible;
+
+    @Schema(description = "瀹℃牳鍛�")
+    private String auditor;
+
+    @Schema(description = "瀹℃牳鍐呭")
+    private String reviewContent;
+
+    @Schema(description = "鍒涘缓浜�")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @Schema(description = "鍒涘缓鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @Schema(description = "淇敼浜�")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    @Schema(description = "淇敼鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+
+    // 瀵煎嚭浣跨敤
+    @TableField(select = false, exist = false)
+    private Integer index;
+}
+
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/pojo/InternalMeeting.java b/cnas-manage/src/main/java/com/ruoyi/manage/pojo/InternalMeeting.java
new file mode 100644
index 0000000..6108c1f
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/pojo/InternalMeeting.java
@@ -0,0 +1,55 @@
+package com.ruoyi.manage.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 鍐呭浼氳琛�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-12 02:50:44
+ */
+@Data
+@TableName("cnas_internal_meeting")
+@Schema(description = "鍐呭浼氳琛�")
+public class InternalMeeting {
+
+    @TableId(value = "meeting_id", type = IdType.AUTO)
+    private Integer meetingId;
+
+    @Schema(description = "鏃堕棿")
+    private String meetingDate;
+
+    @Schema(description = "涓绘寔浜�")
+    private String compere;
+
+    @Schema(description = "鍦扮偣")
+    private String place;
+
+    @Schema(description = "浼氳涓婚")
+    private String subject;
+
+    @Schema(description = "鍙傚姞浜哄憳")
+    private String participant;
+
+    @Schema(description = "鍒涘缓浜�")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @Schema(description = "鍒涘缓鏃堕棿")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @Schema(description = "淇敼浜�")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    @Schema(description = "淇敼鏃堕棿")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/pojo/InternalMeetingDetail.java b/cnas-manage/src/main/java/com/ruoyi/manage/pojo/InternalMeetingDetail.java
new file mode 100644
index 0000000..a20210d
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/pojo/InternalMeetingDetail.java
@@ -0,0 +1,52 @@
+package com.ruoyi.manage.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 鍐呭浼氳璇︽儏琛�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-12 02:56:13
+ */
+@Data
+@TableName("cnas_internal_meeting_detail")
+@Schema(description = "鍐呭浼氳璇︽儏琛�")
+public class InternalMeetingDetail {
+
+    @TableId(value = "meeting_detail_id", type = IdType.AUTO)
+    private Integer meetingDetailId;
+
+    @Schema(description = "浼氳涓昏〃id")
+    private Integer meetingId;
+
+    @Schema(description = "鍙傚姞浜哄憳id")
+    private Integer userId;
+
+    @Schema(description = "鍙傚姞浜哄憳")
+    private String userName;
+
+    @Schema(description = "閮ㄩ棬")
+    private String department;
+
+    @Schema(description = "鍒涘缓浜�")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @Schema(description = "鍒涘缓鏃堕棿")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @Schema(description = "淇敼浜�")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    @Schema(description = "淇敼鏃堕棿")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/pojo/InternalPlan.java b/cnas-manage/src/main/java/com/ruoyi/manage/pojo/InternalPlan.java
new file mode 100644
index 0000000..94b4fb3
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/pojo/InternalPlan.java
@@ -0,0 +1,94 @@
+package com.ruoyi.manage.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 鍐呭骞村害璁″垝
+ * </p>
+ *
+ * @author
+ * @since 2024-11-13 03:27:47
+ */
+@Data
+@TableName("cnas_internal_plan")
+@Schema(description = "鍐呭骞村害璁″垝")
+public class InternalPlan {
+
+    @TableId(value = "plan_id", type = IdType.AUTO)
+    private Integer planId;
+
+    @Schema(description = "鍐呭鐩殑")
+    private String purpose;
+
+    @Schema(description = "鍐呯敓鑼冨洿")
+    private String scope;
+
+    @Schema(description = "鍐呭渚濇嵁")
+    private String basis;
+
+    @Schema(description = "缁勯暱")
+    private String leader;
+
+    @Schema(description = "缁勫憳")
+    private String crew;
+
+    @Schema(description = "缂栧埗浜篿d")
+    private Integer writeUserId;
+
+    @Schema(description = "缂栧埗浜�")
+    private String writeUserName;
+
+    @Schema(description = "缂栧埗鏃堕棿")
+    private LocalDateTime writeTime;
+
+    @Schema(description = "瀹℃牳浜篿d")
+    private Integer examineUserId;
+
+    @Schema(description = "瀹℃牳浜�")
+    private String examineUserName;
+
+    @Schema(description = "瀹℃牳鏃堕棿")
+    private LocalDateTime examineTime;
+
+    @Schema(description = "瀹℃牳鐘舵��,0 涓嶉�氳繃, 1 閫氳繃")
+    private Integer examineStatus;
+
+    @Schema(description = "瀹℃牳淇℃伅")
+    private String examineRemark;
+
+    @Schema(description = "鎵瑰噯浜篿d")
+    private Integer ratifyUserId;
+
+    @Schema(description = "鎵瑰噯浜�")
+    private String ratifyUserName;
+
+    @Schema(description = "鎵瑰噯鏃堕棿")
+    private LocalDateTime ratifyTime;
+
+    @Schema(description = "鎵瑰噯鐘舵��,0 涓嶉�氳繃, 1 閫氳繃")
+    private Integer ratifyStatus;
+
+    @Schema(description = "鎵瑰噯淇℃伅")
+    private String ratifyRemark;
+
+    @Schema(description = "鍒涘缓浜�")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @Schema(description = "鍒涘缓鏃堕棿")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @Schema(description = "淇敼浜�")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    @Schema(description = "淇敼鏃堕棿")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/pojo/InternalPlanDetail.java b/cnas-manage/src/main/java/com/ruoyi/manage/pojo/InternalPlanDetail.java
new file mode 100644
index 0000000..7c9f3eb
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/pojo/InternalPlanDetail.java
@@ -0,0 +1,82 @@
+package com.ruoyi.manage.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 鍐呭骞村害璁″垝璇︽儏琛�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-13 03:28:48
+ */
+@Data
+@TableName("cnas_internal_plan_detail")
+@Schema(description = "鍐呭骞村害璁″垝璇︽儏琛�")
+public class InternalPlanDetail {
+
+    @TableId(value = "plan_detail_id", type = IdType.AUTO)
+    private Integer planDetailId;
+
+    @Schema(description = "鍐呭骞村害璁″垝id")
+    private Integer planId;
+
+    @Schema(description = "閮ㄩ棬")
+    private String department;
+
+    @Schema(description = "涓�鏈�")
+    private String january;
+
+    @Schema(description = "浜屾湀")
+    private String february;
+
+    @Schema(description = "涓夋湀")
+    private String march;
+
+    @Schema(description = "鍥涙湀")
+    private String april;
+
+    @Schema(description = "浜旀湀")
+    private String may;
+
+    @Schema(description = "鍏湀")
+    private String june;
+
+    @Schema(description = "涓冩湀")
+    private String july;
+
+    @Schema(description = "鍏湀")
+    private String august;
+
+    @Schema(description = "涔濇湀")
+    private String september;
+
+    @Schema(description = "鍗佹湀")
+    private String october;
+
+    @Schema(description = "鍗佷竴鏈�")
+    private String november;
+
+    @Schema(description = "鍗佷簩鏈�")
+    private String december;
+
+    @Schema(description = "鍒涘缓浜�")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @Schema(description = "鍒涘缓鏃堕棿")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @Schema(description = "淇敼浜�")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    @Schema(description = "淇敼鏃堕棿")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/pojo/InternalReport.java b/cnas-manage/src/main/java/com/ruoyi/manage/pojo/InternalReport.java
new file mode 100644
index 0000000..05b4b67
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/pojo/InternalReport.java
@@ -0,0 +1,122 @@
+package com.ruoyi.manage.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+/**
+ * 鍐呭鎶ュ憡琛�
+ *
+ * @author zhuo
+ * @since 2024-11-11
+ */
+@Data
+@TableName("cnas_internal_report")
+public class InternalReport {
+
+    @TableId(type = IdType.AUTO)
+    private Integer reportId;
+
+    @Schema(description = "瀹℃牳渚濇嵁")
+    private String purposes;
+
+    @Schema(description = "瀹℃牳渚濇嵁")
+    private String basis;
+
+    @Schema(description = "瀹℃牳鏃ユ湡")
+    private String reviewDate;
+
+    @Schema(description = "瀹℃牳鏂规硶")
+    private String method;
+
+    @Schema(description = "瀹℃牳鑼冨洿")
+    private String scope;
+
+    @Schema(description = "瀹℃牳璐d换鍒�")
+    private String responsible;
+
+    @Schema(description = "瀹℃牳缁勯暱")
+    private String leader;
+
+    @Schema(description = "瀹℃牳鍛�")
+    private String auditor;
+
+    @Schema(description = "瀹℃牳缁勫垎宸ユ儏鍐�")
+    private String division;
+
+    @Schema(description = "瀹℃牳姒傚喌")
+    private String overview;
+
+    @Schema(description = "缁撹鎬ц瘎浠�")
+    private String conclusion;
+
+    @Schema(description = "鏀硅繘寤鸿")
+    private String suggest;
+
+    @Schema(description = "瀹屾垚绾犳鎺柦鎵�闇�鏃堕棿")
+    private String actionDate;
+
+    @Schema(description = "鎬讳綋璺熻繘纭浜�")
+    private String followUser;
+
+    @Schema(description = "鎬讳綋璺熻繘纭璁板綍")
+    private String followRecord;
+
+    @Schema(description = "鏈姤鍛婂彂鏀捐寖鍥�")
+    private String reportScope;
+
+    @Schema(description = "瀹℃牳浜篿d")
+    private Integer examineUserId;
+
+    @Schema(description = "瀹℃牳浜�")
+    private String examineUserName;
+
+    @Schema(description = "瀹℃牳鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime examineTime;
+
+    @Schema(description = "瀹℃牳鐘舵��,0 涓嶉�氳繃, 1 閫氳繃")
+    private Integer examineStatus;
+
+    @Schema(description = "瀹℃牳淇℃伅")
+    private String examineRemark;
+
+    @Schema(description = "璐ㄩ噺璐熻矗浜篿d")
+    private Integer qualityUserId;
+
+    @Schema(description = "璐ㄩ噺璐熻矗浜�")
+    private String qualityUserName;
+
+    @Schema(description = "璐ㄩ噺璐熻矗浜哄~鍐欐椂闂�")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime qualityTime;
+
+    @Schema(description = "璐ㄩ噺璐熻矗浜虹姸鎬�, 0 涓嶉�氳繃, 1閫氳繃")
+    private Integer qualityStatus;
+
+    @Schema(description = "璐ㄩ噺璐熻矗浜烘剰瑙�")
+    private String qualityRemark;
+
+    @Schema(description = "鍒涘缓浜�")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @Schema(description = "鍒涘缓鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @Schema(description = "淇敼浜�")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    @Schema(description = "淇敼鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+
+}
+
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/pojo/ManageControlPlanList.java b/cnas-manage/src/main/java/com/ruoyi/manage/pojo/ManageControlPlanList.java
new file mode 100644
index 0000000..2774265
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/pojo/ManageControlPlanList.java
@@ -0,0 +1,80 @@
+package com.ruoyi.manage.pojo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 閲嶅ぇ椋庨櫓鍥犵礌鍒嗘瀽鍙婃帶鍒惰鍒掓竻鍗�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-15 02:58:30
+ */
+@Getter
+@Setter
+@TableName("cnas_manage_control_plan_list")
+@Schema(description = "閲嶅ぇ椋庨櫓鍥犵礌鍒嗘瀽鍙婃帶鍒惰鍒掓竻鍗�")
+public class ManageControlPlanList implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @Schema(description = "浣滀笟娲诲姩")
+    @ExcelProperty("浣滀笟娲诲姩")
+    private String jobActivity;
+
+    @Schema(description = "椋庨櫓鍥犵礌绫诲埆")
+    @ExcelProperty("椋庨櫓鍥犵礌绫诲埆")
+    private String category;
+
+    @Schema(description = "椋庨櫓鍥犵礌鎻忚堪")
+    @ExcelProperty("椋庨櫓鍥犵礌鎻忚堪")
+    private String description;
+
+    @Schema(description = "鍙鑷寸殑浜嬫晠")
+    @ExcelProperty("鍙鑷寸殑浜嬫晠")
+    private String result;
+
+    @Schema(description = "鏄惁涓嶅彲鎵垮彈椋庨櫓")
+    @ExcelProperty("鏄惁涓嶅彲鎵垮彈椋庨櫓")
+    private String intolerable;
+
+    @Schema(description = "鎺у埗璁″垝")
+    @ExcelProperty("鎺у埗璁″垝")
+    private String plan;
+
+    @Schema(description = "缂栧埗id")
+    private Integer editor;
+
+    @Schema(description = "鏃ユ湡")
+    private LocalDateTime editorDate;
+
+    @Schema(description = "瀹℃壒id")
+    private Integer approval;
+
+    @Schema(description = "鏃ユ湡")
+    private LocalDateTime approvalDate;
+
+    @Schema(description = "鎵瑰噯id")
+    private Integer approve;
+
+    @Schema(description = "鎵瑰噯鏃ユ湡")
+    private LocalDateTime approveDate;
+
+    @Schema(description = "鎵瑰噯鐘舵��1锛氶�氳繃锛�2锛氫笉閫氳繃")
+    private Integer approveStatus;
+
+    @Schema(description = "瀹℃壒鐘舵��1锛氶�氳繃锛�2锛氫笉閫氳繃")
+    private Integer approvalStatus;
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/pojo/ManageDocumentAlter.java b/cnas-manage/src/main/java/com/ruoyi/manage/pojo/ManageDocumentAlter.java
new file mode 100644
index 0000000..7832e84
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/pojo/ManageDocumentAlter.java
@@ -0,0 +1,114 @@
+package com.ruoyi.manage.pojo;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+import org.springframework.format.annotation.DateTimeFormat;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.Serializable;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 鏂囦欢鍙樻洿
+ * </p>
+ *
+ * @author
+ * @since 2024-11-11 11:04:01
+ */
+@Getter
+@Setter
+@TableName("cnas_manage_document_alter")
+@Schema(description = "鏂囦欢鍙樻洿")
+@ExcelIgnoreUnannotated
+public class ManageDocumentAlter  implements Serializable {
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @Schema(description = "鐢宠缂栧彿")
+    @ExcelProperty("鐢宠缂栧彿")
+    private String code;
+
+    @Schema(description = "鐢宠浜�")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @TableField(select = false, exist = false)
+    @ExcelProperty("鐢宠浜�")
+    private String createUserName;
+
+    @TableField(select = false, exist = false)
+    @Schema(description = "鐢宠閮ㄩ棬")
+    private String createUserDepartLims;
+
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+
+    @Schema(description = "鏈熸湜鍙樻洿鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @ExcelProperty("鏈熸湜鍙樻洿鏃堕棿")
+    private LocalDate expectAlterDate;
+
+    @Schema(description = "瀹為檯鍙樻洿鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @ExcelProperty("瀹為檯鍙樻洿鏃堕棿")
+    private LocalDate actuallyAlterDate;
+
+    @Schema(description = "鐘舵��")
+    @ExcelProperty("鐘舵��")
+    private String state;
+
+    @Schema(description = "瀹℃壒浜�")
+    private Integer checkUser;
+
+    @TableField(select = false, exist = false)
+    @ExcelProperty("瀹℃壒浜�")
+    private String checkUserName;
+
+    @Schema(description = "鍙樻洿璇存槑")
+    @ExcelProperty("鍙樻洿璇存槑")
+    private String alterNote;
+
+    @Schema(description = "鍙樻洿鍓嶇紪鍙�")
+    private String alterBeforeCode;
+
+    @Schema(description = "鍙樻洿鍓嶅悕绉�")
+    private String alterBeforeName;
+
+    @Schema(description = "鍙樻洿鍓嶇増鏈�")
+    private String alterBeforeVersion;
+
+    @Schema(description = "鍙樻洿鍚庣紪鍙�")
+    private String alterAfterCode;
+
+    @Schema(description = "鍙樻洿鍚庡悕绉�")
+    private String alterAfterName;
+
+    @Schema(description = "鍙樻洿鍚庣増鏈�")
+    private String alterAfterVersion;
+
+    @Schema(description = "鍙樻洿鍚庨檮浠�")
+    private String alterAfterUrl;
+
+    @Schema(description = "鍙樻洿鍚庨檮浠�")
+    @TableField(select = false,exist = false)
+    private MultipartFile file;
+
+    @Schema(description = "鍓嶄竴鐗堟湰澶勭悊鏂瑰紡")
+    private String method;
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/pojo/ManageDocumentCancel.java b/cnas-manage/src/main/java/com/ruoyi/manage/pojo/ManageDocumentCancel.java
new file mode 100644
index 0000000..665557e
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/pojo/ManageDocumentCancel.java
@@ -0,0 +1,103 @@
+package com.ruoyi.manage.pojo;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serializable;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 鏂囦欢浣滃簾
+ * </p>
+ *
+ * @author
+ * @since 2024-11-09 02:37:35
+ */
+@Getter
+@Setter
+@TableName("cnas_manage_document_cancel")
+@Schema(description = "鏂囦欢浣滃簾")
+@ExcelIgnoreUnannotated
+public class ManageDocumentCancel  implements Serializable {
+
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @Schema(description = "鐢宠浜�")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @Schema(description = "鐢宠浜�")
+    @TableField(select = false,exist = false)
+    @ExcelProperty("鐢宠浜�")
+    private String createUserName;
+
+    @Schema(description = "鐢宠浜�")
+    @TableField(select = false,exist = false)
+    private String createUserDepartLims;
+
+
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+
+    @Schema(description = "鏂囦欢缂栧彿")
+
+    @ExcelProperty("鏂囦欢缂栧彿")
+    private String documentCode;
+
+    @Schema(description = "鏂囦欢鍚嶇О")
+    private String name;
+
+    @Schema(description = "鏂囦欢鐗堟湰")
+    private String version;
+
+    @Schema(description = "鏂囦欢鐘舵��")
+    private String documentState;
+
+    @Schema(description = "浣滃簾鏂瑰紡")
+    private String method;
+
+    @Schema(description = "浣滃簾璇存槑")
+    @ExcelProperty("浣滃簾璇存槑")
+    private String cancelNote;
+
+    @Schema(description = "瀹℃壒浜�")
+    private Integer checkUser;
+
+    @ExcelProperty("瀹℃壒浜�")
+    @TableField(select = false, exist = false)
+    private String checkUserName;
+
+    @Schema(description = "鏈熸湜浣滃簾鏃堕棿")
+    @ExcelProperty("鏈熸湜浣滃簾鏃ユ湡")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    private LocalDate expectCancelDate;
+
+    @Schema(description = "瀹為檯浣滃簾鏃ユ湡")
+    @ExcelProperty("瀹為檯浣滃簾鏃ユ湡")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    private LocalDate actuallyCancelDate;
+
+    @Schema(description = "浣滃簾鐘舵��")
+    @ExcelProperty("浣滃簾鐘舵��")
+    private String state;
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/pojo/ManageDocumentControlled.java b/cnas-manage/src/main/java/com/ruoyi/manage/pojo/ManageDocumentControlled.java
new file mode 100644
index 0000000..5255437
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/pojo/ManageDocumentControlled.java
@@ -0,0 +1,92 @@
+package com.ruoyi.manage.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+import org.springframework.format.annotation.DateTimeFormat;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.Serializable;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 鏂囦欢鍙楁帶
+ * </p>
+ *
+ * @author
+ * @since 2024-11-08 02:54:44
+ */
+@Getter
+@Setter
+@TableName("cnas_manage_document_controlled")
+@Schema(description = "鏂囦欢鍙楁帶")
+public class ManageDocumentControlled  implements Serializable {
+
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @Schema(description = "鐢宠鏂囦欢缂栧彿")
+    private String documentCode;
+
+    @Schema(description = "鏂囦欢绫诲埆")
+    private String type;
+
+    @Schema(description = "鏂囦欢鍚嶇О")
+    private String name;
+
+    @Schema(description = "鏂囦欢鐗堟湰")
+    private String version;
+
+    @Schema(description = "浣滆��")
+    private String writer;
+
+    @Schema(description = "鎻愪氦鏃ユ湡")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    private LocalDate submitDate;
+
+    @Schema(description = "璇存槑")
+    private String instructions;
+
+    @Schema(description = "鐢宠鐘舵��")
+    private String state;
+
+    @Schema(description = "闄勪欢鍦板潃")
+    private String url;
+
+    @Schema(description = "璐d换浜�")
+    private Integer dutyUser;
+
+    @TableField(select = false,exist = false)
+    private String dutyUserName;
+
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @TableField(select = false, exist = false)
+    private String createUserName;
+
+    @Schema(description = "鐢宠閮ㄩ棬")
+    @TableField(select = false, exist = false)
+    private String createUserDepartLims;
+
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    @TableField(fill = FieldFill.INSERT)
+    @JsonFormat(pattern = "yyyy-MM-dd  HH:mm:ss")
+    private LocalDateTime createTime;
+
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+
+    @TableField(select = false, exist = false)
+    private MultipartFile file;
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/pojo/ManageDocumentIssueRecycle.java b/cnas-manage/src/main/java/com/ruoyi/manage/pojo/ManageDocumentIssueRecycle.java
new file mode 100644
index 0000000..eecd441
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/pojo/ManageDocumentIssueRecycle.java
@@ -0,0 +1,108 @@
+package com.ruoyi.manage.pojo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+import org.springframework.format.annotation.DateTimeFormat;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.Serializable;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 鏂囦欢鍙戞斁鍥炴敹
+ * </p>
+ *
+ * @author
+ * @since 2024-11-09 09:18:24
+ */
+@Getter
+@Setter
+@TableName("cnas_manage_document_issue_recycle")
+@Schema(description = "鏂囦欢鍙戞斁鍥炴敹")
+public class ManageDocumentIssueRecycle  implements Serializable {
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @Schema(description = "鏂囦欢缂栧彿")
+    @ExcelProperty(value = "鏂囦欢缂栧彿")
+    private String documentCode;
+
+    @Schema(description = "鏂囦欢鍚嶇О")
+    @ExcelProperty(value = "鏂囦欢鍚嶇О")
+    private String name;
+
+    @Schema(description = "鏂囦欢鐗堟湰")
+    @ExcelProperty(value = "鏂囦欢鐗堟湰")
+    private String version;
+
+    @Schema(description = "鐘舵��")
+    @ExcelProperty(value = "鐘舵��")
+    private String state;
+
+    @Schema(description = "鏂囦欢鐘舵��")
+    @ExcelProperty(value = "鏂囦欢鐘舵��")
+    private String documentState;
+
+    @Schema(description = "鍙戞斁缂栧彿")
+    @ExcelProperty(value = "鍙戞斁缂栧彿")
+    private String issueCode;
+
+    @Schema(description = "鍙戞斁浜�")
+    private Integer issueUser;
+
+    @Schema(description = "鍙戞斁鏃ユ湡")
+    @ExcelProperty(value = "鍙戞斁鏃ユ湡")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    private LocalDate issueDate;
+
+    @Schema(description = "鍙戞斁璇存槑")
+    private String issueNote;
+
+    @Schema(description = "鎺ユ敹浜�")
+    private Integer receiveUser;
+
+    @Schema(description = "鎺ユ敹鏃堕棿")
+    private LocalDate receiveDate;
+
+    @Schema(description = "鍥炴敹缂栧彿")
+    private String recycleCode;
+
+    @Schema(description = "鍥炴敹浜�")
+    private Integer recycleUser;
+
+    @Schema(description = "鍥炴敹鏃ユ湡")
+    @ExcelProperty(value = "鍥炴敹鏃ユ湡")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private LocalDate recycleDate;
+
+    @Schema(description = "鍥炴敹璇存槑")
+    private String recycleNote;
+
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+
+    @Schema(description = "闄勪欢")
+    private String url;
+
+    @TableField(select = false,exist = false)
+    private MultipartFile file;
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/pojo/ManageDocumentList.java b/cnas-manage/src/main/java/com/ruoyi/manage/pojo/ManageDocumentList.java
new file mode 100644
index 0000000..26d3dde
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/pojo/ManageDocumentList.java
@@ -0,0 +1,80 @@
+package com.ruoyi.manage.pojo;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 鏂囦欢娓呭崟
+
+ * </p>
+ *
+ * @author
+ * @since 2024-11-08 11:08:11
+ */
+@Getter
+@Setter
+@TableName("cnas_manage_document_list")
+@Schema(description = "鏂囦欢娓呭崟")
+@ExcelIgnoreUnannotated
+public class ManageDocumentList  implements Serializable {
+
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @Schema(description = "鏂囦欢缂栧彿")
+    @ExcelProperty(value = "鏂囦欢缂栧彿")
+    private String documentCode;
+
+    @Schema(description = "绫诲埆")
+    @ExcelProperty(value = "绫诲埆")
+    private String type;
+
+    @Schema(description = "鍚嶇О")
+    @ExcelProperty(value = "鍚嶇О")
+    private String name;
+
+    @Schema(description = "鏂囦欢鐗堟湰")
+    @ExcelProperty(value = "鏂囦欢鐗堟湰")
+    private String version;
+
+    @Schema(description = "浣滆��")
+    @ExcelProperty(value = "浣滆��")
+    private String writer;
+
+    @Schema(description = "鐢熸晥鏃ユ湡")
+    @ExcelProperty(value = "鐢熸晥鏃ユ湡")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private LocalDate effectiveDate;
+
+    @Schema(description = "鏂囦欢鐘舵��")
+    @ExcelProperty(value = "鏂囦欢鐘舵��")
+    private String state;
+
+    @Schema(description = "闄勪欢鍦板潃")
+    private String url;
+
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/pojo/ManageMeeting.java b/cnas-manage/src/main/java/com/ruoyi/manage/pojo/ManageMeeting.java
new file mode 100644
index 0000000..59ab91c
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/pojo/ManageMeeting.java
@@ -0,0 +1,53 @@
+package com.ruoyi.manage.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author
+ * @since 2024-11-11 09:33:47
+ */
+@Getter
+@Setter
+@TableName("cnas_manage_meeting")
+@Schema(description = "")
+public class ManageMeeting implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @Schema(description = "浼氳鏃堕棿")
+    private LocalDateTime meetingTime;
+
+    @Schema(description = "浼氳鍦扮偣")
+    private String place;
+
+    @Schema(description = "涓绘寔浜�")
+    private String compere;
+
+    @Schema(description = "浼氳鍐呭鎽樿")
+    private String content;
+
+    @TableField(fill = FieldFill.INSERT)
+    private String createUser;
+
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private String updateUser;
+
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/pojo/ManageMeetingParticipants.java b/cnas-manage/src/main/java/com/ruoyi/manage/pojo/ManageMeetingParticipants.java
new file mode 100644
index 0000000..4e382ce
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/pojo/ManageMeetingParticipants.java
@@ -0,0 +1,53 @@
+package com.ruoyi.manage.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author
+ * @since 2024-11-11 09:34:27
+ */
+@Getter
+@Setter
+@TableName("cnas_manage_meeting_participants")
+@Schema(description = "")
+public class ManageMeetingParticipants implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @Schema(description = "鍙備細浜哄憳")
+    private Integer participants;
+
+    @TableField(select = false,exist = false)
+    private String userName;
+
+    @Schema(description = "閮ㄩ棬")
+    private String department;
+
+    @Schema(description = "浼氳id")
+    private Integer meetingId;
+
+    @TableField(fill = FieldFill.INSERT)
+    private String createUser;
+
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private String updateUser;
+
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/pojo/ManageRecordAudit.java b/cnas-manage/src/main/java/com/ruoyi/manage/pojo/ManageRecordAudit.java
new file mode 100644
index 0000000..0db259b
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/pojo/ManageRecordAudit.java
@@ -0,0 +1,133 @@
+package com.ruoyi.manage.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+import org.springframework.format.annotation.DateTimeFormat;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.Serializable;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 鏂囦欢淇鐢宠瀹℃壒璁板綍
+ * </p>
+ *
+ * @author
+ * @since 2024-11-14 10:29:18
+ */
+@Getter
+@Setter
+@TableName("cnas_manage_record_audit")
+@Schema(description = "鏂囦欢淇鐢宠瀹℃壒璁板綍")
+public class ManageRecordAudit  implements Serializable {
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @Schema(description = "鏂囦欢缂栧彿")
+    private String documentCode;
+
+    @Schema(description = "鏂囦欢鍚嶇О")
+    private String documentName;
+
+    @Schema(description = "绔犺妭鍙�")
+    private String capter;
+
+    @Schema(description = "椤电爜")
+    private String pages;
+
+    @Schema(description = "淇娆℃暟")
+    private Integer number;
+
+    @Schema(description = "淇敼鍓嶇増鏈彿")
+    private String beforeVersion;
+
+    @Schema(description = "淇敼鍚庣増鏈彿")
+    private String afterVersion;
+
+    @Schema(description = "淇敼鍐呭")
+    private String alterThing;
+
+    @Schema(description = "淇浜�")
+    private Integer alterUser;
+
+    @TableField(select = false, exist = false)
+    private String alterUserName;
+
+    @Schema(description = "鎵瑰噯浜�")
+    private Integer ratifyUser;
+
+    @TableField(select = false, exist = false)
+    private String ratifyUserName;
+
+    //鎵瑰噯浜虹鍚�
+    @TableField(select = false, exist = false)
+    private String ratifyUserUrl;
+
+    @Schema(description = "鏃ユ湡")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    private LocalDate date;
+
+    @Schema(description = "鐢宠浜�")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    //鐢宠浜�
+    @TableField(select = false, exist = false)
+    private String createUserName;
+
+    //鐢宠閮ㄩ棬
+    @TableField(select = false, exist = false)
+    private String createUserDepart;
+
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    @Schema(description = "鐢宠鏃ユ湡")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    private LocalDate createTime;
+
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+
+    @Schema(description = "鍙樺寲鍘熷洜")
+    private String reason;
+
+    @Schema(description = "鍘熷垎鍙戦儴闂�")
+    private String beforeDepart;
+
+    @Schema(description = "淇鍚庡垎鍙戦儴闂�")
+    private String afterDepart;
+
+    @Schema(description = "鐢宠閮ㄩ棬涓荤鎰忚")
+    private String applicant;
+
+    @Schema(description = "鍘熷埗瀹氶儴闂ㄦ剰瑙�")
+    private String formulation;
+
+    @Schema(description = "鍘熷鏍搁儴闂ㄦ剰瑙�")
+    private String audit;
+
+    @Schema(description = "淇浣滃簾")
+    private String method;
+
+
+    @Schema(description = "鍘熼檮浠�")
+    private String beforeUrl;
+
+    @Schema(description = "淇鍚庨檮浠�")
+    private String afterUrl;
+
+    @TableField(select = false, exist = false)
+    private MultipartFile file;
+
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/pojo/ManageRecordCancel.java b/cnas-manage/src/main/java/com/ruoyi/manage/pojo/ManageRecordCancel.java
new file mode 100644
index 0000000..802a0e2
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/pojo/ManageRecordCancel.java
@@ -0,0 +1,80 @@
+package com.ruoyi.manage.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serializable;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 浣滃簾鏂囦欢閿�榄傝褰�
+ * </p>
+ *
+ * @author 
+ * @since 2024-11-13 01:27:22
+ */
+@Getter
+@Setter
+@TableName("cnas_manage_record_cancel")
+@Schema(description = "浣滃簾鏂囦欢閿�榄傝褰�")
+public class ManageRecordCancel  implements Serializable {
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @Schema(description = "鏂囦欢缂栧彿")
+
+    private String documentCode;
+
+    @Schema(description = "鏂囦欢鍚嶇О")
+
+    private String documentName;
+
+    @Schema(description = "鏁伴噺")
+    private Integer qty;
+
+    @Schema(description = "閿�姣佸師鍥�")
+    private String reason;
+
+    @Schema(description = "鐢宠浜�")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @TableField(select = false,exist = false)
+    private String createUserName;
+
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    @Schema(description = "鐢宠鏃ユ湡")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    private LocalDate createTime;
+
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+
+    @Schema(description = "鎵瑰噯浜�")
+    private Integer ratifyUser;
+
+    @TableField(select = false,exist = false)
+    private String ratifyUserName;
+
+    private String ratifyState;
+
+    @Schema(description = "鎵瑰噯鏃ユ湡")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    private LocalDate ratifyTime;
+
+    @Schema(description = "澶囨敞")
+    private String remark;
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/pojo/ManageRecordCheck.java b/cnas-manage/src/main/java/com/ruoyi/manage/pojo/ManageRecordCheck.java
new file mode 100644
index 0000000..2f1de47
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/pojo/ManageRecordCheck.java
@@ -0,0 +1,77 @@
+package com.ruoyi.manage.pojo;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serializable;
+import java.time.LocalDate;
+
+/**
+ * <p>
+ * 鏂囦欢瀹℃壒璁板綍(鍚慨璁㈠悗鍐嶆瀹℃壒璁板綍)
+ * </p>
+ *
+ * @author
+ * @since 2024-11-12 02:31:36
+ */
+@Getter
+@Setter
+@TableName("cnas_manage_record_check")
+@Schema(description = "鏂囦欢瀹℃壒璁板綍(鍚慨璁㈠悗鍐嶆瀹℃壒璁板綍)")
+public class ManageRecordCheck  implements Serializable {
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @Schema(description = "鏂囦欢鍚嶇О")
+
+    private String documentName;
+
+    @Schema(description = "鏂囦欢缂栧彿")
+
+    private String documentCode;
+
+    @Schema(description = "鐗�/娆�")
+    private String documentVersion;
+
+    @Schema(description = "缂栧埗浜�")
+    private Integer writeUser;
+
+    @TableField(select = false,exist = false)
+    private String writeUserName;
+
+    @Schema(description = "瀹℃牳浜�")
+    private Integer checkUser;
+
+    @TableField(select = false,exist = false)
+    private String checkUserName;
+
+    @Schema(description = "瀹℃牳鐘舵��")
+    private String checkState;
+
+    @Schema(description = "鎵瑰噯浜�")
+    private Integer ratifyUser;
+
+    @TableField(select = false,exist = false)
+    private String ratifyUserName;
+
+    @Schema(description = "鎵瑰噯鐘舵��")
+    private String ratifyState;
+
+    @Schema(description = "鎵瑰噯鏃ユ湡")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    private LocalDate ratifyDate;
+
+    @Schema(description = "澶囨敞")
+    private String remark;
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/pojo/ManageRecordIntervals.java b/cnas-manage/src/main/java/com/ruoyi/manage/pojo/ManageRecordIntervals.java
new file mode 100644
index 0000000..cf4ebb8
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/pojo/ManageRecordIntervals.java
@@ -0,0 +1,62 @@
+package com.ruoyi.manage.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 鏂囦欢瀹氭湡瀹℃煡璁板綍
+ * </p>
+ *
+ * @author
+ * @since 2024-11-13 10:54:31
+ */
+@Getter
+@Setter
+@TableName("cnas_manage_record_intervals")
+@Schema(description = "鏂囦欢瀹氭湡瀹℃煡璁板綍")
+public class ManageRecordIntervals  implements Serializable {
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @Schema(description = "鏂囦欢鍚嶇О")
+    private String documentName;
+
+    @Schema(description = "鏂囦欢缂栧彿")
+    private String documentCode;
+
+    @Schema(description = "鐗堟湰鍙�")
+    private String documentVersion;
+
+    @Schema(description = "淇鍙�")
+    private String revision;
+
+    @Schema(description = "閫傚疁鎬�")
+    private String suitability;
+
+    @Schema(description = "澶囨敞")
+    private String remark;
+
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+
+    @Schema(description = "澶栭敭鍏宠仈,澶栨潵鏂囦欢纭鍘嗗彶璁板綍id")
+    private Integer recordIntervalsTotalId;
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/pojo/ManageRecordIntervalsTotal.java b/cnas-manage/src/main/java/com/ruoyi/manage/pojo/ManageRecordIntervalsTotal.java
new file mode 100644
index 0000000..6f0f5cf
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/pojo/ManageRecordIntervalsTotal.java
@@ -0,0 +1,75 @@
+package com.ruoyi.manage.pojo;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serializable;
+import java.time.LocalDate;
+
+/**
+ * <p>
+ * 鏂囦欢瀹氭湡瀹℃煡璁板綍鎬诲巻鍙茶褰曡〃
+ * </p>
+ *
+ * @author
+ * @since 2024-11-15 01:12:11
+ */
+@Getter
+@Setter
+@TableName("cnas_manage_record_intervals_total")
+@Schema(description = "鏂囦欢瀹氭湡瀹℃煡璁板綍鎬诲巻鍙茶褰曡〃")
+public class ManageRecordIntervalsTotal  implements Serializable {
+
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @Schema(description = "鎵瑰噯浜�")
+    private Integer ratifyUser;
+
+    @TableField(select = false,exist = false)
+    private String ratifyUserName;
+
+    @Schema(description = "鎵瑰噯缁撴灉")
+    private String ratifyState;
+
+    @Schema(description = "鎵瑰噯鏃ユ湡")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    private LocalDate ratifyDate;
+
+    @Schema(description = "鎵瑰噯浜虹鍚�")
+    private String ratifyUrl;
+
+    @Schema(description = "鎷熷埗浜�")
+    private Integer submitUser;
+
+    @TableField(select = false,exist = false)
+    private String submitUserName;
+
+    @Schema(description = "鎷熷埗浜虹鍚�")
+    private String submitUrl;
+
+    @Schema(description = "鎷熷埗鏃ユ湡")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    private LocalDate submitDate;
+
+    @Schema(description = "骞翠唤")
+    private String year;
+
+    @Schema(description = "鎬绘暟閲�")
+    private Integer totalNum;
+
+    @Schema(description = "鐢熸垚鐢宠琛ㄧ殑璺緞")
+    private String url;
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/pojo/ManageRecordIssueRecycle.java b/cnas-manage/src/main/java/com/ruoyi/manage/pojo/ManageRecordIssueRecycle.java
new file mode 100644
index 0000000..5426343
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/pojo/ManageRecordIssueRecycle.java
@@ -0,0 +1,77 @@
+package com.ruoyi.manage.pojo;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serializable;
+import java.time.LocalDate;
+
+/**
+ * <p>
+ * 鎵�鏈夋枃浠�(鍐呫�佸閮ㄦ枃浠�)鐨勫彂鏀句笌鍥炴敹璁板綍
+ * </p>
+ *
+ * @author 
+ * @since 2024-11-13 09:11:05
+ */
+@Getter
+@Setter
+@TableName("cnas_manage_record_issue_recycle")
+@Schema(description = "鎵�鏈夋枃浠�(鍐呫�佸閮ㄦ枃浠�)鐨勫彂鏀句笌鍥炴敹璁板綍")
+public class ManageRecordIssueRecycle  implements Serializable {
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @Schema(description = "鏂囦欢缂栧彿")
+    private String documentCode;
+
+    @Schema(description = "鏂囦欢鍚嶇О")
+    private String documentName;
+
+    @Schema(description = "鐗堝彿")
+    private String documentVersion;
+
+    @Schema(description = "浠芥暟")
+    private String pages;
+
+    @Schema(description = "鏂囦欢绫诲埆")
+    private String documentType;
+
+    @Schema(description = "鍒嗗彂鍙�")
+    private String number;
+
+    @Schema(description = "鎺ユ敹閮ㄩ棬")
+    private String departLims;
+
+    @Schema(description = "鎺ュ彈浜�")
+    private Integer receiveUser;
+
+    @TableField(select = false,exist = false)
+    private String receiveUserName;
+
+    @Schema(description = "鎺ュ彈鏃ユ湡")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    private LocalDate receiveDate;
+
+    @Schema(description = "绛炬敹浜�")
+    private Integer signedUser;
+
+    @TableField(select = false,exist = false)
+    private String signedUserName;
+
+    @Schema(description = "绛炬敹鏃ユ湡")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    private LocalDate signedDate;
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/pojo/ManageRecordTotal.java b/cnas-manage/src/main/java/com/ruoyi/manage/pojo/ManageRecordTotal.java
new file mode 100644
index 0000000..ab1134e
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/pojo/ManageRecordTotal.java
@@ -0,0 +1,77 @@
+package com.ruoyi.manage.pojo;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serializable;
+import java.time.LocalDate;
+
+/**
+ * <p>
+ * 澶栨潵鏂囦欢纭璁板綍鎬诲巻鍙茶褰曡〃
+ * </p>
+ *
+ * @author
+ * @since 2024-11-12 10:30:08
+ */
+@Getter
+@Setter
+@TableName("cnas_manage_record_total")
+@Schema(description = "澶栨潵鏂囦欢纭璁板綍鎬诲巻鍙茶褰曡〃")
+public class ManageRecordTotal  implements Serializable {
+
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @Schema(description = "鎵瑰噯浜�")
+    private Integer ratifyUser;
+
+    @TableField(select = false,exist = false)
+    private String ratifyUserName;
+
+    @Schema(description = "鎵瑰噯缁撴灉")
+    private String ratifyState;
+
+    @Schema(description = "鎵瑰噯鏃ユ湡")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    private LocalDate ratifyDate;
+
+    @Schema(description = "鎵瑰噯浜虹鍚�")
+    private String ratifyUrl;
+
+    @Schema(description = "鎷熷埗浜�")
+    private Integer submitUser;
+
+    @TableField(select = false,exist = false)
+    private String submitUserName;
+
+    @Schema(description = "鎷熷埗浜虹鍚�")
+    private String submitUrl;
+
+    @Schema(description = "鎷熷埗鏃ユ湡")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    private LocalDate submitDate;
+
+    @Schema(description = "骞翠唤")
+
+    private String year;
+
+    @Schema(description = "鎬绘暟閲�")
+
+    private Integer totalNum;
+
+    @Schema(description = "鐢熸垚鐢宠琛ㄧ殑璺緞")
+    private String url;
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/pojo/ManageRecordVerify.java b/cnas-manage/src/main/java/com/ruoyi/manage/pojo/ManageRecordVerify.java
new file mode 100644
index 0000000..74899e7
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/pojo/ManageRecordVerify.java
@@ -0,0 +1,63 @@
+package com.ruoyi.manage.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.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serializable;
+import java.time.LocalDate;
+
+/**
+ * <p>
+ * 澶栨潵鏂囦欢纭璁板綍
+ * </p>
+ *
+ * @author 
+ * @since 2024-11-12 10:29:44
+ */
+@Getter
+@Setter
+@TableName("cnas_manage_record_verify")
+@Schema(description = "澶栨潵鏂囦欢纭璁板綍")
+public class ManageRecordVerify  implements Serializable {
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @Schema(description = "澶栨潵鏂囦欢鍚嶇О")
+
+    private String documentName;
+
+    @Schema(description = "鏂囦欢缂栧彿")
+
+    private String documentCode;
+
+    @Schema(description = "鏍囧噯瑙勮寖鍚嶇О")
+    private String standardName;
+
+    @Schema(description = "鏍囧噯鍙�")
+    private String standardCode;
+
+    @Schema(description = "鐢熸晥鏃ユ湡")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    private LocalDate effectiveDate;
+
+    @Schema(description = "浣滃簾鏃ユ湡")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    private LocalDate cancelDate;
+
+    @Schema(description = "澶囨敞")
+    private String note;
+
+    @Schema(description = "澶栭敭鍏宠仈,澶栨潵鏂囦欢纭鍘嗗彶璁板綍id")
+    private Integer manageRecordTotalId;
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/pojo/ManageReviewProgram.java b/cnas-manage/src/main/java/com/ruoyi/manage/pojo/ManageReviewProgram.java
new file mode 100644
index 0000000..842ffd5
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/pojo/ManageReviewProgram.java
@@ -0,0 +1,80 @@
+package com.ruoyi.manage.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author 
+ * @since 2024-11-09 03:05:42
+ */
+@Getter
+@Setter
+@TableName("cnas_manage_review_program")
+@Schema(description = "")
+public class ManageReviewProgram implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @Schema(description = "璇勫鏃堕棿")
+    private LocalDateTime reviewTime;
+
+    @Schema(description = "璇勫鍦扮偣")
+    private String judgingLocation;
+
+    @Schema(description = "璇勫鐩殑")
+    private String judgingPurpose;
+
+    @Schema(description = "璇勫鏂瑰紡")
+    private String judgingMethod;
+
+    @Schema(description = "鍙傚姞浜哄憳")
+    private String participants;
+
+    @Schema(description = "璇勫鑼冨洿")
+    private String judgingScope;
+
+    @Schema(description = "璇勫渚濇嵁")
+    private String judgingBasis;
+
+    @Schema(description = "璇勫涓昏鍐呭")
+    private String mainContext;
+
+    @Schema(description = "鍑嗗宸ヤ綔瑕佹眰")
+    private String preparationRequirements;
+
+    @Schema(description = "缂栧埗")
+    private String editor;
+
+    @Schema(description = "缂栧埗鏃ユ湡")
+    private LocalDateTime editorDate;
+
+    @Schema(description = "鎵瑰噯")
+    private String approve;
+
+    @Schema(description = "鎵瑰噯鏃ユ湡")
+    private LocalDateTime approveDate;
+
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private String updateUser;
+
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/pojo/ManageReviewProgramFile.java b/cnas-manage/src/main/java/com/ruoyi/manage/pojo/ManageReviewProgramFile.java
new file mode 100644
index 0000000..aad7a76
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/pojo/ManageReviewProgramFile.java
@@ -0,0 +1,49 @@
+package com.ruoyi.manage.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author
+ * @since 2024-11-09 04:15:47
+ */
+@Getter
+@Setter
+@TableName("cnas_manage_review_program_file")
+@Schema(description = "")
+public class ManageReviewProgramFile implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @Schema(description = "鏂囦欢鍚嶇О")
+    private String fileName;
+
+    @Schema(description = "璁″垝琛↖D")
+    private Integer reviewId;
+
+    @TableField(fill = FieldFill.INSERT)
+    private String createUser;
+
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private String updateUser;
+
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+
+    private String url;
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/pojo/ManageReviewReport.java b/cnas-manage/src/main/java/com/ruoyi/manage/pojo/ManageReviewReport.java
new file mode 100644
index 0000000..0e08579
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/pojo/ManageReviewReport.java
@@ -0,0 +1,101 @@
+package com.ruoyi.manage.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 绠$悊璇勫鎶ュ憡
+ * </p>
+ *
+ * @author 
+ * @since 2024-11-12 04:44:39
+ */
+@Getter
+@Setter
+@TableName("cnas_manage_review_report")
+@Schema(description = "绠$悊璇勫鎶ュ憡")
+public class ManageReviewReport implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @Schema(description = "鐩殑")
+    private String objective;
+
+    @Schema(description = "鍦扮偣")
+    private String place;
+
+    @Schema(description = "涓绘寔浜�")
+    private String compere;
+
+    @Schema(description = "璁板綍浜�")
+    private String recordPeople;
+
+    @Schema(description = "鏃ユ湡")
+    private LocalDateTime date;
+
+    @Schema(description = "椤垫")
+    private Integer page;
+
+    @Schema(description = "璇勫鏂瑰紡")
+    private String judgingMethod;
+
+    @Schema(description = "璇勫渚濇嵁")
+    private String reviewBasis;
+
+    @Schema(description = "鍑哄腑浜哄憳")
+    private String attendess;
+
+    @Schema(description = "璇勫杈撳叆鎯呭喌")
+    private String reviewInputs;
+
+    @Schema(description = "璇勫杩囩▼姒傚喌")
+    private String reviewProcess;
+
+    @Schema(description = "涓昏璁姒傝堪")
+    private String mainTopic;
+
+    @Schema(description = "浜嬮」")
+    private String matters;
+
+    @Schema(description = "璐熻矗浜�")
+    private String head;
+
+    @Schema(description = "瀹屾垚鏃ユ湡")
+    private LocalDateTime completionDate;
+
+    @Schema(description = "璺熻釜纭浜�")
+    private String trackingConfirmed;
+
+    @Schema(description = "璺熻釜鎯呭喌纭璁板綍")
+    private String follerUp;
+
+    @Schema(description = "浣撶郴璇勪环")
+    private String overallEvaluation;
+
+    @Schema(description = "瀹℃牳")
+    private String audit;
+
+    @Schema(description = "鎵瑰噯")
+    private String approval;
+
+    @TableField(fill = FieldFill.INSERT)
+    private String createUser;
+
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private String updateUser;
+
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/pojo/ManageRiskAssessmentResults.java b/cnas-manage/src/main/java/com/ruoyi/manage/pojo/ManageRiskAssessmentResults.java
new file mode 100644
index 0000000..b472ba1
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/pojo/ManageRiskAssessmentResults.java
@@ -0,0 +1,102 @@
+package com.ruoyi.manage.pojo;
+
+import com.alibaba.excel.annotation.ExcelIgnore;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 鍗遍櫓鍥犵礌杈ㄨ瘑涓庨闄╄瘎浠风粨鏋滀竴瑙堣〃
+ * </p>
+ *
+ * @author
+ * @since 2024-11-15 02:58:51
+ */
+@Getter
+@Setter
+@TableName("cnas_manage_risk_assessment_results")
+@Schema(description = "鍗遍櫓鍥犵礌杈ㄨ瘑涓庨闄╄瘎浠风粨鏋滀竴瑙堣〃")
+public class ManageRiskAssessmentResults implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    @ExcelIgnore
+    private Integer id;
+
+    @Schema(description = "鍦扮偣/娲诲姩")
+    @ExcelProperty(value = "鍦扮偣/娲诲姩", index = 0)
+    private String venue;
+
+    @Schema(description = "鍗遍櫓鍥犵礌")
+    @ExcelProperty(value = "鍗遍櫓鍥犵礌", index = 1)
+    private String hazard;
+
+    @Schema(description = "鍙兘瀵艰嚧鐨勪簨鏁�")
+    @ExcelProperty(value = "鍙兘瀵艰嚧鐨勪簨鏁�", index = 2)
+    private String accidents;
+
+    @Schema(description = "瀵逛汉鍙兘閫犳垚鐨勫嵄瀹�")
+    @ExcelProperty(value = "瀵逛汉鍙兘閫犳垚鐨勫嵄瀹�", index = 3)
+    private String injury;
+
+    @Schema(description = "椋庨櫓璇勪环")
+    @ExcelProperty(value = {"椋庨櫓璇勪环", "L"})
+    private String riskL;
+
+    @Schema(description = "椋庨櫓璇勪环")
+    @ExcelProperty(value = {"椋庨櫓璇勪环", "E"})
+    private String riskE;
+
+    @Schema(description = "椋庨櫓璇勪环")
+    @ExcelProperty(value = {"椋庨櫓璇勪环", "C"})
+    private String riskC;
+
+    @Schema(description = "椋庨櫓璇勪环")
+    @ExcelProperty(value = {"椋庨櫓璇勪环", "D"})
+    private String riskD;
+
+    @Schema(description = "椋庨櫓绛夌骇")
+    @ExcelProperty(value = "椋庨櫓绛夌骇", index = 8)
+    private String level;
+
+    @Schema(description = "璇勪环缁撹")
+    @ExcelProperty(value = "璇勪环缁撹", index = 9)
+    private String conclusion;
+
+    @Schema(description = "鎺у埗鎺柦")
+    @ExcelProperty(value = "鎺у埗鎺柦", index = 10)
+    private String measures;
+
+    @Schema(description = "缂栧埗id")
+    private Integer editor;
+
+    @Schema(description = "缂栧埗鏃ユ湡")
+    private LocalDateTime editorDate;
+
+    @Schema(description = "瀹℃壒浜篿d")
+    private Integer approval;
+
+    @Schema(description = "瀹℃壒鏃ユ湡")
+    private LocalDateTime approvalDate;
+
+    @Schema(description = "鎵瑰噯浜篿d")
+    private Integer approve;
+
+    @Schema(description = "鎵瑰噯鏃ユ湡")
+    private LocalDateTime approveDate;
+
+    @Schema(description = "鎵瑰噯鐘舵��1锛氶�氳繃锛�2锛氫笉閫氳繃")
+    private Integer approveStatus;
+
+    @Schema(description = "瀹℃壒鐘舵��1锛氶�氳繃锛�2锛氫笉閫氳繃")
+    private Integer approvalStatus;
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/schedule/ManageRecordTotalSchedule.java b/cnas-manage/src/main/java/com/ruoyi/manage/schedule/ManageRecordTotalSchedule.java
new file mode 100644
index 0000000..34457f7
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/schedule/ManageRecordTotalSchedule.java
@@ -0,0 +1,36 @@
+package com.ruoyi.manage.schedule;
+
+import com.ruoyi.manage.pojo.ManageRecordIntervalsTotal;
+import com.ruoyi.manage.pojo.ManageRecordTotal;
+import com.ruoyi.manage.service.ManageRecordIntervalsTotalService;
+import com.ruoyi.manage.service.ManageRecordTotalService;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import jakarta.annotation.Resource;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+
+@Component
+public class ManageRecordTotalSchedule {
+
+    @Resource
+    private ManageRecordTotalService manageRecordTotalService;
+
+    @Resource
+    private ManageRecordIntervalsTotalService manageRecordIntervalsTotalService;
+
+    @Scheduled(cron = "0 0 2 1 1 ?") //姣忓勾1鏈�1鍙�2鐐�
+    public void manageRecordTotal() {
+        ManageRecordTotal manageRecordTotal = new ManageRecordTotal();
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy");
+        Calendar calendar = Calendar.getInstance();
+        String formattedDate = sdf.format(calendar.getTime());
+        manageRecordTotal.setYear(formattedDate);
+        manageRecordTotalService.save(manageRecordTotal);
+
+        ManageRecordIntervalsTotal manageRecordIntervalsTotal = new ManageRecordIntervalsTotal();
+        manageRecordIntervalsTotal.setYear(formattedDate);
+        manageRecordIntervalsTotalService.save(manageRecordIntervalsTotal);
+    }
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/service/ClientSatisfactionService.java b/cnas-manage/src/main/java/com/ruoyi/manage/service/ClientSatisfactionService.java
new file mode 100644
index 0000000..4f8c4e9
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/service/ClientSatisfactionService.java
@@ -0,0 +1,59 @@
+package com.ruoyi.manage.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.manage.pojo.ClientSatisfaction;
+import com.ruoyi.manage.pojo.ClientSatisfactionAnalyseFile;
+import org.springframework.web.multipart.MultipartFile;
+
+import jakarta.servlet.http.HttpServletResponse;
+
+/**
+ * 瀹㈡埛婊℃剰搴�
+ *
+ * @author zhuo
+ * @since 2024-11-09
+ */
+public interface ClientSatisfactionService extends IService<ClientSatisfaction> {
+
+    /**
+     * 瀹㈡埛婊℃剰搴﹁皟鏌ュ垪琛�
+     * @param page
+     * @param clientSatisfaction
+     * @return
+     */
+    IPage<ClientSatisfaction> pageClientSatisfaction(Page page, ClientSatisfaction clientSatisfaction);
+
+    /**
+     * 鏂板瀹㈡埛鍒嗘瀽闄勪欢
+     * @param file
+     * @return
+     */
+    boolean uploadAnalyseFile(MultipartFile file);
+
+    /**
+     * 鏌ヨ瀹㈡埛鍒嗘瀽闄勪欢
+     * @param page
+     * @param analyseFile
+     * @return
+     */
+    IPage<ClientSatisfactionAnalyseFile> pageAnalyseFile(Page page, ClientSatisfactionAnalyseFile analyseFile);
+
+    /**
+     * 瀹㈡埛婊℃剰搴﹀鍑�
+     *
+     * @param clientSatisfactionId
+     * @param response
+     */
+    void exportWordClientSatisfaction(Integer clientSatisfactionId, HttpServletResponse response);
+
+    /**
+     * 纭瀹㈡埛婊℃剰搴�
+     *
+     * @param clientSatisfaction 瑕佷慨鏀瑰鎴锋弧鎰忓害鐨勭姸鎬佸璞�
+     * @param userId             淇敼浜篿d
+     */
+    void confirmClientSatisfaction(ClientSatisfaction clientSatisfaction, Integer userId);
+}
+
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/service/InternalCheckDetailService.java b/cnas-manage/src/main/java/com/ruoyi/manage/service/InternalCheckDetailService.java
new file mode 100644
index 0000000..acac9da
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/service/InternalCheckDetailService.java
@@ -0,0 +1,15 @@
+package com.ruoyi.manage.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.manage.pojo.InternalCheckDetail;
+
+/**
+ * 鍐呭妫�鏌ヨ鎯呰〃
+ *
+ * @author zhuo
+ * @since 2024-11-11
+ */
+public interface InternalCheckDetailService extends IService<InternalCheckDetail> {
+
+}
+
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/service/InternalCheckService.java b/cnas-manage/src/main/java/com/ruoyi/manage/service/InternalCheckService.java
new file mode 100644
index 0000000..4f68da1
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/service/InternalCheckService.java
@@ -0,0 +1,69 @@
+package com.ruoyi.manage.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.manage.dto.InternalCheckDto;
+import com.ruoyi.manage.pojo.InternalCheck;
+
+import jakarta.servlet.http.HttpServletResponse;
+
+/**
+ * 鍐呭妫�鏌ヨ〃
+ *
+ * @author zhuo
+ * @since 2024-11-11
+ */
+public interface InternalCheckService extends IService<InternalCheck> {
+
+    /**
+     * 鍐呭妫�鏌ュ垎椤垫煡璇�
+     * @param page
+     * @param internalCheck
+     * @return
+     */
+    IPage<InternalCheckDto> pageInternalCheck(Page page, InternalCheck internalCheck);
+
+    /**
+     * 鍐呭妫�鏌ユ柊澧�
+     * @param internalCheck
+     * @return
+     */
+    boolean addInternalCheck(InternalCheckDto internalCheck);
+
+    /**
+     * 鍐呭妫�鏌ヤ慨鏀�
+     * @param internalCheck
+     * @return
+     */
+    boolean updateInternalCheck(InternalCheckDto internalCheck);
+
+    /**
+     * 鍐呭妫�鏌ュ垹闄�
+     * @param checkId
+     * @return
+     */
+    boolean delInternalCheck(Integer checkId);
+
+    /**
+     * 鍐呭妫�鏌ユ煡鐪嬭鎯�
+     * @param checkId
+     * @return
+     */
+    InternalCheckDto getInternalCheckOne(Integer checkId);
+
+    /**
+     * 鍐呭妫�鏌ユ壒鍑�
+     * @param internalCheck
+     * @return
+     */
+    boolean ratifyInternalCheck(InternalCheckDto internalCheck);
+
+    /**
+     * 瀵煎嚭鍐呭妫�鏌�
+     * @param checkId
+     * @param response
+     */
+    void exportInternalCheck(Integer checkId, HttpServletResponse response);
+}
+
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/service/InternalCorrectFileService.java b/cnas-manage/src/main/java/com/ruoyi/manage/service/InternalCorrectFileService.java
new file mode 100644
index 0000000..4d7b983
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/service/InternalCorrectFileService.java
@@ -0,0 +1,16 @@
+package com.ruoyi.manage.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.manage.pojo.InternalCorrectFile;
+
+/**
+ * <p>
+ * 鍐呭绠$悊绾犳鎺柦闄勪欢琛� 鏈嶅姟绫�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-13 04:00:38
+ */
+public interface InternalCorrectFileService extends IService<InternalCorrectFile> {
+
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/service/InternalCorrectService.java b/cnas-manage/src/main/java/com/ruoyi/manage/service/InternalCorrectService.java
new file mode 100644
index 0000000..0995a22
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/service/InternalCorrectService.java
@@ -0,0 +1,66 @@
+package com.ruoyi.manage.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.manage.pojo.InternalCorrect;
+import com.ruoyi.manage.pojo.InternalCorrectFile;
+import org.springframework.web.multipart.MultipartFile;
+
+import jakarta.servlet.http.HttpServletResponse;
+import java.util.List;
+
+/**
+ * <p>
+ * 鍐呭绠$悊绾犳澶勭悊琛� 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 
+ * @since 2024-11-13 04:00:15
+ */
+public interface InternalCorrectService extends IService<InternalCorrect> {
+
+    /**
+     * 鏂板鍐呭绠$悊绾犳澶勭悊淇℃伅
+     * @param InternalAccording
+     * @return
+     */
+    boolean addInternalCorrect(InternalCorrect InternalAccording);
+
+    /**
+     * 鏌ヨ鍐呭绠$悊绾犳澶勭悊
+     * @param correctId
+     * @return
+     */
+    InternalCorrect getInternalCorrect(Integer correctId);
+
+    /**
+     * 鏌ヨ鍐呭绠$悊绾犳鎺柦鍒楄〃
+     * @param page
+     * @param detailsCorrect
+     * @return
+     */
+    IPage<InternalCorrect> pageInternalCorrect(Page page, InternalCorrect detailsCorrect);
+
+    /**
+     * 鏂板鍐呭绠$悊绾犳鎺柦闄勪欢
+     * @param correctId
+     * @param file
+     * @return
+     */
+    boolean uploadInternalCorrectFile(Integer correctId, MultipartFile file);
+
+    /**
+     * 鏌ヨ鍐呭绠$悊绾犳鎺柦闄勪欢
+     * @param correctId
+     * @return
+     */
+    List<InternalCorrectFile> getInternalCorrectFileList(Integer correctId);
+
+    /**
+     * 瀵煎嚭绾犳鎺柦
+     * @param correctId
+     * @param response
+     */
+    void exportInternalCorrect(Integer correctId, HttpServletResponse response);
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/service/InternalImplementDetailService.java b/cnas-manage/src/main/java/com/ruoyi/manage/service/InternalImplementDetailService.java
new file mode 100644
index 0000000..fe6b57f
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/service/InternalImplementDetailService.java
@@ -0,0 +1,15 @@
+package com.ruoyi.manage.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.manage.pojo.InternalImplementDetail;
+
+/**
+ * 鍐呭瀹炴柦璁″垝璇︽儏
+ *
+ * @author makejava
+ * @since 2024-11-11
+ */
+public interface InternalImplementDetailService extends IService<InternalImplementDetail> {
+
+}
+
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/service/InternalImplementService.java b/cnas-manage/src/main/java/com/ruoyi/manage/service/InternalImplementService.java
new file mode 100644
index 0000000..7431d80
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/service/InternalImplementService.java
@@ -0,0 +1,69 @@
+package com.ruoyi.manage.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.manage.dto.InternalImplementDto;
+import com.ruoyi.manage.pojo.InternalImplement;
+
+import jakarta.servlet.http.HttpServletResponse;
+
+/**
+ * 鍐呭瀹炴柦璁″垝
+ *
+ * @author zhuo
+ * @since 2024-11-11
+ */
+public interface InternalImplementService extends IService<InternalImplement> {
+
+    /**
+     * 鍐呭瀹炴柦璁″垝鍒嗛〉鏌ヨ
+     * @param page
+     * @param internalImplement
+     * @return
+     */
+    IPage<InternalImplementDto> pageInternalImplement(Page page, InternalImplement internalImplement);
+
+    /**
+     * 鍐呭瀹炴柦璁″垝鏂板
+     * @param internalImplement
+     * @return
+     */
+    boolean addInternalImplement(InternalImplementDto internalImplement);
+
+    /**
+     * 鍐呭瀹炴柦璁″垝淇敼
+     * @param internalImplement
+     * @return
+     */
+    boolean updateInternalImplement(InternalImplementDto internalImplement);
+
+    /**
+     * 鍐呭瀹炴柦璁″垝鍒犻櫎
+     * @param implementId
+     * @return
+     */
+    boolean delInternalImplement(Integer implementId);
+
+    /**
+     * 鍐呭瀹炴柦璁″垝鏌ョ湅璇︽儏
+     * @param implementId
+     * @return
+     */
+    InternalImplementDto getInternalImplementOne(Integer implementId);
+
+    /**
+     * 鍐呭瀹炴柦璁″垝鎵瑰噯
+     * @param internalImplement
+     * @return
+     */
+    boolean ratifyInternalImplement(InternalImplementDto internalImplement);
+
+    /**
+     * 瀵煎嚭鍐呭瀹炴柦璁″垝
+     * @param implementId
+     * @param response
+     */
+    void exportInternalImplement(Integer implementId, HttpServletResponse response);
+}
+
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/service/InternalMeetingDetailService.java b/cnas-manage/src/main/java/com/ruoyi/manage/service/InternalMeetingDetailService.java
new file mode 100644
index 0000000..85b49a5
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/service/InternalMeetingDetailService.java
@@ -0,0 +1,16 @@
+package com.ruoyi.manage.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.manage.pojo.InternalMeetingDetail;
+
+/**
+ * <p>
+ * 鍐呭浼氳璇︽儏琛� 鏈嶅姟绫�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-12 02:56:13
+ */
+public interface InternalMeetingDetailService extends IService<InternalMeetingDetail> {
+
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/service/InternalMeetingService.java b/cnas-manage/src/main/java/com/ruoyi/manage/service/InternalMeetingService.java
new file mode 100644
index 0000000..9abd02f
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/service/InternalMeetingService.java
@@ -0,0 +1,63 @@
+package com.ruoyi.manage.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.manage.dto.InternalMeetingDto;
+import com.ruoyi.manage.pojo.InternalMeeting;
+
+import jakarta.servlet.http.HttpServletResponse;
+
+/**
+ * <p>
+ * 鍐呭浼氳琛� 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 
+ * @since 2024-11-12 02:50:44
+ */
+public interface InternalMeetingService extends IService<InternalMeeting> {
+
+    /**
+     * 鍐呭浼氳鍒嗛〉鏌ヨ
+     * @param page
+     * @param internalMeeting
+     * @return
+     */
+    IPage<InternalMeetingDto> pageInternalMeeting(Page page, InternalMeeting internalMeeting);
+
+    /**
+     * 鍐呭浼氳鏂板
+     * @param internalMeeting
+     * @return
+     */
+    boolean addInternalMeeting(InternalMeetingDto internalMeeting);
+
+    /**
+     * 鍐呭浼氳淇敼
+     * @param internalMeeting
+     * @return
+     */
+    boolean updateInternalMeeting(InternalMeetingDto internalMeeting);
+
+    /**
+     * 鍐呭浼氳鍒犻櫎
+     * @param meetingId
+     * @return
+     */
+    boolean delInternalMeeting(Integer meetingId);
+
+    /**
+     * 鍐呭浼氳鏌ョ湅璇︽儏
+     * @param meetingId
+     * @return
+     */
+    InternalMeetingDto getInternalMeetingOne(Integer meetingId);
+
+    /**
+     * 瀵煎嚭鍐呭浼氳
+     * @param meetingId
+     * @param response
+     */
+    void exportInternalMeeting(Integer meetingId, HttpServletResponse response);
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/service/InternalPlanDetailService.java b/cnas-manage/src/main/java/com/ruoyi/manage/service/InternalPlanDetailService.java
new file mode 100644
index 0000000..a433943
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/service/InternalPlanDetailService.java
@@ -0,0 +1,16 @@
+package com.ruoyi.manage.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.manage.pojo.InternalPlanDetail;
+
+/**
+ * <p>
+ * 鍐呭骞村害璁″垝璇︽儏琛� 鏈嶅姟绫�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-13 03:28:48
+ */
+public interface InternalPlanDetailService extends IService<InternalPlanDetail> {
+
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/service/InternalPlanService.java b/cnas-manage/src/main/java/com/ruoyi/manage/service/InternalPlanService.java
new file mode 100644
index 0000000..a0deaf7
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/service/InternalPlanService.java
@@ -0,0 +1,77 @@
+package com.ruoyi.manage.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.manage.dto.InternalPlanDto;
+import com.ruoyi.manage.pojo.InternalPlan;
+
+import jakarta.servlet.http.HttpServletResponse;
+
+/**
+ * <p>
+ * 鍐呭骞村害璁″垝 鏈嶅姟绫�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-13 03:27:47
+ */
+public interface InternalPlanService extends IService<InternalPlan> {
+
+    /**
+     * 鍐呭骞村害璁″垝鍒嗛〉鏌ヨ
+     * @param page
+     * @param internalPlan
+     * @return
+     */
+    IPage<InternalPlanDto> pageInternalPlan(Page page, InternalPlan internalPlan);
+
+    /**
+     * 鍐呭骞村害璁″垝鏂板
+     * @param internalPlan
+     * @return
+     */
+    boolean addInternalPlan(InternalPlanDto internalPlan);
+
+    /**
+     * 鍐呭骞村害璁″垝淇敼
+     * @param internalPlan
+     * @return
+     */
+    boolean updateInternalPlan(InternalPlanDto internalPlan);
+
+    /**
+     * 鍐呭骞村害璁″垝鍒犻櫎
+     * @param planId
+     * @return
+     */
+    boolean delInternalPlan(Integer planId);
+
+    /**
+     * 鍐呭骞村害璁″垝鏌ョ湅璇︽儏
+     * @param planId
+     * @return
+     */
+    InternalPlanDto getInternalPlanOne(Integer planId);
+
+    /**
+     * 鍐呭骞村害璁″垝瀹℃牳
+     * @param internalPlanDto
+     * @return
+     */
+    boolean examineInternalPlan(InternalPlanDto internalPlanDto);
+
+    /**
+     * 鍐呭骞村害璁″垝鎵瑰噯
+     * @param internalPlanDto
+     * @return
+     */
+    boolean ratifyInternalPlan(InternalPlanDto internalPlanDto);
+
+    /**
+     * 瀵煎嚭鍐呭骞村害璁″垝
+     * @param planId
+     * @param response
+     */
+    void exportInternalImplement(Integer planId, HttpServletResponse response);
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/service/InternalReportService.java b/cnas-manage/src/main/java/com/ruoyi/manage/service/InternalReportService.java
new file mode 100644
index 0000000..91d4924
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/service/InternalReportService.java
@@ -0,0 +1,47 @@
+package com.ruoyi.manage.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.manage.pojo.InternalReport;
+
+import jakarta.servlet.http.HttpServletResponse;
+
+/**
+ * 鍐呭鎶ュ憡琛�
+ *
+ * @author zhuo
+ * @since 2024-11-11
+ */
+public interface InternalReportService extends IService<InternalReport> {
+
+    /**
+     * 鍐呭鎶ュ憡鍒嗛〉鏌ヨ
+     * @param page
+     * @param internalReport
+     * @return
+     */
+    IPage<InternalReport> pageInternalReport(Page page, InternalReport internalReport);
+
+    /**
+     * 鍐呭鎶ュ憡瀹℃牳
+     * @param internalReport
+     * @return
+     */
+    boolean ratifyInternalCheck(InternalReport internalReport);
+
+    /**
+     * 璐ㄩ噺閮ㄧ粡鐞嗗~鍐�
+     * @param internalReport
+     * @return
+     */
+    boolean qualityInternalReport(InternalReport internalReport);
+
+    /**
+     * 瀵煎嚭鍐呭鎶ュ憡
+     * @param reportId
+     * @param response
+     */
+    void exportInternalReport(Integer reportId, HttpServletResponse response);
+}
+
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/service/ManageControlPlanListService.java b/cnas-manage/src/main/java/com/ruoyi/manage/service/ManageControlPlanListService.java
new file mode 100644
index 0000000..4343084
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/service/ManageControlPlanListService.java
@@ -0,0 +1,24 @@
+package com.ruoyi.manage.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.manage.pojo.ManageControlPlanList;
+import com.ruoyi.manage.vo.ManageControlPlanListVo;
+
+import jakarta.servlet.http.HttpServletResponse;
+
+/**
+ * <p>
+ * 閲嶅ぇ椋庨櫓鍥犵礌鍒嗘瀽鍙婃帶鍒惰鍒掓竻鍗� 鏈嶅姟绫�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-15 02:58:30
+ */
+public interface ManageControlPlanListService extends IService<ManageControlPlanList> {
+
+    IPage<ManageControlPlanListVo> getPageList(Page page);
+
+    void exportPersonTraining(HttpServletResponse response);
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/service/ManageDocumentAlterService.java b/cnas-manage/src/main/java/com/ruoyi/manage/service/ManageDocumentAlterService.java
new file mode 100644
index 0000000..0f81585
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/service/ManageDocumentAlterService.java
@@ -0,0 +1,36 @@
+package com.ruoyi.manage.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.manage.pojo.ManageDocumentAlter;
+
+import jakarta.servlet.http.HttpServletResponse;
+import java.util.Map;
+
+/**
+ * <p>
+ * 鏂囦欢鍙樻洿 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 
+ * @since 2024-11-11 11:04:01
+ */
+public interface ManageDocumentAlterService extends IService<ManageDocumentAlter> {
+
+    IPage<ManageDocumentAlter> pageManageDocumentAlter(Page page, ManageDocumentAlter manageDocumentAlter);
+
+    ManageDocumentAlter getManageDocumentAlter(Integer id);
+
+    int addManageDocumentAlter(ManageDocumentAlter manageDocumentAlter);
+
+    int doManageDocumentAlter(ManageDocumentAlter manageDocumentAlter);
+
+    int checkManageDocumentAlter(ManageDocumentAlter manageDocumentAlter);
+
+    void checkManageDocumentAlterPdf(Long id, HttpServletResponse response) throws Exception;
+
+    void exportManageDocumentAlter(ManageDocumentAlter manageDocumentAlter, HttpServletResponse response) throws Exception;
+
+    int delManageDocumentAlter(Integer id);
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/service/ManageDocumentCancelService.java b/cnas-manage/src/main/java/com/ruoyi/manage/service/ManageDocumentCancelService.java
new file mode 100644
index 0000000..2119e54
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/service/ManageDocumentCancelService.java
@@ -0,0 +1,34 @@
+package com.ruoyi.manage.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.manage.pojo.ManageDocumentCancel;
+
+import jakarta.servlet.http.HttpServletResponse;
+import java.util.Map;
+
+/**
+ * <p>
+ * 鏂囦欢浣滃簾 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 
+ * @since 2024-11-09 02:37:35
+ */
+public interface ManageDocumentCancelService extends IService<ManageDocumentCancel> {
+
+    IPage<ManageDocumentCancel> pageManageDocumentCancel(Page page, ManageDocumentCancel manageDocumentCancel);
+
+    int addManageDocumentCancel(ManageDocumentCancel manageDocumentCancel);
+
+    int checkManageDocumentCancel(Integer id, String state);
+
+    ManageDocumentCancel getManageDocumentCancel(Integer id);
+
+    void exportManageDocumentCancel(ManageDocumentCancel manageDocumentCancel, HttpServletResponse response) throws Exception;
+
+    int delManageDocumentCancel(Integer id);
+
+    int doManageDocumentCancel(ManageDocumentCancel manageDocumentCancel);
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/service/ManageDocumentControlledService.java b/cnas-manage/src/main/java/com/ruoyi/manage/service/ManageDocumentControlledService.java
new file mode 100644
index 0000000..086bbe4
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/service/ManageDocumentControlledService.java
@@ -0,0 +1,34 @@
+package com.ruoyi.manage.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.manage.pojo.ManageDocumentControlled;
+
+import jakarta.servlet.http.HttpServletResponse;
+import java.util.Map;
+
+/**
+ * <p>
+ * 鏂囦欢鍙楁帶 鏈嶅姟绫�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-08 02:54:44
+ */
+public interface ManageDocumentControlledService extends IService<ManageDocumentControlled> {
+
+    IPage<ManageDocumentControlled> pageManageDocumentControlled(Page page, ManageDocumentControlled manageDocumentControlled);
+
+    int addManageDocumentControlled(ManageDocumentControlled manageDocumentControlled);
+
+    int delManageDocumentControlled(Long id);
+
+    ManageDocumentControlled getManageDocumentControlled(Long id);
+
+    int doManageDocumentControlled(ManageDocumentControlled manageDocumentControlled);
+
+    int checkManageDocumentControlled(ManageDocumentControlled manageDocumentControlled);
+
+    void checkManageDocumentControlledPdf(Long id, HttpServletResponse response) throws Exception ;
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/service/ManageDocumentIssueRecycleService.java b/cnas-manage/src/main/java/com/ruoyi/manage/service/ManageDocumentIssueRecycleService.java
new file mode 100644
index 0000000..1785c79
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/service/ManageDocumentIssueRecycleService.java
@@ -0,0 +1,35 @@
+package com.ruoyi.manage.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.manage.dto.ManageDocumentIssueRecycleDto;
+import com.ruoyi.manage.pojo.ManageDocumentIssueRecycle;
+
+import jakarta.servlet.http.HttpServletResponse;
+import java.util.Map;
+
+/**
+ * <p>
+ * 鏂囦欢鍙戞斁鍥炴敹 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 
+ * @since 2024-11-09 09:18:24
+ */
+public interface ManageDocumentIssueRecycleService extends IService<ManageDocumentIssueRecycle> {
+
+    IPage<ManageDocumentIssueRecycleDto> pageManageDocumentIssueRecycle(Page page, ManageDocumentIssueRecycleDto manageDocumentIssueRecycleDto);
+
+    ManageDocumentIssueRecycleDto getManageDocumentIssueRecycle(Long id);
+
+    void exportManageDocumentIssueRecycle(ManageDocumentIssueRecycleDto manageDocumentIssueRecycleDto, HttpServletResponse response) throws Exception;
+
+    int checkManageDocumentIssueRecycle(Integer id, String documentState);
+
+    int addManageDocumentIssueRecycle(ManageDocumentIssueRecycle manageDocumentIssueRecycle);
+
+    int doManageDocumentIssueRecycle(ManageDocumentIssueRecycle manageDocumentIssueRecycle);
+
+    int delManageDocumentIssueRecycle(Long id);
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/service/ManageDocumentListService.java b/cnas-manage/src/main/java/com/ruoyi/manage/service/ManageDocumentListService.java
new file mode 100644
index 0000000..545f8d1
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/service/ManageDocumentListService.java
@@ -0,0 +1,29 @@
+package com.ruoyi.manage.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.manage.pojo.ManageDocumentList;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 鏂囦欢娓呭崟
+ 鏈嶅姟绫�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-08 11:08:11
+ */
+public interface ManageDocumentListService extends IService<ManageDocumentList> {
+
+    IPage<ManageDocumentList> pageManageDocumentList(Page page, ManageDocumentList manageDocumentList);
+
+    int uploadFile(Integer id, MultipartFile file);
+
+    void importExcel(List<ManageDocumentList> list);
+
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/service/ManageMeetingParticipantsService.java b/cnas-manage/src/main/java/com/ruoyi/manage/service/ManageMeetingParticipantsService.java
new file mode 100644
index 0000000..9bb6679
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/service/ManageMeetingParticipantsService.java
@@ -0,0 +1,20 @@
+package com.ruoyi.manage.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.manage.pojo.ManageMeetingParticipants;
+import com.ruoyi.manage.vo.MeetingParticipantsDetailsVo;
+
+/**
+ * <p>
+ *  鏈嶅姟绫�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-11 09:34:27
+ */
+public interface ManageMeetingParticipantsService extends IService<ManageMeetingParticipants> {
+
+
+
+    MeetingParticipantsDetailsVo getParticipants(Integer id);
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/service/ManageMeetingService.java b/cnas-manage/src/main/java/com/ruoyi/manage/service/ManageMeetingService.java
new file mode 100644
index 0000000..43a959e
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/service/ManageMeetingService.java
@@ -0,0 +1,28 @@
+package com.ruoyi.manage.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.manage.dto.ManageMeetingDto;
+import com.ruoyi.manage.pojo.ManageMeeting;
+
+import jakarta.servlet.http.HttpServletResponse;
+
+/**
+ * <p>
+ *  鏈嶅姟绫�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-11 09:33:47
+ */
+public interface ManageMeetingService extends IService<ManageMeeting> {
+
+    IPage<ManageMeetingDto> page(Page page, String startTime, String endTime, String place);
+
+    void addMeeting(ManageMeetingDto dto);
+
+    int modifyMeeting(ManageMeetingDto manageMeetingDto);
+
+    void exportMeeting(Integer id, HttpServletResponse response);
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/service/ManageRecordAuditService.java b/cnas-manage/src/main/java/com/ruoyi/manage/service/ManageRecordAuditService.java
new file mode 100644
index 0000000..2f57781
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/service/ManageRecordAuditService.java
@@ -0,0 +1,30 @@
+package com.ruoyi.manage.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.manage.pojo.ManageRecordAudit;
+
+import jakarta.servlet.http.HttpServletResponse;
+import java.util.Map;
+
+/**
+ * <p>
+ * 鏂囦欢淇鐢宠瀹℃壒璁板綍 鏈嶅姟绫�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-14 10:29:18
+ */
+public interface ManageRecordAuditService extends IService<ManageRecordAudit> {
+
+    IPage<ManageRecordAudit> pageManageRecordAudit(Page page, ManageRecordAudit manageRecordAudit);
+
+    int addManageRecordAudit(ManageRecordAudit manageRecordAudit);
+
+    int doManageRecordAudit(ManageRecordAudit manageRecordAudit);
+
+    int ratifyManageRecordAudit(Integer id);
+
+    String exportOutManageRecordAudit(ManageRecordAudit manageRecordAudit, HttpServletResponse response);
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/service/ManageRecordCancelService.java b/cnas-manage/src/main/java/com/ruoyi/manage/service/ManageRecordCancelService.java
new file mode 100644
index 0000000..6e23947
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/service/ManageRecordCancelService.java
@@ -0,0 +1,29 @@
+package com.ruoyi.manage.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.manage.pojo.ManageRecordCancel;
+import org.springframework.web.multipart.MultipartFile;
+
+import jakarta.servlet.http.HttpServletResponse;
+import java.util.Map;
+
+/**
+ * <p>
+ * 浣滃簾鏂囦欢閿�榄傝褰� 鏈嶅姟绫�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-13 01:27:22
+ */
+public interface ManageRecordCancelService extends IService<ManageRecordCancel> {
+
+    IPage<ManageRecordCancel> pageManageRecordCancel(Page page, ManageRecordCancel manageRecordCancel);
+
+    int ratifyManageRecordCancel(Integer id, String ratifyState);
+
+    String exportOutManageRecordCancel(ManageRecordCancel manageRecordCancel, HttpServletResponse response);
+
+    int exportInManageRecordCancel(MultipartFile file);
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/service/ManageRecordCheckService.java b/cnas-manage/src/main/java/com/ruoyi/manage/service/ManageRecordCheckService.java
new file mode 100644
index 0000000..35b526d
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/service/ManageRecordCheckService.java
@@ -0,0 +1,32 @@
+package com.ruoyi.manage.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.manage.pojo.ManageRecordCheck;
+import org.springframework.web.multipart.MultipartFile;
+
+import jakarta.servlet.http.HttpServletResponse;
+import java.util.Map;
+
+/**
+ * <p>
+ * 鏂囦欢瀹℃壒璁板綍(鍚慨璁㈠悗鍐嶆瀹℃壒璁板綍) 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 
+ * @since 2024-11-12 02:31:36
+ */
+public interface ManageRecordCheckService extends IService<ManageRecordCheck> {
+
+    IPage<ManageRecordCheck> pageManageRecordCheck(Page page, ManageRecordCheck manageRecordCheck);
+
+    int checkManageRecordCheck(Integer id, String checkState);
+
+    int ratifyManageRecordCheck(Integer id, String ratifyState);
+
+    String exportOutManageRecordCheck(ManageRecordCheck manageRecordCheck, HttpServletResponse response);
+
+    int exportInManageRecordCheck(MultipartFile file);
+
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/service/ManageRecordIntervalsService.java b/cnas-manage/src/main/java/com/ruoyi/manage/service/ManageRecordIntervalsService.java
new file mode 100644
index 0000000..7e7f847
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/service/ManageRecordIntervalsService.java
@@ -0,0 +1,31 @@
+package com.ruoyi.manage.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.manage.pojo.ManageRecordIntervals;
+import org.springframework.web.multipart.MultipartFile;
+
+import jakarta.servlet.http.HttpServletResponse;
+import java.util.Map;
+
+/**
+ * <p>
+ * 鏂囦欢瀹氭湡瀹℃煡璁板綍 鏈嶅姟绫�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-13 10:54:31
+ */
+public interface ManageRecordIntervalsService extends IService<ManageRecordIntervals> {
+
+    IPage<ManageRecordIntervals> pageManageRecordIntervals(Page page, ManageRecordIntervals manageRecordIntervals);
+
+    String exportOutManageRecordIntervals(ManageRecordIntervals manageRecordIntervals, HttpServletResponse response);
+
+    int exportInManageRecordIntervals(MultipartFile file);
+
+    int addManageRecordIntervals(ManageRecordIntervals manageRecordIntervals);
+
+    int delManageRecordIntervals(Integer id);
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/service/ManageRecordIntervalsTotalService.java b/cnas-manage/src/main/java/com/ruoyi/manage/service/ManageRecordIntervalsTotalService.java
new file mode 100644
index 0000000..c40a76f
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/service/ManageRecordIntervalsTotalService.java
@@ -0,0 +1,25 @@
+package com.ruoyi.manage.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.manage.pojo.ManageRecordIntervalsTotal;
+
+import java.util.Map;
+
+/**
+ * <p>
+ * 鏂囦欢瀹氭湡瀹℃煡璁板綍鎬诲巻鍙茶褰曡〃 鏈嶅姟绫�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-15 01:12:11
+ */
+public interface ManageRecordIntervalsTotalService extends IService<ManageRecordIntervalsTotal> {
+
+    IPage<ManageRecordIntervalsTotal> pageManageRecordIntervalsTotal(Page page, ManageRecordIntervalsTotal manageRecordIntervalsTotal);
+
+    int submitManageRecordIntervalsTotal(Integer id);
+
+    int ratifyManageRecordIntervalsTotal(Integer id, String ratifyState);
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/service/ManageRecordIssueRecycleService.java b/cnas-manage/src/main/java/com/ruoyi/manage/service/ManageRecordIssueRecycleService.java
new file mode 100644
index 0000000..b597c2f
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/service/ManageRecordIssueRecycleService.java
@@ -0,0 +1,31 @@
+package com.ruoyi.manage.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.manage.pojo.ManageRecordIssueRecycle;
+import org.springframework.web.multipart.MultipartFile;
+
+import jakarta.servlet.http.HttpServletResponse;
+import java.util.Map;
+
+/**
+ * <p>
+ * 鎵�鏈夋枃浠�(鍐呫�佸閮ㄦ枃浠�)鐨勫彂鏀句笌鍥炴敹璁板綍 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 
+ * @since 2024-11-13 09:11:05
+ */
+public interface ManageRecordIssueRecycleService extends IService<ManageRecordIssueRecycle> {
+
+    IPage<ManageRecordIssueRecycle> pageManageRecordIssueRecycle(Page page, ManageRecordIssueRecycle manageRecordIssueRecycle);
+
+    String exportOutManageRecordIssueRecycle(ManageRecordIssueRecycle manageRecordIssueRecycle, HttpServletResponse response);
+
+    int exportInManageRecordIssueRecycle(MultipartFile file);
+
+    int addManageRecordIssueRecycle(ManageRecordIssueRecycle manageRecordIssueRecycle);
+
+    int doManageRecordIssueRecycle(ManageRecordIssueRecycle manageRecordIssueRecycle);
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/service/ManageRecordTotalService.java b/cnas-manage/src/main/java/com/ruoyi/manage/service/ManageRecordTotalService.java
new file mode 100644
index 0000000..26b994b
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/service/ManageRecordTotalService.java
@@ -0,0 +1,25 @@
+package com.ruoyi.manage.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.manage.pojo.ManageRecordTotal;
+
+import java.util.Map;
+
+/**
+ * <p>
+ * 澶栨潵鏂囦欢纭璁板綍鎬诲巻鍙茶褰曡〃 鏈嶅姟绫�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-12 10:30:08
+ */
+public interface ManageRecordTotalService extends IService<ManageRecordTotal> {
+
+    IPage<ManageRecordTotal> pageManageRecordTotal(Page page, ManageRecordTotal manageRecordTotal);
+
+    int submitManageRecordTotal(Integer id);
+
+    int ratifyManageRecordTotal(Integer id, String ratifyState);
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/service/ManageRecordVerifyService.java b/cnas-manage/src/main/java/com/ruoyi/manage/service/ManageRecordVerifyService.java
new file mode 100644
index 0000000..effbc17
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/service/ManageRecordVerifyService.java
@@ -0,0 +1,28 @@
+package com.ruoyi.manage.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.manage.pojo.ManageRecordVerify;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.Map;
+
+/**
+ * <p>
+ * 澶栨潵鏂囦欢纭璁板綍 鏈嶅姟绫�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-12 10:29:44
+ */
+public interface ManageRecordVerifyService extends IService<ManageRecordVerify> {
+
+    IPage<ManageRecordVerify> pageManageRecordVerify(Page page, ManageRecordVerify manageRecordVerify);
+
+    int addManageRecordVerify(ManageRecordVerify manageRecordVerify);
+
+    int delManageRecordVerify(Integer id);
+
+    int exportManageRecordVerify(MultipartFile file);
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/service/ManageReviewProgramFileService.java b/cnas-manage/src/main/java/com/ruoyi/manage/service/ManageReviewProgramFileService.java
new file mode 100644
index 0000000..f3b88d1
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/service/ManageReviewProgramFileService.java
@@ -0,0 +1,22 @@
+package com.ruoyi.manage.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.manage.pojo.ManageReviewProgramFile;
+import com.ruoyi.manage.vo.ReviewProgramDetailsVo;
+import org.springframework.web.multipart.MultipartFile;
+
+/**
+ * <p>
+ *  鏈嶅姟绫�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-09 04:15:47
+ */
+public interface ManageReviewProgramFileService extends IService<ManageReviewProgramFile> {
+
+    ReviewProgramDetailsVo selectFile(Integer id);
+
+
+    void addFile(MultipartFile file,Integer id);
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/service/ManageReviewProgramService.java b/cnas-manage/src/main/java/com/ruoyi/manage/service/ManageReviewProgramService.java
new file mode 100644
index 0000000..cba708f
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/service/ManageReviewProgramService.java
@@ -0,0 +1,25 @@
+package com.ruoyi.manage.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.manage.pojo.ManageReviewProgram;
+
+import jakarta.servlet.http.HttpServletResponse;
+
+/**
+ * <p>
+ *  鏈嶅姟绫�
+ * </p>
+ *
+ * @author 
+ * @since 2024-11-09 03:05:42
+ */
+public interface ManageReviewProgramService extends IService<ManageReviewProgram> {
+
+    IPage<ManageReviewProgram> page(Page page,String startTime,String endTime, String judgingLocation);
+
+    void exportReviewProgram(Integer id, HttpServletResponse response);
+
+    int addReviewProgram(ManageReviewProgram manageReviewProgram);
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/service/ManageReviewReportService.java b/cnas-manage/src/main/java/com/ruoyi/manage/service/ManageReviewReportService.java
new file mode 100644
index 0000000..b9570b6
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/service/ManageReviewReportService.java
@@ -0,0 +1,24 @@
+package com.ruoyi.manage.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.manage.pojo.ManageReviewReport;
+
+import jakarta.servlet.http.HttpServletResponse;
+
+/**
+ * <p>
+ * 绠$悊璇勫鎶ュ憡 鏈嶅姟绫�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-12 04:44:39
+ */
+public interface ManageReviewReportService extends IService<ManageReviewReport> {
+
+
+    IPage<ManageReviewReport> page(Page page, String startTime, String endTime, String place);
+
+    void exportReviewReport(Integer id, HttpServletResponse response);
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/service/ManageRiskAssessmentResultsService.java b/cnas-manage/src/main/java/com/ruoyi/manage/service/ManageRiskAssessmentResultsService.java
new file mode 100644
index 0000000..5de9e3b
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/service/ManageRiskAssessmentResultsService.java
@@ -0,0 +1,24 @@
+package com.ruoyi.manage.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.manage.pojo.ManageRiskAssessmentResults;
+import com.ruoyi.manage.vo.ManageRiskAssessmentResultsVo;
+
+import jakarta.servlet.http.HttpServletResponse;
+
+/**
+ * <p>
+ * 鍗遍櫓鍥犵礌杈ㄨ瘑涓庨闄╄瘎浠风粨鏋滀竴瑙堣〃 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 
+ * @since 2024-11-15 02:58:51
+ */
+public interface ManageRiskAssessmentResultsService extends IService<ManageRiskAssessmentResults> {
+
+    IPage<ManageRiskAssessmentResultsVo> getPageResults(Page page);
+
+    void exportPersonTraining(HttpServletResponse response);
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ClientSatisfactionServiceImpl.java b/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ClientSatisfactionServiceImpl.java
new file mode 100644
index 0000000..e38e930
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ClientSatisfactionServiceImpl.java
@@ -0,0 +1,188 @@
+package com.ruoyi.manage.service.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+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.config.ConfigureBuilder;
+import com.deepoove.poi.data.Pictures;
+import com.ruoyi.common.core.domain.entity.User;
+import com.ruoyi.common.utils.QueryWrappers;
+import com.ruoyi.framework.exception.ErrorException;
+import com.ruoyi.manage.dto.ClientSatisfactionDto;
+import com.ruoyi.manage.mapper.ClientSatisfactionAnalyseFileMapper;
+import com.ruoyi.manage.mapper.ClientSatisfactionMapper;
+import com.ruoyi.manage.pojo.ClientSatisfaction;
+import com.ruoyi.manage.pojo.ClientSatisfactionAnalyseFile;
+import com.ruoyi.manage.service.ClientSatisfactionService;
+import com.ruoyi.system.mapper.UserMapper;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
+import jakarta.annotation.Resource;
+import jakarta.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;
+
+
+/**
+ * 瀹㈡埛婊℃剰搴�
+ *
+ * @author zhuo
+ * @since 2024-11-09
+ */
+@Service
+public class ClientSatisfactionServiceImpl extends ServiceImpl<ClientSatisfactionMapper, ClientSatisfaction> implements ClientSatisfactionService {
+
+    @Resource
+    private ClientSatisfactionAnalyseFileMapper clientSatisfactionAnalyseFileMapper;
+
+    @Resource
+    private UserMapper userMapper;
+
+    @Value("${file.path}")
+    private String imgUrl;
+
+    @Value("${wordUrl}")
+    private String wordUrl;
+
+    /**
+     * 瀹㈡埛婊℃剰搴﹁皟鏌ュ垪琛�
+     *
+     * @param page
+     * @param clientSatisfaction
+     * @return
+     */
+    @Override
+    public IPage<ClientSatisfaction> pageClientSatisfaction(Page page, ClientSatisfaction clientSatisfaction) {
+        return baseMapper.pageClientSatisfaction(page, QueryWrappers.queryWrappers(clientSatisfaction));
+    }
+
+    /**
+     * 鏂板瀹㈡埛鍒嗘瀽闄勪欢
+     *
+     * @param file
+     * @return
+     */
+    @Override
+    public boolean uploadAnalyseFile(MultipartFile file) {
+
+        String urlString;
+        String pathName;
+        String path;
+        String filename = file.getOriginalFilename();
+        String contentType = file.getContentType();
+        ClientSatisfactionAnalyseFile analyseFile = new ClientSatisfactionAnalyseFile();
+        analyseFile.setFileName(filename);
+        if (contentType != null && contentType.startsWith("image/")) {
+            // 鏄浘鐗�
+            path = imgUrl;
+            analyseFile.setType(1);
+        } else {
+            // 鏄枃浠�
+            path = wordUrl;
+            analyseFile.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));
+            analyseFile.setFileUrl(pathName);
+            clientSatisfactionAnalyseFileMapper.insert(analyseFile);
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new ErrorException(e.getMessage());
+        }
+    }
+
+    /**
+     * 鏌ヨ瀹㈡埛鍒嗘瀽闄勪欢
+     *
+     * @param page
+     * @param analyseFile
+     * @return
+     */
+    @Override
+    public IPage<ClientSatisfactionAnalyseFile> pageAnalyseFile(Page page, ClientSatisfactionAnalyseFile analyseFile) {
+        return clientSatisfactionAnalyseFileMapper.pageAnalyseFile(page, QueryWrappers.queryWrappers(analyseFile));
+    }
+
+    /**
+     * 瀹㈡埛婊℃剰搴﹀鍑�
+     *
+     * @param clientSatisfactionId
+     * @param response
+     */
+    @Override
+    public void exportWordClientSatisfaction(Integer clientSatisfactionId, HttpServletResponse response) {
+        // 鏌ヨ瀹㈡埛婊℃剰搴﹁皟鏌�
+        ClientSatisfactionDto clientSatisfaction = baseMapper.exportWordClientSatisfaction(clientSatisfactionId);
+        if (clientSatisfaction == null) {
+            throw new RuntimeException("瀹㈡埛婊℃剰搴﹁皟鏌ヤ笉瀛樺湪");
+        }
+        // 鏌ヨ纭浜虹殑绛惧悕
+        String confirmPersonUrl = null;
+        // 鐘舵�佷负纭涓旂‘璁や汉涓嶄负绌�
+        if (clientSatisfaction.getConfirmStatus() != null && clientSatisfaction.getConfirmStatus() != 0 && clientSatisfaction.getConfirmPersonId() != null) {
+            confirmPersonUrl = userMapper.selectById(clientSatisfaction.getConfirmPersonId()).getSignatureUrl();
+            if (StringUtils.isBlank(confirmPersonUrl)) {
+                throw new ErrorException("鎵句笉鍒伴獙璇佷汉鐨勭鍚�");
+            }
+        }
+        // 鑾峰彇璺緞
+        InputStream inputStream = this.getClass().getResourceAsStream("/static/customer-satisfaction-questionnaire.docx");
+        ConfigureBuilder builder = Configure.builder();
+        String finalConfirmPersonUrl = confirmPersonUrl;
+        XWPFTemplate template = XWPFTemplate.compile(inputStream, builder.build()).render(
+                new HashMap<String, Object>() {{
+                    put("clientSatisfaction", clientSatisfaction);
+                    put("finalConfirmPersonUrl", StringUtils.isNotBlank(finalConfirmPersonUrl) ? Pictures.ofLocal(imgUrl + "/" + finalConfirmPersonUrl).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();
+            inputStream.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException("瀵煎嚭澶辫触");
+        }
+    }
+
+    /**
+     * 纭瀹㈡埛婊℃剰搴�
+     *
+     * @param clientSatisfaction 瑕佷慨鏀瑰鎴锋弧鎰忓害鐨勭姸鎬佸璞�
+     * @param userId             淇敼浜篿d
+     */
+    @Override
+    public void confirmClientSatisfaction(ClientSatisfaction clientSatisfaction, Integer userId) {
+        User user = userMapper.selectById(userId);
+        if (user != null) {
+            clientSatisfaction.setConfirmPerson(user.getName());
+            clientSatisfaction.setConfirmPersonId(user.getId());
+        }
+        clientSatisfaction.setConfirmStatus(1);
+        baseMapper.updateById(clientSatisfaction);
+    }
+}
+
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/InternalCheckDetailServiceImpl.java b/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/InternalCheckDetailServiceImpl.java
new file mode 100644
index 0000000..0ede72f
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/InternalCheckDetailServiceImpl.java
@@ -0,0 +1,19 @@
+package com.ruoyi.manage.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.manage.mapper.InternalCheckDetailMapper;
+import com.ruoyi.manage.pojo.InternalCheckDetail;
+import com.ruoyi.manage.service.InternalCheckDetailService;
+import org.springframework.stereotype.Service;
+
+/**
+ * 鍐呭妫�鏌ヨ鎯呰〃
+ *
+ * @author zhuo
+ * @since 2024-11-11
+ */
+@Service
+public class InternalCheckDetailServiceImpl extends ServiceImpl<InternalCheckDetailMapper, InternalCheckDetail> implements InternalCheckDetailService {
+
+}
+
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/InternalCheckServiceImpl.java b/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/InternalCheckServiceImpl.java
new file mode 100644
index 0000000..4339965
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/InternalCheckServiceImpl.java
@@ -0,0 +1,233 @@
+package com.ruoyi.manage.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.ruoyi.common.core.domain.entity.User;
+import com.ruoyi.common.utils.DateImageUtil;
+import com.ruoyi.common.utils.QueryWrappers;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.framework.exception.ErrorException;
+import com.ruoyi.inspect.util.HackLoopTableRenderPolicy;
+import com.ruoyi.manage.dto.InternalCheckDto;
+import com.ruoyi.manage.mapper.InternalCheckMapper;
+import com.ruoyi.manage.pojo.InternalCheck;
+import com.ruoyi.manage.pojo.InternalCheckDetail;
+import com.ruoyi.manage.service.InternalCheckDetailService;
+import com.ruoyi.manage.service.InternalCheckService;
+import com.ruoyi.system.mapper.UserMapper;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import jakarta.annotation.Resource;
+import jakarta.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;
+
+/**
+ * 鍐呭妫�鏌ヨ〃
+ *
+ * @author zhuo
+ * @since 2024-11-11
+ */
+@Service
+@Transactional(rollbackFor = Exception.class)
+public class InternalCheckServiceImpl extends ServiceImpl<InternalCheckMapper, InternalCheck> implements InternalCheckService {
+
+    @Resource
+    private InternalCheckDetailService internalCheckDetailService;
+    @Resource
+    private UserMapper userMapper;
+    @Value("${file.path}")
+    private String imgUrl;
+
+    /**
+     * 鍐呭妫�鏌ュ垎椤垫煡璇�
+     * @param page
+     * @param internalCheck
+     * @return
+     */
+    @Override
+    public IPage<InternalCheckDto> pageInternalCheck(Page page, InternalCheck internalCheck) {
+        return baseMapper.pageInternalCheck(page, QueryWrappers.queryWrappers(internalCheck));
+    }
+
+    /**
+     * 鍐呭妫�鏌ユ柊澧�
+     * @param internalCheck
+     * @return
+     */
+    @Override
+    public boolean addInternalCheck(InternalCheckDto internalCheck) {
+        Integer userId = SecurityUtils.getUserId().intValue();
+        // 娣诲姞缂栧埗浜�
+        User user = userMapper.selectById(userId);
+        internalCheck.setWriteTime(LocalDateTime.now());
+        internalCheck.setWriteUserId(user.getId());
+        internalCheck.setWriteUserName(user.getName());
+
+        baseMapper.insert(internalCheck);
+        // 鏂板璇︽儏
+        for (InternalCheckDetail internalCheckDetail : internalCheck.getCheckDetailList()) {
+            internalCheckDetail.setCheckId(internalCheck.getCheckId());
+        }
+        internalCheckDetailService.saveBatch(internalCheck.getCheckDetailList());
+        return true;
+    }
+
+    /**
+     * 鍐呭妫�鏌ヤ慨鏀�
+     * @param internalCheck
+     * @return
+     */
+    @Override
+    public boolean updateInternalCheck(InternalCheckDto internalCheck) {
+        baseMapper.updateById(internalCheck);
+
+        // 鍒犻櫎涔嬪墠鐨勮鎯�
+        internalCheckDetailService.remove(Wrappers.<InternalCheckDetail>lambdaQuery()
+                .eq(InternalCheckDetail::getCheckId, internalCheck.getCheckId()));
+
+        // 鏂板璇︽儏
+        for (InternalCheckDetail internalCheckDetail : internalCheck.getCheckDetailList()) {
+            internalCheckDetail.setCheckId(internalCheck.getCheckId());
+        }
+        internalCheckDetailService.saveBatch(internalCheck.getCheckDetailList());
+
+        return true;
+    }
+
+    /**
+     * 鍐呭妫�鏌ュ垹闄�
+     * @param CheckId
+     * @return
+     */
+    @Override
+    public boolean delInternalCheck(Integer CheckId) {
+        internalCheckDetailService.remove(Wrappers.<InternalCheckDetail>lambdaQuery()
+                .eq(InternalCheckDetail::getCheckId, CheckId));
+        baseMapper.deleteById(CheckId);
+        return true;
+    }
+
+    /**
+     * 鍐呭妫�鏌ユ煡鐪嬭鎯�
+     * @param CheckId
+     * @return
+     */
+    @Override
+    public InternalCheckDto getInternalCheckOne(Integer CheckId) {
+        InternalCheck internalCheck = baseMapper.selectById(CheckId);
+        InternalCheckDto internalCheckDto = new InternalCheckDto();
+        BeanUtils.copyProperties(internalCheck, internalCheckDto);
+
+        // 鏌ヨ璇︾粏淇℃伅
+        internalCheckDto.setCheckDetailList(internalCheckDetailService.list(Wrappers.<InternalCheckDetail>lambdaQuery()
+                .eq(InternalCheckDetail::getCheckId, CheckId)));
+        return internalCheckDto;
+    }
+
+    /**
+     * 鍐呭妫�鏌ユ壒鍑�
+     * @param internalCheck
+     * @return
+     */
+    @Override
+    public boolean ratifyInternalCheck(InternalCheckDto internalCheck) {
+        Integer userId = SecurityUtils.getUserId().intValue();
+        User user = userMapper.selectById(userId);
+        baseMapper.update(null, Wrappers.<InternalCheck>lambdaUpdate()
+                .eq(InternalCheck::getCheckId, internalCheck.getCheckId())
+                .set(InternalCheck::getRatifyUserId, userId)
+                .set(InternalCheck::getRatifyUserName, user.getName())
+                .set(InternalCheck::getRatifyRemark, internalCheck.getRatifyRemark())
+                .set(InternalCheck::getRatifyStatus, internalCheck.getRatifyStatus())
+                .set(InternalCheck::getRatifyTime, LocalDateTime.now())
+        );
+        return true;
+    }
+
+    /**
+     * 瀵煎嚭鍐呭妫�鏌�
+     * @param checkId
+     * @param response
+     */
+    @Override
+    public void exportInternalCheck(Integer checkId, HttpServletResponse response) {
+        InternalCheck internalCheck = baseMapper.selectById(checkId);
+
+        //鑾峰彇鎻愪氦浜虹殑绛惧悕鍦板潃
+        String writeUrl = userMapper.selectById(internalCheck.getWriteUserId()).getSignatureUrl();
+        if (ObjectUtils.isEmpty(writeUrl) || writeUrl.equals("")) {
+            throw new ErrorException("鎵句笉鍒版楠屼汉鐨勭鍚�");
+        }
+
+        //鑾峰彇鎵瑰噯浜虹殑绛惧悕鍦板潃
+        String ratifyUrl = null;
+        if (internalCheck.getRatifyUserId() != null) {
+            ratifyUrl = userMapper.selectById(internalCheck.getRatifyUserId()).getSignatureUrl();
+            if (StringUtils.isBlank(ratifyUrl)) {
+                throw new ErrorException("鎵句笉鍒板鏍镐汉鐨勭鍚�");
+            }
+        }
+
+        // 鏌ヨ璇︽儏
+        List<InternalCheckDetail> internalCheckDetails = internalCheckDetailService.list(Wrappers.<InternalCheckDetail>lambdaQuery()
+                .eq(InternalCheckDetail::getCheckId, checkId));
+
+        int index = 1;
+        for (InternalCheckDetail detail : internalCheckDetails) {
+            detail.setIndex(index);
+            index++;
+        }
+
+        // 鑾峰彇璺緞
+        InputStream inputStream = this.getClass().getResourceAsStream("/static/internal-check.docx");
+        String finalRatifyUrl = ratifyUrl;
+        Configure configure = Configure.builder()
+                .bind("checkDetailList", new HackLoopTableRenderPolicy())
+                .build();
+        XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
+                new HashMap<String, Object>() {{
+                    put("check", internalCheck);
+                    put("checkDetailList", internalCheckDetails);
+                    put("writeUrl", StringUtils.isNotBlank(writeUrl) ? Pictures.ofLocal(imgUrl + "/" + writeUrl).create() : null);
+                    put("ratifyUrl", StringUtils.isNotBlank(finalRatifyUrl) ? Pictures.ofLocal(imgUrl + "/" + finalRatifyUrl).create() : null);
+                    put("writeDateUrl", internalCheck.getWriteTime() != null ?
+                            Pictures.ofStream(DateImageUtil.createDateImage(internalCheck.getWriteTime())).create() : null);
+                    put("ratifyDateUrl", internalCheck.getRatifyTime() != null ?
+                            Pictures.ofStream(DateImageUtil.createDateImage(internalCheck.getRatifyTime())).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();
+            inputStream.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException("瀵煎嚭澶辫触");
+        }
+
+    }
+
+}
+
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/InternalCorrectFileServiceImpl.java b/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/InternalCorrectFileServiceImpl.java
new file mode 100644
index 0000000..55ff0b7
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/InternalCorrectFileServiceImpl.java
@@ -0,0 +1,20 @@
+package com.ruoyi.manage.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.manage.mapper.InternalCorrectFileMapper;
+import com.ruoyi.manage.pojo.InternalCorrectFile;
+import com.ruoyi.manage.service.InternalCorrectFileService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 鍐呭绠$悊绾犳鎺柦闄勪欢琛� 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-13 04:00:38
+ */
+@Service
+public class InternalCorrectFileServiceImpl extends ServiceImpl<InternalCorrectFileMapper, InternalCorrectFile> implements InternalCorrectFileService {
+
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/InternalCorrectServiceImpl.java b/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/InternalCorrectServiceImpl.java
new file mode 100644
index 0000000..3971f31
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/InternalCorrectServiceImpl.java
@@ -0,0 +1,320 @@
+package com.ruoyi.manage.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.config.ConfigureBuilder;
+import com.deepoove.poi.data.Pictures;
+import com.ruoyi.common.core.domain.entity.User;
+import com.ruoyi.common.utils.QueryWrappers;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.framework.exception.ErrorException;
+import com.ruoyi.manage.dto.InternalCorrectDto;
+import com.ruoyi.manage.mapper.InternalCorrectFileMapper;
+import com.ruoyi.manage.mapper.InternalCorrectMapper;
+import com.ruoyi.manage.pojo.InternalCorrect;
+import com.ruoyi.manage.pojo.InternalCorrectFile;
+import com.ruoyi.manage.service.InternalCorrectService;
+import com.ruoyi.system.mapper.UserMapper;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.multipart.MultipartFile;
+
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletResponse;
+import java.io.File;
+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.HashMap;
+import java.util.List;
+
+/**
+ * <p>
+ * 鍐呭绠$悊绾犳澶勭悊琛� 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-13 04:00:15
+ */
+@Service
+@Transactional(rollbackFor = Exception.class)
+public class InternalCorrectServiceImpl extends ServiceImpl<InternalCorrectMapper, InternalCorrect> implements InternalCorrectService {
+
+    @Resource
+    private InternalCorrectFileMapper internalCorrectFileMapper;
+    @Resource
+    private UserMapper userMapper;
+    @Value("${file.path}")
+    private String imgUrl;
+
+    @Value("${wordUrl}")
+    private String wordUrl;
+
+
+    @Override
+    public boolean addInternalCorrect(InternalCorrect detailsCorrect) {
+        InternalCorrect correct = new InternalCorrect();
+        // 褰撳墠鐧诲綍鐢ㄦ埛淇℃伅鍜岄儴闂�
+        User user = userMapper.selectById(SecurityUtils.getUserId().intValue());
+        String departmentLimsName = userMapper.selectUserDepartmentLimsName(user.getId());
+
+        switch (detailsCorrect.getFlowType()) {
+            // 涓嶅悎鏍兼彁鍑�
+            case 0:
+                correct.setRaiseResult(detailsCorrect.getRaiseResult());//涓嶅悎鏍艰〃杩�
+                correct.setVdeRaiseResult(detailsCorrect.getVdeRaiseResult());//vde涓撳鍙戠幇
+                correct.setRaiseDepartment(departmentLimsName);//鎻愬嚭閮ㄩ棬
+                correct.setRaiseUserId(user.getId());//鎻愬嚭浜篿d
+                correct.setRaiseUserName(user.getName());// 鎻愬嚭浜�
+                correct.setRaiseTime(LocalDate.now());// 鎻愬嚭鏃堕棿
+
+                // 鍘熷洜鍒嗘瀽浜轰俊鎭�
+                User causeUser = userMapper.selectById(detailsCorrect.getCauseUserId());
+                String causeDepartmentLims = userMapper.selectUserDepartmentLimsName(causeUser.getId());
+
+                correct.setCauseDepartment(causeDepartmentLims);//鍘熷洜鍒嗘瀽璐d换閮ㄩ棬
+                correct.setCauseUserId(causeUser.getId());//1鍘熷洜鍒嗘瀽浜篿d
+                correct.setCauseUserName(causeUser.getName());// 1鍘熷洜鍒嗘瀽浜�
+                baseMapper.insert(correct);
+                break;
+
+            // 鍘熷洜鍒嗘瀽
+            case 1:
+                correct.setCorrectId(detailsCorrect.getCorrectId());
+                correct.setCauseResult(detailsCorrect.getCauseResult());//鍘熷洜鍒嗘瀽
+                correct.setCauseTime(LocalDate.now());// 1鍘熷洜鍒嗘瀽鏃堕棿
+
+                // 绾犳浜轰俊鎭�
+                User correctUser = userMapper.selectById(detailsCorrect.getCorrectUserId());
+                String correctUserDepartmentLims = userMapper.selectUserDepartmentLimsName(correctUser.getId());
+
+                correct.setCorrectDepartment(correctUserDepartmentLims);//2绾犳璐d换閮ㄩ棬
+                correct.setCorrectUserId(correctUser.getId());//2绾犳浜篿d
+                correct.setCorrectUserName(correctUser.getName());// 2绾犳浜�
+                baseMapper.updateById(correct);
+                break;
+
+            // 绾犳鎺柦
+            case 2:
+                correct.setCorrectId(detailsCorrect.getCorrectId());
+                correct.setCorrectResult(detailsCorrect.getCorrectResult());//2绾犳鎺柦
+                correct.setRaiseDepartmentAffirm(detailsCorrect.getRaiseDepartmentAffirm());//2鎻愬嚭閮ㄩ棬纭
+                correct.setCorrectTime(LocalDate.now());// 2绾犳鏃堕棿
+
+                // 楠岃瘉浜轰俊鎭�
+                User validationUser = userMapper.selectById(detailsCorrect.getValidationUserId());
+                String validationUserDepartmentLims = userMapper.selectUserDepartmentLimsName(validationUser.getId());
+
+                correct.setValidationDepartment(validationUserDepartmentLims);//3楠岃瘉閮ㄩ棬
+                correct.setValidationUserId(validationUser.getId());//3楠岃瘉浜篿d
+                correct.setValidationUserName(validationUser.getName());// 3楠岃瘉浜�
+                baseMapper.updateById(correct);
+                break;
+
+            // 楠岃瘉缁撴灉
+            case 3:
+                correct.setCorrectId(detailsCorrect.getCorrectId());
+                correct.setValidationResult(detailsCorrect.getValidationResult());//3楠岃瘉缁撴灉
+                correct.setValidationTime(LocalDate.now());// 3楠岃瘉鏃堕棿
+                correct.setIsFinish(1);
+                baseMapper.updateById(correct);
+                break;
+        }
+
+        return true;
+    }
+
+    /**
+     * 鏌ヨ鍐呭绠$悊绾犳澶勭悊
+     * @param correctId
+     * @return
+     */
+    @Override
+    public InternalCorrect getInternalCorrect(Integer correctId) {
+        InternalCorrect detailsCorrect;
+
+        detailsCorrect = baseMapper.selectOne(Wrappers.<InternalCorrect>lambdaQuery()
+                .eq(InternalCorrect::getCorrectId, correctId));
+
+        if (detailsCorrect == null) {
+            detailsCorrect = new InternalCorrect();
+        }
+        return detailsCorrect;
+    }
+
+    /**
+     * 鏌ヨ鍐呭绠$悊绾犳鎺柦鍒楄〃
+     * @param page
+     * @param detailsCorrect
+     * @return
+     */
+    @Override
+    public IPage<InternalCorrect> pageInternalCorrect(Page page, InternalCorrect detailsCorrect) {
+        return baseMapper.pageInternalAccording(page, QueryWrappers.queryWrappers(detailsCorrect));
+    }
+
+    /**
+     * 鏂板鍐呭绠$悊绾犳鎺柦闄勪欢
+     * @param InternalCorrectId
+     * @param file
+     * @return
+     */
+    @Override
+    public boolean uploadInternalCorrectFile(Integer InternalCorrectId, MultipartFile file) {
+        if (InternalCorrectId == null) {
+            throw new ErrorException("缂哄皯绾犳鎺柦id");
+        }
+
+        String urlString;
+        String pathName;
+        String path;
+        String filename = file.getOriginalFilename();
+        String contentType = file.getContentType();
+        InternalCorrectFile InternalCorrectFile = new InternalCorrectFile();
+        InternalCorrectFile.setCorrectId(InternalCorrectId);
+        InternalCorrectFile.setFileName(filename);
+        if (contentType != null && contentType.startsWith("image/")) {
+            // 鏄浘鐗�
+            path = imgUrl;
+            InternalCorrectFile.setType(1);
+        } else {
+            // 鏄枃浠�
+            path = wordUrl;
+            InternalCorrectFile.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));
+            InternalCorrectFile.setFileUrl(pathName);
+            internalCorrectFileMapper.insert(InternalCorrectFile);
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new ErrorException(e.getMessage());
+        }
+    }
+
+    /**
+     * 鏌ヨ鍐呭绠$悊绾犳鎺柦闄勪欢
+     * @param correctId
+     * @return
+     */
+    @Override
+    public List<InternalCorrectFile> getInternalCorrectFileList(Integer correctId) {
+        return internalCorrectFileMapper.selectList(Wrappers.<InternalCorrectFile>lambdaQuery()
+                .eq(InternalCorrectFile::getCorrectId, correctId));
+    }
+
+    /**
+     * 瀵煎嚭绾犳鎺柦
+     * @param correctId
+     * @param response
+     */
+    @Override
+    public void exportInternalCorrect(Integer correctId, HttpServletResponse response) {
+        InternalCorrect internalCorrect = baseMapper.selectById(correctId);
+        InternalCorrectDto internalCorrectDto = new InternalCorrectDto();
+        BeanUtils.copyProperties(internalCorrect, internalCorrectDto);
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+        // 鎻愬嚭鏃堕棿
+        internalCorrectDto.setRaiseTimeString(internalCorrect.getRaiseTime() != null
+                ? internalCorrect.getRaiseTime().format(formatter) : null);
+        // 鍘熷洜鍒嗘瀽鏃堕棿
+        internalCorrectDto.setCauseTimeString(internalCorrect.getCauseTime() != null
+                ? internalCorrect.getCauseTime().format(formatter) : null);
+
+        // 绾犳鏃堕棿
+        internalCorrectDto.setCorrectTimeString(internalCorrect.getCorrectTime() != null
+                ? internalCorrect.getCorrectTime().format(formatter) : null);
+
+        // 楠岃瘉鏃堕棿
+        internalCorrectDto.setValidationTimeString(internalCorrect.getValidationTime() != null
+                ? internalCorrect.getValidationTime().format(formatter) : null);
+
+
+        // 鎻愬嚭浜虹鍚�
+        String raiseUrl = null;
+        if (internalCorrect.getRaiseUserId() != null) {
+            raiseUrl = userMapper.selectById(internalCorrect.getRaiseUserId()).getSignatureUrl();
+            if (StringUtils.isBlank(raiseUrl)) {
+                throw new ErrorException("鎵句笉鍒版彁鍑轰汉鐨勭鍚�");
+            }
+        }
+
+        // 鍘熷洜鍒嗘瀽浜�
+        String causeUrl = null;
+        if (internalCorrect.getCauseUserId() != null) {
+            causeUrl = userMapper.selectById(internalCorrect.getCauseUserId()).getSignatureUrl();
+            if (StringUtils.isBlank(causeUrl)) {
+                throw new ErrorException("鎵句笉鍒板師鍥犲垎鏋愪汉鐨勭鍚�");
+            }
+        }
+
+        // 绾犳浜�
+        String correctUrl = null;
+        if (internalCorrect.getCorrectUserId() != null) {
+            correctUrl = userMapper.selectById(internalCorrect.getCorrectUserId()).getSignatureUrl();
+            if (StringUtils.isBlank(correctUrl)) {
+                throw new ErrorException("鎵句笉鍒扮籂姝d汉鐨勭鍚�");
+            }
+        }
+
+        // 楠岃瘉浜�
+        String validationUrl = null;
+        if (internalCorrect.getValidationUserId() != null) {
+            validationUrl = userMapper.selectById(internalCorrect.getValidationUserId()).getSignatureUrl();
+            if (StringUtils.isBlank(validationUrl)) {
+                throw new ErrorException("鎵句笉鍒伴獙璇佷汉鐨勭鍚�");
+            }
+        }
+
+        // 鑾峰彇璺緞
+        InputStream inputStream = this.getClass().getResourceAsStream("/static/internal-correct.docx");
+        ConfigureBuilder builder = Configure.builder();
+        builder.useSpringEL(true);
+        String finalRaiseUrl = raiseUrl;
+        String finalCauseUrl = causeUrl;
+        String finalCorrectUrl = correctUrl;
+        String finalValidationUrl = validationUrl;
+        XWPFTemplate template = XWPFTemplate.compile(inputStream, builder.build()).render(
+                new HashMap<String, Object>() {{
+                    put("correct", internalCorrectDto);
+                    put("raiseUrl", StringUtils.isNotBlank(finalRaiseUrl) ? Pictures.ofLocal(imgUrl + "/" + finalRaiseUrl).create() : null);
+                    put("causeUrl", StringUtils.isNotBlank(finalCauseUrl) ? Pictures.ofLocal(imgUrl + "/" + finalCauseUrl).create() : null);
+                    put("correctUrl", StringUtils.isNotBlank(finalCorrectUrl) ? Pictures.ofLocal(imgUrl + "/" + finalCorrectUrl).create() : null);
+                    put("validationUrl", StringUtils.isNotBlank(finalValidationUrl) ? Pictures.ofLocal(imgUrl + "/" + finalValidationUrl).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();
+            inputStream.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException("瀵煎嚭澶辫触");
+        }
+
+    }
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/InternalImplementDetailServiceImpl.java b/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/InternalImplementDetailServiceImpl.java
new file mode 100644
index 0000000..c1b6cb5
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/InternalImplementDetailServiceImpl.java
@@ -0,0 +1,19 @@
+package com.ruoyi.manage.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.manage.mapper.InternalImplementDetailMapper;
+import com.ruoyi.manage.pojo.InternalImplementDetail;
+import com.ruoyi.manage.service.InternalImplementDetailService;
+import org.springframework.stereotype.Service;
+
+/**
+ * 鍐呭瀹炴柦璁″垝璇︽儏
+ *
+ * @author zhuo
+ * @since 2024-11-11
+ */
+@Service
+public class InternalImplementDetailServiceImpl extends ServiceImpl<InternalImplementDetailMapper, InternalImplementDetail> implements InternalImplementDetailService {
+
+}
+
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/InternalImplementServiceImpl.java b/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/InternalImplementServiceImpl.java
new file mode 100644
index 0000000..78e3f25
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/InternalImplementServiceImpl.java
@@ -0,0 +1,239 @@
+package com.ruoyi.manage.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.ruoyi.common.core.domain.entity.User;
+import com.ruoyi.common.utils.DateImageUtil;
+import com.ruoyi.common.utils.QueryWrappers;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.framework.exception.ErrorException;
+import com.ruoyi.inspect.util.HackLoopTableRenderPolicy;
+import com.ruoyi.manage.dto.InternalImplementDto;
+
+import com.ruoyi.manage.mapper.InternalImplementMapper;
+
+import com.ruoyi.manage.pojo.InternalImplement;
+import com.ruoyi.manage.pojo.InternalImplementDetail;
+
+import com.ruoyi.manage.service.InternalImplementDetailService;
+import com.ruoyi.manage.service.InternalImplementService;
+
+
+
+import com.ruoyi.system.mapper.UserMapper;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import jakarta.annotation.Resource;
+import jakarta.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;
+
+/**
+ * 鍐呭瀹炴柦璁″垝
+ *
+ * @author zhuo
+ * @since 2024-11-11
+ */
+@Service
+@Transactional(rollbackFor = Exception.class)
+public class InternalImplementServiceImpl extends ServiceImpl<InternalImplementMapper, InternalImplement> implements InternalImplementService {
+
+    @Resource
+    private InternalImplementDetailService internalImplementDetailService;
+
+    @Resource
+    private UserMapper userMapper;
+    @Value("${file.path}")
+    private String imgUrl;
+
+    /**
+     * 鍐呭瀹炴柦璁″垝鍒嗛〉鏌ヨ
+     * @param page
+     * @param internalImplement
+     * @return
+     */
+    @Override
+    public IPage<InternalImplementDto> pageInternalImplement(Page page, InternalImplement internalImplement) {
+        return baseMapper.pageInternalImplement(page, QueryWrappers.queryWrappers(internalImplement));
+    }
+
+    /**
+     * 鍐呭瀹炴柦璁″垝鏂板
+     * @param internalImplement
+     * @return
+     */
+    @Override
+    public boolean addInternalImplement(InternalImplementDto internalImplement) {
+        Integer userId = SecurityUtils.getUserId().intValue();
+        // 娣诲姞缂栧埗浜�
+        User user = userMapper.selectById(userId);
+        internalImplement.setWriteTime(LocalDateTime.now());
+        internalImplement.setWriteUserId(user.getId());
+        internalImplement.setWriteUserName(user.getName());
+
+        baseMapper.insert(internalImplement);
+        // 鏂板璇︽儏
+        for (InternalImplementDetail internalImplementDetail : internalImplement.getImplementDetailList()) {
+            internalImplementDetail.setImplementId(internalImplement.getImplementId());
+        }
+        internalImplementDetailService.saveBatch(internalImplement.getImplementDetailList());
+        return true;
+    }
+
+    /**
+     * 鍐呭瀹炴柦璁″垝淇敼
+     * @param internalImplement
+     * @return
+     */
+    @Override
+    public boolean updateInternalImplement(InternalImplementDto internalImplement) {
+        baseMapper.updateById(internalImplement);
+
+        // 鍒犻櫎涔嬪墠鐨勮鎯�
+        internalImplementDetailService.remove(Wrappers.<InternalImplementDetail>lambdaQuery()
+                .eq(InternalImplementDetail::getImplementId, internalImplement.getImplementId()));
+
+        // 鏂板璇︽儏
+        for (InternalImplementDetail internalImplementDetail : internalImplement.getImplementDetailList()) {
+            internalImplementDetail.setImplementId(internalImplement.getImplementId());
+        }
+        internalImplementDetailService.saveBatch(internalImplement.getImplementDetailList());
+
+        return true;
+    }
+
+    /**
+     * 鍐呭瀹炴柦璁″垝鍒犻櫎
+     * @param implementId
+     * @return
+     */
+    @Override
+    public boolean delInternalImplement(Integer implementId) {
+        internalImplementDetailService.remove(Wrappers.<InternalImplementDetail>lambdaQuery()
+                .eq(InternalImplementDetail::getImplementId, implementId));
+        baseMapper.deleteById(implementId);
+        return true;
+    }
+
+    /**
+     * 鍐呭瀹炴柦璁″垝鏌ョ湅璇︽儏
+     * @param implementId
+     * @return
+     */
+    @Override
+    public InternalImplementDto getInternalImplementOne(Integer implementId) {
+        InternalImplement internalImplement = baseMapper.selectById(implementId);
+        InternalImplementDto internalImplementDto = new InternalImplementDto();
+        BeanUtils.copyProperties(internalImplement, internalImplementDto);
+
+        // 鏌ヨ璇︾粏淇℃伅
+        internalImplementDto.setImplementDetailList(internalImplementDetailService.list(Wrappers.<InternalImplementDetail>lambdaQuery()
+                .eq(InternalImplementDetail::getImplementId, implementId)));
+        return internalImplementDto;
+    }
+
+    /**
+     * 鍐呭瀹炴柦璁″垝鎵瑰噯
+     * @param internalImplement
+     * @return
+     */
+    @Override
+    public boolean ratifyInternalImplement(InternalImplementDto internalImplement) {
+        Integer userId = SecurityUtils.getUserId().intValue();
+        User user = userMapper.selectById(userId);
+        baseMapper.update(null, Wrappers.<InternalImplement>lambdaUpdate()
+                .eq(InternalImplement::getImplementId, internalImplement.getImplementId())
+                .set(InternalImplement::getRatifyUserId, userId)
+                .set(InternalImplement::getRatifyUserName, user.getName())
+                .set(InternalImplement::getRatifyRemark, internalImplement.getRatifyRemark())
+                .set(InternalImplement::getRatifyStatus, internalImplement.getRatifyStatus())
+                .set(InternalImplement::getRatifyTime, LocalDateTime.now())
+        );
+        return true;
+    }
+
+    /**
+     * 瀵煎嚭鍐呭瀹炴柦璁″垝
+     * @param implementId
+     * @param response
+     */
+    @Override
+    public void exportInternalImplement(Integer implementId, HttpServletResponse response) {
+        InternalImplement internalImplement = baseMapper.selectById(implementId);
+
+        //鑾峰彇鎻愪氦浜虹殑绛惧悕鍦板潃
+        String writeUrl = userMapper.selectById(internalImplement.getWriteUserId()).getSignatureUrl();
+        if (StringUtils.isBlank(writeUrl)) {
+            throw new ErrorException("鎵句笉鍒版楠屼汉鐨勭鍚�");
+        }
+
+        //鑾峰彇鎵瑰噯浜虹殑绛惧悕鍦板潃
+        String ratifyUrl = null;
+        if (internalImplement.getRatifyUserId() != null) {
+            ratifyUrl = userMapper.selectById(internalImplement.getRatifyUserId()).getSignatureUrl();
+            if (StringUtils.isBlank(ratifyUrl)) {
+                throw new ErrorException("鎵句笉鍒版壒鍑嗕汉鐨勭鍚�");
+            }
+        }
+
+        // 鏌ヨ璇︽儏
+        List<InternalImplementDetail> detailList = internalImplementDetailService.list(Wrappers.<InternalImplementDetail>lambdaQuery()
+                .eq(InternalImplementDetail::getImplementId, implementId));
+
+        int index = 1;
+        for (InternalImplementDetail detail : detailList) {
+            detail.setIndex(index);
+            index++;
+        }
+
+        // 鑾峰彇璺緞
+        InputStream inputStream = this.getClass().getResourceAsStream("/static/internal-implement.docx");
+        String finalRatifyUrl = ratifyUrl;
+        Configure configure = Configure.builder()
+                .bind("implementDetailList", new HackLoopTableRenderPolicy())
+                .build();
+        XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
+                new HashMap<String, Object>() {{
+                    put("implement", internalImplement);
+                    put("implementDetailList", detailList);
+                    put("writeUrl", StringUtils.isNotBlank(writeUrl) ? Pictures.ofLocal(imgUrl + "/" + writeUrl).create() : null);
+                    put("ratifyUrl", StringUtils.isNotBlank(finalRatifyUrl) ? Pictures.ofLocal(imgUrl + "/" + finalRatifyUrl).create() : null);
+                    put("writeDateUrl", internalImplement.getWriteTime() != null ?
+                            Pictures.ofStream(DateImageUtil.createDateImage(internalImplement.getWriteTime())).create() : null);
+                    put("ratifyDateUrl", internalImplement.getRatifyTime() != null ?
+                            Pictures.ofStream(DateImageUtil.createDateImage(internalImplement.getRatifyTime())).create() : null);
+                }});
+
+        try {
+            response.setContentType("application/msword");
+            String fileName = URLEncoder.encode(
+                    internalImplement.getPurposes(), "UTF-8");
+            response.setHeader("Content-disposition",
+                    "attachment;filename=" + fileName + ".docx");
+            OutputStream os = response.getOutputStream();
+            template.write(os);
+            os.flush();
+            os.close();
+            inputStream.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException("瀵煎嚭澶辫触");
+        }
+
+    }
+}
+
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/InternalMeetingDetailServiceImpl.java b/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/InternalMeetingDetailServiceImpl.java
new file mode 100644
index 0000000..bc60750
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/InternalMeetingDetailServiceImpl.java
@@ -0,0 +1,20 @@
+package com.ruoyi.manage.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.manage.mapper.InternalMeetingDetailMapper;
+import com.ruoyi.manage.pojo.InternalMeetingDetail;
+import com.ruoyi.manage.service.InternalMeetingDetailService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 鍐呭浼氳璇︽儏琛� 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-12 02:56:13
+ */
+@Service
+public class InternalMeetingDetailServiceImpl extends ServiceImpl<InternalMeetingDetailMapper, InternalMeetingDetail> implements InternalMeetingDetailService {
+
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/InternalMeetingServiceImpl.java b/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/InternalMeetingServiceImpl.java
new file mode 100644
index 0000000..b117add
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/InternalMeetingServiceImpl.java
@@ -0,0 +1,203 @@
+package com.ruoyi.manage.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.ruoyi.common.utils.QueryWrappers;
+import com.ruoyi.inspect.util.HackLoopTableRenderPolicy;
+import com.ruoyi.manage.dto.InternalMeetingDto;
+import com.ruoyi.manage.dto.InternalMeetingParticipantDto;
+import com.ruoyi.manage.mapper.InternalMeetingMapper;
+
+import com.ruoyi.manage.pojo.InternalMeeting;
+import com.ruoyi.manage.pojo.InternalMeetingDetail;
+import com.ruoyi.manage.service.InternalMeetingDetailService;
+import com.ruoyi.manage.service.InternalMeetingService;
+
+
+import com.ruoyi.system.mapper.UserMapper;
+import lombok.AllArgsConstructor;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import jakarta.servlet.http.HttpServletResponse;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URLEncoder;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 鍐呭浼氳琛� 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-12 02:50:44
+ */
+@Service
+@AllArgsConstructor
+@Transactional(rollbackFor = Exception.class)
+public class InternalMeetingServiceImpl extends ServiceImpl<InternalMeetingMapper, InternalMeeting> implements InternalMeetingService {
+
+    private InternalMeetingDetailService internalMeetingDetailService;
+
+    private UserMapper userMapper;
+
+    /**
+     * 鍐呭浼氳鍒嗛〉鏌ヨ
+     * @param page
+     * @param internalMeeting
+     * @return
+     */
+    @Override
+    public IPage<InternalMeetingDto> pageInternalMeeting(Page page, InternalMeeting internalMeeting) {
+        return baseMapper.pageInternalMeeting(page, QueryWrappers.queryWrappers(internalMeeting));
+    }
+
+    /**
+     * 鍐呭浼氳鏂板
+     * @param internalMeeting
+     * @return
+     */
+    @Override
+    public boolean addInternalMeeting(InternalMeetingDto internalMeeting) {
+
+        baseMapper.insert(internalMeeting);
+//        // 鏂板璇︽儏
+//        for (InternalMeetingDetail internalMeetingDetail : internalMeeting.getMeetingDetailList()) {
+//            internalMeetingDetail.setMeetingId(internalMeeting.getMeetingId());
+//        }
+//        internalMeetingDetailService.saveBatch(internalMeeting.getMeetingDetailList());
+        return true;
+    }
+
+    /**
+     * 鍐呭浼氳淇敼
+     * @param internalMeeting
+     * @return
+     */
+    @Override
+    public boolean updateInternalMeeting(InternalMeetingDto internalMeeting) {
+        baseMapper.updateById(internalMeeting);
+
+        // 鍒犻櫎涔嬪墠鐨勮鎯�
+//        internalMeetingDetailService.remove(Wrappers.<InternalMeetingDetail>lambdaQuery()
+//                .eq(InternalMeetingDetail::getMeetingId, internalMeeting.getMeetingId()));
+//
+//        // 鏂板璇︽儏
+//        for (InternalMeetingDetail internalMeetingDetail : internalMeeting.getMeetingDetailList()) {
+//            internalMeetingDetail.setMeetingId(internalMeeting.getMeetingId());
+//        }
+        internalMeetingDetailService.saveBatch(internalMeeting.getMeetingDetailList());
+
+        return true;
+    }
+
+    /**
+     * 鍐呭浼氳鍒犻櫎
+     * @param MeetingId
+     * @return
+     */
+    @Override
+    public boolean delInternalMeeting(Integer MeetingId) {
+        internalMeetingDetailService.remove(Wrappers.<InternalMeetingDetail>lambdaQuery()
+                .eq(InternalMeetingDetail::getMeetingId, MeetingId));
+        baseMapper.deleteById(MeetingId);
+        return true;
+    }
+
+    /**
+     * 鍐呭浼氳鏌ョ湅璇︽儏
+     * @param MeetingId
+     * @return
+     */
+    @Override
+    public InternalMeetingDto getInternalMeetingOne(Integer MeetingId) {
+        InternalMeeting internalMeeting = baseMapper.selectById(MeetingId);
+        InternalMeetingDto internalMeetingDto = new InternalMeetingDto();
+        BeanUtils.copyProperties(internalMeeting, internalMeetingDto);
+
+        // 鏌ヨ璇︾粏淇℃伅
+        internalMeetingDto.setMeetingDetailList(internalMeetingDetailService.list(Wrappers.<InternalMeetingDetail>lambdaQuery()
+                .eq(InternalMeetingDetail::getMeetingId, MeetingId)));
+        return internalMeetingDto;
+    }
+
+    /**
+     * 瀵煎嚭鍐呭浼氳
+     * @param meetingId
+     * @param response
+     */
+    @Override
+    public void exportInternalMeeting(Integer meetingId, HttpServletResponse response) {
+        InternalMeeting internalMeeting = baseMapper.selectById(meetingId);
+
+        // 鏈�澶ц鏁�
+        int max = 11;
+
+        // 鏌ヨ鍙傚姞浜哄憳
+        List<Map<String, String>> mapList = userMapper.selectNameAnddepartment(internalMeeting.getParticipant());
+
+        // 鍒涘缓绌哄璞�
+        List<InternalMeetingParticipantDto> participants = new ArrayList<>();
+        for (int i = 0; i < max; i++) {
+            InternalMeetingParticipantDto participant = new InternalMeetingParticipantDto();
+            participants.add(participant);
+        }
+
+        int count = 0;
+        // 娣诲姞鍙傚姞浜哄憳
+        for (Map<String, String> stringMap : mapList) {
+            // 鍒ゆ柇鏈夋病鏈夊埌11琛�
+            if (count >= max * 2) {
+                participants.get(count - max * 2).setUserName3(stringMap.get("userName"));
+                participants.get(count - max * 2).setDepartment3(stringMap.get("department"));
+            } else if (count >= max){
+                participants.get(count - max).setUserName2(stringMap.get("userName"));
+                participants.get(count - max).setDepartment2(stringMap.get("department"));
+            } else {
+                participants.get(count).setUserName1(stringMap.get("userName"));
+                participants.get(count).setDepartment1(stringMap.get("department"));
+            }
+            count ++;
+        }
+
+        // 鑾峰彇璺緞
+        InputStream inputStream = this.getClass().getResourceAsStream("/static/internal-meeting.docx");
+        Configure configure = Configure.builder()
+                .bind("meetingDetails", new HackLoopTableRenderPolicy())
+                .build();
+        XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
+                new HashMap<String, Object>() {{
+                    put("meeting", internalMeeting);
+                    put("meetingDetails", participants);
+                }});
+
+        try {
+            response.setContentType("application/msword");
+            String fileName = URLEncoder.encode(
+                    internalMeeting.getMeetingDate() + "鍐呭浼氳绛惧埌", "UTF-8");
+            response.setHeader("Content-disposition",
+                    "attachment;filename=" + fileName + ".docx");
+            OutputStream os = response.getOutputStream();
+            template.write(os);
+            os.flush();
+            os.close();
+            inputStream.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException("瀵煎嚭澶辫触");
+        }
+
+    }
+
+
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/InternalPlanDetailServiceImpl.java b/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/InternalPlanDetailServiceImpl.java
new file mode 100644
index 0000000..c0b310a
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/InternalPlanDetailServiceImpl.java
@@ -0,0 +1,20 @@
+package com.ruoyi.manage.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.manage.mapper.InternalPlanDetailMapper;
+import com.ruoyi.manage.pojo.InternalPlanDetail;
+import com.ruoyi.manage.service.InternalPlanDetailService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 鍐呭骞村害璁″垝璇︽儏琛� 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 
+ * @since 2024-11-13 03:28:48
+ */
+@Service
+public class InternalPlanDetailServiceImpl extends ServiceImpl<InternalPlanDetailMapper, InternalPlanDetail> implements InternalPlanDetailService {
+
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/InternalPlanServiceImpl.java b/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/InternalPlanServiceImpl.java
new file mode 100644
index 0000000..35f0e58
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/InternalPlanServiceImpl.java
@@ -0,0 +1,259 @@
+package com.ruoyi.manage.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.ruoyi.common.core.domain.entity.User;
+import com.ruoyi.common.utils.QueryWrappers;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.framework.exception.ErrorException;
+import com.ruoyi.inspect.util.HackLoopTableRenderPolicy;
+import com.ruoyi.manage.dto.InternalPlanDto;
+
+import com.ruoyi.manage.mapper.InternalPlanMapper;
+
+import com.ruoyi.manage.pojo.InternalPlan;
+import com.ruoyi.manage.pojo.InternalPlanDetail;
+import com.ruoyi.manage.service.InternalPlanDetailService;
+import com.ruoyi.manage.service.InternalPlanService;
+
+
+import com.ruoyi.system.mapper.UserMapper;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import jakarta.annotation.Resource;
+import jakarta.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;
+
+/**
+ * <p>
+ * 鍐呭骞村害璁″垝 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-13 03:27:47
+ */
+@Service
+@Transactional(rollbackFor = Exception.class)
+public class InternalPlanServiceImpl extends ServiceImpl<InternalPlanMapper, InternalPlan> implements InternalPlanService {
+
+    @Resource
+    private InternalPlanDetailService internalPlanDetailService;
+
+    @Resource
+    private UserMapper userMapper;
+    @Value("${file.path}")
+    private String imgUrl;
+
+
+    /**
+     * 鍐呭骞村害璁″垝鍒嗛〉鏌ヨ
+     * @param page
+     * @param internalPlan
+     * @return
+     */
+    @Override
+    public IPage<InternalPlanDto> pageInternalPlan(Page page, InternalPlan internalPlan) {
+        return baseMapper.pageInternalPlan(page, QueryWrappers.queryWrappers(internalPlan));
+    }
+
+    /**
+     * 鍐呭骞村害璁″垝鏂板
+     * @param internalPlan
+     * @return
+     */
+    @Override
+    public boolean addInternalPlan(InternalPlanDto internalPlan) {
+        Integer userId = SecurityUtils.getUserId().intValue();
+        // 娣诲姞缂栧埗浜�
+        User user = userMapper.selectById(userId);
+        internalPlan.setWriteTime(LocalDateTime.now());
+        internalPlan.setWriteUserId(user.getId());
+        internalPlan.setWriteUserName(user.getName());
+
+        baseMapper.insert(internalPlan);
+        // 鏂板璇︽儏
+        for (InternalPlanDetail internalPlanDetail : internalPlan.getPlanDetailList()) {
+            internalPlanDetail.setPlanId(internalPlan.getPlanId());
+        }
+        internalPlanDetailService.saveBatch(internalPlan.getPlanDetailList());
+        return true;
+    }
+
+    /**
+     * 鍐呭骞村害璁″垝淇敼
+     * @param internalPlan
+     * @return
+     */
+    @Override
+    public boolean updateInternalPlan(InternalPlanDto internalPlan) {
+        baseMapper.updateById(internalPlan);
+
+        // 鍒犻櫎涔嬪墠鐨勮鎯�
+        internalPlanDetailService.remove(Wrappers.<InternalPlanDetail>lambdaQuery()
+                .eq(InternalPlanDetail::getPlanId, internalPlan.getPlanId()));
+
+        // 鏂板璇︽儏
+        for (InternalPlanDetail internalPlanDetail : internalPlan.getPlanDetailList()) {
+            internalPlanDetail.setPlanId(internalPlan.getPlanId());
+        }
+        internalPlanDetailService.saveBatch(internalPlan.getPlanDetailList());
+
+        return true;
+    }
+
+    /**
+     * 鍐呭骞村害璁″垝鍒犻櫎
+     * @param planId
+     * @return
+     */
+    @Override
+    public boolean delInternalPlan(Integer planId) {
+        internalPlanDetailService.remove(Wrappers.<InternalPlanDetail>lambdaQuery()
+                .eq(InternalPlanDetail::getPlanId, planId));
+        baseMapper.deleteById(planId);
+        return true;
+    }
+
+    /**
+     * 鍐呭骞村害璁″垝鏌ョ湅璇︽儏
+     * @param planId
+     * @return
+     */
+    @Override
+    public InternalPlanDto getInternalPlanOne(Integer planId) {
+        InternalPlan internalPlan = baseMapper.selectById(planId);
+        InternalPlanDto internalPlanDto = new InternalPlanDto();
+        BeanUtils.copyProperties(internalPlan, internalPlanDto);
+
+        // 鏌ヨ璇︾粏淇℃伅
+        internalPlanDto.setPlanDetailList(internalPlanDetailService.list(Wrappers.<InternalPlanDetail>lambdaQuery()
+                .eq(InternalPlanDetail::getPlanId, planId)));
+        return internalPlanDto;
+    }
+
+    /**
+     * 鍐呭骞村害璁″垝瀹℃牳
+     * @param internalPlanDto
+     * @return
+     */
+    @Override
+    public boolean examineInternalPlan(InternalPlanDto internalPlanDto) {
+        Integer userId = SecurityUtils.getUserId().intValue();
+        User user = userMapper.selectById(userId);
+        baseMapper.update(null, Wrappers.<InternalPlan>lambdaUpdate()
+                .eq(InternalPlan::getPlanId, internalPlanDto.getPlanId())
+                .set(InternalPlan::getExamineUserId, userId)
+                .set(InternalPlan::getExamineUserName, user.getName())
+                .set(InternalPlan::getExamineRemark, internalPlanDto.getExamineRemark())
+                .set(InternalPlan::getExamineStatus, internalPlanDto.getExamineStatus())
+                .set(InternalPlan::getExamineTime, LocalDateTime.now())
+        );
+        return true;
+    }
+
+    /**
+     * 鍐呭骞村害璁″垝鎵瑰噯
+     * @param internalPlanDto
+     * @return
+     */
+    @Override
+    public boolean ratifyInternalPlan(InternalPlanDto internalPlanDto) {
+        Integer userId = SecurityUtils.getUserId().intValue();
+        User user = userMapper.selectById(userId);
+        baseMapper.update(null, Wrappers.<InternalPlan>lambdaUpdate()
+                .eq(InternalPlan::getPlanId, internalPlanDto.getPlanId())
+                .set(InternalPlan::getRatifyUserId, userId)
+                .set(InternalPlan::getRatifyUserName, user.getName())
+                .set(InternalPlan::getRatifyRemark, internalPlanDto.getRatifyRemark())
+                .set(InternalPlan::getRatifyStatus, internalPlanDto.getRatifyStatus())
+                .set(InternalPlan::getRatifyTime, LocalDateTime.now())
+        );
+        return true;
+    }
+
+    /**
+     * 瀵煎嚭鍐呭骞村害璁″垝
+     * @param planId
+     * @param response
+     */
+    @Override
+    public void exportInternalImplement(Integer planId, HttpServletResponse response) {
+        InternalPlan internalPlan = baseMapper.selectById(planId);
+        //鑾峰彇鎻愪氦浜虹殑绛惧悕鍦板潃
+        String writeUrl = userMapper.selectById(internalPlan.getWriteUserId()).getSignatureUrl();
+        if (StringUtils.isBlank(writeUrl)) {
+            throw new ErrorException("鎵句笉鍒版楠屼汉鐨勭鍚�");
+        }
+
+        //鑾峰彇瀹℃牳浜虹殑绛惧悕鍦板潃
+        String examineUrl = null;
+        if (internalPlan.getExamineUserId() != null) {
+            examineUrl = userMapper.selectById(internalPlan.getExamineUserId()).getSignatureUrl();
+            if (StringUtils.isBlank(examineUrl)) {
+                throw new ErrorException("鎵句笉鍒板鏍镐汉鐨勭鍚�");
+            }
+        }
+
+        //鑾峰彇鎵瑰噯浜虹殑绛惧悕鍦板潃
+        String ratifyUrl = null;
+        if (internalPlan.getRatifyUserId() != null) {
+            ratifyUrl = userMapper.selectById(internalPlan.getRatifyUserId()).getSignatureUrl();
+            if (StringUtils.isBlank(ratifyUrl)) {
+                throw new ErrorException("鎵句笉鍒版壒鍑嗕汉鐨勭鍚�");
+            }
+        }
+
+        // 鏌ヨ璇︽儏
+        List<InternalPlanDetail> planDetails = internalPlanDetailService.list(Wrappers.<InternalPlanDetail>lambdaQuery()
+                .eq(InternalPlanDetail::getPlanId, planId));
+
+        // 鑾峰彇璺緞
+        InputStream inputStream = this.getClass().getResourceAsStream("/static/internal-plan.docx");
+        String finalExamineUrl = examineUrl;
+        String finalRatifyUrl = ratifyUrl;
+        Configure configure = Configure.builder()
+                .bind("planDetailList", new HackLoopTableRenderPolicy())
+                .build();
+        XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
+                new HashMap<String, Object>() {{
+                    put("plan", internalPlan);
+                    put("planDetailList", planDetails);
+                    put("writeUrl", StringUtils.isNotBlank(writeUrl) ? Pictures.ofLocal(imgUrl + "/" + writeUrl).create() : null);
+                    put("examineUrl", StringUtils.isNotBlank(finalExamineUrl) ? Pictures.ofLocal(imgUrl + "/" + finalExamineUrl).create() : null);
+                    put("ratifyUrl", StringUtils.isNotBlank(finalRatifyUrl) ? Pictures.ofLocal(imgUrl + "/" + finalRatifyUrl).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();
+            inputStream.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException("瀵煎嚭澶辫触");
+        }
+
+    }
+
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/InternalReportServiceImpl.java b/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/InternalReportServiceImpl.java
new file mode 100644
index 0000000..1ee3071
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/InternalReportServiceImpl.java
@@ -0,0 +1,165 @@
+package com.ruoyi.manage.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.config.ConfigureBuilder;
+import com.deepoove.poi.data.Pictures;
+
+
+import com.ruoyi.common.core.domain.entity.User;
+import com.ruoyi.common.utils.QueryWrappers;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.framework.exception.ErrorException;
+import com.ruoyi.manage.mapper.InternalReportMapper;
+
+import com.ruoyi.manage.pojo.InternalReport;
+
+import com.ruoyi.manage.service.InternalReportService;
+
+import com.ruoyi.system.mapper.UserMapper;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletResponse;
+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;
+
+/**
+ * 鍐呭鎶ュ憡琛�
+ *
+ * @author zhuo
+ * @since 2024-11-11
+ */
+@Service
+@Transactional(rollbackFor = Exception.class)
+public class InternalReportServiceImpl extends ServiceImpl<InternalReportMapper, InternalReport> implements InternalReportService {
+
+
+    @Resource
+    private UserMapper userMapper;
+    @Value("${file.path}")
+    private String imgUrl;
+
+    /**
+     * 鍐呭鎶ュ憡鍒嗛〉鏌ヨ
+     * @param page
+     * @param internalReport
+     * @return
+     */
+    @Override
+    public IPage<InternalReport> pageInternalReport(Page page, InternalReport internalReport) {
+        return baseMapper.pageInternalReport(page, QueryWrappers.queryWrappers(internalReport));
+    }
+
+    /**
+     * 鍐呭鎶ュ憡瀹℃牳
+     * @param internalReport
+     * @return
+     */
+    @Override
+    public boolean ratifyInternalCheck(InternalReport internalReport) {
+        Integer userId = SecurityUtils.getUserId().intValue();
+        User user = userMapper.selectById(userId);
+        baseMapper.update(null, Wrappers.<InternalReport>lambdaUpdate()
+                .eq(InternalReport::getReportId, internalReport.getReportId())
+                .set(InternalReport::getExamineUserId, userId)
+                .set(InternalReport::getExamineUserName, user.getName())
+                .set(InternalReport::getExamineRemark, internalReport.getExamineRemark())
+                .set(InternalReport::getExamineStatus, internalReport.getExamineStatus())
+                .set(InternalReport::getExamineTime, LocalDateTime.now())
+        );
+        return true;
+    }
+
+    /**
+     * 鍐呭鎶ュ憡璐ㄩ噺璐熻矗浜哄~鍐�
+     * @param internalReport
+     * @return
+     */
+    @Override
+    public boolean qualityInternalReport(InternalReport internalReport) {
+        Integer userId = SecurityUtils.getUserId().intValue();
+        User user = userMapper.selectById(userId);
+        baseMapper.update(null, Wrappers.<InternalReport>lambdaUpdate()
+                .eq(InternalReport::getReportId, internalReport.getReportId())
+                .set(InternalReport::getQualityUserId, userId)
+                .set(InternalReport::getQualityUserName, user.getName())
+                .set(InternalReport::getQualityRemark, internalReport.getQualityRemark())
+                .set(InternalReport::getQualityStatus, internalReport.getQualityStatus())
+                .set(InternalReport::getQualityTime, LocalDateTime.now())
+        );
+        return true;
+    }
+
+    /**
+     * 瀵煎嚭鍐呭鎶ュ憡
+     * @param reportId
+     * @param response
+     */
+    @Override
+    public void exportInternalReport(Integer reportId, HttpServletResponse response) {
+        InternalReport internalReport = baseMapper.selectById(reportId);
+
+        //鑾峰彇瀹℃牳浜虹殑绛惧悕鍦板潃
+        String examineUrl = null;
+        if (internalReport.getExamineUserId() != null) {
+            examineUrl = userMapper.selectById(internalReport.getExamineUserId()).getSignatureUrl();
+            if (StringUtils.isBlank(examineUrl)) {
+                throw new ErrorException("鎵句笉鍒板鏍镐汉鐨勭鍚�");
+            }
+        }
+
+        //鑾峰彇璐ㄩ噺璐熻矗浜虹殑绛惧悕鍦板潃
+        String qualityUrl = null;
+        if (internalReport.getQualityUserId() != null) {
+            qualityUrl = userMapper.selectById(internalReport.getQualityUserId()).getSignatureUrl();
+            if (StringUtils.isBlank(qualityUrl)) {
+                throw new ErrorException("鎵句笉鍒拌川閲忚礋璐d汉鐨勭鍚�");
+            }
+        }
+
+        // 鑾峰彇璺緞
+        InputStream inputStream = this.getClass().getResourceAsStream("/static/internal-report.docx");
+        ConfigureBuilder builder = Configure.builder();
+        builder.useSpringEL(true);
+        String finalExamineUrl = examineUrl;
+        String finalQualityUrl = qualityUrl;
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+        XWPFTemplate template = XWPFTemplate.compile(inputStream, builder.build()).render(
+                new HashMap<String, Object>() {{
+                    put("report", internalReport);
+                    put("examineUrl", StringUtils.isNotBlank(finalExamineUrl) ? Pictures.ofLocal(imgUrl + "/" + finalQualityUrl).create() : null);
+                    put("qualityUrl", StringUtils.isNotBlank(finalQualityUrl) ? Pictures.ofLocal(imgUrl + "/" + finalQualityUrl).create() : null);
+                    put("examineTime", internalReport.getExamineTime() != null ? internalReport.getExamineTime().format(formatter) : null);
+                    put("qualityTime", internalReport.getQualityTime() != null ? internalReport.getQualityTime().format(formatter) : 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();
+            inputStream.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException("瀵煎嚭澶辫触");
+        }
+    }
+}
+
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageControlPlanListServiceImpl.java b/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageControlPlanListServiceImpl.java
new file mode 100644
index 0000000..d5249f1
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageControlPlanListServiceImpl.java
@@ -0,0 +1,129 @@
+package com.ruoyi.manage.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.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.ruoyi.common.utils.DateImageUtil;
+import com.ruoyi.framework.exception.ErrorException;
+import com.ruoyi.inspect.util.HackLoopTableRenderPolicy;
+import com.ruoyi.manage.mapper.ManageControlPlanListMapper;
+
+import com.ruoyi.manage.pojo.ManageControlPlanList;
+import com.ruoyi.manage.service.ManageControlPlanListService;
+
+
+import com.ruoyi.manage.vo.ManageControlPlanListVo;
+import com.ruoyi.system.mapper.UserMapper;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+import jakarta.servlet.http.HttpServletResponse;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URLEncoder;
+import java.util.HashMap;
+
+/**
+ * <p>
+ * 閲嶅ぇ椋庨櫓鍥犵礌鍒嗘瀽鍙婃帶鍒惰鍒掓竻鍗� 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-15 02:58:30
+ */
+@Service
+public class ManageControlPlanListServiceImpl extends ServiceImpl<ManageControlPlanListMapper, ManageControlPlanList> implements ManageControlPlanListService {
+
+    @Autowired
+    private UserMapper userMapper;
+
+    @Value("${file.path}")
+    private String imgUrl;
+
+    @Override
+    public IPage<ManageControlPlanListVo> getPageList(Page page) {
+        return baseMapper.getPageList(page, false);
+    }
+
+    @Override
+    public void exportPersonTraining(HttpServletResponse response) {
+        // 鏌ヨ璇︽儏
+        IPage<ManageControlPlanListVo> detailedDtos = baseMapper.getPageList(new Page(1, -1), true);
+        if (detailedDtos.getRecords().isEmpty()) {
+            throw new ErrorException("瀹℃牳閫氳繃鐨勬暟鎹负绌猴紒璇峰鏍搁�氳繃鍚庡湪瀵煎嚭");
+        }
+        ManageControlPlanListVo manageRiskAssessmentResultsVo = detailedDtos.getRecords().get(0);
+
+        //鑾峰彇缂栧埗浜虹殑绛惧悕鍦板潃
+        String writeUrl = userMapper.selectById(manageRiskAssessmentResultsVo.getEditor()).getSignatureUrl();
+        if (ObjectUtils.isEmpty(writeUrl) || writeUrl.equals("")) {
+            throw new ErrorException("鎵句笉鍒版楠屼汉鐨勭鍚�");
+        }
+
+        //鑾峰彇澶嶆牳浜虹殑绛惧悕鍦板潃
+        String examineUrl = null;
+        if (manageRiskAssessmentResultsVo.getApproval() != null) {
+            examineUrl = userMapper.selectById(manageRiskAssessmentResultsVo.getApproval()).getSignatureUrl();
+            if (StringUtils.isBlank(examineUrl)) {
+                throw new ErrorException("鎵句笉鍒板鏍镐汉鐨勭鍚�");
+            }
+        }
+
+        //鑾峰彇鎵瑰噯浜虹殑绛惧悕鍦板潃
+        String ratifyUrl = null;
+        if (manageRiskAssessmentResultsVo.getApproval() != null) {
+            ratifyUrl = userMapper.selectById(manageRiskAssessmentResultsVo.getApproval()).getSignatureUrl();
+            if (StringUtils.isBlank(ratifyUrl)) {
+                throw new ErrorException("鎵句笉鍒板鏍镐汉鐨勭鍚�");
+            }
+        }
+
+        int index = 1;
+        for (ManageControlPlanListVo detailedDto : detailedDtos.getRecords()) {
+            detailedDto.setIndex(index);
+            index++;
+        }
+        // 鑾峰彇璺緞
+        InputStream inputStream = this.getClass().getResourceAsStream("/static/analysis-risk-factors.docx");
+        String finalExamineUrl = examineUrl;
+        String finalRatifyUrl = ratifyUrl;
+        Configure configure = Configure.builder()
+                .bind("trainingDetailedList", new HackLoopTableRenderPolicy())
+                .build();
+        XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
+                new HashMap<String, Object>() {{
+                    put("trainingDetailedList", detailedDtos.getRecords());
+                    put("writeUrl", StringUtils.isNotBlank(writeUrl) ? Pictures.ofLocal(imgUrl + "/" + writeUrl).create() : null);
+                    put("examineUrl", StringUtils.isNotBlank(finalExamineUrl) ? Pictures.ofLocal(imgUrl + "/" + finalExamineUrl).create() : null);
+                    put("ratifyUrl", StringUtils.isNotBlank(finalRatifyUrl) ? Pictures.ofLocal(imgUrl + "/" + finalRatifyUrl).create() : null);
+                    put("writeDateUrl", manageRiskAssessmentResultsVo.getEditorDate() != null ?
+                            Pictures.ofStream(DateImageUtil.createDateImage(manageRiskAssessmentResultsVo.getEditorDate())).create() : null);
+                    put("examineDateUrl", manageRiskAssessmentResultsVo.getApproveDate() != null ?
+                            Pictures.ofStream(DateImageUtil.createDateImage(manageRiskAssessmentResultsVo.getApproveDate())).create() : null);
+                    put("ratifyDateUrl", manageRiskAssessmentResultsVo.getApproveDate() != null ?
+                            Pictures.ofStream(DateImageUtil.createDateImage(manageRiskAssessmentResultsVo.getApproveDate())).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();
+            inputStream.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException("瀵煎嚭澶辫触");
+        }
+    }
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageDocumentAlterServiceImpl.java b/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageDocumentAlterServiceImpl.java
new file mode 100644
index 0000000..6576d4b
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageDocumentAlterServiceImpl.java
@@ -0,0 +1,292 @@
+package com.ruoyi.manage.service.impl;
+
+import cn.hutool.core.lang.UUID;
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.ExcelWriter;
+import com.alibaba.excel.write.metadata.WriteSheet;
+import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
+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.ruoyi.common.utils.QueryWrappers;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.system.mapper.UserMapper;
+
+
+import com.ruoyi.manage.mapper.*;
+import com.ruoyi.manage.pojo.*;
+import com.ruoyi.manage.service.ManageDocumentAlterService;
+
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.multipart.MultipartFile;
+
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletResponse;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.net.URLEncoder;
+import java.time.LocalDate;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 鏂囦欢鍙樻洿 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-11 11:04:01
+ */
+@Service
+@Transactional(rollbackFor = Exception.class)
+public class ManageDocumentAlterServiceImpl extends ServiceImpl<ManageDocumentAlterMapper, ManageDocumentAlter> implements ManageDocumentAlterService {
+
+    @Resource
+    private ManageDocumentAlterMapper manageDocumentAlterMapper;
+
+    @Resource
+    private ManageRecordCheckMapper manageRecordCheckMapper;
+
+
+
+    @Value("${wordUrl}")
+    private String wordUrl;
+
+    @Resource
+    private UserMapper userMapper;
+
+    @Resource
+    private ManageDocumentListMapper manageDocumentListMapper;
+
+    @Resource
+    private ManageDocumentCancelMapper manageDocumentCancelMapper;
+
+    @Resource
+    private ManageRecordAuditMapper manageRecordAuditMapper;
+
+
+    @Override
+    public IPage<ManageDocumentAlter> pageManageDocumentAlter(Page page, ManageDocumentAlter manageDocumentAlter) {
+        return manageDocumentAlterMapper.pageManageDocumentAlter(page, QueryWrappers.queryWrappers(manageDocumentAlter));
+    }
+
+    @Override
+    public ManageDocumentAlter getManageDocumentAlter(Integer id) {
+        ManageDocumentAlter manageDocumentAlter = manageDocumentAlterMapper.getManageDocumentAlter(id);
+        String limsName = userMapper.selectUserDepartmentLimsName(manageDocumentAlter.getCreateUser());
+        manageDocumentAlter.setCreateUserDepartLims(limsName);
+        return manageDocumentAlter;
+    }
+
+    @Override
+    public int addManageDocumentAlter(ManageDocumentAlter manageDocumentAlter) {
+        /*鏂板8.4鐨勬枃浠朵慨璁㈢敵璇峰鎵硅褰�*/
+        ManageRecordAudit manageRecordAudit = new ManageRecordAudit();
+        manageRecordAudit.setDocumentCode(manageDocumentAlter.getAlterBeforeCode());
+        manageRecordAudit.setDocumentName(manageDocumentAlter.getAlterBeforeName());
+        manageRecordAudit.setBeforeVersion(manageDocumentAlter.getAlterBeforeVersion());
+        manageRecordAudit.setAfterVersion(manageDocumentAlter.getAlterAfterVersion());
+        manageRecordAudit.setReason(manageDocumentAlter.getAlterNote());
+        manageRecordAudit.setAlterUser(SecurityUtils.getUserId().intValue());
+        manageRecordAudit.setMethod("淇");
+        if (ObjectUtils.isNotEmpty(manageDocumentAlter.getFile())) {
+            String urlString;
+            String pathName;
+            String path;
+            MultipartFile file = manageDocumentAlter.getFile();
+            //涓婁紶鏂版枃浠�
+            path = wordUrl;
+            try {
+                File realpath = new File(path);
+                if (!realpath.exists()) {
+                    realpath.mkdirs();
+                }
+                pathName = UUID.randomUUID() + "_" + file.getOriginalFilename();
+                urlString = realpath + "/" + pathName;
+                file.transferTo(new File(urlString));
+            } catch (Exception e) {
+                e.printStackTrace();
+                System.err.println("闄勪欢涓婁紶閿欒");
+                return 0;
+            }
+            manageDocumentAlter.setAlterAfterUrl(pathName);
+            manageRecordAudit.setAfterUrl(pathName);
+        }
+        manageRecordAuditMapper.insert(manageRecordAudit);
+        return manageDocumentAlterMapper.insert(manageDocumentAlter);
+    }
+
+    @Override
+    public int doManageDocumentAlter(ManageDocumentAlter manageDocumentAlter) {
+        ManageDocumentAlter manageDocumentAlter1= manageDocumentAlterMapper.selectById(manageDocumentAlter.getId());
+        if (ObjectUtils.isNotEmpty(manageDocumentAlter.getFile())) {
+            if (ObjectUtils.isNotEmpty(manageDocumentAlter1.getAlterAfterUrl())) {
+                // 鍒犻櫎鏃ф枃浠�
+                File oldFile = new File(wordUrl + "/" + manageDocumentAlter1.getAlterAfterUrl());
+                oldFile.delete();
+            }
+            //涓婁紶鏂版枃浠�
+            String urlString;
+            String pathName;
+            String path;
+            MultipartFile file = manageDocumentAlter.getFile();
+            path = wordUrl;
+            try {
+                File realpath = new File(path);
+                if (!realpath.exists()) {
+                    realpath.mkdirs();
+                }
+                pathName = UUID.randomUUID() + "_" + file.getOriginalFilename();
+                urlString = realpath + "/" + pathName;
+                file.transferTo(new File(urlString));
+                manageDocumentAlter.setAlterAfterUrl(pathName);
+            } catch (Exception e) {
+                e.printStackTrace();
+                System.err.println("闄勪欢涓婁紶閿欒");
+                return 0;
+            }
+        }
+        return manageDocumentAlterMapper.updateById(manageDocumentAlter);
+    }
+
+    @Override
+    public int checkManageDocumentAlter(ManageDocumentAlter manageDocumentAlter) {
+        ManageDocumentAlter oldManageDocumentAlter = manageDocumentAlterMapper.selectById(manageDocumentAlter.getId());
+        if (manageDocumentAlter.getState().equals("閫氳繃")) {
+            /*灏嗘枃浠剁洊绔�*/
+            // 鍒犻櫎鏃ф枃浠�
+            File oldFile = new File(wordUrl + "/" + oldManageDocumentAlter.getAlterAfterUrl());
+            oldFile.delete();
+            //涓婁紶鏂版枃浠�
+            String urlString;
+            String pathName;
+            String path;
+            MultipartFile file = manageDocumentAlter.getFile();
+            path = wordUrl;
+            try {
+                File realpath = new File(path);
+                if (!realpath.exists()) {
+                    realpath.mkdirs();
+                }
+                pathName = UUID.randomUUID() + "_" + file.getOriginalFilename();
+                urlString = realpath + "/" + pathName;
+                file.transferTo(new File(urlString));
+                manageDocumentAlter.setAlterAfterUrl(pathName);
+            } catch (Exception e) {
+                e.printStackTrace();
+                System.err.println("闄勪欢涓婁紶閿欒");
+                return 0;
+            }
+            if(StringUtils.isNotEmpty(oldManageDocumentAlter.getMethod())){
+
+            }
+            /*鍏朵綑鐩稿叧澶勭悊*/
+            if ("浣滃簾".equals(oldManageDocumentAlter.getMethod())){
+                //鏂板鍒颁綔搴熺敵璇烽噷闈�
+                ManageDocumentCancel manageDocumentCancel = new ManageDocumentCancel();
+                manageDocumentCancel.setDocumentCode(oldManageDocumentAlter.getAlterBeforeCode());
+                manageDocumentCancel.setName(oldManageDocumentAlter.getAlterBeforeName());
+                manageDocumentCancel.setVersion(oldManageDocumentAlter.getAlterBeforeVersion());
+                manageDocumentCancel.setCancelNote("鏂囦欢鍙樻洿,鍙樻洿鐨勬枃浠剁紪鍙锋槸"+oldManageDocumentAlter.getAlterAfterCode());
+                manageDocumentCancelMapper.insert(manageDocumentCancel);
+                //鍒犻櫎鏂囦欢娓呭崟
+                manageDocumentListMapper.delete(Wrappers.<ManageDocumentList>lambdaQuery()
+                        .eq(ManageDocumentList::getDocumentCode,oldManageDocumentAlter.getAlterBeforeCode()));
+                //鏂板鏂囦欢娓呭崟
+                ManageDocumentList manageDocumentList = new ManageDocumentList();
+                manageDocumentList.setDocumentCode(oldManageDocumentAlter.getAlterAfterCode());
+                manageDocumentList.setName(oldManageDocumentAlter.getAlterAfterName());
+                manageDocumentList.setVersion(oldManageDocumentAlter.getAlterAfterVersion());
+                manageDocumentList.setState("鏈夋晥");
+                manageDocumentList.setEffectiveDate(LocalDate.now());
+                manageDocumentList.setUrl(pathName);
+                manageDocumentListMapper.insert(manageDocumentList);
+                /*鏂板8.4鐨勬枃浠朵慨璁㈢敵璇峰鎵硅褰�*/
+                ManageRecordAudit manageRecordAudit = new ManageRecordAudit();
+                manageRecordAudit.setDocumentCode(manageDocumentCancel.getDocumentCode());
+                manageRecordAudit.setDocumentName(manageDocumentCancel.getName());
+                manageRecordAudit.setAlterThing("浣滃簾");
+                manageRecordAudit.setMethod("浣滃簾");
+                manageRecordAuditMapper.insert(manageRecordAudit);
+            }else {
+                //濡傛灉鏄瓨妗d笉鍙敤,閭e氨灏嗘枃浠舵竻鍗曠殑鐘舵�佹敼涓烘棤鏁�
+                manageDocumentListMapper.update(null,Wrappers.<ManageDocumentList>lambdaUpdate()
+                        .eq(ManageDocumentList::getDocumentCode,oldManageDocumentAlter.getAlterBeforeCode())
+                        .set(ManageDocumentList::getState,"鏃犳晥"));
+            }
+        }
+        /*鏂板8.4鐨勬枃浠跺鎵硅褰�*/
+        ManageRecordCheck manageRecordCheck = new ManageRecordCheck();
+        manageRecordCheck.setDocumentCode(oldManageDocumentAlter.getAlterAfterCode());
+        manageRecordCheck.setDocumentName(oldManageDocumentAlter.getAlterAfterName());
+        manageRecordCheck.setDocumentVersion(oldManageDocumentAlter.getAlterAfterVersion());
+        manageRecordCheck.setWriteUser(oldManageDocumentAlter.getCreateUser());
+        manageRecordCheck.setCheckUser(oldManageDocumentAlter.getCheckUser());
+        manageRecordCheck.setCheckState(manageDocumentAlter.getState());
+        manageRecordCheck.setRemark(manageDocumentAlter.getAlterNote());
+        manageRecordCheckMapper.insert(manageRecordCheck);
+        return manageDocumentAlterMapper.updateById(manageDocumentAlter);
+    }
+
+    @Override
+    public void checkManageDocumentAlterPdf(Long id, HttpServletResponse response) throws Exception {
+        ManageDocumentAlter manageDocumentAlter = manageDocumentAlterMapper.selectById(id);
+        File file = new File(wordUrl + "/" + manageDocumentAlter.getAlterAfterUrl());
+        FileInputStream fileInputStream = new FileInputStream(file);
+        response.setContentType("application/pdf");
+        response.setCharacterEncoding("UTF-8");
+        response.setHeader("Content-disposition", "inline;filename=" + file.getName());
+        response.setContentLength((int)file.length());
+        OutputStream os = response.getOutputStream();
+        // 灏嗘枃浠跺唴瀹瑰啓鍏ヨ緭鍑烘祦
+        byte[] buffer = new byte[4096];
+        int bytesRead;
+        while ((bytesRead = fileInputStream.read(buffer)) != -1) {
+            os.write(buffer, 0, bytesRead);
+        }
+        os.flush();
+        os.close();
+    }
+
+    @Override
+    public void exportManageDocumentAlter(ManageDocumentAlter manageDocumentAlter, HttpServletResponse response) throws Exception {
+        List<ManageDocumentAlter> data = manageDocumentAlterMapper.pageManageDocumentAlter(new Page(-1, -1), QueryWrappers.queryWrappers(manageDocumentAlter)).getRecords();
+        response.setContentType("application/vnd.ms-excel");
+        response.setCharacterEncoding("UTF-8");
+        String fileName = URLEncoder.encode("鏂囦欢鍙樻洿鍒楄〃瀵煎嚭", "UTF-8");
+        response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
+        try {
+            // 鏂板缓ExcelWriter
+            ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()).build();
+            WriteSheet mainSheet = EasyExcel.writerSheet(0, "鏂囦欢鍙樻洿鍒楄〃瀵煎嚭").head(ManageDocumentAlter.class).build();
+            excelWriter.write(data, mainSheet);
+            // 鍏抽棴娴�
+            excelWriter.finish();
+        } catch (IOException e) {
+            throw new RuntimeException("瀵煎嚭澶辫触");
+        }
+    }
+
+    @Override
+    public int delManageDocumentAlter(Integer id) {
+        ManageDocumentAlter manageDocumentAlter = manageDocumentAlterMapper.selectById(id);
+        /*鍒犻櫎8.4鐨勬枃浠朵慨璁㈢敵璇峰鎵硅褰�*/
+        manageRecordAuditMapper.delete(Wrappers.<ManageRecordAudit>lambdaQuery()
+        .eq(ManageRecordAudit::getDocumentCode,manageDocumentAlter.getAlterBeforeCode())
+        .eq(ManageRecordAudit::getDocumentName,manageDocumentAlter.getAlterBeforeName())
+        .eq(ManageRecordAudit::getBeforeVersion,manageDocumentAlter.getAlterBeforeVersion())
+        .eq(ManageRecordAudit::getAfterVersion,manageDocumentAlter.getAlterAfterVersion())
+        .eq(ManageRecordAudit::getReason,manageDocumentAlter.getAlterNote())
+        .eq(ManageRecordAudit::getAlterUser,manageDocumentAlter.getCreateUser())
+        .eq(ManageRecordAudit::getMethod,"淇"));
+        return manageDocumentAlterMapper.deleteById(id);
+    }
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageDocumentCancelServiceImpl.java b/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageDocumentCancelServiceImpl.java
new file mode 100644
index 0000000..a97290a
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageDocumentCancelServiceImpl.java
@@ -0,0 +1,146 @@
+package com.ruoyi.manage.service.impl;
+
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.ExcelWriter;
+import com.alibaba.excel.write.metadata.WriteSheet;
+import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
+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.ruoyi.common.utils.QueryWrappers;
+import com.ruoyi.system.mapper.UserMapper;
+
+
+import com.ruoyi.manage.mapper.ManageDocumentCancelMapper;
+import com.ruoyi.manage.mapper.ManageDocumentListMapper;
+import com.ruoyi.manage.mapper.ManageRecordAuditMapper;
+import com.ruoyi.manage.mapper.ManageRecordCheckMapper;
+import com.ruoyi.manage.pojo.ManageDocumentCancel;
+import com.ruoyi.manage.pojo.ManageDocumentList;
+import com.ruoyi.manage.pojo.ManageRecordAudit;
+import com.ruoyi.manage.pojo.ManageRecordCheck;
+import com.ruoyi.manage.service.ManageDocumentCancelService;
+
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.net.URLEncoder;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 鏂囦欢浣滃簾 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-09 02:37:35
+ */
+@Service
+@Transactional(rollbackFor = Exception.class)
+public class ManageDocumentCancelServiceImpl extends ServiceImpl<ManageDocumentCancelMapper, ManageDocumentCancel> implements ManageDocumentCancelService {
+
+    @Resource
+    private ManageDocumentCancelMapper manageDocumentCancelMapper;
+
+    @Resource
+    private ManageRecordCheckMapper manageRecordCheckMapper;
+
+    @Resource
+    private ManageRecordAuditMapper manageRecordAuditMapper;
+
+
+
+    @Resource
+    private ManageDocumentListMapper manageDocumentListMapper;
+
+    @Resource
+    private UserMapper userMapper;
+
+    @Override
+    public IPage<ManageDocumentCancel> pageManageDocumentCancel(Page page, ManageDocumentCancel manageDocumentCancel) {
+        return manageDocumentCancelMapper.pageManageDocumentCancel(page, QueryWrappers.queryWrappers(manageDocumentCancel));
+    }
+
+    @Override
+    public int addManageDocumentCancel(ManageDocumentCancel manageDocumentCancel) {
+        manageDocumentCancel.setState("寰呭鏍�");
+        /*鏂板8.4鐨勬枃浠朵慨璁㈢敵璇峰鎵硅褰�*/
+        ManageRecordAudit manageRecordAudit = new ManageRecordAudit();
+        manageRecordAudit.setDocumentCode(manageDocumentCancel.getDocumentCode());
+        manageRecordAudit.setDocumentName(manageDocumentCancel.getName());
+        manageRecordAudit.setAlterThing("浣滃簾");
+        manageRecordAudit.setMethod("浣滃簾");
+        manageRecordAuditMapper.insert(manageRecordAudit);
+        return manageDocumentCancelMapper.insert(manageDocumentCancel);
+    }
+
+    @Override
+    public int checkManageDocumentCancel(Integer id, String state) {
+        ManageDocumentCancel manageDocumentCancel = manageDocumentCancelMapper.selectById(id);
+        if (state.equals("閫氳繃")){
+            //鍒犻櫎鏂囦欢娓呭崟瀵瑰簲鏁版嵁
+            manageDocumentListMapper.delete(Wrappers.<ManageDocumentList>lambdaQuery().eq(ManageDocumentList::getDocumentCode,manageDocumentCancel.getDocumentCode()));
+        }
+        manageDocumentCancel.setState(state);
+        /*鏂板8.4鐨勬枃浠跺鎵硅褰�*/
+        ManageRecordCheck manageRecordCheck = new ManageRecordCheck();
+        manageRecordCheck.setDocumentCode(manageDocumentCancel.getDocumentCode());
+        manageRecordCheck.setDocumentName(manageDocumentCancel.getName());
+        manageRecordCheck.setDocumentVersion(manageDocumentCancel.getVersion());
+        manageRecordCheck.setWriteUser(manageDocumentCancel.getCreateUser());
+        manageRecordCheck.setCheckUser(manageDocumentCancel.getCheckUser());
+        manageRecordCheck.setCheckState(manageDocumentCancel.getState());
+        manageRecordCheck.setRemark(manageDocumentCancel.getCancelNote());
+        manageRecordCheckMapper.insert(manageRecordCheck);
+        return manageDocumentCancelMapper.updateById(manageDocumentCancel);
+    }
+
+    @Override
+    public ManageDocumentCancel getManageDocumentCancel(Integer id) {
+        ManageDocumentCancel manageDocumentCancel = manageDocumentCancelMapper.getManageDocumentCancel(id);
+        String limsName = userMapper.selectUserDepartmentLimsName(manageDocumentCancel.getCreateUser());
+        manageDocumentCancel.setCreateUserDepartLims(limsName);
+        return manageDocumentCancel;
+    }
+
+    @Override
+    public void exportManageDocumentCancel(ManageDocumentCancel manageDocumentCancel, HttpServletResponse response) throws Exception{
+        List<ManageDocumentCancel> data = manageDocumentCancelMapper.pageManageDocumentCancel(new Page(-1, -1), QueryWrappers.queryWrappers(manageDocumentCancel)).getRecords();
+        response.setContentType("application/vnd.ms-excel");
+        response.setCharacterEncoding("UTF-8");
+        String fileName = URLEncoder.encode("鏂囦欢浣滃簾鍒楄〃瀵煎嚭", "UTF-8");
+        response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
+        try {
+            // 鏂板缓ExcelWriter
+            ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()).build();
+            WriteSheet mainSheet = EasyExcel.writerSheet(0, "鏂囦欢浣滃簾鍒楄〃瀵煎嚭").head(ManageDocumentCancel.class).build();
+            excelWriter.write(data, mainSheet);
+            // 鍏抽棴娴�
+            excelWriter.finish();
+        } catch (IOException e) {
+            throw new RuntimeException("瀵煎嚭澶辫触");
+        }
+    }
+
+    @Override
+    public int delManageDocumentCancel(Integer id) {
+        ManageDocumentCancel manageDocumentCancel = manageDocumentCancelMapper.selectById(id);
+        /*鍒犻櫎8.4鐨勬枃浠朵慨璁㈢敵璇峰鎵硅褰�*/
+        manageRecordAuditMapper.delete(Wrappers.<ManageRecordAudit>lambdaQuery()
+        .eq(ManageRecordAudit::getDocumentCode,manageDocumentCancel.getDocumentCode())
+        .eq(ManageRecordAudit::getDocumentName,manageDocumentCancel.getName())
+        .eq(ManageRecordAudit::getMethod,"浣滃簾"));
+        return manageDocumentCancelMapper.deleteById(id);
+    }
+
+    @Override
+    public int doManageDocumentCancel(ManageDocumentCancel manageDocumentCancel) {
+        return manageDocumentCancelMapper.updateById(manageDocumentCancel);
+    }
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageDocumentControlledServiceImpl.java b/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageDocumentControlledServiceImpl.java
new file mode 100644
index 0000000..06edf3c
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageDocumentControlledServiceImpl.java
@@ -0,0 +1,219 @@
+package com.ruoyi.manage.service.impl;
+
+import cn.hutool.core.lang.UUID;
+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.ruoyi.common.core.domain.entity.User;
+import com.ruoyi.common.utils.QueryWrappers;
+import com.ruoyi.manage.mapper.ManageDocumentControlledMapper;
+import com.ruoyi.manage.mapper.ManageDocumentListMapper;
+import com.ruoyi.manage.mapper.ManageRecordCheckMapper;
+import com.ruoyi.manage.pojo.ManageDocumentControlled;
+import com.ruoyi.manage.pojo.ManageDocumentList;
+import com.ruoyi.manage.pojo.ManageRecordCheck;
+import com.ruoyi.manage.service.ManageDocumentControlledService;
+import com.ruoyi.system.mapper.UserMapper;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.multipart.MultipartFile;
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletResponse;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.OutputStream;
+import java.time.LocalDate;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * <p>
+ * 鏂囦欢鍙楁帶 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-08 02:54:44
+ */
+@Service
+@Transactional(rollbackFor = Exception.class)
+public class ManageDocumentControlledServiceImpl extends ServiceImpl<ManageDocumentControlledMapper, ManageDocumentControlled> implements ManageDocumentControlledService {
+
+    @Resource
+    private ManageDocumentControlledMapper manageDocumentControlledMapper;
+
+    @Resource
+    private ManageDocumentListMapper manageDocumentListMapper;
+
+    @Resource
+    private ManageRecordCheckMapper manageRecordCheckMapper;
+
+
+
+    @Value("${wordUrl}")
+    private String wordUrl;
+
+    @Resource
+    private UserMapper userMapper;
+
+    @Override
+    public IPage<ManageDocumentControlled> pageManageDocumentControlled(Page page, ManageDocumentControlled manageDocumentControlled) {
+        return manageDocumentControlledMapper.pageManageDocumentControlled(page, QueryWrappers.queryWrappers(manageDocumentControlled));
+    }
+
+    @Override
+    public int addManageDocumentControlled(ManageDocumentControlled manageDocumentControlled) {
+        manageDocumentControlled.setState("寰呭鏍�");
+        String urlString;
+        String pathName;
+        String path;
+        if (ObjectUtils.isNotEmpty(manageDocumentControlled.getFile())) {
+            MultipartFile file = manageDocumentControlled.getFile();
+            //涓婁紶鏂版枃浠�
+            path = wordUrl;
+            try {
+                File realpath = new File(path);
+                if (!realpath.exists()) {
+                    realpath.mkdirs();
+                }
+                pathName = UUID.randomUUID() + "_" + file.getOriginalFilename();
+                urlString = realpath + "/" + pathName;
+                file.transferTo(new File(urlString));
+            } catch (Exception e) {
+                e.printStackTrace();
+                System.err.println("闄勪欢涓婁紶閿欒");
+                return 0;
+            }
+            manageDocumentControlled.setUrl(pathName);
+        }
+        return manageDocumentControlledMapper.insert(manageDocumentControlled);
+    }
+
+    @Override
+    public int delManageDocumentControlled(Long id) {
+        ManageDocumentControlled manageDocumentControlled = manageDocumentControlledMapper.selectById(id);
+        if (ObjectUtils.isNotEmpty(manageDocumentControlled.getUrl())) {
+            // 鍒犻櫎鏃ф枃浠�
+            File oldFile = new File(wordUrl + "/" + manageDocumentControlled.getUrl());
+            oldFile.delete();
+        }
+        return manageDocumentControlledMapper.deleteById(id);
+    }
+
+    @Override
+    public ManageDocumentControlled getManageDocumentControlled(Long id) {
+        ManageDocumentControlled manageDocumentControlled = manageDocumentControlledMapper.getManageDocumentControlled(id);
+        //鑾峰彇閮ㄩ棬淇℃伅
+        String departmentLimsName = userMapper.selectUserDepartmentLimsName(manageDocumentControlled.getCreateUser());
+        manageDocumentControlled.setCreateUserDepartLims(departmentLimsName);
+        return manageDocumentControlled;
+    }
+
+    @Override
+    public int doManageDocumentControlled(ManageDocumentControlled manageDocumentControlled) {
+        ManageDocumentControlled manageDocumentControlled1 = manageDocumentControlledMapper.selectById(manageDocumentControlled.getId());
+        if (ObjectUtils.isNotEmpty(manageDocumentControlled.getFile())) {
+            if (ObjectUtils.isNotEmpty(manageDocumentControlled1.getUrl())) {
+                // 鍒犻櫎鏃ф枃浠�
+                File oldFile = new File(wordUrl + "/" + manageDocumentControlled1.getUrl());
+                oldFile.delete();
+            }
+            //涓婁紶鏂版枃浠�
+            String urlString;
+            String pathName;
+            String path;
+            MultipartFile file = manageDocumentControlled.getFile();
+            path = wordUrl;
+            try {
+                File realpath = new File(path);
+                if (!realpath.exists()) {
+                    realpath.mkdirs();
+                }
+                pathName = UUID.randomUUID() + "_" + file.getOriginalFilename();
+                urlString = realpath + "/" + pathName;
+                file.transferTo(new File(urlString));
+                manageDocumentControlled.setUrl(pathName);
+            } catch (Exception e) {
+                e.printStackTrace();
+                System.err.println("闄勪欢涓婁紶閿欒");
+                return 0;
+            }
+        }
+        return manageDocumentControlledMapper.updateById(manageDocumentControlled);
+    }
+
+    @Override
+    public int checkManageDocumentControlled(ManageDocumentControlled manageDocumentControlled) {
+        ManageDocumentControlled documentControlled = manageDocumentControlledMapper.selectById(manageDocumentControlled.getId());
+        if (manageDocumentControlled.getState().equals("閫氳繃")) {
+            // 鍒犻櫎鏃ф枃浠�
+            File oldFile = new File(wordUrl + "/" + documentControlled.getUrl());
+            oldFile.delete();
+            //涓婁紶鏂版枃浠�
+            String urlString;
+            String pathName;
+            String path;
+            MultipartFile file = manageDocumentControlled.getFile();
+            path = wordUrl;
+            try {
+                File realpath = new File(path);
+                if (!realpath.exists()) {
+                    realpath.mkdirs();
+                }
+                pathName = UUID.randomUUID() + "_" + file.getOriginalFilename();
+                urlString = realpath + "/" + pathName;
+                file.transferTo(new File(urlString));
+                manageDocumentControlled.setUrl(pathName);
+            } catch (Exception e) {
+                e.printStackTrace();
+                System.err.println("闄勪欢涓婁紶閿欒");
+                return 0;
+            }
+            //灏嗘枃浠跺彈鎺у凡鐭ユ枃浠舵竻鍗�
+            ManageDocumentList manageDocumentList = new ManageDocumentList();
+            manageDocumentList.setDocumentCode(documentControlled.getDocumentCode());
+            manageDocumentList.setType(documentControlled.getType());
+            manageDocumentList.setName(documentControlled.getName());
+            manageDocumentList.setVersion(documentControlled.getVersion());
+            manageDocumentList.setWriter(documentControlled.getWriter());
+            manageDocumentList.setEffectiveDate(LocalDate.now());
+            manageDocumentList.setState("鏈夋晥");
+            manageDocumentList.setUrl(manageDocumentControlled.getUrl());
+            manageDocumentListMapper.insert(manageDocumentList);
+        }
+        /*鏂板8.4鐨勬枃浠跺鎵硅褰�*/
+        ManageRecordCheck manageRecordCheck = new ManageRecordCheck();
+        manageRecordCheck.setDocumentCode(documentControlled.getDocumentCode());
+        manageRecordCheck.setDocumentName(documentControlled.getName());
+        manageRecordCheck.setDocumentVersion(documentControlled.getVersion());
+        manageRecordCheck.setWriteUser(userMapper.selectOne(Wrappers.<User>lambdaQuery().eq(User::getName,documentControlled.getWriter())).getId());
+        manageRecordCheck.setCheckUser(documentControlled.getDutyUser());
+        manageRecordCheck.setCheckState(manageDocumentControlled.getState());
+        manageRecordCheck.setRemark(documentControlled.getInstructions());
+        manageRecordCheckMapper.insert(manageRecordCheck);
+        return manageDocumentControlledMapper.updateById(manageDocumentControlled);
+    }
+
+    @Override
+    public void checkManageDocumentControlledPdf(Long id, HttpServletResponse response) throws Exception {
+        ManageDocumentControlled manageDocumentControlled = manageDocumentControlledMapper.selectById(id);
+        File file = new File(wordUrl + "/" + manageDocumentControlled.getUrl());
+        FileInputStream fileInputStream = new FileInputStream(file);
+        response.setContentType("application/pdf");
+        response.setCharacterEncoding("UTF-8");
+        response.setHeader("Content-disposition", "inline;filename=" + file.getName());
+        response.setContentLength((int)file.length());
+        OutputStream os = response.getOutputStream();
+        // 灏嗘枃浠跺唴瀹瑰啓鍏ヨ緭鍑烘祦
+        byte[] buffer = new byte[4096];
+        int bytesRead;
+        while ((bytesRead = fileInputStream.read(buffer)) != -1) {
+            os.write(buffer, 0, bytesRead);
+        }
+        os.flush();
+        os.close();
+    }
+
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageDocumentIssueRecycleServiceImpl.java b/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageDocumentIssueRecycleServiceImpl.java
new file mode 100644
index 0000000..74a57c4
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageDocumentIssueRecycleServiceImpl.java
@@ -0,0 +1,202 @@
+package com.ruoyi.manage.service.impl;
+
+import cn.hutool.core.lang.UUID;
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.ExcelWriter;
+import com.alibaba.excel.write.metadata.WriteSheet;
+import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
+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.ruoyi.common.utils.QueryWrappers;
+import com.ruoyi.manage.dto.ManageDocumentIssueRecycleDto;
+import com.ruoyi.manage.mapper.ManageDocumentIssueRecycleMapper;
+import com.ruoyi.manage.mapper.ManageRecordCheckMapper;
+import com.ruoyi.manage.mapper.ManageRecordIssueRecycleMapper;
+import com.ruoyi.manage.pojo.ManageDocumentIssueRecycle;
+import com.ruoyi.manage.pojo.ManageRecordCheck;
+import com.ruoyi.manage.pojo.ManageRecordIssueRecycle;
+import com.ruoyi.manage.service.ManageDocumentIssueRecycleService;
+
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.multipart.MultipartFile;
+
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletResponse;
+import java.io.File;
+import java.io.IOException;
+import java.net.URLEncoder;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 鏂囦欢鍙戞斁鍥炴敹 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-09 09:18:24
+ */
+@Service
+@Transactional(rollbackFor = Exception.class)
+public class ManageDocumentIssueRecycleServiceImpl extends ServiceImpl<ManageDocumentIssueRecycleMapper, ManageDocumentIssueRecycle> implements ManageDocumentIssueRecycleService {
+
+    @Resource
+    private ManageDocumentIssueRecycleMapper manageDocumentIssueRecycleMapper;
+
+
+
+    @Value("${wordUrl}")
+    private String wordUrl;
+
+    @Resource
+    private ManageRecordCheckMapper manageRecordCheckMapper;
+
+    @Resource
+    private ManageRecordIssueRecycleMapper manageRecordIssueRecycleMapper;
+
+    @Override
+    public IPage<ManageDocumentIssueRecycleDto> pageManageDocumentIssueRecycle(Page page, ManageDocumentIssueRecycleDto manageDocumentIssueRecycleDto) {
+        return manageDocumentIssueRecycleMapper.pageManageDocumentIssueRecycle(page, QueryWrappers.queryWrappers(manageDocumentIssueRecycleDto));
+    }
+
+    @Override
+    public ManageDocumentIssueRecycleDto getManageDocumentIssueRecycle(Long id) {
+        return manageDocumentIssueRecycleMapper.getManageDocumentIssueRecycle(id);
+    }
+
+    @Override
+    public void exportManageDocumentIssueRecycle(ManageDocumentIssueRecycleDto manageDocumentIssueRecycleDto, HttpServletResponse response)throws Exception {
+        List<ManageDocumentIssueRecycleDto> data = manageDocumentIssueRecycleMapper.pageManageDocumentIssueRecycle(new Page(-1, -1), QueryWrappers.queryWrappers(manageDocumentIssueRecycleDto)).getRecords();
+        response.setContentType("application/vnd.ms-excel");
+        response.setCharacterEncoding("UTF-8");
+        String fileName = URLEncoder.encode("鏂囦欢鍙戞斁鍥炴敹瀵煎嚭", "UTF-8");
+        response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
+        try {
+            // 鏂板缓ExcelWriter
+            ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()).build();
+            WriteSheet mainSheet = EasyExcel.writerSheet(0, "鏂囦欢鍙戞斁鍥炴敹瀵煎嚭").head(ManageDocumentIssueRecycleDto.class).build();
+            excelWriter.write(data, mainSheet);
+            // 鍏抽棴娴�
+            excelWriter.finish();
+        } catch (IOException e) {
+            throw new RuntimeException("瀵煎嚭澶辫触");
+        }
+    }
+
+    @Override
+    public int checkManageDocumentIssueRecycle(Integer id, String documentState) {
+        ManageDocumentIssueRecycle manageDocumentIssueRecycle = manageDocumentIssueRecycleMapper.selectById(id);
+        manageDocumentIssueRecycle.setDocumentState(documentState);
+        /*鏂板8.4鐨勬枃浠跺鎵硅褰�*/
+        ManageRecordCheck manageRecordCheck = new ManageRecordCheck();
+        manageRecordCheck.setDocumentCode(manageDocumentIssueRecycle.getDocumentCode());
+        manageRecordCheck.setDocumentName(manageDocumentIssueRecycle.getName());
+        manageRecordCheck.setDocumentVersion(manageDocumentIssueRecycle.getVersion());
+        manageRecordCheck.setCheckUser(manageDocumentIssueRecycle.getReceiveUser());
+        manageRecordCheck.setCheckState(documentState);
+        manageRecordCheckMapper.insert(manageRecordCheck);
+        return manageDocumentIssueRecycleMapper.updateById(manageDocumentIssueRecycle);
+    }
+
+    @Override
+    public int addManageDocumentIssueRecycle(ManageDocumentIssueRecycle manageDocumentIssueRecycle) {
+        manageDocumentIssueRecycle.setDocumentState("寰呭鏍�");
+        if (ObjectUtils.isNotEmpty(manageDocumentIssueRecycle.getFile())){
+            String urlString;
+            String pathName;
+            String path;
+            MultipartFile file = manageDocumentIssueRecycle.getFile();
+            //涓婁紶鏂版枃浠�
+            path = wordUrl;
+            try {
+                File realpath = new File(path);
+                if (!realpath.exists()) {
+                    realpath.mkdirs();
+                }
+                pathName = UUID.randomUUID() + "_" + file.getOriginalFilename();
+                urlString = realpath + "/" + pathName;
+                file.transferTo(new File(urlString));
+            } catch (Exception e) {
+                e.printStackTrace();
+                System.err.println("闄勪欢涓婁紶閿欒");
+                return 0;
+            }
+            manageDocumentIssueRecycle.setUrl(pathName);
+        }
+        /*鏂板8.3鐨勫彂鏀句笌鍥炴敹璁板綍*/
+        ManageRecordIssueRecycle manageRecordIssueRecycle = new ManageRecordIssueRecycle();
+        manageRecordIssueRecycle.setDocumentCode(manageDocumentIssueRecycle.getDocumentCode());
+        manageRecordIssueRecycle.setDocumentName(manageDocumentIssueRecycle.getName());
+        manageRecordIssueRecycle.setDocumentVersion(manageDocumentIssueRecycle.getVersion());
+        manageRecordIssueRecycle.setReceiveUser(manageDocumentIssueRecycle.getIssueUser());
+        manageRecordIssueRecycle.setReceiveDate(manageDocumentIssueRecycle.getIssueDate());
+        manageRecordIssueRecycleMapper.insert(manageRecordIssueRecycle);
+        return manageDocumentIssueRecycleMapper.insert(manageDocumentIssueRecycle);
+    }
+
+    @Override
+    public int doManageDocumentIssueRecycle(ManageDocumentIssueRecycle manageDocumentIssueRecycle) {
+        ManageDocumentIssueRecycle documentIssueRecycle = manageDocumentIssueRecycleMapper.selectById(manageDocumentIssueRecycle.getId());
+        //鍒よ鏄惁鏄洖鏀�
+        if (ObjectUtils.isNotEmpty(manageDocumentIssueRecycle.getRecycleUser())){
+            /*鏂板8.3鐨勫彂鏀句笌鍥炴敹璁板綍*/
+            ManageRecordIssueRecycle manageRecordIssueRecycle = manageRecordIssueRecycleMapper.selectOne(Wrappers.<ManageRecordIssueRecycle>lambdaQuery()
+                    .eq(ManageRecordIssueRecycle::getDocumentCode, documentIssueRecycle.getDocumentCode())
+                    .eq(ManageRecordIssueRecycle::getDocumentName, documentIssueRecycle.getName())
+                    .eq(ManageRecordIssueRecycle::getDocumentVersion, documentIssueRecycle.getVersion())
+                    .eq(ManageRecordIssueRecycle::getReceiveUser, documentIssueRecycle.getIssueUser())
+                    .eq(ManageRecordIssueRecycle::getReceiveDate, documentIssueRecycle.getIssueDate()));
+            manageRecordIssueRecycle.setSignedUser(manageDocumentIssueRecycle.getRecycleUser());
+            manageRecordIssueRecycle.setSignedDate(manageDocumentIssueRecycle.getRecycleDate());
+            manageRecordIssueRecycleMapper.updateById(manageRecordIssueRecycle);
+        }
+        if (ObjectUtils.isNotEmpty(manageDocumentIssueRecycle.getFile())) {
+            if (ObjectUtils.isNotEmpty(documentIssueRecycle.getUrl())) {
+                // 鍒犻櫎鏃ф枃浠�
+                File oldFile = new File(wordUrl + "/" + documentIssueRecycle.getUrl());
+                oldFile.delete();
+            }
+            //涓婁紶鏂版枃浠�
+            String urlString;
+            String pathName;
+            String path;
+            MultipartFile file = manageDocumentIssueRecycle.getFile();
+            path = wordUrl;
+            try {
+                File realpath = new File(path);
+                if (!realpath.exists()) {
+                    realpath.mkdirs();
+                }
+                pathName = UUID.randomUUID() + "_" + file.getOriginalFilename();
+                urlString = realpath + "/" + pathName;
+                file.transferTo(new File(urlString));
+                manageDocumentIssueRecycle.setUrl(pathName);
+            } catch (Exception e) {
+                e.printStackTrace();
+                System.err.println("闄勪欢涓婁紶閿欒");
+                return 0;
+            }
+        }
+        return manageDocumentIssueRecycleMapper.updateById(manageDocumentIssueRecycle);
+    }
+
+    @Override
+    public int delManageDocumentIssueRecycle(Long id) {
+        ManageDocumentIssueRecycle documentIssueRecycle = manageDocumentIssueRecycleMapper.selectById(id);
+        manageRecordIssueRecycleMapper.delete(Wrappers.<ManageRecordIssueRecycle>lambdaQuery()
+                .eq(ManageRecordIssueRecycle::getDocumentCode, documentIssueRecycle.getDocumentCode())
+                .eq(ManageRecordIssueRecycle::getDocumentName, documentIssueRecycle.getName())
+                .eq(ManageRecordIssueRecycle::getDocumentVersion, documentIssueRecycle.getVersion())
+                .eq(ManageRecordIssueRecycle::getReceiveUser, documentIssueRecycle.getIssueUser())
+                .eq(ManageRecordIssueRecycle::getReceiveDate, documentIssueRecycle.getIssueDate()));
+        return manageDocumentIssueRecycleMapper.deleteById(id);
+    }
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageDocumentListServiceImpl.java b/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageDocumentListServiceImpl.java
new file mode 100644
index 0000000..ef35755
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageDocumentListServiceImpl.java
@@ -0,0 +1,98 @@
+package com.ruoyi.manage.service.impl;
+
+import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.lang.UUID;
+import com.aspose.words.License;
+import com.aspose.words.SaveFormat;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+
+
+import com.ruoyi.common.utils.QueryWrappers;
+import com.ruoyi.manage.mapper.ManageDocumentListMapper;
+import com.ruoyi.manage.pojo.ManageDocumentList;
+import com.ruoyi.manage.service.ManageDocumentListService;
+
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.core.io.ClassPathResource;
+import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
+
+import jakarta.annotation.Resource;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ * 鏂囦欢娓呭崟
+ * 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-08 11:08:11
+ */
+@Service
+public class ManageDocumentListServiceImpl extends ServiceImpl<ManageDocumentListMapper, ManageDocumentList> implements ManageDocumentListService {
+
+    @Resource
+    private ManageDocumentListMapper manageDocumentListMapper;
+
+
+
+    @Value("${wordUrl}")
+    private String wordUrl;
+
+    @Override
+    public IPage<ManageDocumentList> pageManageDocumentList(Page page, ManageDocumentList manageDocumentList) {
+        return manageDocumentListMapper.pageManageDocumentList(page, QueryWrappers.queryWrappers(manageDocumentList));
+    }
+
+
+    @Override
+    public int uploadFile(Integer id, MultipartFile file) {
+        String urlString;
+        String pathName;
+        String path;
+        ManageDocumentList manageDocumentList = manageDocumentListMapper.selectById(id);
+        if (ObjectUtils.isNotEmpty(manageDocumentList.getUrl())){
+            // 鍒犻櫎鏃ф枃浠�
+            File oldFile = new File(wordUrl + "/" + manageDocumentList.getUrl());
+            oldFile.delete();
+        }
+        //涓婁紶鏂版枃浠�
+        path = wordUrl;
+        try {
+            File realpath = new File(path);
+            if (!realpath.exists()) {
+                realpath.mkdirs();
+            }
+            pathName = UUID.randomUUID() + "_" + file.getOriginalFilename();
+            urlString = realpath + "/" + pathName;
+            file.transferTo(new File(urlString));
+        } catch (Exception e) {
+            e.printStackTrace();
+            System.err.println("闄勪欢涓婁紶閿欒");
+            return 0;
+        }
+        manageDocumentList.setUrl(pathName);
+        return manageDocumentListMapper.updateById(manageDocumentList);
+    }
+
+    @Override
+    public void importExcel(List<ManageDocumentList> list) {
+        if (CollectionUtil.isEmpty(list)) {
+            return;
+        }
+        list = list.stream().filter(manageDocumentList -> ObjectUtils.isNotEmpty(manageDocumentList.getName())).collect(Collectors.toList());
+        saveBatch(list);
+    }
+
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageMeetingParticipantsServiceImpl.java b/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageMeetingParticipantsServiceImpl.java
new file mode 100644
index 0000000..4a1fbe6
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageMeetingParticipantsServiceImpl.java
@@ -0,0 +1,42 @@
+package com.ruoyi.manage.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.manage.mapper.ManageMeetingMapper;
+import com.ruoyi.manage.mapper.ManageMeetingParticipantsMapper;
+import com.ruoyi.manage.pojo.ManageMeeting;
+import com.ruoyi.manage.pojo.ManageMeetingParticipants;
+import com.ruoyi.manage.service.ManageMeetingParticipantsService;
+import com.ruoyi.manage.vo.MeetingParticipantsDetailsVo;
+import org.springframework.stereotype.Service;
+
+import jakarta.annotation.Resource;
+import java.util.List;
+
+/**
+ * <p>
+ *  鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-11 09:34:27
+ */
+@Service
+public class ManageMeetingParticipantsServiceImpl extends ServiceImpl<ManageMeetingParticipantsMapper, ManageMeetingParticipants> implements ManageMeetingParticipantsService {
+
+
+    @Resource
+    private ManageMeetingMapper manageMeetingMapper;
+
+    @Override
+    public MeetingParticipantsDetailsVo getParticipants(Integer id) {
+        ManageMeeting manageMeeting = manageMeetingMapper.selectById(id);
+        QueryWrapper<ManageMeetingParticipants> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("meeting_id",id);
+        List<ManageMeetingParticipants> participantsList = this.baseMapper.selectList(queryWrapper);
+        MeetingParticipantsDetailsVo vo = new MeetingParticipantsDetailsVo();
+        vo.setManageMeeting(manageMeeting);
+        vo.setParticipantsList(participantsList);
+        return vo;
+    }
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageMeetingServiceImpl.java b/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageMeetingServiceImpl.java
new file mode 100644
index 0000000..8e7e270
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageMeetingServiceImpl.java
@@ -0,0 +1,161 @@
+package com.ruoyi.manage.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.ruoyi.common.core.domain.entity.User;
+import com.ruoyi.inspect.util.HackLoopTableRenderPolicy;
+import com.ruoyi.manage.dto.ManageMeetingDto;
+import com.ruoyi.manage.dto.ManageMeetingParticipantsDto;
+import com.ruoyi.manage.mapper.ManageMeetingMapper;
+import com.ruoyi.manage.mapper.ManageMeetingParticipantsMapper;
+
+import com.ruoyi.manage.pojo.ManageMeeting;
+import com.ruoyi.manage.pojo.ManageMeetingParticipants;
+
+import com.ruoyi.manage.service.ManageMeetingService;
+
+import com.ruoyi.system.mapper.UserMapper;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import jakarta.annotation.Resource;
+import jakarta.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.stream.Collectors;
+
+/**
+ * <p>
+ * 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-11 09:33:47
+ */
+@Service
+public class ManageMeetingServiceImpl extends ServiceImpl<ManageMeetingMapper, ManageMeeting> implements ManageMeetingService {
+
+
+    @Resource
+    private ManageMeetingParticipantsMapper manageMeetingParticipantsMapper;
+
+    @Autowired
+    private UserMapper userMapper;
+
+    @Override
+    public IPage<ManageMeetingDto> page(Page page, String startTime, String endTime, String place) {
+        IPage<ManageMeetingDto> iPage = this.baseMapper.page(page, startTime, endTime, place);
+        for (ManageMeetingDto record : iPage.getRecords()) {
+            List<ManageMeetingParticipants> manageMeetingParticipants = manageMeetingParticipantsMapper.selectList(Wrappers.<ManageMeetingParticipants>lambdaQuery().eq(ManageMeetingParticipants::getMeetingId, record.getId()));
+            String collect = manageMeetingParticipants.stream().map(manageMeetingParticipants1 -> {
+                return manageMeetingParticipants1.getParticipants() + "";
+            }).collect(Collectors.joining(","));
+            record.setParticipant(collect);
+        }
+        return iPage;
+    }
+
+    @Override
+    public void addMeeting(ManageMeetingDto dto) {
+        this.baseMapper.insert(dto);
+
+        String[] ids = dto.getParticipant().split(",");
+        List<ManageMeetingParticipants> list = new ArrayList<>();
+        for (String id : ids) {
+            User user = userMapper.selectById(id);
+            ManageMeetingParticipants participants = new ManageMeetingParticipants();
+            participants.setMeetingId(dto.getId());
+            participants.setParticipants(Integer.parseInt(id));
+            participants.setDepartment(userMapper.selectUserDepartmentLimsName(user.getId()));
+            list.add(participants);
+        }
+        list.forEach(v -> manageMeetingParticipantsMapper.insert(v));
+    }
+
+    @Override
+    public int modifyMeeting(ManageMeetingDto manageMeetingDto) {
+        this.baseMapper.updateById(manageMeetingDto);
+        manageMeetingParticipantsMapper.delete(Wrappers.<ManageMeetingParticipants>lambdaQuery().eq(ManageMeetingParticipants::getMeetingId, manageMeetingDto.getId()));
+        String[] ids = manageMeetingDto.getParticipant().split(",");
+        List<ManageMeetingParticipants> list = new ArrayList<>();
+        for (String id : ids) {
+            User user = userMapper.selectById(id);
+            ManageMeetingParticipants participants = new ManageMeetingParticipants();
+            participants.setMeetingId(manageMeetingDto.getId());
+            participants.setParticipants(Integer.parseInt(id));
+            participants.setDepartment(userMapper.selectUserDepartmentLimsName(user.getId()));
+            list.add(participants);
+        }
+        list.forEach(v -> manageMeetingParticipantsMapper.insert(v));
+        return 0;
+    }
+
+    @Override
+    public void exportMeeting(Integer id, HttpServletResponse response) {
+        ManageMeeting meeting = baseMapper.selectById(id);
+        // 鏌ヨ鍙傚姞浜哄憳
+        List<ManageMeetingParticipants> manageMeetingParticipants = manageMeetingParticipantsMapper.selectList(Wrappers.<ManageMeetingParticipants>lambdaQuery().eq(ManageMeetingParticipants::getMeetingId, id));
+
+        List<ManageMeetingParticipants> list = manageMeetingParticipants.stream().map(manageMeetingParticipants1 -> {
+            manageMeetingParticipants1.setUserName(userMapper.selectById(manageMeetingParticipants1.getParticipants()).getName());
+            manageMeetingParticipants1.setDepartment(userMapper.selectUserDepartmentLimsName(manageMeetingParticipants1.getParticipants()));
+            return manageMeetingParticipants1;
+        }).collect(Collectors.toList());
+
+
+        // 鍒涘缓绌哄璞�
+        List<ManageMeetingParticipantsDto> participants = new ArrayList<>();
+
+        // 娣诲姞鍙傚姞浜哄憳
+        for (int i = 0; i < list.size(); i++) {
+            // 鍒ゆ柇鏈夋病鏈夊埌11琛�
+            if (i % 2 == 0) {
+                ManageMeetingParticipantsDto manageMeetingParticipantsDto = new ManageMeetingParticipantsDto();
+                manageMeetingParticipantsDto.setUserName1(list.get(i).getUserName());
+                manageMeetingParticipantsDto.setDepartment1(list.get(i).getDepartment());
+                participants.add(manageMeetingParticipantsDto);
+            } else {
+                participants.get((i-1)/2).setUserName2(list.get(i).getUserName());
+                participants.get((i-1)/2).setDepartment2(list.get(i).getDepartment());
+            }
+        }
+
+        InputStream inputStream = this.getClass().getResourceAsStream("/static/review-meet.docx");
+
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy骞碝M鏈坉d鏃�");
+        Configure configure = Configure.builder()
+                .bind("meetingDetails", new HackLoopTableRenderPolicy())
+                .build();
+        XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
+                new HashMap<String, Object>() {{
+                    put("meeting", meeting);
+                    put("meetingTime", meeting.getMeetingTime().format(formatter));
+                    put("meetingDetails", participants);
+                }});
+
+        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();
+            inputStream.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException("瀵煎嚭澶辫触");
+        }
+    }
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageRecordAuditServiceImpl.java b/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageRecordAuditServiceImpl.java
new file mode 100644
index 0000000..6d4ef2b
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageRecordAuditServiceImpl.java
@@ -0,0 +1,679 @@
+package com.ruoyi.manage.service.impl;
+
+import cn.hutool.core.lang.UUID;
+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.deepoove.poi.XWPFTemplate;
+import com.deepoove.poi.config.Configure;
+import com.deepoove.poi.config.ConfigureBuilder;
+
+
+import com.deepoove.poi.data.*;
+import com.deepoove.poi.data.style.*;
+import com.ruoyi.common.utils.QueryWrappers;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.framework.exception.ErrorException;
+import com.ruoyi.manage.mapper.ManageRecordAuditMapper;
+
+import com.ruoyi.manage.pojo.ManageRecordAudit;
+import com.ruoyi.manage.service.ManageRecordAuditService;
+
+import com.ruoyi.system.mapper.UserMapper;
+import org.apache.commons.io.IOUtils;
+import org.apache.poi.openxml4j.util.ZipSecureFile;
+import org.apache.poi.xwpf.usermodel.*;
+import org.openxmlformats.schemas.wordprocessingml.x2006.main.STMerge;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.multipart.MultipartFile;
+
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletResponse;
+import java.io.*;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.time.LocalDate;
+import java.util.*;
+
+/**
+ * <p>
+ * 鏂囦欢淇鐢宠瀹℃壒璁板綍 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-14 10:29:18
+ */
+@Service
+@Transactional(rollbackFor = Exception.class)
+public class ManageRecordAuditServiceImpl extends ServiceImpl<ManageRecordAuditMapper, ManageRecordAudit> implements ManageRecordAuditService {
+
+    @Resource
+    private ManageRecordAuditMapper manageRecordAuditMapper;
+
+    @Resource
+    private UserMapper userMapper;
+
+    @Value("${wordUrl}")
+    private String wordUrl;
+
+
+
+    @Override
+    public IPage<ManageRecordAudit> pageManageRecordAudit(Page page, ManageRecordAudit manageRecordAudit) {
+
+        IPage<ManageRecordAudit> manageRecordAuditIPage = manageRecordAuditMapper.pageManageRecordAudit(page, QueryWrappers.queryWrappers(manageRecordAudit));
+        for (ManageRecordAudit record : manageRecordAuditIPage.getRecords()) {
+            String limsName = userMapper.selectUserDepartmentLimsName(record.getCreateUser());
+            record.setCreateUserDepart(limsName);
+        }
+        return manageRecordAuditIPage;
+    }
+
+    @Override
+    public int addManageRecordAudit(ManageRecordAudit manageRecordAudit) {
+        if (ObjectUtils.isNotEmpty(manageRecordAudit.getFile())) {
+            String urlString;
+            String pathName;
+            String path;
+            MultipartFile file = manageRecordAudit.getFile();
+            //涓婁紶鏂版枃浠�
+            path = wordUrl;
+            try {
+                File realpath = new File(path);
+                if (!realpath.exists()) {
+                    realpath.mkdirs();
+                }
+                pathName = UUID.randomUUID() + "_" + file.getOriginalFilename();
+                urlString = realpath + "/" + pathName;
+                file.transferTo(new File(urlString));
+            } catch (Exception e) {
+                e.printStackTrace();
+                System.err.println("闄勪欢涓婁紶閿欒");
+                return 0;
+            }
+            manageRecordAudit.setAfterUrl(pathName);
+        }
+        manageRecordAudit.setCreateTime(LocalDate.now());
+        return manageRecordAuditMapper.insert(manageRecordAudit);
+    }
+
+    @Override
+    public int doManageRecordAudit(ManageRecordAudit manageRecordAudit) {
+        ManageRecordAudit recordAudit= manageRecordAuditMapper.selectById(manageRecordAudit.getId());
+        if (ObjectUtils.isNotEmpty(manageRecordAudit.getFile())) {
+            if (ObjectUtils.isNotEmpty(recordAudit.getAfterUrl())) {
+                // 鍒犻櫎鏃ф枃浠�
+                File oldFile = new File(wordUrl + "/" + recordAudit.getAfterUrl());
+                oldFile.delete();
+            }
+            //涓婁紶鏂版枃浠�
+            String urlString;
+            String pathName;
+            String path;
+            MultipartFile file = manageRecordAudit.getFile();
+            path = wordUrl;
+            try {
+                File realpath = new File(path);
+                if (!realpath.exists()) {
+                    realpath.mkdirs();
+                }
+                pathName = UUID.randomUUID() + "_" + file.getOriginalFilename();
+                urlString = realpath + "/" + pathName;
+                file.transferTo(new File(urlString));
+                manageRecordAudit.setAfterUrl(pathName);
+            } catch (Exception e) {
+                e.printStackTrace();
+                System.err.println("闄勪欢涓婁紶閿欒");
+                return 0;
+            }
+        }
+        return manageRecordAuditMapper.updateById(manageRecordAudit);
+    }
+
+    @Override
+    public int ratifyManageRecordAudit(Integer id) {
+        ManageRecordAudit recordAudit = manageRecordAuditMapper.selectById(id);
+        recordAudit.setRatifyUser(SecurityUtils.getUserId().intValue());
+        return manageRecordAuditMapper.updateById(recordAudit);
+    }
+
+    @Override
+    public String exportOutManageRecordAudit(ManageRecordAudit manageRecordAudit, HttpServletResponse response) {
+        List<ManageRecordAudit> manageRecordAuditList = manageRecordAuditMapper.pageManageRecordAudit(new Page(-1, -1), QueryWrappers.queryWrappers(manageRecordAudit)).getRecords();
+        for (ManageRecordAudit record : manageRecordAuditList) {
+            String limsName = userMapper.selectUserDepartmentLimsName(record.getCreateUser());
+            record.setCreateUserDepart(limsName);
+        }
+        //鐢熸垚妫�楠屾姤鍛婂彂鏀剧櫥璁拌〃
+        String url;
+        try {
+            InputStream inputStream = this.getClass().getResourceAsStream("/static/audit-deal.docx");
+            File file = File.createTempFile("temp", ".tmp");
+            OutputStream outputStream = new FileOutputStream(file);
+            IOUtils.copy(inputStream, outputStream);
+            url = file.getAbsolutePath();
+            inputStream.close();
+            outputStream.close();
+        } catch (FileNotFoundException e) {
+            throw new ErrorException("鎵句笉鍒版ā鏉挎枃浠�");
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+        ConfigureBuilder builder = Configure.builder();
+        builder.useSpringEL(true);
+
+        List<Map<String, Object>> auditList = new ArrayList<>();
+        Integer index = 1;
+        Integer index1 = 1;
+        for (int c = 0; c < manageRecordAuditList.size(); c++) {
+            //瓒呰繃15琛屾崲椤�
+            if (c % 15 == 0) {
+                List<RowRenderData> rows = new ArrayList<>();
+                //琛ㄦ牸鐨勮鏁�
+                for (int i = 0; i < 17; i++) {
+                    RowRenderData rowRenderData = new RowRenderData();
+                    RowStyle rowStyle = new RowStyle();
+                    rowStyle.setHeight(40);
+                    rowRenderData.setRowStyle(rowStyle);
+                    List<CellRenderData> cells = new ArrayList<>();
+                    //琛ㄦ牸鐨勫垪鏁�
+                    for (int j = 0; j < 11; j++) {
+                        CellRenderData cellRenderData = new CellRenderData();
+                        CellStyle cellStyle = new CellStyle();
+                        cellStyle.setVertAlign(XWPFTableCell.XWPFVertAlign.CENTER);
+                        cellRenderData.setCellStyle(cellStyle);
+                        List<ParagraphRenderData> paragraphRenderDataList = new ArrayList<>();
+                        ParagraphRenderData paragraphRenderData = new ParagraphRenderData();
+                        ParagraphStyle paragraphStyle = new ParagraphStyle();
+                        paragraphStyle.setAlign(ParagraphAlignment.CENTER);
+                        paragraphRenderData.setParagraphStyle(paragraphStyle);
+                        List<RenderData> renderData = new ArrayList<>();
+                        TextRenderData textRenderData = new TextRenderData();
+                        Style style = new Style();
+                        style.setFontFamily("瀹嬩綋");
+                        style.setColor("000000");
+                        textRenderData.setStyle(style);
+                        if (i == 0) {
+                            //绗竴琛�
+                            if (j == 0) {
+                                //绗竴鍒楀簭鍙�
+                                textRenderData.setText("搴忓彿@No.鈭�1");
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else if (j == 1) {
+                                //绗簩鍒�
+                                textRenderData.setText("鏂囦欢缂栧彿@File number鈭�2");
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else if (j == 2) {
+                                //绗笁鍒�
+                                textRenderData.setText("绔犺妭鍙稝Chapter number鈭�3");
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else if (j == 3) {
+                                //绗洓鍒�
+                                textRenderData.setText("椤电爜@Page number鈭�4");
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else if (j == 4) {
+                                //绗簲鍒�
+                                textRenderData.setText("淇娆℃暟@Number of revisions鈭�5");
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else if (j == 5 || j == 6) {
+                                //绗叚鍒�
+                                textRenderData.setText("鐗堟湰鍙� Version number鈭�6");
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else if (j == 7) {
+                                //绗竷鍒�
+                                textRenderData.setText("淇鍐呭@Revision of contents鈭�7");
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else if (j == 8) {
+                                //绗叓鍒�
+                                textRenderData.setText("淇浜篅Revised鈭�8");
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else if (j == 9 ) {
+                                //绗節鍒�
+                                textRenderData.setText("鎵瑰噯浜篅Approver鈭�9");
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else {
+                                //绗崄鍒�
+                                textRenderData.setText("鏃ユ湡@Date鈭�10");
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            }
+                        }
+                        else if (i == 1) {
+                            //绗竴琛�
+                            if (j == 0) {
+                                //绗竴鍒楀簭鍙�
+                                textRenderData.setText("搴忓彿@No.鈭�1");
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else if (j == 1) {
+                                //绗簩鍒�
+                                textRenderData.setText("鏂囦欢缂栧彿@File number鈭�2");
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else if (j == 2) {
+                                //绗笁鍒�
+                                textRenderData.setText("绔犺妭鍙稝Chapter number鈭�3");
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else if (j == 3) {
+                                //绗洓鍒�
+                                textRenderData.setText("椤电爜@Page number鈭�4");
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else if (j == 4) {
+                                //绗簲鍒�
+                                textRenderData.setText("淇娆℃暟@Number of revisions鈭�5");
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else if (j == 5 ) {
+                                //绗叚鍒�
+                                textRenderData.setText("淇敼鍓岪Before modification");
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else if (j == 6) {
+                                //绗竷鍒�
+                                textRenderData.setText("淇敼鍚嶡After modification");
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            }
+                            else if (j == 7) {
+                                //绗竷鍒�
+                                textRenderData.setText("淇鍐呭@Revision of contents鈭�7");
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else if (j == 8) {
+                                //绗叓鍒�
+                                textRenderData.setText("淇浜篅Revised鈭�8");
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else if (j == 9 ) {
+                                //绗節鍒�
+                                textRenderData.setText("鎵瑰噯浜篅Approver鈭�9");
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else {
+                                //绗崄鍒�
+                                textRenderData.setText("鏃ユ湡@Date鈭�10");
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            }
+                        }
+                        else {
+                            //鍏朵粬琛�
+                            if (j == 0) {
+                                //绗竴鍒�
+                                try {
+                                    String insReportCode = manageRecordAuditList.get((i - 2) + (index1 - 1) * 15).getDocumentCode();
+                                    textRenderData.setText(index + "");
+                                } catch (Exception e) {
+                                    textRenderData.setText("");
+                                }
+                                index++;
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else if (j == 1) {
+                                try {
+                                    textRenderData.setText(manageRecordAuditList.get((i - 2) + (index1 - 1) * 15).getDocumentCode());
+                                } catch (Exception e) {
+                                    textRenderData.setText("");
+                                }
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else if (j == 2) {
+                                try {
+                                    textRenderData.setText(manageRecordAuditList.get((i - 2) + (index1 - 1) * 15).getCapter());
+                                } catch (Exception e) {
+                                    textRenderData.setText("");
+                                }
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else if (j == 3) {
+                                try {
+                                    textRenderData.setText(manageRecordAuditList.get((i - 2) + (index1 - 1) * 15).getPages());
+                                } catch (Exception e) {
+                                    textRenderData.setText("");
+                                }
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else if (j == 4) {
+                                try {
+                                    textRenderData.setText(manageRecordAuditList.get((i - 2) + (index1 - 1) * 15).getNumber()+"");
+                                } catch (Exception e) {
+                                    textRenderData.setText("");
+                                }
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else if (j == 5) {
+                                try {
+                                    textRenderData.setText(manageRecordAuditList.get((i - 2) + (index1 - 1) * 15).getBeforeVersion());
+                                } catch (Exception e) {
+                                    textRenderData.setText("");
+                                }
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else if (j == 6) {
+                                try {
+                                    textRenderData.setText(manageRecordAuditList.get((i - 2) + (index1 - 1) * 15).getAfterVersion());
+                                } catch (Exception e) {
+                                    textRenderData.setText("");
+                                }
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else if (j == 7) {
+                                try {
+                                    textRenderData.setText(manageRecordAuditList.get((i - 2) + (index1 - 1) * 15).getAlterThing());
+                                } catch (Exception e) {
+                                    textRenderData.setText("");
+                                }
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else if (j == 8) {
+                                try {
+                                    textRenderData.setText(manageRecordAuditList.get((i - 2) + (index1 - 1) * 15).getAlterUserName());
+                                } catch (Exception e) {
+                                    textRenderData.setText("");
+                                }
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            }else if (j == 9) {
+                                try {
+                                    textRenderData.setText(manageRecordAuditList.get((i - 2) + (index1 - 1) * 15).getRatifyUserName());
+                                } catch (Exception e) {
+                                    textRenderData.setText("");
+                                }
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            }
+                            else {
+                                try {
+                                    textRenderData.setText(manageRecordAuditList.get((i - 2) + (index1 - 1) * 15).getDate()+"");
+                                } catch (Exception e) {
+                                    textRenderData.setText("");
+                                }
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            }
+                        }
+                    }
+                    rowRenderData.setCells(cells);
+                    if (rowRenderData.getCells().size() != 0) {
+                        rows.add(rowRenderData);
+                    }
+                }
+                TableRenderData tableRenderData = new TableRenderData();
+                tableRenderData.setRows(rows);
+                int countSize = tableRenderData.getRows().get(0).getCells().size();
+                for (RowRenderData row : tableRenderData.getRows()) {
+                    if (row.getCells().size() != countSize) {
+                        throw new ErrorException("姣忚鍗曞厓鏍间笉鐩哥瓑");
+                    }
+                }
+                TableStyle tableStyle = new TableStyle();
+                tableStyle.setWidth(XWPFTable.DEFAULT_PERCENTAGE_WIDTH);
+                tableStyle.setAlign(TableRowAlign.CENTER);
+                BorderStyle borderStyle = new BorderStyle();
+                borderStyle.setColor("000000");
+                borderStyle.setType(XWPFTable.XWPFBorderType.THICK);
+                borderStyle.setSize(14);
+                tableStyle.setLeftBorder(borderStyle);
+                tableStyle.setTopBorder(borderStyle);
+                tableStyle.setRightBorder(borderStyle);
+                tableStyle.setBottomBorder(borderStyle);
+                tableRenderData.setTableStyle(tableStyle);
+                Map<String, Object> table = new HashMap<>();
+                table.put("audit", tableRenderData);
+                table.put("index1", index1);
+                auditList.add(table);
+                index1++;
+            }
+        }
+        Integer finalIndex = index1;
+        XWPFTemplate template = XWPFTemplate.compile(url, builder.build()).render(
+                new HashMap<String, Object>() {{
+                    put("size", finalIndex);
+                    put("cancelList", auditList);
+                }});
+        String name = UUID.randomUUID() + "_鏂囦欢淇琛�" + ".docx";
+        try {
+            template.writeAndClose(Files.newOutputStream(Paths.get(wordUrl + "/" + name)));
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+        String path = wordUrl + "/" + name;
+        // 澶勭悊鍚堝苟鍗曞厓鏍肩殑闂
+        try {
+            ZipSecureFile.setMinInflateRatio(0.0001);
+            FileInputStream stream = new FileInputStream(path);
+            XWPFDocument document = new XWPFDocument(stream);
+            List<XWPFTable> xwpfTables = document.getTables();
+            for (int i = 0; i < xwpfTables.size(); i++) {
+                Set<String> set1 = new HashSet<>();
+                Map<String, Map<String, Integer>> maps = new HashMap<>();
+                for (int j = 0; j < xwpfTables.get(i).getRows().size(); j++) {
+                    for (int k = 0; k < xwpfTables.get(i).getRows().get(j).getTableCells().size(); k++) {
+                        if (xwpfTables.get(i).getRows().get(j).getTableCells().get(k).getText().indexOf("鈭�") > -1) {
+                            String[] split = xwpfTables.get(i).getRows().get(j).getTableCells().get(k).getText().split("鈭�");
+                            if (set1.add(split[1])) {
+                                Map<String, Integer> map = new HashMap<>();
+                                map.put("sr", j);
+                                map.put("sc", k);
+                                map.put("er", j + 0);
+                                map.put("ec", k + 0);
+                                maps.put(split[1], map);
+                            } else {
+                                Map<String, Integer> map1 = maps.get(split[1]);
+                                if (j == map1.get("sr")) {
+                                    map1.put("ec", map1.get("ec") + 1);
+                                } else if (k == map1.get("sc")) {
+                                    map1.put("er", map1.get("er") + 1);
+                                }
+                            }
+                            String str = xwpfTables.get(i).getRows().get(j).getTableCells().get(k).getText().split("鈭�")[0];
+                            xwpfTables.get(i).getRows().get(j).getTableCells().get(k).removeParagraph(0);
+                            xwpfTables.get(i).getRows().get(j).getTableCells().get(k).setText(str);
+                            xwpfTables.get(i).getRows().get(j).getTableCells().get(k).setVerticalAlignment(XWPFTableCell.XWPFVertAlign.CENTER);
+                            xwpfTables.get(i).getRows().get(j).getTableCells().get(k).getParagraphArray(0).setAlignment(ParagraphAlignment.CENTER);
+                        }
+                    }
+                }
+                // 鍗曞厓鏍兼帓搴�, 閬垮厤鏍煎紡閿欎贡
+                List<Map.Entry<String, Map<String, Integer>>> entries = new ArrayList<>(maps.entrySet());
+                entries.sort((o1, o2) -> o1.getValue().get("sc") - o2.getValue().get("sc"));
+                // 鎸夌収椤哄簭娣诲姞杩涢泦鍚�
+                List<String> list = new ArrayList<>();
+                for (Map.Entry<String, Map<String, Integer>> entry : entries) {
+                    list.add(entry.getKey());
+                }
+                for (int a = list.size() - 1; a >= 0; a--) {
+                    Map<String, Integer> v = maps.get(list.get(a));
+                    for (int j = 0; j < v.get("er") - v.get("sr") + 1; j++) {
+                        if (v.get("ec") > v.get("sc")) {
+                            try {
+                                mergeCellsHorizontally(xwpfTables.get(i), v.get("sr") + j, v.get("sc"), v.get("ec"));
+//                                TableTools.mergeCellsHorizonal(xwpfTables.get(i), v.get("sr") + j, v.get("sc"), v.get("ec"));
+                            } catch (Exception e) {
+                            }
+                        }
+                    }
+                    if (v.get("er") > v.get("sr")) {
+                        try {
+                            mergeCellsVertically(xwpfTables.get(i), v.get("sc"), v.get("sr"), v.get("er"));
+//                            TableTools.mergeCellsVertically(xwpfTables.get(i), v.get("sc"), v.get("sr"), v.get("er"));
+                        } catch (Exception e) {
+                        }
+                    }
+                }
+            }
+            FileOutputStream fileOutputStream = new FileOutputStream(path);
+            document.write(fileOutputStream);
+            fileOutputStream.close();
+        } catch (FileNotFoundException e) {
+            throw new RuntimeException(e);
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+        //澶勭悊涓嫳鏂囨崲琛岀殑闂
+        try {
+            FileInputStream stream1 = new FileInputStream(path);
+            XWPFDocument document1 = new XWPFDocument(stream1);
+            List<XWPFTable> xwpfTables1 = document1.getTables();
+            for (int i = 0; i < xwpfTables1.size(); i++) {
+                for (int j = 0; j < xwpfTables1.get(i).getRows().size(); j++) {
+                    for (int k = 0; k < xwpfTables1.get(i).getRows().get(j).getTableCells().size(); k++) {
+                        if (xwpfTables1.get(i).getRows().get(j).getTableCells().get(k).getText().contains("@")) {
+                            String text = xwpfTables1.get(i).getRows().get(j).getTableCells().get(k).getText();
+                            String[] split = text.split("@");
+                            xwpfTables1.get(i).getRows().get(j).getTableCells().get(k).removeParagraph(0);
+                            XWPFParagraph xwpfParagraph = xwpfTables1.get(i).getRows().get(j).getTableCells().get(k).addParagraph();
+                            XWPFRun run = xwpfParagraph.createRun();
+                            run.setText(split[0]);
+                            if (ObjectUtils.isNotNull(split[1])) {
+                                run.addBreak();
+                                run.setText(split[1]);
+                            }
+                            xwpfParagraph.setAlignment(ParagraphAlignment.CENTER);
+                        }
+                    }
+                }
+            }
+            FileOutputStream fileOutputStream1 = new FileOutputStream(path);
+            document1.write(fileOutputStream1);
+            fileOutputStream1.close();
+        } catch (FileNotFoundException e) {
+            throw new RuntimeException(e);
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+        return name;
+    }
+
+    // 姘村钩鍚堝苟鍗曞厓鏍�
+    private static void mergeCellsHorizontally(XWPFTable table, int row, int fromCol, int toCol) {
+        for (int i = fromCol; i <= toCol; i++) {
+            if (i == fromCol) {
+                table.getRow(row).getCell(i).getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.RESTART);
+            } else {
+                table.getRow(row).getCell(i).getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.CONTINUE);
+            }
+        }
+    }
+
+    // 鍨傜洿鍚堝苟鍗曞厓鏍�
+    private static void mergeCellsVertically(XWPFTable table, int col, int fromRow, int toRow) {
+        for (int i = fromRow; i <= toRow; i++) {
+            if (i == fromRow) {
+                table.getRow(i).getCell(col).getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.RESTART);
+            } else {
+                table.getRow(i).getCell(col).getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.CONTINUE);
+            }
+        }
+    }
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageRecordCancelServiceImpl.java b/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageRecordCancelServiceImpl.java
new file mode 100644
index 0000000..ad17167
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageRecordCancelServiceImpl.java
@@ -0,0 +1,486 @@
+package com.ruoyi.manage.service.impl;
+
+import cn.hutool.core.lang.UUID;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.baomidou.mybatisplus.core.toolkit.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.config.ConfigureBuilder;
+import com.deepoove.poi.data.*;
+import com.deepoove.poi.data.style.*;
+import com.ruoyi.common.core.domain.entity.User;
+import com.ruoyi.common.utils.QueryWrappers;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.framework.exception.ErrorException;
+import com.ruoyi.manage.mapper.ManageRecordCancelMapper;
+import com.ruoyi.manage.pojo.ManageRecordCancel;
+
+import com.ruoyi.manage.service.ManageRecordCancelService;
+
+import com.ruoyi.system.mapper.UserMapper;
+import org.apache.commons.io.IOUtils;
+import org.apache.poi.xwpf.usermodel.*;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.multipart.MultipartFile;
+
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletResponse;
+import java.io.*;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+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;
+
+/**
+ * <p>
+ * 浣滃簾鏂囦欢閿�榄傝褰� 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-13 01:27:22
+ */
+@Service
+@Transactional(rollbackFor = Exception.class)
+public class ManageRecordCancelServiceImpl extends ServiceImpl<ManageRecordCancelMapper, ManageRecordCancel> implements ManageRecordCancelService {
+
+    @Resource
+    private ManageRecordCancelMapper manageRecordCancelMapper;
+
+
+
+    @Value("${wordUrl}")
+    private String wordUrl;
+
+    @Resource
+    private UserMapper userMapper;
+
+    @Override
+    public IPage<ManageRecordCancel> pageManageRecordCancel(Page page, ManageRecordCancel manageRecordCancel) {
+        return manageRecordCancelMapper.pageManageRecordCancel(page, QueryWrappers.queryWrappers(manageRecordCancel));
+    }
+
+    @Override
+    public int ratifyManageRecordCancel(Integer id, String ratifyState) {
+        Integer userId = SecurityUtils.getUserId().intValue();
+        ManageRecordCancel manageRecordCancel = manageRecordCancelMapper.selectById(id);
+        manageRecordCancel.setRatifyUser(userId);
+        manageRecordCancel.setRatifyTime(LocalDate.now());
+        manageRecordCancel.setRatifyState(ratifyState);
+        return manageRecordCancelMapper.updateById(manageRecordCancel);
+    }
+
+    @Override
+    public String exportOutManageRecordCancel(ManageRecordCancel manageRecordCancel, HttpServletResponse response) {
+        List<ManageRecordCancel> manageRecordCancelList = manageRecordCancelMapper.pageManageRecordCancel(new Page(-1, -1), QueryWrappers.queryWrappers(manageRecordCancel)).getRecords();
+        //鐢熸垚妫�楠屾姤鍛婂彂鏀剧櫥璁拌〃
+        String url;
+        try {
+            InputStream inputStream = this.getClass().getResourceAsStream("/static/cancel-deal.docx");
+            File file = File.createTempFile("temp", ".tmp");
+            OutputStream outputStream = new FileOutputStream(file);
+            IOUtils.copy(inputStream, outputStream);
+            url = file.getAbsolutePath();
+            inputStream.close();
+            outputStream.close();
+        } catch (FileNotFoundException e) {
+            throw new ErrorException("鎵句笉鍒版ā鏉挎枃浠�");
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+        ConfigureBuilder builder = Configure.builder();
+        builder.useSpringEL(true);
+
+        List<Map<String, Object>> cancelList = new ArrayList<>();
+        Integer index = 1;
+        Integer index1 = 1;
+        for (int c = 0; c < manageRecordCancelList.size(); c++) {
+            //瓒呰繃15琛屾崲椤�
+            if (c % 15 == 0) {
+                List<RowRenderData> rows = new ArrayList<>();
+                //琛ㄦ牸鐨勮鏁�
+                for (int i = 0; i < 16; i++) {
+                    RowRenderData rowRenderData = new RowRenderData();
+                    RowStyle rowStyle = new RowStyle();
+                    rowStyle.setHeight(40);
+                    rowRenderData.setRowStyle(rowStyle);
+                    List<CellRenderData> cells = new ArrayList<>();
+                    //琛ㄦ牸鐨勫垪鏁�
+                    for (int j = 0; j < 10; j++) {
+                        CellRenderData cellRenderData = new CellRenderData();
+                        CellStyle cellStyle = new CellStyle();
+                        cellStyle.setVertAlign(XWPFTableCell.XWPFVertAlign.CENTER);
+                        cellRenderData.setCellStyle(cellStyle);
+                        List<ParagraphRenderData> paragraphRenderDataList = new ArrayList<>();
+                        ParagraphRenderData paragraphRenderData = new ParagraphRenderData();
+                        ParagraphStyle paragraphStyle = new ParagraphStyle();
+                        paragraphStyle.setAlign(ParagraphAlignment.CENTER);
+                        paragraphRenderData.setParagraphStyle(paragraphStyle);
+                        List<RenderData> renderData = new ArrayList<>();
+                        TextRenderData textRenderData = new TextRenderData();
+                        Style style = new Style();
+                        style.setFontFamily("瀹嬩綋");
+                        style.setColor("000000");
+                        textRenderData.setStyle(style);
+                        if (i == 0) {
+                            //绗竴琛�
+                            if (j == 0) {
+                                //绗竴鍒楀簭鍙�
+                                textRenderData.setText("搴忓彿@No.");
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else if (j == 1) {
+                                //绗簩鍒�
+                                textRenderData.setText("鏂囦欢缂栧彿@File number");
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else if (j == 2) {
+                                //绗笁鍒�
+                                textRenderData.setText("鏂囦欢(璁板綍)鍚嶇О@File (record) name");
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else if (j == 3) {
+                                //绗洓鍒�
+                                textRenderData.setText("鏁伴噺@Quantity");
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else if (j == 4) {
+                                //绗簲鍒�
+                                textRenderData.setText("閿�姣佸師鍥燖Reason for destruction");
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else if (j == 5) {
+                                //绗叚鍒�
+                                textRenderData.setText("鐢宠浜篅Applicant");
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else if (j == 6) {
+                                //绗竷鍒�
+                                textRenderData.setText("鏃ユ湡@Date");
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else if (j == 7) {
+                                //绗叓鍒�
+                                textRenderData.setText("鎵瑰噯@Approve");
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else if (j == 8 ) {
+                                //绗節鍒�
+                                textRenderData.setText("鏃ユ湡@Date");
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else {
+                                //绗崄鍒�
+                                textRenderData.setText("澶囨敞@Remark");
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            }
+                        }
+                        else {
+                            //鍏朵粬琛�
+                            if (j == 0) {
+                                //绗竴鍒�
+                                try {
+                                    String insReportCode = manageRecordCancelList.get((i - 1) + (index1 - 1) * 15).getDocumentCode();
+                                    textRenderData.setText(index + "");
+                                } catch (Exception e) {
+                                    textRenderData.setText("");
+                                }
+                                index++;
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else if (j == 1) {
+                                try {
+                                    textRenderData.setText(manageRecordCancelList.get((i - 1) + (index1 - 1) * 15).getDocumentCode());
+                                } catch (Exception e) {
+                                    textRenderData.setText("");
+                                }
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else if (j == 2) {
+                                try {
+                                    textRenderData.setText(manageRecordCancelList.get((i - 1) + (index1 - 1) * 15).getDocumentName());
+                                } catch (Exception e) {
+                                    textRenderData.setText("");
+                                }
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else if (j == 3) {
+                                try {
+                                    textRenderData.setText(manageRecordCancelList.get((i - 1) + (index1 - 1) * 15).getQty()+"");
+                                } catch (Exception e) {
+                                    textRenderData.setText("");
+                                }
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else if (j == 4) {
+                                try {
+                                    textRenderData.setText(manageRecordCancelList.get((i - 1) + (index1 - 1) * 15).getReason());
+                                } catch (Exception e) {
+                                    textRenderData.setText("");
+                                }
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else if (j == 5) {
+                                try {
+                                    textRenderData.setText(manageRecordCancelList.get((i - 1) + (index1 - 1) * 15).getCreateUserName());
+                                } catch (Exception e) {
+                                    textRenderData.setText("");
+                                }
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else if (j == 6) {
+                                try {
+                                    textRenderData.setText(manageRecordCancelList.get((i - 1) + (index1 - 1) * 15).getCreateTime()+"");
+                                } catch (Exception e) {
+                                    textRenderData.setText("");
+                                }
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else if (j == 7) {
+                                try {
+                                    textRenderData.setText(manageRecordCancelList.get((i - 1) + (index1 - 1) * 15).getRatifyUserName());
+                                } catch (Exception e) {
+                                    textRenderData.setText("");
+                                }
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else if (j == 8) {
+                                try {
+                                    textRenderData.setText(manageRecordCancelList.get((i - 1) + (index1 - 1) * 15).getRatifyTime()+"");
+                                } catch (Exception e) {
+                                    textRenderData.setText("");
+                                }
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            }else {
+                                try {
+                                    textRenderData.setText(manageRecordCancelList.get((i - 1) + (index1 - 1) * 15).getRemark());
+                                } catch (Exception e) {
+                                    textRenderData.setText("");
+                                }
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            }
+                        }
+                    }
+                    rowRenderData.setCells(cells);
+                    if (rowRenderData.getCells().size() != 0) {
+                        rows.add(rowRenderData);
+                    }
+                }
+                TableRenderData tableRenderData = new TableRenderData();
+                tableRenderData.setRows(rows);
+                int countSize = tableRenderData.getRows().get(0).getCells().size();
+                for (RowRenderData row : tableRenderData.getRows()) {
+                    if (row.getCells().size() != countSize) {
+                        throw new ErrorException("姣忚鍗曞厓鏍间笉鐩哥瓑");
+                    }
+                }
+                TableStyle tableStyle = new TableStyle();
+                tableStyle.setWidth(XWPFTable.DEFAULT_PERCENTAGE_WIDTH);
+                tableStyle.setAlign(TableRowAlign.CENTER);
+                BorderStyle borderStyle = new BorderStyle();
+                borderStyle.setColor("000000");
+                borderStyle.setType(XWPFTable.XWPFBorderType.THICK);
+                borderStyle.setSize(14);
+                tableStyle.setLeftBorder(borderStyle);
+                tableStyle.setTopBorder(borderStyle);
+                tableStyle.setRightBorder(borderStyle);
+                tableStyle.setBottomBorder(borderStyle);
+                tableRenderData.setTableStyle(tableStyle);
+                Map<String, Object> table = new HashMap<>();
+                table.put("cancel", tableRenderData);
+                table.put("index1", index1);
+                cancelList.add(table);
+                index1++;
+            }
+        }
+        Integer finalIndex = index1;
+        XWPFTemplate template = XWPFTemplate.compile(url, builder.build()).render(
+                new HashMap<String, Object>() {{
+                    put("size", finalIndex);
+                    put("cancelList", cancelList);
+                }});
+        String name = UUID.randomUUID() + "_鏂囦欢閿�姣佺敵璇疯〃" + ".docx";
+        try {
+            template.writeAndClose(Files.newOutputStream(Paths.get(wordUrl + "/" + name)));
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+        String path = wordUrl + "/" + name;
+        //澶勭悊涓嫳鏂囨崲琛岀殑闂
+        try {
+            FileInputStream stream1 = new FileInputStream(path);
+            XWPFDocument document1 = new XWPFDocument(stream1);
+            List<XWPFTable> xwpfTables1 = document1.getTables();
+            for (int i = 0; i < xwpfTables1.size(); i++) {
+                for (int j = 0; j < xwpfTables1.get(i).getRows().size(); j++) {
+                    for (int k = 0; k < xwpfTables1.get(i).getRows().get(j).getTableCells().size(); k++) {
+                        if (xwpfTables1.get(i).getRows().get(j).getTableCells().get(k).getText().contains("@")) {
+                            String text = xwpfTables1.get(i).getRows().get(j).getTableCells().get(k).getText();
+                            String[] split = text.split("@");
+                            xwpfTables1.get(i).getRows().get(j).getTableCells().get(k).removeParagraph(0);
+                            XWPFParagraph xwpfParagraph = xwpfTables1.get(i).getRows().get(j).getTableCells().get(k).addParagraph();
+                            XWPFRun run = xwpfParagraph.createRun();
+                            run.setText(split[0]);
+                            if (ObjectUtils.isNotNull(split[1])) {
+                                run.addBreak();
+                                run.setText(split[1]);
+                            }
+                            xwpfParagraph.setAlignment(ParagraphAlignment.CENTER);
+                        }
+                    }
+                }
+            }
+            FileOutputStream fileOutputStream1 = new FileOutputStream(path);
+            document1.write(fileOutputStream1);
+            fileOutputStream1.close();
+        } catch (FileNotFoundException e) {
+            throw new RuntimeException(e);
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+        return name;
+    }
+
+    @Override
+    public int exportInManageRecordCancel(MultipartFile file) {
+        List<ManageRecordCancel> manageRecordCancelList = new ArrayList<>();
+        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+        try {
+            InputStream inputStream = file.getInputStream();
+            XWPFDocument document = new XWPFDocument(inputStream);
+            List<XWPFTable> tables = document.getTables();
+            if (tables.isEmpty()) {
+                throw new ErrorException("鏂囨。涓病鏈夎〃鏍�");
+            }
+
+            for (XWPFTable table : tables) {
+                List<XWPFTableRow> rows = table.getRows();
+                if (rows.size() <= 1) {
+                    throw new ErrorException("琛ㄦ牸娌℃湁鏁版嵁琛�");
+                }
+                for (int i = 1; i < rows.size(); i++) { // 浠庣浜岃寮�濮嬶紝璺宠繃琛ㄥご
+                    XWPFTableRow row = rows.get(i);
+                    if (row.getTableCells().size() != 10) {
+                        continue;
+                    }
+                    if (ObjectUtils.isNotEmpty(row.getCell(1).getText())) {
+                        ManageRecordCancel manageRecordCancel = new ManageRecordCancel();
+                        manageRecordCancel.setDocumentCode(row.getCell(1).getText());
+                        manageRecordCancel.setDocumentName(row.getCell(2).getText());
+                        manageRecordCancel.setQty(Integer.valueOf(row.getCell(3).getText()));
+                        manageRecordCancel.setReason(row.getCell(4).getText());
+                        try {
+                            manageRecordCancel.setCreateUser(userMapper.selectOne(Wrappers.<User>lambdaQuery()
+                                    .eq(User::getName, row.getCell(5).getText())).getId());
+                        } catch (Exception e) {
+                            manageRecordCancel.setCreateUser(null);
+                        }
+                        try {
+                            manageRecordCancel.setRatifyUser(userMapper.selectOne(Wrappers.<User>lambdaQuery()
+                                    .eq(User::getName, row.getCell(7).getText())).getId());
+                        } catch (Exception e) {
+                            manageRecordCancel.setRatifyUser(null);
+                        }
+                        try {
+                            manageRecordCancel.setCreateTime(LocalDate.parse(row.getCell(6).getText(), dateTimeFormatter));
+                        } catch (Exception e) {
+                            manageRecordCancel.setCreateTime(null);
+                        }
+                        try {
+                            manageRecordCancel.setRatifyTime(LocalDate.parse(row.getCell(8).getText(), dateTimeFormatter));
+                        } catch (Exception e) {
+                            manageRecordCancel.setRatifyTime(null);
+                        }
+                        manageRecordCancel.setRemark(row.getCell(9).getText());
+                        ManageRecordCancel cancel = manageRecordCancelMapper.selectOne(Wrappers.<ManageRecordCancel>lambdaQuery()
+                                .eq(ManageRecordCancel::getDocumentCode, manageRecordCancel.getDocumentCode())
+                                .eq(ManageRecordCancel::getDocumentName, manageRecordCancel.getDocumentName()));
+                        if (ObjectUtils.isNotEmpty(cancel)) {
+                            manageRecordCancel.setId(cancel.getId());
+                        }
+                        manageRecordCancelList.add(manageRecordCancel);
+                    }
+                }
+            }
+            if(CollectionUtils.isEmpty(manageRecordCancelList)){
+                throw new RuntimeException("瀵煎叆妯℃澘鏈夎");
+            }
+            saveOrUpdateBatch(manageRecordCancelList);
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return 0;
+    }
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageRecordCheckServiceImpl.java b/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageRecordCheckServiceImpl.java
new file mode 100644
index 0000000..5c67cf5
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageRecordCheckServiceImpl.java
@@ -0,0 +1,475 @@
+package com.ruoyi.manage.service.impl;
+
+import cn.hutool.core.lang.UUID;
+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.deepoove.poi.XWPFTemplate;
+import com.deepoove.poi.config.Configure;
+import com.deepoove.poi.config.ConfigureBuilder;
+
+
+import com.deepoove.poi.data.*;
+import com.deepoove.poi.data.style.*;
+import com.ruoyi.common.core.domain.entity.User;
+import com.ruoyi.common.utils.QueryWrappers;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.framework.exception.ErrorException;
+import com.ruoyi.manage.mapper.ManageRecordCheckMapper;
+
+import com.ruoyi.manage.pojo.ManageRecordCheck;
+
+import com.ruoyi.manage.service.ManageRecordCheckService;
+
+import com.ruoyi.system.mapper.UserMapper;
+import org.apache.commons.io.IOUtils;
+import org.apache.poi.xwpf.usermodel.*;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.multipart.MultipartFile;
+
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletResponse;
+import java.io.*;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+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;
+
+/**
+ * <p>
+ * 鏂囦欢瀹℃壒璁板綍(鍚慨璁㈠悗鍐嶆瀹℃壒璁板綍) 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-12 02:31:36
+ */
+@Service
+@Transactional(rollbackFor = Exception.class)
+public class ManageRecordCheckServiceImpl extends ServiceImpl<ManageRecordCheckMapper, ManageRecordCheck> implements ManageRecordCheckService {
+
+    @Resource
+    private ManageRecordCheckMapper manageRecordCheckMapper;
+
+    @Value("${wordUrl}")
+    private String wordUrl;
+
+    @Resource
+    private UserMapper userMapper;
+
+
+
+    @Override
+    public IPage<ManageRecordCheck> pageManageRecordCheck(Page page, ManageRecordCheck manageRecordCheck) {
+        return manageRecordCheckMapper.pageManageRecordCheck(page, QueryWrappers.queryWrappers(manageRecordCheck));
+    }
+
+    @Override
+    public int checkManageRecordCheck(Integer id, String checkState) {
+        Integer userId = SecurityUtils.getUserId().intValue();
+        ManageRecordCheck manageRecordCheck = manageRecordCheckMapper.selectById(id);
+        manageRecordCheck.setCheckState(checkState);
+        manageRecordCheck.setCheckUser(userId);
+        return manageRecordCheckMapper.updateById(manageRecordCheck);
+    }
+
+    @Override
+    public int ratifyManageRecordCheck(Integer id, String ratifyState) {
+        Integer userId = SecurityUtils.getUserId().intValue();
+        ManageRecordCheck manageRecordCheck = manageRecordCheckMapper.selectById(id);
+        manageRecordCheck.setRatifyState(ratifyState);
+        manageRecordCheck.setRatifyUser(userId);
+        return manageRecordCheckMapper.updateById(manageRecordCheck);
+    }
+
+    @Override
+    public String exportOutManageRecordCheck(ManageRecordCheck manageRecordCheck, HttpServletResponse response) {
+        List<ManageRecordCheck> manageRecordCheckList = manageRecordCheckMapper.pageManageRecordCheck(new Page(-1, -1), QueryWrappers.queryWrappers(manageRecordCheck)).getRecords();
+        //鐢熸垚妫�楠屾姤鍛婂彂鏀剧櫥璁拌〃
+        String url;
+        try {
+            InputStream inputStream = this.getClass().getResourceAsStream("/static/check-deal.docx");
+            File file = File.createTempFile("temp", ".tmp");
+            OutputStream outputStream = new FileOutputStream(file);
+            IOUtils.copy(inputStream, outputStream);
+            url = file.getAbsolutePath();
+            inputStream.close();
+            outputStream.close();
+        } catch (FileNotFoundException e) {
+            throw new ErrorException("鎵句笉鍒版ā鏉挎枃浠�");
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+        ConfigureBuilder builder = Configure.builder();
+        builder.useSpringEL(true);
+
+        List<Map<String, Object>> checkList = new ArrayList<>();
+        Integer index = 1;
+        Integer index1 = 1;
+        for (int c = 0; c < manageRecordCheckList.size(); c++) {
+            //瓒呰繃20琛屾崲椤�
+            if (c % 20 == 0) {
+                List<RowRenderData> rows = new ArrayList<>();
+                //琛ㄦ牸鐨勮鏁�
+                for (int i = 0; i < 21; i++) {
+                    RowRenderData rowRenderData = new RowRenderData();
+                    RowStyle rowStyle = new RowStyle();
+                    rowStyle.setHeight(40);
+                    rowRenderData.setRowStyle(rowStyle);
+                    List<CellRenderData> cells = new ArrayList<>();
+                    //琛ㄦ牸鐨勫垪鏁�
+                    for (int j = 0; j < 9; j++) {
+                        CellRenderData cellRenderData = new CellRenderData();
+                        CellStyle cellStyle = new CellStyle();
+                        cellStyle.setVertAlign(XWPFTableCell.XWPFVertAlign.CENTER);
+                        cellRenderData.setCellStyle(cellStyle);
+                        List<ParagraphRenderData> paragraphRenderDataList = new ArrayList<>();
+                        ParagraphRenderData paragraphRenderData = new ParagraphRenderData();
+                        ParagraphStyle paragraphStyle = new ParagraphStyle();
+                        paragraphStyle.setAlign(ParagraphAlignment.CENTER);
+                        paragraphRenderData.setParagraphStyle(paragraphStyle);
+                        List<RenderData> renderData = new ArrayList<>();
+                        TextRenderData textRenderData = new TextRenderData();
+                        Style style = new Style();
+                        style.setFontFamily("瀹嬩綋");
+                        style.setColor("000000");
+                        textRenderData.setStyle(style);
+                        if (i == 0) {
+                            //绗竴琛�
+                            if (j == 0) {
+                                //绗竴鍒楀簭鍙�
+                                textRenderData.setText("搴忓彿@No.");
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else if (j == 1) {
+                                //绗簩鍒�
+                                textRenderData.setText("鏂囦欢鍚嶇О@File name");
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else if (j == 2) {
+                                //绗笁鍒�
+                                textRenderData.setText("鏂囦欢缂栧彿@File number");
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else if (j == 3) {
+                                //绗洓鍒�
+                                textRenderData.setText("鐗�/娆Edition/time");
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else if (j == 4) {
+                                //绗簲鍒�
+                                textRenderData.setText("缂栧埗@Editor");
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else if (j == 5) {
+                                //绗叚鍒�
+                                textRenderData.setText("瀹℃牳@Audit");
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else if (j == 6) {
+                                //绗竷鍒�
+                                textRenderData.setText("鎵瑰噯@Approve");
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else if (j == 7) {
+                                //绗叓鍒�
+                                textRenderData.setText("鎵瑰噯鏃ユ湡@Date of approve");
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else {
+                                //绗節鍒�
+                                textRenderData.setText("澶囨敞@Remark");
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            }
+                        } else {
+                            //鍏朵粬琛�
+                            if (j == 0) {
+                                //绗竴鍒�
+                                try {
+                                    String insReportCode = manageRecordCheckList.get((i - 1) + (index1 - 1) * 20).getDocumentName();
+                                    textRenderData.setText(index + "");
+                                } catch (Exception e) {
+                                    textRenderData.setText("");
+                                }
+                                index++;
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else if (j == 1) {
+                                try {
+                                    textRenderData.setText(manageRecordCheckList.get((i - 1) + (index1 - 1) * 20).getDocumentName());
+                                } catch (Exception e) {
+                                    textRenderData.setText("");
+                                }
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else if (j == 2) {
+                                try {
+                                    textRenderData.setText(manageRecordCheckList.get((i - 1) + (index1 - 1) * 20).getDocumentCode());
+                                } catch (Exception e) {
+                                    textRenderData.setText("");
+                                }
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else if (j == 3) {
+                                try {
+                                    textRenderData.setText(manageRecordCheckList.get((i - 1) + (index1 - 1) * 20).getDocumentVersion());
+                                } catch (Exception e) {
+                                    textRenderData.setText("");
+                                }
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else if (j == 4) {
+                                try {
+                                    textRenderData.setText(manageRecordCheckList.get((i - 1) + (index1 - 1) * 20).getWriteUserName());
+                                } catch (Exception e) {
+                                    textRenderData.setText("");
+                                }
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else if (j == 5) {
+                                try {
+                                    textRenderData.setText(manageRecordCheckList.get((i - 1) + (index1 - 1) * 20).getCheckUserName());
+                                } catch (Exception e) {
+                                    textRenderData.setText("");
+                                }
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else if (j == 6) {
+                                try {
+                                    textRenderData.setText(manageRecordCheckList.get((i - 1) + (index1 - 1) * 20).getRatifyUserName());
+                                } catch (Exception e) {
+                                    textRenderData.setText("");
+                                }
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else if (j == 7) {
+                                try {
+                                    textRenderData.setText(manageRecordCheckList.get((i - 1) + (index1 - 1) * 20).getRatifyDate() + "");
+                                } catch (Exception e) {
+                                    textRenderData.setText("");
+                                }
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else {
+                                try {
+                                    textRenderData.setText(manageRecordCheckList.get((i - 1) + (index1 - 1) * 20).getRemark());
+                                } catch (Exception e) {
+                                    textRenderData.setText("");
+                                }
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            }
+                        }
+                    }
+                    rowRenderData.setCells(cells);
+                    if (rowRenderData.getCells().size() != 0) {
+                        rows.add(rowRenderData);
+                    }
+                }
+                TableRenderData tableRenderData = new TableRenderData();
+                tableRenderData.setRows(rows);
+                int countSize = tableRenderData.getRows().get(0).getCells().size();
+                for (RowRenderData row : tableRenderData.getRows()) {
+                    if (row.getCells().size() != countSize) {
+                        throw new ErrorException("姣忚鍗曞厓鏍间笉鐩哥瓑");
+                    }
+                }
+                TableStyle tableStyle = new TableStyle();
+                tableStyle.setWidth(XWPFTable.DEFAULT_PERCENTAGE_WIDTH);
+                tableStyle.setAlign(TableRowAlign.CENTER);
+                BorderStyle borderStyle = new BorderStyle();
+                borderStyle.setColor("000000");
+                borderStyle.setType(XWPFTable.XWPFBorderType.THICK);
+                borderStyle.setSize(14);
+                tableStyle.setLeftBorder(borderStyle);
+                tableStyle.setTopBorder(borderStyle);
+                tableStyle.setRightBorder(borderStyle);
+                tableStyle.setBottomBorder(borderStyle);
+                tableRenderData.setTableStyle(tableStyle);
+                Map<String, Object> table = new HashMap<>();
+                table.put("check", tableRenderData);
+                table.put("index1", index1);
+                checkList.add(table);
+                index1++;
+            }
+        }
+        Integer finalIndex = index1;
+        XWPFTemplate template = XWPFTemplate.compile(url, builder.build()).render(
+                new HashMap<String, Object>() {{
+                    put("size", finalIndex);
+                    put("checkList", checkList);
+                }});
+        String name = UUID.randomUUID() + "_鏂囦欢瀹℃壒璁板綍" + ".docx";
+        try {
+            template.writeAndClose(Files.newOutputStream(Paths.get(wordUrl + "/" + name)));
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+        //澶勭悊涓嫳鏂囨崲琛岀殑闂
+        String path = wordUrl + "/" + name;
+        try {
+            FileInputStream stream1 = new FileInputStream(path);
+            XWPFDocument document1 = new XWPFDocument(stream1);
+            List<XWPFTable> xwpfTables1 = document1.getTables();
+            for (int i = 0; i < xwpfTables1.size(); i++) {
+                for (int j = 0; j < xwpfTables1.get(i).getRows().size(); j++) {
+                    for (int k = 0; k < xwpfTables1.get(i).getRows().get(j).getTableCells().size(); k++) {
+                        if (xwpfTables1.get(i).getRows().get(j).getTableCells().get(k).getText().contains("@")) {
+                            String text = xwpfTables1.get(i).getRows().get(j).getTableCells().get(k).getText();
+                            String[] split = text.split("@");
+                            xwpfTables1.get(i).getRows().get(j).getTableCells().get(k).removeParagraph(0);
+                            XWPFParagraph xwpfParagraph = xwpfTables1.get(i).getRows().get(j).getTableCells().get(k).addParagraph();
+                            XWPFRun run = xwpfParagraph.createRun();
+                            run.setText(split[0]);
+                            if (ObjectUtils.isNotNull(split[1])) {
+                                run.addBreak();
+                                run.setText(split[1]);
+                            }
+                            xwpfParagraph.setAlignment(ParagraphAlignment.CENTER);
+                        }
+                    }
+                }
+            }
+            FileOutputStream fileOutputStream1 = new FileOutputStream(path);
+            document1.write(fileOutputStream1);
+            fileOutputStream1.close();
+        } catch (FileNotFoundException e) {
+            throw new RuntimeException(e);
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+        return name;
+    }
+
+    @Override
+    public int exportInManageRecordCheck(MultipartFile file) {
+        List<ManageRecordCheck> manageRecordCheckList = new ArrayList<>();
+        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+        try {
+            InputStream inputStream = file.getInputStream();
+            XWPFDocument document = new XWPFDocument(inputStream);
+            List<XWPFTable> tables = document.getTables();
+            if (tables.isEmpty()) {
+                throw new ErrorException("鏂囨。涓病鏈夎〃鏍�");
+            }
+
+            for (XWPFTable table : tables) {
+                List<XWPFTableRow> rows = table.getRows();
+                if (rows.size() <= 1) {
+                    throw new ErrorException("琛ㄦ牸娌℃湁鏁版嵁琛�");
+                }
+                for (int i = 1; i < rows.size(); i++) { // 浠庣浜岃寮�濮嬶紝璺宠繃琛ㄥご
+                    XWPFTableRow row = rows.get(i);
+                    if (row.getTableCells().size() != 9) {
+                        continue;
+                    }
+                    if (ObjectUtils.isNotEmpty(row.getCell(1).getText())) {
+                        ManageRecordCheck manageRecordCheck = new ManageRecordCheck();
+                        manageRecordCheck.setDocumentName(row.getCell(1).getText());
+                        manageRecordCheck.setDocumentCode(row.getCell(2).getText());
+                        manageRecordCheck.setDocumentVersion(row.getCell(3).getText());
+                        try {
+                            manageRecordCheck.setWriteUser(userMapper.selectOne(Wrappers.<User>lambdaQuery()
+                                    .eq(User::getName, row.getCell(4).getText())).getId());
+                        } catch (Exception e) {
+                            manageRecordCheck.setWriteUser(null);
+                        }
+                        try {
+                            manageRecordCheck.setCheckUser(userMapper.selectOne(Wrappers.<User>lambdaQuery()
+                                    .eq(User::getName, row.getCell(5).getText())).getId());
+                        } catch (Exception e) {
+                            manageRecordCheck.setCheckUser(null);
+                        }
+                        try {
+                            manageRecordCheck.setRatifyUser(userMapper.selectOne(Wrappers.<User>lambdaQuery()
+                                    .eq(User::getName, row.getCell(6).getText())).getId());
+                        } catch (Exception e) {
+                            manageRecordCheck.setRatifyUser(null);
+                        }
+                        try {
+                            manageRecordCheck.setRatifyDate(LocalDate.parse(row.getCell(7).getText(), dateTimeFormatter));
+                        } catch (Exception e) {
+                            manageRecordCheck.setRatifyDate(null);
+                        }
+
+                        manageRecordCheck.setRemark(row.getCell(8).getText());
+                        ManageRecordCheck check = manageRecordCheckMapper.selectOne(Wrappers.<ManageRecordCheck>lambdaQuery()
+                                .eq(ManageRecordCheck::getDocumentCode, manageRecordCheck.getDocumentCode())
+                                .eq(ManageRecordCheck::getDocumentName, manageRecordCheck.getDocumentName())
+                                .eq(ManageRecordCheck::getDocumentVersion, manageRecordCheck.getDocumentVersion()));
+                        if (ObjectUtils.isNotEmpty(check)) {
+                            manageRecordCheck.setId(check.getId());
+                        }
+                        manageRecordCheckList.add(manageRecordCheck);
+                    }
+                }
+            }
+            saveOrUpdateBatch(manageRecordCheckList);
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return 0;
+    }
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageRecordIntervalsServiceImpl.java b/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageRecordIntervalsServiceImpl.java
new file mode 100644
index 0000000..9b24dc6
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageRecordIntervalsServiceImpl.java
@@ -0,0 +1,528 @@
+package com.ruoyi.manage.service.impl;
+
+import cn.hutool.core.lang.UUID;
+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.deepoove.poi.XWPFTemplate;
+import com.deepoove.poi.config.Configure;
+import com.deepoove.poi.config.ConfigureBuilder;
+
+
+import com.deepoove.poi.data.*;
+import com.deepoove.poi.data.style.*;
+import com.ruoyi.common.utils.QueryWrappers;
+import com.ruoyi.framework.exception.ErrorException;
+import com.ruoyi.manage.mapper.ManageRecordIntervalsMapper;
+import com.ruoyi.manage.mapper.ManageRecordIntervalsTotalMapper;
+import com.ruoyi.manage.pojo.ManageRecordIntervals;
+import com.ruoyi.manage.pojo.ManageRecordIntervalsTotal;
+import com.ruoyi.manage.service.ManageRecordIntervalsService;
+
+import org.apache.commons.io.IOUtils;
+import org.apache.poi.openxml4j.util.ZipSecureFile;
+import org.apache.poi.xwpf.usermodel.*;
+import org.openxmlformats.schemas.wordprocessingml.x2006.main.STMerge;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.multipart.MultipartFile;
+
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletResponse;
+import java.io.*;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
+import java.util.*;
+
+/**
+ * <p>
+ * 鏂囦欢瀹氭湡瀹℃煡璁板綍 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-13 10:54:31
+ */
+@Service
+@Transactional(rollbackFor = Exception.class)
+public class ManageRecordIntervalsServiceImpl extends ServiceImpl<ManageRecordIntervalsMapper, ManageRecordIntervals> implements ManageRecordIntervalsService {
+
+    @Resource
+    private ManageRecordIntervalsMapper manageRecordIntervalsMapper;
+
+    @Resource
+    private ManageRecordIntervalsTotalMapper manageRecordIntervalsTotalMapper;
+
+    @Value("${wordUrl}")
+    private String wordUrl;
+
+    @Override
+    public IPage<ManageRecordIntervals> pageManageRecordIntervals(Page page, ManageRecordIntervals manageRecordIntervals) {
+        return manageRecordIntervalsMapper.pageManageRecordIntervals(page, QueryWrappers.queryWrappers(manageRecordIntervals));
+    }
+
+    @Override
+    public String exportOutManageRecordIntervals(ManageRecordIntervals manageRecordIntervals, HttpServletResponse response) {
+        List<ManageRecordIntervals> manageRecordIntervalsList = manageRecordIntervalsMapper.pageManageRecordIntervals(new Page(-1, -1), QueryWrappers.queryWrappers(manageRecordIntervals)).getRecords();
+        //鐢熸垚妫�楠屾姤鍛婂彂鏀剧櫥璁拌〃
+        String url;
+        try {
+            InputStream inputStream = this.getClass().getResourceAsStream("/static/intervals-deal.docx");
+            File file = File.createTempFile("temp", ".tmp");
+            OutputStream outputStream = new FileOutputStream(file);
+            IOUtils.copy(inputStream, outputStream);
+            url = file.getAbsolutePath();
+            inputStream.close();
+            outputStream.close();
+        } catch (FileNotFoundException e) {
+            throw new ErrorException("鎵句笉鍒版ā鏉挎枃浠�");
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+        ConfigureBuilder builder = Configure.builder();
+        builder.useSpringEL(true);
+
+        List<Map<String, Object>> intervalsList = new ArrayList<>();
+        Integer index = 1;
+        Integer index1 = 1;
+        for (int c = 0; c < manageRecordIntervalsList.size(); c++) {
+            //瓒呰繃15琛屾崲椤�
+            if (c % 15 == 0) {
+                List<RowRenderData> rows = new ArrayList<>();
+                //琛ㄦ牸鐨勮鏁�
+                for (int i = 0; i < 17; i++) {
+                    RowRenderData rowRenderData = new RowRenderData();
+                    RowStyle rowStyle = new RowStyle();
+                    rowStyle.setHeight(40);
+                    rowRenderData.setRowStyle(rowStyle);
+                    List<CellRenderData> cells = new ArrayList<>();
+                    //琛ㄦ牸鐨勫垪鏁�
+                    for (int j = 0; j < 7; j++) {
+                        CellRenderData cellRenderData = new CellRenderData();
+                        CellStyle cellStyle = new CellStyle();
+                        cellStyle.setVertAlign(XWPFTableCell.XWPFVertAlign.CENTER);
+                        cellRenderData.setCellStyle(cellStyle);
+                        List<ParagraphRenderData> paragraphRenderDataList = new ArrayList<>();
+                        ParagraphRenderData paragraphRenderData = new ParagraphRenderData();
+                        ParagraphStyle paragraphStyle = new ParagraphStyle();
+                        paragraphStyle.setAlign(ParagraphAlignment.CENTER);
+                        paragraphRenderData.setParagraphStyle(paragraphStyle);
+                        List<RenderData> renderData = new ArrayList<>();
+                        TextRenderData textRenderData = new TextRenderData();
+                        Style style = new Style();
+                        style.setFontFamily("瀹嬩綋");
+                        style.setColor("000000");
+                        textRenderData.setStyle(style);
+                        if (i == 0) {
+                            //绗竴琛�
+                            if (j == 0) {
+                                //绗竴鍒楀簭鍙�
+                                textRenderData.setText("搴忓彿@No.");
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else if (j == 1) {
+                                //绗簩鍒�
+                                textRenderData.setText("鏂囦欢鍚嶇О@File name");
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else if (j == 2) {
+                                //绗笁鍒�
+                                textRenderData.setText("鏂囦欢缂栧彿@File number");
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else if (j == 3) {
+                                //绗洓鍒�
+                                textRenderData.setText("鐗堟湰鍙稝Version number");
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else if (j == 4) {
+                                //绗簲鍒�
+                                textRenderData.setText("淇鍙稝Revision number");
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else if (j == 5) {
+                                //绗叚鍒�
+                                textRenderData.setText("閫傚疁鎬Suitability");
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else {
+                                //绗竷鍒�
+                                textRenderData.setText("澶囨敞@Remark");
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            }
+                        }
+                        else if (i == 16) {
+                            //鏈�鍚庝竴琛�
+                            textRenderData.setText("娉細閫傚疁鎬т竴鏍忔墦鈥溾垰鈥濊〃姝ゆ枃浠堕�傚疁锛屸�溍椻�濊〃绀轰笉閫傚疁锛屾枃浠堕渶淇鎴栦綔搴熴�侤Note:The鈥溾垰鈥漷able in the suitability column is suitable for this document, the鈥溍椻�漷able is not suitable,and the document needs to berevised or invalidated @瀹℃煡鏃ユ湡锛� @Review Date:@鍙傚姞瀹℃煡浜哄憳绛惧悕锛欯Signatures of the reviewers particip ating in the review:鈭�1");
+                            renderData.add(textRenderData);
+                            paragraphRenderData.setContents(renderData);
+                            paragraphRenderDataList.add(paragraphRenderData);
+                            cellRenderData.setParagraphs(paragraphRenderDataList);
+                            cells.add(cellRenderData);
+                        }
+                        else {
+                            //鍏朵粬琛�
+                            if (j == 0) {
+                                //绗竴鍒�
+                                try {
+                                    String insReportCode = manageRecordIntervalsList.get((i - 1) + (index1 - 1) * 15).getDocumentCode();
+                                    textRenderData.setText(index + "");
+                                } catch (Exception e) {
+                                    textRenderData.setText("");
+                                }
+                                index++;
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else if (j == 1) {
+                                try {
+                                    textRenderData.setText(manageRecordIntervalsList.get((i - 1) + (index1 - 1) * 15).getDocumentName());
+                                } catch (Exception e) {
+                                    textRenderData.setText("");
+                                }
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else if (j == 2) {
+                                try {
+                                    textRenderData.setText(manageRecordIntervalsList.get((i - 1) + (index1 - 1) * 15).getDocumentCode());
+                                } catch (Exception e) {
+                                    textRenderData.setText("");
+                                }
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else if (j == 3) {
+                                try {
+                                    textRenderData.setText(manageRecordIntervalsList.get((i - 1) + (index1 - 1) * 15).getDocumentVersion());
+                                } catch (Exception e) {
+                                    textRenderData.setText("");
+                                }
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else if (j == 4) {
+                                try {
+                                    textRenderData.setText(manageRecordIntervalsList.get((i -1) + (index1 - 1) * 15).getRevision());
+                                } catch (Exception e) {
+                                    textRenderData.setText("");
+                                }
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else if (j == 5) {
+                                try {
+                                    textRenderData.setText(manageRecordIntervalsList.get((i - 1) + (index1 - 1) * 15).getSuitability());
+                                } catch (Exception e) {
+                                    textRenderData.setText("");
+                                }
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else {
+                                try {
+                                    textRenderData.setText(manageRecordIntervalsList.get((i - 1) + (index1 - 1) * 15).getRemark() );
+                                } catch (Exception e) {
+                                    textRenderData.setText("");
+                                }
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            }
+                        }
+                    }
+                    rowRenderData.setCells(cells);
+                    if (rowRenderData.getCells().size() != 0) {
+                        rows.add(rowRenderData);
+                    }
+                }
+                TableRenderData tableRenderData = new TableRenderData();
+                tableRenderData.setRows(rows);
+                int countSize = tableRenderData.getRows().get(0).getCells().size();
+                for (RowRenderData row : tableRenderData.getRows()) {
+                    if (row.getCells().size() != countSize) {
+                        throw new ErrorException("姣忚鍗曞厓鏍间笉鐩哥瓑");
+                    }
+                }
+                TableStyle tableStyle = new TableStyle();
+                tableStyle.setWidth(XWPFTable.DEFAULT_PERCENTAGE_WIDTH);
+                tableStyle.setAlign(TableRowAlign.CENTER);
+                BorderStyle borderStyle = new BorderStyle();
+                borderStyle.setColor("000000");
+                borderStyle.setType(XWPFTable.XWPFBorderType.THICK);
+                borderStyle.setSize(14);
+                tableStyle.setLeftBorder(borderStyle);
+                tableStyle.setTopBorder(borderStyle);
+                tableStyle.setRightBorder(borderStyle);
+                tableStyle.setBottomBorder(borderStyle);
+                tableRenderData.setTableStyle(tableStyle);
+                Map<String, Object> table = new HashMap<>();
+                table.put("intervals", tableRenderData);
+                table.put("index1", index1);
+                intervalsList.add(table);
+                index1++;
+            }
+        }
+        Integer finalIndex = index1;
+        XWPFTemplate template = XWPFTemplate.compile(url, builder.build()).render(
+                new HashMap<String, Object>() {{
+                    put("size", finalIndex);
+                    put("intervalsList", intervalsList);
+                }});
+        String name = UUID.randomUUID() + "_鏂囦欢瀹氭湡瀹℃煡璁板綍琛�" + ".docx";
+        try {
+            template.writeAndClose(Files.newOutputStream(Paths.get(wordUrl + "/" + name)));
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+        String path = wordUrl + "/" + name;
+        // 澶勭悊鍚堝苟鍗曞厓鏍肩殑闂
+        try {
+            ZipSecureFile.setMinInflateRatio(0.0001);
+            FileInputStream stream = new FileInputStream(path);
+            XWPFDocument document = new XWPFDocument(stream);
+            List<XWPFTable> xwpfTables = document.getTables();
+            for (int i = 0; i < xwpfTables.size(); i++) {
+                Set<String> set1 = new HashSet<>();
+                Map<String, Map<String, Integer>> maps = new HashMap<>();
+                for (int j = 0; j < xwpfTables.get(i).getRows().size(); j++) {
+                    for (int k = 0; k < xwpfTables.get(i).getRows().get(j).getTableCells().size(); k++) {
+                        if (xwpfTables.get(i).getRows().get(j).getTableCells().get(k).getText().indexOf("鈭�") > -1) {
+                            String[] split = xwpfTables.get(i).getRows().get(j).getTableCells().get(k).getText().split("鈭�");
+                            if (set1.add(split[1])) {
+                                Map<String, Integer> map = new HashMap<>();
+                                map.put("sr", j);
+                                map.put("sc", k);
+                                map.put("er", j + 0);
+                                map.put("ec", k + 0);
+                                maps.put(split[1], map);
+                            } else {
+                                Map<String, Integer> map1 = maps.get(split[1]);
+                                if (j == map1.get("sr")) {
+                                    map1.put("ec", map1.get("ec") + 1);
+                                } else if (k == map1.get("sc")) {
+                                    map1.put("er", map1.get("er") + 1);
+                                }
+                            }
+                            String str = xwpfTables.get(i).getRows().get(j).getTableCells().get(k).getText().split("鈭�")[0];
+                            xwpfTables.get(i).getRows().get(j).getTableCells().get(k).removeParagraph(0);
+                            xwpfTables.get(i).getRows().get(j).getTableCells().get(k).setText(str);
+                            xwpfTables.get(i).getRows().get(j).getTableCells().get(k).setVerticalAlignment(XWPFTableCell.XWPFVertAlign.CENTER);
+                            xwpfTables.get(i).getRows().get(j).getTableCells().get(k).getParagraphArray(0).setAlignment(ParagraphAlignment.CENTER);
+                        }
+                    }
+                }
+                // 鍗曞厓鏍兼帓搴�, 閬垮厤鏍煎紡閿欎贡
+                List<Map.Entry<String, Map<String, Integer>>> entries = new ArrayList<>(maps.entrySet());
+                entries.sort((o1, o2) -> o1.getValue().get("sc") - o2.getValue().get("sc"));
+                // 鎸夌収椤哄簭娣诲姞杩涢泦鍚�
+                List<String> list = new ArrayList<>();
+                for (Map.Entry<String, Map<String, Integer>> entry : entries) {
+                    list.add(entry.getKey());
+                }
+                for (int a = list.size() - 1; a >= 0; a--) {
+                    Map<String, Integer> v = maps.get(list.get(a));
+                    for (int j = 0; j < v.get("er") - v.get("sr") + 1; j++) {
+                        if (v.get("ec") > v.get("sc")) {
+                            try {
+                                mergeCellsHorizontally(xwpfTables.get(i), v.get("sr") + j, v.get("sc"), v.get("ec"));
+//                                TableTools.mergeCellsHorizonal(xwpfTables.get(i), v.get("sr") + j, v.get("sc"), v.get("ec"));
+                            } catch (Exception e) {
+                            }
+                        }
+                    }
+                    if (v.get("er") > v.get("sr")) {
+                        try {
+                            mergeCellsVertically(xwpfTables.get(i), v.get("sc"), v.get("sr"), v.get("er"));
+//                            TableTools.mergeCellsVertically(xwpfTables.get(i), v.get("sc"), v.get("sr"), v.get("er"));
+                        } catch (Exception e) {
+                        }
+                    }
+                }
+            }
+            FileOutputStream fileOutputStream = new FileOutputStream(path);
+            document.write(fileOutputStream);
+            fileOutputStream.close();
+        } catch (FileNotFoundException e) {
+            throw new RuntimeException(e);
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+        //澶勭悊涓嫳鏂囨崲琛岀殑闂
+        try {
+            FileInputStream stream1 = new FileInputStream(path);
+            XWPFDocument document1 = new XWPFDocument(stream1);
+            List<XWPFTable> xwpfTables1 = document1.getTables();
+            for (int i = 0; i < xwpfTables1.size(); i++) {
+                for (int j = 0; j < xwpfTables1.get(i).getRows().size(); j++) {
+                    for (int k = 0; k < xwpfTables1.get(i).getRows().get(j).getTableCells().size(); k++) {
+                        if (xwpfTables1.get(i).getRows().get(j).getTableCells().get(k).getText().contains("@")) {
+                            String text = xwpfTables1.get(i).getRows().get(j).getTableCells().get(k).getText();
+                            String[] split = text.split("@");
+                            xwpfTables1.get(i).getRows().get(j).getTableCells().get(k).removeParagraph(0);
+                            XWPFParagraph xwpfParagraph = xwpfTables1.get(i).getRows().get(j).getTableCells().get(k).addParagraph();
+                            XWPFRun run = xwpfParagraph.createRun();
+                            run.setText(split[0]);
+                            if (ObjectUtils.isNotNull(split[1])) {
+                                run.addBreak();
+                                run.setText(split[1]);
+                            }
+                            xwpfParagraph.setAlignment(ParagraphAlignment.CENTER);
+                        }
+                    }
+                }
+            }
+            FileOutputStream fileOutputStream1 = new FileOutputStream(path);
+            document1.write(fileOutputStream1);
+            fileOutputStream1.close();
+        } catch (FileNotFoundException e) {
+            throw new RuntimeException(e);
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+        return name;
+    }
+
+    @Override
+    public int exportInManageRecordIntervals(MultipartFile file) {
+        List<ManageRecordIntervals> manageRecordIntervalsList = new ArrayList<>();
+
+        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+        //鑾峰彇褰撳墠骞翠唤
+        LocalDate currentDate = LocalDate.now();
+        // 瀹氫箟鏃ユ湡鏍煎紡
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy");
+        // 鏍煎紡鍖栧綋鍓嶆棩鏈�
+        String currentMonth = currentDate.format(formatter);
+        ManageRecordIntervalsTotal manageRecordIntervalsTotal = manageRecordIntervalsTotalMapper.selectOne(Wrappers.<ManageRecordIntervalsTotal>lambdaQuery().eq(ManageRecordIntervalsTotal::getYear, currentMonth));
+        try {
+            InputStream inputStream = file.getInputStream();
+            XWPFDocument document = new XWPFDocument(inputStream);
+            List<XWPFTable> tables = document.getTables();
+            if (tables.isEmpty()) {
+                throw new ErrorException("鏂囨。涓病鏈夎〃鏍�");
+            }
+            for (XWPFTable table : tables) {
+                List<XWPFTableRow> rows = table.getRows();
+                if (rows.size() <= 1) {
+                    throw new ErrorException("琛ㄦ牸娌℃湁鏁版嵁琛�");
+                }
+                for (int i = 1; i < rows.size(); i++) { // 浠庣浜岃寮�濮嬶紝璺宠繃琛ㄥご
+                    XWPFTableRow row = rows.get(i);
+                    if (row.getTableCells().size() != 7) {
+                        continue;
+                    }
+                    if (ObjectUtils.isNotEmpty(row.getCell(1).getText())) {
+                        ManageRecordIntervals manageRecordIntervals = new ManageRecordIntervals();
+                        manageRecordIntervals.setDocumentName(row.getCell(1).getText());
+                        manageRecordIntervals.setDocumentCode(row.getCell(2).getText());
+                        manageRecordIntervals.setDocumentVersion(row.getCell(3).getText());
+                        manageRecordIntervals.setRevision(row.getCell(4).getText());
+                        manageRecordIntervals.setSuitability(row.getCell(5).getText());
+                        manageRecordIntervals.setRemark(row.getCell(6).getText());
+                        manageRecordIntervals.setRecordIntervalsTotalId(manageRecordIntervalsTotal.getId());
+                        ManageRecordIntervals intervals = manageRecordIntervalsMapper.selectOne(Wrappers.<ManageRecordIntervals>lambdaQuery()
+                                .eq(ManageRecordIntervals::getDocumentCode, manageRecordIntervals.getDocumentCode())
+                                .eq(ManageRecordIntervals::getDocumentName, manageRecordIntervals.getDocumentName())
+                                .eq(ManageRecordIntervals::getRecordIntervalsTotalId, manageRecordIntervalsTotal.getId())
+                                .eq(ManageRecordIntervals::getDocumentVersion, manageRecordIntervals.getDocumentVersion()));
+                        if (ObjectUtils.isNotEmpty(intervals)) {
+                            manageRecordIntervals.setId(intervals.getId());
+                        }
+                        manageRecordIntervalsList.add(manageRecordIntervals);
+                    }
+                }
+            }
+            saveOrUpdateBatch(manageRecordIntervalsList);
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return 0;
+    }
+
+    @Override
+    public int addManageRecordIntervals(ManageRecordIntervals manageRecordIntervals) {
+        //鑾峰彇褰撳墠骞翠唤
+        LocalDate currentDate = LocalDate.now();
+        // 瀹氫箟鏃ユ湡鏍煎紡
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy");
+        // 鏍煎紡鍖栧綋鍓嶆棩鏈�
+        String currentMonth = currentDate.format(formatter);
+        ManageRecordIntervalsTotal manageRecordIntervalsTotal = manageRecordIntervalsTotalMapper.selectOne(Wrappers.<ManageRecordIntervalsTotal>lambdaQuery().eq(ManageRecordIntervalsTotal::getYear, currentMonth));
+        manageRecordIntervals.setRecordIntervalsTotalId(manageRecordIntervalsTotal.getId());
+        manageRecordIntervalsMapper.insert(manageRecordIntervals);
+        manageRecordIntervalsTotal.setTotalNum(1 + manageRecordIntervalsTotal.getTotalNum());
+        return manageRecordIntervalsTotalMapper.updateById(manageRecordIntervalsTotal);
+    }
+
+    @Override
+    public int delManageRecordIntervals(Integer id) {
+        ManageRecordIntervals manageRecordIntervals = manageRecordIntervalsMapper.selectById(id);
+        manageRecordIntervalsMapper.deleteById(id);
+        ManageRecordIntervalsTotal manageRecordIntervalsTotal = manageRecordIntervalsTotalMapper.selectById(manageRecordIntervals.getRecordIntervalsTotalId());
+        manageRecordIntervalsTotal.setTotalNum(manageRecordIntervalsTotal.getTotalNum() - 1);
+        return manageRecordIntervalsTotalMapper.updateById(manageRecordIntervalsTotal);
+    }
+
+    // 姘村钩鍚堝苟鍗曞厓鏍�
+    private static void mergeCellsHorizontally(XWPFTable table, int row, int fromCol, int toCol) {
+        for (int i = fromCol; i <= toCol; i++) {
+            if (i == fromCol) {
+                table.getRow(row).getCell(i).getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.RESTART);
+            } else {
+                table.getRow(row).getCell(i).getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.CONTINUE);
+            }
+        }
+    }
+
+    // 鍨傜洿鍚堝苟鍗曞厓鏍�
+    private static void mergeCellsVertically(XWPFTable table, int col, int fromRow, int toRow) {
+        for (int i = fromRow; i <= toRow; i++) {
+            if (i == fromRow) {
+                table.getRow(i).getCell(col).getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.RESTART);
+            } else {
+                table.getRow(i).getCell(col).getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.CONTINUE);
+            }
+        }
+    }
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageRecordIntervalsTotalServiceImpl.java b/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageRecordIntervalsTotalServiceImpl.java
new file mode 100644
index 0000000..ae21e58
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageRecordIntervalsTotalServiceImpl.java
@@ -0,0 +1,507 @@
+package com.ruoyi.manage.service.impl;
+
+import cn.hutool.core.lang.UUID;
+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.deepoove.poi.XWPFTemplate;
+import com.deepoove.poi.config.Configure;
+import com.deepoove.poi.config.ConfigureBuilder;
+
+
+import com.deepoove.poi.data.*;
+import com.deepoove.poi.data.style.*;
+import com.ruoyi.common.core.domain.entity.User;
+import com.ruoyi.common.utils.QueryWrappers;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.framework.exception.ErrorException;
+import com.ruoyi.manage.mapper.ManageRecordIntervalsMapper;
+import com.ruoyi.manage.mapper.ManageRecordIntervalsTotalMapper;
+
+import com.ruoyi.manage.pojo.ManageRecordIntervals;
+import com.ruoyi.manage.pojo.ManageRecordIntervalsTotal;
+import com.ruoyi.manage.service.ManageRecordIntervalsTotalService;
+
+import com.ruoyi.system.mapper.UserMapper;
+import org.apache.commons.io.IOUtils;
+import org.apache.poi.openxml4j.util.ZipSecureFile;
+import org.apache.poi.xwpf.usermodel.*;
+import org.openxmlformats.schemas.wordprocessingml.x2006.main.STMerge;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import jakarta.annotation.Resource;
+import java.io.*;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
+import java.util.*;
+
+/**
+ * <p>
+ * 鏂囦欢瀹氭湡瀹℃煡璁板綍鎬诲巻鍙茶褰曡〃 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-15 01:12:11
+ */
+@Service
+@Transactional(rollbackFor = Exception.class)
+public class ManageRecordIntervalsTotalServiceImpl extends ServiceImpl<ManageRecordIntervalsTotalMapper, ManageRecordIntervalsTotal> implements ManageRecordIntervalsTotalService {
+
+    @Value("${wordUrl}")
+    private String wordUrl;
+
+
+
+    @Resource
+    private UserMapper userMapper;
+
+    @Value("${file.path}")
+    private String imgUrl;
+
+    @Resource
+    private ManageRecordIntervalsTotalMapper manageRecordIntervalsTotalMapper;
+
+    @Resource
+    private ManageRecordIntervalsMapper manageRecordIntervalsMapper;
+
+    @Override
+    public IPage<ManageRecordIntervalsTotal> pageManageRecordIntervalsTotal(Page page, ManageRecordIntervalsTotal manageRecordIntervalsTotal) {
+        return manageRecordIntervalsTotalMapper.pageManageRecordIntervalsTotal(page, QueryWrappers.queryWrappers(manageRecordIntervalsTotal));
+    }
+
+    @Override
+    public int submitManageRecordIntervalsTotal(Integer id) {
+        Integer userId = SecurityUtils.getUserId().intValue();
+        User user = userMapper.selectById(userId);
+        if (ObjectUtils.isEmpty(user.getSignatureUrl())) throw new ErrorException("鏈壘鍒板~琛ㄤ汉鐨勭數瀛愮鍚�,璇蜂笂浼犺嚜宸辩殑鐢靛瓙绛惧悕!");
+        ManageRecordIntervalsTotal manageRecordIntervalsTotal = manageRecordIntervalsTotalMapper.selectById(id);
+        manageRecordIntervalsTotal.setSubmitUser(userId);
+        manageRecordIntervalsTotal.setSubmitDate(LocalDate.now());
+        manageRecordIntervalsTotal.setSubmitUrl(user.getSignatureUrl());
+        //鐢熸垚鏍峰搧澶勭悊鐢宠琛ㄥ苟灏嗗~琛ㄤ汉鐨勭數瀛愮鍚嶅嵃涓�
+        manageRecordIntervalsTotal.setUrl(recordTotaldeal(id,user.getSignatureUrl()));
+        return manageRecordIntervalsTotalMapper.updateById(manageRecordIntervalsTotal);
+    }
+
+    @Override
+    public int ratifyManageRecordIntervalsTotal(Integer id, String ratifyState) {
+        Integer userId = SecurityUtils.getUserId().intValue();
+        User user = userMapper.selectById(userId);
+        if (ObjectUtils.isEmpty(user.getSignatureUrl())) throw new ErrorException("鏈壘鍒版壒鍑嗕汉鐨勭數瀛愮鍚�,璇蜂笂浼犺嚜宸辩殑鐢靛瓙绛惧悕!");
+        ManageRecordIntervalsTotal manageRecordIntervalsTotal = manageRecordIntervalsTotalMapper.selectById(id);
+        manageRecordIntervalsTotal.setRatifyUser(userId);
+        manageRecordIntervalsTotal.setRatifyState(ratifyState);
+        manageRecordIntervalsTotal.setRatifyDate(LocalDate.now());
+        manageRecordIntervalsTotal.setRatifyUrl(user.getSignatureUrl());
+        //灏嗘壒鍑嗕汉鐨勭鍚嶅嵃涓�
+        String[] monthNames = {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"};
+        wordInsertUrl(new HashMap<String, Object>() {{
+            put("ratifyDateEn", monthNames[LocalDate.now().getMonthValue() - 1] + " " + LocalDate.now().getDayOfMonth() + ", " + LocalDate.now().getYear());
+            put("ratifyDate", LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy骞碝M鏈坉d鏃�")));
+            put("ratifyUrl", new FilePictureRenderData(100,50,imgUrl + "/" + user.getSignatureUrl()));
+        }},  wordUrl+"/"+manageRecordIntervalsTotal.getUrl());
+        return manageRecordIntervalsTotalMapper.updateById(manageRecordIntervalsTotal);
+    }
+
+    public int wordInsertUrl(Map<String, Object> map, String url) {
+        XWPFTemplate template = XWPFTemplate.compile(url).render(map);
+        try {
+            template.writeAndClose(Files.newOutputStream(Paths.get(url)));
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+        return 1;
+    }
+
+    private String recordTotaldeal(Integer id,String signatureUrl){
+        List<ManageRecordIntervals> manageRecordIntervalsList = manageRecordIntervalsMapper.selectList(Wrappers.<ManageRecordIntervals>lambdaQuery().eq(ManageRecordIntervals::getRecordIntervalsTotalId,id));
+        String[] monthNames = {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"};
+        //鐢熸垚妫�楠屾姤鍛婂彂鏀剧櫥璁拌〃
+        String url;
+        try {
+            InputStream inputStream = this.getClass().getResourceAsStream("/static/intervals-deal.docx");
+            File file = File.createTempFile("temp", ".tmp");
+            OutputStream outputStream = new FileOutputStream(file);
+            IOUtils.copy(inputStream, outputStream);
+            url = file.getAbsolutePath();
+            inputStream.close();
+            outputStream.close();
+        } catch (FileNotFoundException e) {
+            throw new ErrorException("鎵句笉鍒版ā鏉挎枃浠�");
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+        ConfigureBuilder builder = Configure.builder();
+        builder.useSpringEL(true);
+
+        List<Map<String, Object>> intervalsList = new ArrayList<>();
+        Integer index = 1;
+        Integer index1 = 1;
+        for (int c = 0; c < manageRecordIntervalsList.size(); c++) {
+            //瓒呰繃15琛屾崲椤�
+            if (c % 15 == 0) {
+                List<RowRenderData> rows = new ArrayList<>();
+                //琛ㄦ牸鐨勮鏁�
+                for (int i = 0; i < 17; i++) {
+                    RowRenderData rowRenderData = new RowRenderData();
+                    RowStyle rowStyle = new RowStyle();
+                    rowStyle.setHeight(40);
+                    rowRenderData.setRowStyle(rowStyle);
+                    List<CellRenderData> cells = new ArrayList<>();
+                    //琛ㄦ牸鐨勫垪鏁�
+                    for (int j = 0; j < 7; j++) {
+                        CellRenderData cellRenderData = new CellRenderData();
+                        CellStyle cellStyle = new CellStyle();
+                        cellStyle.setVertAlign(XWPFTableCell.XWPFVertAlign.CENTER);
+                        cellRenderData.setCellStyle(cellStyle);
+                        List<ParagraphRenderData> paragraphRenderDataList = new ArrayList<>();
+                        ParagraphRenderData paragraphRenderData = new ParagraphRenderData();
+                        ParagraphStyle paragraphStyle = new ParagraphStyle();
+                        paragraphStyle.setAlign(ParagraphAlignment.CENTER);
+                        paragraphRenderData.setParagraphStyle(paragraphStyle);
+                        List<RenderData> renderData = new ArrayList<>();
+                        TextRenderData textRenderData = new TextRenderData();
+                        Style style = new Style();
+                        style.setFontFamily("瀹嬩綋");
+                        style.setColor("000000");
+                        textRenderData.setStyle(style);
+                        if (i == 0) {
+                            //绗竴琛�
+                            if (j == 0) {
+                                //绗竴鍒楀簭鍙�
+                                textRenderData.setText("搴忓彿@No.");
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else if (j == 1) {
+                                //绗簩鍒�
+                                textRenderData.setText("鏂囦欢鍚嶇О@File name");
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else if (j == 2) {
+                                //绗笁鍒�
+                                textRenderData.setText("鏂囦欢缂栧彿@File number");
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else if (j == 3) {
+                                //绗洓鍒�
+                                textRenderData.setText("鐗堟湰鍙稝Version number");
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else if (j == 4) {
+                                //绗簲鍒�
+                                textRenderData.setText("淇鍙稝Revision number");
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else if (j == 5) {
+                                //绗叚鍒�
+                                textRenderData.setText("閫傚疁鎬Suitability");
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else {
+                                //绗竷鍒�
+                                textRenderData.setText("澶囨敞@Remark");
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            }
+                        }
+                        else if (i == 16) {
+                            //鏈�鍚庝竴琛�
+                            textRenderData.setText("娉細閫傚疁鎬т竴鏍忔墦鈥溾垰鈥濊〃姝ゆ枃浠堕�傚疁锛屸�溍椻�濊〃绀轰笉閫傚疁锛屾枃浠堕渶淇鎴栦綔搴熴�侤Note:The鈥溾垰鈥漷able in the suitability column is suitable for this document, the鈥溍椻�漷able is not suitable,and the document needs to berevised or invalidated @瀹℃煡鏃ユ湡锛� @Review Date:@鍙傚姞瀹℃煡浜哄憳绛惧悕锛欯Signatures of the reviewers particip ating in the review:鈭�22");
+                            renderData.add(textRenderData);
+                            paragraphRenderData.setContents(renderData);
+                            paragraphRenderDataList.add(paragraphRenderData);
+                            cellRenderData.setParagraphs(paragraphRenderDataList);
+                            cells.add(cellRenderData);
+                        }
+                        else {
+                            //鍏朵粬琛�
+                            if (j == 0) {
+                                //绗竴鍒�
+                                try {
+                                    String insReportCode = manageRecordIntervalsList.get((i - 1) + (index1 - 1) * 15).getDocumentCode();
+                                    textRenderData.setText(index + "");
+                                } catch (Exception e) {
+                                    textRenderData.setText("");
+                                }
+                                index++;
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else if (j == 1) {
+                                try {
+                                    textRenderData.setText(manageRecordIntervalsList.get((i - 1) + (index1 - 1) * 15).getDocumentName());
+                                } catch (Exception e) {
+                                    textRenderData.setText("");
+                                }
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else if (j == 2) {
+                                try {
+                                    textRenderData.setText(manageRecordIntervalsList.get((i - 1) + (index1 - 1) * 15).getDocumentCode());
+                                } catch (Exception e) {
+                                    textRenderData.setText("");
+                                }
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else if (j == 3) {
+                                try {
+                                    textRenderData.setText(manageRecordIntervalsList.get((i - 1) + (index1 - 1) * 15).getDocumentVersion());
+                                } catch (Exception e) {
+                                    textRenderData.setText("");
+                                }
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else if (j == 4) {
+                                try {
+                                    textRenderData.setText(manageRecordIntervalsList.get((i -1) + (index1 - 1) * 15).getRevision());
+                                } catch (Exception e) {
+                                    textRenderData.setText("");
+                                }
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else if (j == 5) {
+                                try {
+                                    textRenderData.setText(manageRecordIntervalsList.get((i - 1) + (index1 - 1) * 15).getSuitability());
+                                } catch (Exception e) {
+                                    textRenderData.setText("");
+                                }
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else {
+                                try {
+                                    textRenderData.setText(manageRecordIntervalsList.get((i - 1) + (index1 - 1) * 15).getRemark() );
+                                } catch (Exception e) {
+                                    textRenderData.setText("");
+                                }
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            }
+                        }
+                    }
+                    rowRenderData.setCells(cells);
+                    if (rowRenderData.getCells().size() != 0) {
+                        rows.add(rowRenderData);
+                    }
+                }
+                TableRenderData tableRenderData = new TableRenderData();
+                tableRenderData.setRows(rows);
+                int countSize = tableRenderData.getRows().get(0).getCells().size();
+                for (RowRenderData row : tableRenderData.getRows()) {
+                    if (row.getCells().size() != countSize) {
+                        throw new ErrorException("姣忚鍗曞厓鏍间笉鐩哥瓑");
+                    }
+                }
+                TableStyle tableStyle = new TableStyle();
+                tableStyle.setWidth(XWPFTable.DEFAULT_PERCENTAGE_WIDTH);
+                tableStyle.setAlign(TableRowAlign.CENTER);
+                BorderStyle borderStyle = new BorderStyle();
+                borderStyle.setColor("000000");
+                borderStyle.setType(XWPFTable.XWPFBorderType.THICK);
+                borderStyle.setSize(14);
+                tableStyle.setLeftBorder(borderStyle);
+                tableStyle.setTopBorder(borderStyle);
+                tableStyle.setRightBorder(borderStyle);
+                tableStyle.setBottomBorder(borderStyle);
+                tableRenderData.setTableStyle(tableStyle);
+                Map<String, Object> table = new HashMap<>();
+                table.put("intervals", tableRenderData);
+                table.put("index1", index1);
+                intervalsList.add(table);
+                index1++;
+            }
+        }
+        Integer finalIndex = index1;
+        XWPFTemplate template = XWPFTemplate.compile(url, builder.build()).render(
+                new HashMap<String, Object>() {{
+                    put("size", finalIndex);
+                    put("intervalsList", intervalsList);
+                    put("submitDate", LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy骞碝M鏈坉d鏃�")));
+                    put("submitDateEn", monthNames[LocalDate.now().getMonthValue() - 1] + " " + LocalDate.now().getDayOfMonth() + ", " + LocalDate.now().getYear());
+                    put("ratifyDate", "{{ratifyDate}}");
+                    put("ratifyDateEn","{{ratifyDateEn}}");
+                    put("ratifyUrl", null);
+                    put("writeUrl", new FilePictureRenderData(100,50,imgUrl + "/" + signatureUrl));
+                }});
+        String name = UUID.randomUUID() + "_鏂囦欢瀹氭湡瀹℃煡璁板綍琛�" + ".docx";
+        try {
+            template.writeAndClose(Files.newOutputStream(Paths.get(wordUrl + "/" + name)));
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+        String path = wordUrl + "/" + name;
+        // 澶勭悊鍚堝苟鍗曞厓鏍肩殑闂
+        try {
+            ZipSecureFile.setMinInflateRatio(0.0001);
+            FileInputStream stream = new FileInputStream(path);
+            XWPFDocument document = new XWPFDocument(stream);
+            List<XWPFTable> xwpfTables = document.getTables();
+            for (int i = 0; i < xwpfTables.size(); i++) {
+                Set<String> set1 = new HashSet<>();
+                Map<String, Map<String, Integer>> maps = new HashMap<>();
+                for (int j = 0; j < xwpfTables.get(i).getRows().size(); j++) {
+                    for (int k = 0; k < xwpfTables.get(i).getRows().get(j).getTableCells().size(); k++) {
+                        if (xwpfTables.get(i).getRows().get(j).getTableCells().get(k).getText().indexOf("鈭�") > -1) {
+                            String[] split = xwpfTables.get(i).getRows().get(j).getTableCells().get(k).getText().split("鈭�");
+                            if (set1.add(split[1])) {
+                                Map<String, Integer> map = new HashMap<>();
+                                map.put("sr", j);
+                                map.put("sc", k);
+                                map.put("er", j + 0);
+                                map.put("ec", k + 0);
+                                maps.put(split[1], map);
+                            } else {
+                                Map<String, Integer> map1 = maps.get(split[1]);
+                                if (j == map1.get("sr")) {
+                                    map1.put("ec", map1.get("ec") + 1);
+                                } else if (k == map1.get("sc")) {
+                                    map1.put("er", map1.get("er") + 1);
+                                }
+                            }
+                            String str = xwpfTables.get(i).getRows().get(j).getTableCells().get(k).getText().split("鈭�")[0];
+                            xwpfTables.get(i).getRows().get(j).getTableCells().get(k).removeParagraph(0);
+                            xwpfTables.get(i).getRows().get(j).getTableCells().get(k).setText(str);
+                            xwpfTables.get(i).getRows().get(j).getTableCells().get(k).setVerticalAlignment(XWPFTableCell.XWPFVertAlign.CENTER);
+                            xwpfTables.get(i).getRows().get(j).getTableCells().get(k).getParagraphArray(0).setAlignment(ParagraphAlignment.CENTER);
+                        }
+                    }
+                }
+                // 鍗曞厓鏍兼帓搴�, 閬垮厤鏍煎紡閿欎贡
+                List<Map.Entry<String, Map<String, Integer>>> entries = new ArrayList<>(maps.entrySet());
+                entries.sort((o1, o2) -> o1.getValue().get("sc") - o2.getValue().get("sc"));
+                // 鎸夌収椤哄簭娣诲姞杩涢泦鍚�
+                List<String> list = new ArrayList<>();
+                for (Map.Entry<String, Map<String, Integer>> entry : entries) {
+                    list.add(entry.getKey());
+                }
+                for (int a = list.size() - 1; a >= 0; a--) {
+                    Map<String, Integer> v = maps.get(list.get(a));
+                    for (int j = 0; j < v.get("er") - v.get("sr") + 1; j++) {
+                        if (v.get("ec") > v.get("sc")) {
+                            try {
+                                mergeCellsHorizontally(xwpfTables.get(i), v.get("sr") + j, v.get("sc"), v.get("ec"));
+//                                TableTools.mergeCellsHorizonal(xwpfTables.get(i), v.get("sr") + j, v.get("sc"), v.get("ec"));
+                            } catch (Exception e) {
+                            }
+                        }
+                    }
+                    if (v.get("er") > v.get("sr")) {
+                        try {
+                            mergeCellsVertically(xwpfTables.get(i), v.get("sc"), v.get("sr"), v.get("er"));
+//                            TableTools.mergeCellsVertically(xwpfTables.get(i), v.get("sc"), v.get("sr"), v.get("er"));
+                        } catch (Exception e) {
+                        }
+                    }
+                }
+            }
+            FileOutputStream fileOutputStream = new FileOutputStream(path);
+            document.write(fileOutputStream);
+            fileOutputStream.close();
+        } catch (FileNotFoundException e) {
+            throw new RuntimeException(e);
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+        //澶勭悊涓嫳鏂囨崲琛岀殑闂
+        try {
+            FileInputStream stream1 = new FileInputStream(path);
+            XWPFDocument document1 = new XWPFDocument(stream1);
+            List<XWPFTable> xwpfTables1 = document1.getTables();
+            for (int i = 0; i < xwpfTables1.size(); i++) {
+                for (int j = 0; j < xwpfTables1.get(i).getRows().size(); j++) {
+                    for (int k = 0; k < xwpfTables1.get(i).getRows().get(j).getTableCells().size(); k++) {
+                        if (xwpfTables1.get(i).getRows().get(j).getTableCells().get(k).getText().contains("@")) {
+                            String text = xwpfTables1.get(i).getRows().get(j).getTableCells().get(k).getText();
+                            String[] split = text.split("@");
+                            xwpfTables1.get(i).getRows().get(j).getTableCells().get(k).removeParagraph(0);
+                            XWPFParagraph xwpfParagraph = xwpfTables1.get(i).getRows().get(j).getTableCells().get(k).addParagraph();
+                            XWPFRun run = xwpfParagraph.createRun();
+                            run.setText(split[0]);
+                            if (ObjectUtils.isNotNull(split[1])) {
+                                run.addBreak();
+                                run.setText(split[1]);
+                            }
+                            xwpfParagraph.setAlignment(ParagraphAlignment.CENTER);
+                        }
+                    }
+                }
+            }
+            FileOutputStream fileOutputStream1 = new FileOutputStream(path);
+            document1.write(fileOutputStream1);
+            fileOutputStream1.close();
+        } catch (FileNotFoundException e) {
+            throw new RuntimeException(e);
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+        return name;
+    }
+
+    // 姘村钩鍚堝苟鍗曞厓鏍�
+    private static void mergeCellsHorizontally(XWPFTable table, int row, int fromCol, int toCol) {
+        for (int i = fromCol; i <= toCol; i++) {
+            if (i == fromCol) {
+                table.getRow(row).getCell(i).getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.RESTART);
+            } else {
+                table.getRow(row).getCell(i).getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.CONTINUE);
+            }
+        }
+    }
+
+    // 鍨傜洿鍚堝苟鍗曞厓鏍�
+    private static void mergeCellsVertically(XWPFTable table, int col, int fromRow, int toRow) {
+        for (int i = fromRow; i <= toRow; i++) {
+            if (i == fromRow) {
+                table.getRow(i).getCell(col).getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.RESTART);
+            } else {
+                table.getRow(i).getCell(col).getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.CONTINUE);
+            }
+        }
+    }
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageRecordIssueRecycleServiceImpl.java b/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageRecordIssueRecycleServiceImpl.java
new file mode 100644
index 0000000..71a64d4
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageRecordIssueRecycleServiceImpl.java
@@ -0,0 +1,701 @@
+package com.ruoyi.manage.service.impl;
+
+import cn.hutool.core.lang.UUID;
+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.deepoove.poi.XWPFTemplate;
+import com.deepoove.poi.config.Configure;
+import com.deepoove.poi.config.ConfigureBuilder;
+
+
+import com.deepoove.poi.data.*;
+import com.deepoove.poi.data.style.*;
+import com.ruoyi.common.core.domain.entity.User;
+import com.ruoyi.common.utils.QueryWrappers;
+import com.ruoyi.framework.exception.ErrorException;
+import com.ruoyi.manage.mapper.ManageRecordIssueRecycleMapper;
+
+import com.ruoyi.manage.pojo.ManageRecordIssueRecycle;
+
+import com.ruoyi.manage.service.ManageRecordIssueRecycleService;
+
+import com.ruoyi.system.mapper.UserMapper;
+import org.apache.commons.io.IOUtils;
+import org.apache.poi.openxml4j.util.ZipSecureFile;
+import org.apache.poi.xwpf.usermodel.*;
+import org.openxmlformats.schemas.wordprocessingml.x2006.main.STMerge;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.multipart.MultipartFile;
+
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletResponse;
+import java.io.*;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
+import java.util.*;
+
+/**
+ * <p>
+ * 鎵�鏈夋枃浠�(鍐呫�佸閮ㄦ枃浠�)鐨勫彂鏀句笌鍥炴敹璁板綍 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-13 09:11:05
+ */
+@Service
+@Transactional(rollbackFor = Exception.class)
+public class ManageRecordIssueRecycleServiceImpl extends ServiceImpl<ManageRecordIssueRecycleMapper, ManageRecordIssueRecycle> implements ManageRecordIssueRecycleService {
+
+    @Resource
+    private ManageRecordIssueRecycleMapper manageRecordIssueRecycleMapper;
+
+    @Value("${wordUrl}")
+    private String wordUrl;
+
+    @Resource
+    private UserMapper userMapper;
+
+    @Override
+    public IPage<ManageRecordIssueRecycle> pageManageRecordIssueRecycle(Page page, ManageRecordIssueRecycle manageRecordIssueRecycle) {
+        return manageRecordIssueRecycleMapper.pageManageRecordIssueRecycle(page, QueryWrappers.queryWrappers(manageRecordIssueRecycle));
+    }
+
+    @Override
+    public String exportOutManageRecordIssueRecycle(ManageRecordIssueRecycle manageRecordIssueRecycle, HttpServletResponse response) {
+        List<ManageRecordIssueRecycle> manageRecordIssueRecycleList = manageRecordIssueRecycleMapper.pageManageRecordIssueRecycle(new Page(-1, -1), QueryWrappers.queryWrappers(manageRecordIssueRecycle)).getRecords();
+        //鐢熸垚妫�楠屾姤鍛婂彂鏀剧櫥璁拌〃
+        String url;
+        try {
+            InputStream inputStream = this.getClass().getResourceAsStream("/static/recycle-deal.docx");
+            File file = File.createTempFile("temp", ".tmp");
+            OutputStream outputStream = new FileOutputStream(file);
+            IOUtils.copy(inputStream, outputStream);
+            url = file.getAbsolutePath();
+            inputStream.close();
+            outputStream.close();
+        } catch (FileNotFoundException e) {
+            throw new ErrorException("鎵句笉鍒版ā鏉挎枃浠�");
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+        ConfigureBuilder builder = Configure.builder();
+        builder.useSpringEL(true);
+
+        List<Map<String, Object>> recycleList = new ArrayList<>();
+        Integer index = 1;
+        Integer index1 = 1;
+        for (int c = 0; c < manageRecordIssueRecycleList.size(); c++) {
+            //瓒呰繃15琛屾崲椤�
+            if (c % 15 == 0) {
+                List<RowRenderData> rows = new ArrayList<>();
+                //琛ㄦ牸鐨勮鏁�
+                for (int i = 0; i < 17; i++) {
+                    RowRenderData rowRenderData = new RowRenderData();
+                    RowStyle rowStyle = new RowStyle();
+                    rowStyle.setHeight(40);
+                    rowRenderData.setRowStyle(rowStyle);
+                    List<CellRenderData> cells = new ArrayList<>();
+                    //琛ㄦ牸鐨勫垪鏁�
+                    for (int j = 0; j < 12; j++) {
+                        CellRenderData cellRenderData = new CellRenderData();
+                        CellStyle cellStyle = new CellStyle();
+                        cellStyle.setVertAlign(XWPFTableCell.XWPFVertAlign.CENTER);
+                        cellRenderData.setCellStyle(cellStyle);
+                        List<ParagraphRenderData> paragraphRenderDataList = new ArrayList<>();
+                        ParagraphRenderData paragraphRenderData = new ParagraphRenderData();
+                        ParagraphStyle paragraphStyle = new ParagraphStyle();
+                        paragraphStyle.setAlign(ParagraphAlignment.CENTER);
+                        paragraphRenderData.setParagraphStyle(paragraphStyle);
+                        List<RenderData> renderData = new ArrayList<>();
+                        TextRenderData textRenderData = new TextRenderData();
+                        Style style = new Style();
+                        style.setFontFamily("瀹嬩綋");
+                        style.setColor("000000");
+                        textRenderData.setStyle(style);
+                        if (i == 0) {
+                            //绗竴琛�
+                            if (j == 0) {
+                                //绗竴鍒楀簭鍙�
+                                textRenderData.setText("搴忓彿@No.鈭�1");
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else if (j == 1) {
+                                //绗簩鍒�
+                                textRenderData.setText("鏂囦欢缂栧彿@File number鈭�2");
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else if (j == 2) {
+                                //绗笁鍒�
+                                textRenderData.setText("鏂囦欢鍚嶇О@File name鈭�3");
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else if (j == 3) {
+                                //绗洓鍒�
+                                textRenderData.setText("鐗堝彿@Edition number鈭�4");
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else if (j == 4) {
+                                //绗簲鍒�
+                                textRenderData.setText("浠芥暟@Number of copies鈭�5");
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else if (j == 5) {
+                                //绗叚鍒�
+                                textRenderData.setText("鏂囦欢绫诲埆@File category鈭�6");
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else if (j == 6) {
+                                //绗竷鍒�
+                                textRenderData.setText("鍒嗗彂鍙稝Distribution number鈭�7");
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else if (j == 7) {
+                                //绗叓鍒�
+                                textRenderData.setText("鎺ユ敹閮ㄩ棬@Receiving department鈭�8");
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else if (j == 8 || j == 9) {
+                                //绗節鍒�
+                                textRenderData.setText("鍙戞斁 Issue鈭�9");
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else if (j == 10 || j == 11) {
+                                //绗叓鍒�
+                                textRenderData.setText("鍥炴敹 Reclaim鈭�10");
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            }
+                        }
+                        else if (i == 1) {
+                            //绗竴琛�
+                            if (j == 0) {
+                                //绗竴鍒楀簭鍙�
+                                textRenderData.setText("搴忓彿@No.鈭�1");
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else if (j == 1) {
+                                //绗簩鍒�
+                                textRenderData.setText("鏂囦欢缂栧彿@File number鈭�2");
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else if (j == 2) {
+                                //绗笁鍒�
+                                textRenderData.setText("鏂囦欢鍚嶇О@File name鈭�3");
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else if (j == 3) {
+                                //绗洓鍒�
+                                textRenderData.setText("鐗堝彿@Edition number鈭�4");
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else if (j == 4) {
+                                //绗簲鍒�
+                                textRenderData.setText("浠芥暟@Number of copies鈭�5");
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else if (j == 5) {
+                                //绗叚鍒�
+                                textRenderData.setText("鏂囦欢绫诲埆@File category鈭�6");
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else if (j == 6) {
+                                //绗竷鍒�
+                                textRenderData.setText("鍒嗗彂鍙稝Distribution number鈭�7");
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else if (j == 7) {
+                                //绗叓鍒�
+                                textRenderData.setText("鎺ユ敹閮ㄩ棬@Receiving department鈭�8");
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else if (j == 8) {
+                                //绗節鍒�
+                                textRenderData.setText("鎺ュ彈浜篅Recipients");
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else if (j == 9) {
+                                //绗崄鍒�
+                                textRenderData.setText("鏃ユ湡@Date");
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else if (j == 10) {
+                                //绗崄涓�鍒�
+                                textRenderData.setText("绛炬敹浜篅Signatory");
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else {
+                                //绗崄浜屽垪
+                                textRenderData.setText("鏃ユ湡@Date");
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            }
+                        }
+                        else {
+                            //鍏朵粬琛�
+                            if (j == 0) {
+                                //绗竴鍒�
+                                try {
+                                    String insReportCode = manageRecordIssueRecycleList.get((i - 2) + (index1 - 1) * 15).getDocumentCode();
+                                    textRenderData.setText(index + "");
+                                } catch (Exception e) {
+                                    textRenderData.setText("");
+                                }
+                                index++;
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else if (j == 1) {
+                                try {
+                                    textRenderData.setText(manageRecordIssueRecycleList.get((i - 2) + (index1 - 1) * 15).getDocumentCode());
+                                } catch (Exception e) {
+                                    textRenderData.setText("");
+                                }
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else if (j == 2) {
+                                try {
+                                    textRenderData.setText(manageRecordIssueRecycleList.get((i - 2) + (index1 - 1) * 15).getDocumentName());
+                                } catch (Exception e) {
+                                    textRenderData.setText("");
+                                }
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else if (j == 3) {
+                                try {
+                                    textRenderData.setText(manageRecordIssueRecycleList.get((i - 2) + (index1 - 1) * 15).getDocumentVersion());
+                                } catch (Exception e) {
+                                    textRenderData.setText("");
+                                }
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else if (j == 4) {
+                                try {
+                                    textRenderData.setText(manageRecordIssueRecycleList.get((i - 2) + (index1 - 1) * 15).getPages());
+                                } catch (Exception e) {
+                                    textRenderData.setText("");
+                                }
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else if (j == 5) {
+                                try {
+                                    textRenderData.setText(manageRecordIssueRecycleList.get((i - 2) + (index1 - 1) * 15).getDocumentType());
+                                } catch (Exception e) {
+                                    textRenderData.setText("");
+                                }
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else if (j == 6) {
+                                try {
+                                    textRenderData.setText(manageRecordIssueRecycleList.get((i - 2) + (index1 - 1) * 15).getNumber());
+                                } catch (Exception e) {
+                                    textRenderData.setText("");
+                                }
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else if (j == 7) {
+                                try {
+                                    textRenderData.setText(manageRecordIssueRecycleList.get((i - 2) + (index1 - 1) * 15).getDepartLims());
+                                } catch (Exception e) {
+                                    textRenderData.setText("");
+                                }
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else if (j == 8) {
+                                try {
+                                    textRenderData.setText(manageRecordIssueRecycleList.get((i - 2) + (index1 - 1) * 15).getReceiveUserName());
+                                } catch (Exception e) {
+                                    textRenderData.setText("");
+                                }
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else if (j == 9) {
+                                try {
+                                    textRenderData.setText(manageRecordIssueRecycleList.get((i - 2) + (index1 - 1) * 15).getReceiveDate() + "");
+                                } catch (Exception e) {
+                                    textRenderData.setText("");
+                                }
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else if (j == 10) {
+                                try {
+                                    textRenderData.setText(manageRecordIssueRecycleList.get((i - 2) + (index1 - 1) * 15).getSignedUserName());
+                                } catch (Exception e) {
+                                    textRenderData.setText("");
+                                }
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else {
+                                try {
+                                    textRenderData.setText(manageRecordIssueRecycleList.get((i - 2) + (index1 - 1) * 15).getSignedDate() + "");
+                                } catch (Exception e) {
+                                    textRenderData.setText("");
+                                }
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            }
+                        }
+                    }
+                    rowRenderData.setCells(cells);
+                    if (rowRenderData.getCells().size() != 0) {
+                        rows.add(rowRenderData);
+                    }
+                }
+                TableRenderData tableRenderData = new TableRenderData();
+                tableRenderData.setRows(rows);
+                int countSize = tableRenderData.getRows().get(0).getCells().size();
+                for (RowRenderData row : tableRenderData.getRows()) {
+                    if (row.getCells().size() != countSize) {
+                        throw new ErrorException("姣忚鍗曞厓鏍间笉鐩哥瓑");
+                    }
+                }
+                TableStyle tableStyle = new TableStyle();
+                tableStyle.setWidth(XWPFTable.DEFAULT_PERCENTAGE_WIDTH);
+                tableStyle.setAlign(TableRowAlign.CENTER);
+                BorderStyle borderStyle = new BorderStyle();
+                borderStyle.setColor("000000");
+                borderStyle.setType(XWPFTable.XWPFBorderType.THICK);
+                borderStyle.setSize(14);
+                tableStyle.setLeftBorder(borderStyle);
+                tableStyle.setTopBorder(borderStyle);
+                tableStyle.setRightBorder(borderStyle);
+                tableStyle.setBottomBorder(borderStyle);
+                tableRenderData.setTableStyle(tableStyle);
+                Map<String, Object> table = new HashMap<>();
+                table.put("recycle", tableRenderData);
+                table.put("index1", index1);
+                recycleList.add(table);
+                index1++;
+            }
+        }
+        Integer finalIndex = index1;
+        XWPFTemplate template = XWPFTemplate.compile(url, builder.build()).render(
+                new HashMap<String, Object>() {{
+                    put("size", finalIndex);
+                    put("recycleList", recycleList);
+                }});
+        String name = UUID.randomUUID() + "_鎵�鏈夋枃浠剁殑鍙戞斁涓庡洖鏀惰褰�" + ".docx";
+        try {
+            template.writeAndClose(Files.newOutputStream(Paths.get(wordUrl + "/" + name)));
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+        String path = wordUrl + "/" + name;
+        // 澶勭悊鍚堝苟鍗曞厓鏍肩殑闂
+        try {
+            ZipSecureFile.setMinInflateRatio(0.0001);
+            FileInputStream stream = new FileInputStream(path);
+            XWPFDocument document = new XWPFDocument(stream);
+            List<XWPFTable> xwpfTables = document.getTables();
+            for (int i = 0; i < xwpfTables.size(); i++) {
+                Set<String> set1 = new HashSet<>();
+                Map<String, Map<String, Integer>> maps = new HashMap<>();
+                for (int j = 0; j < xwpfTables.get(i).getRows().size(); j++) {
+                    for (int k = 0; k < xwpfTables.get(i).getRows().get(j).getTableCells().size(); k++) {
+                        if (xwpfTables.get(i).getRows().get(j).getTableCells().get(k).getText().indexOf("鈭�") > -1) {
+                            String[] split = xwpfTables.get(i).getRows().get(j).getTableCells().get(k).getText().split("鈭�");
+                            if (set1.add(split[1])) {
+                                Map<String, Integer> map = new HashMap<>();
+                                map.put("sr", j);
+                                map.put("sc", k);
+                                map.put("er", j + 0);
+                                map.put("ec", k + 0);
+                                maps.put(split[1], map);
+                            } else {
+                                Map<String, Integer> map1 = maps.get(split[1]);
+                                if (j == map1.get("sr")) {
+                                    map1.put("ec", map1.get("ec") + 1);
+                                } else if (k == map1.get("sc")) {
+                                    map1.put("er", map1.get("er") + 1);
+                                }
+                            }
+                            String str = xwpfTables.get(i).getRows().get(j).getTableCells().get(k).getText().split("鈭�")[0];
+                            xwpfTables.get(i).getRows().get(j).getTableCells().get(k).removeParagraph(0);
+                            xwpfTables.get(i).getRows().get(j).getTableCells().get(k).setText(str);
+                            xwpfTables.get(i).getRows().get(j).getTableCells().get(k).setVerticalAlignment(XWPFTableCell.XWPFVertAlign.CENTER);
+                            xwpfTables.get(i).getRows().get(j).getTableCells().get(k).getParagraphArray(0).setAlignment(ParagraphAlignment.CENTER);
+                        }
+                    }
+                }
+                // 鍗曞厓鏍兼帓搴�, 閬垮厤鏍煎紡閿欎贡
+                List<Map.Entry<String, Map<String, Integer>>> entries = new ArrayList<>(maps.entrySet());
+                entries.sort((o1, o2) -> o1.getValue().get("sc") - o2.getValue().get("sc"));
+                // 鎸夌収椤哄簭娣诲姞杩涢泦鍚�
+                List<String> list = new ArrayList<>();
+                for (Map.Entry<String, Map<String, Integer>> entry : entries) {
+                    list.add(entry.getKey());
+                }
+                for (int a = list.size() - 1; a >= 0; a--) {
+                    Map<String, Integer> v = maps.get(list.get(a));
+                    for (int j = 0; j < v.get("er") - v.get("sr") + 1; j++) {
+                        if (v.get("ec") > v.get("sc")) {
+                            try {
+                                mergeCellsHorizontally(xwpfTables.get(i), v.get("sr") + j, v.get("sc"), v.get("ec"));
+//                                TableTools.mergeCellsHorizonal(xwpfTables.get(i), v.get("sr") + j, v.get("sc"), v.get("ec"));
+                            } catch (Exception e) {
+                            }
+                        }
+                    }
+                    if (v.get("er") > v.get("sr")) {
+                        try {
+                            mergeCellsVertically(xwpfTables.get(i), v.get("sc"), v.get("sr"), v.get("er"));
+//                            TableTools.mergeCellsVertically(xwpfTables.get(i), v.get("sc"), v.get("sr"), v.get("er"));
+                        } catch (Exception e) {
+                        }
+                    }
+                }
+            }
+            FileOutputStream fileOutputStream = new FileOutputStream(path);
+            document.write(fileOutputStream);
+            fileOutputStream.close();
+        } catch (FileNotFoundException e) {
+            throw new RuntimeException(e);
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+        //澶勭悊涓嫳鏂囨崲琛岀殑闂
+        try {
+            FileInputStream stream1 = new FileInputStream(path);
+            XWPFDocument document1 = new XWPFDocument(stream1);
+            List<XWPFTable> xwpfTables1 = document1.getTables();
+            for (int i = 0; i < xwpfTables1.size(); i++) {
+                for (int j = 0; j < xwpfTables1.get(i).getRows().size(); j++) {
+                    for (int k = 0; k < xwpfTables1.get(i).getRows().get(j).getTableCells().size(); k++) {
+                        if (xwpfTables1.get(i).getRows().get(j).getTableCells().get(k).getText().contains("@")) {
+                            String text = xwpfTables1.get(i).getRows().get(j).getTableCells().get(k).getText();
+                            String[] split = text.split("@");
+                            xwpfTables1.get(i).getRows().get(j).getTableCells().get(k).removeParagraph(0);
+                            XWPFParagraph xwpfParagraph = xwpfTables1.get(i).getRows().get(j).getTableCells().get(k).addParagraph();
+                            XWPFRun run = xwpfParagraph.createRun();
+                            run.setText(split[0]);
+                            if (ObjectUtils.isNotNull(split[1])) {
+                                run.addBreak();
+                                run.setText(split[1]);
+                            }
+                            xwpfParagraph.setAlignment(ParagraphAlignment.CENTER);
+                        }
+                    }
+                }
+            }
+            FileOutputStream fileOutputStream1 = new FileOutputStream(path);
+            document1.write(fileOutputStream1);
+            fileOutputStream1.close();
+        } catch (FileNotFoundException e) {
+            throw new RuntimeException(e);
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+        return name;
+    }
+
+    @Override
+    public int exportInManageRecordIssueRecycle(MultipartFile file) {
+        List<ManageRecordIssueRecycle> manageRecordIssueRecycleList = new ArrayList<>();
+        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+        try {
+            InputStream inputStream = file.getInputStream();
+            XWPFDocument document = new XWPFDocument(inputStream);
+            List<XWPFTable> tables = document.getTables();
+            if (tables.isEmpty()) {
+                throw new ErrorException("鏂囨。涓病鏈夎〃鏍�");
+            }
+
+            for (XWPFTable table : tables) {
+                List<XWPFTableRow> rows = table.getRows();
+                if (rows.size() <= 1) {
+                    throw new ErrorException("琛ㄦ牸娌℃湁鏁版嵁琛�");
+                }
+                for (int i = 2; i < rows.size(); i++) { // 浠庣涓夎寮�濮嬶紝璺宠繃琛ㄥご
+                    XWPFTableRow row = rows.get(i);
+                    if (row.getTableCells().size() != 12) {
+                        continue;
+                    }
+                    if (ObjectUtils.isNotEmpty(row.getCell(1).getText())) {
+                        ManageRecordIssueRecycle manageRecordIssueRecycle = new ManageRecordIssueRecycle();
+                        manageRecordIssueRecycle.setDocumentCode(row.getCell(1).getText());
+                        manageRecordIssueRecycle.setDocumentName(row.getCell(2).getText());
+                        manageRecordIssueRecycle.setDocumentVersion(row.getCell(3).getText());
+                        manageRecordIssueRecycle.setPages(row.getCell(4).getText());
+                        manageRecordIssueRecycle.setDocumentType(row.getCell(5).getText());
+                        manageRecordIssueRecycle.setNumber(row.getCell(6).getText());
+                        manageRecordIssueRecycle.setDepartLims(row.getCell(7).getText());
+                        try {
+                            manageRecordIssueRecycle.setReceiveUser(userMapper.selectOne(Wrappers.<User>lambdaQuery()
+                                    .eq(User::getName, row.getCell(8).getText())).getId());
+                        } catch (Exception e) {
+                            manageRecordIssueRecycle.setReceiveUser(null);
+                        }
+                        try {
+                            manageRecordIssueRecycle.setSignedUser(userMapper.selectOne(Wrappers.<User>lambdaQuery()
+                                    .eq(User::getName, row.getCell(10).getText())).getId());
+                        } catch (Exception e) {
+                            manageRecordIssueRecycle.setSignedUser(null);
+                        }
+                        try {
+                            manageRecordIssueRecycle.setReceiveDate(LocalDate.parse(row.getCell(9).getText(), dateTimeFormatter));
+                        } catch (Exception e) {
+                            manageRecordIssueRecycle.setReceiveDate(null);
+                        }
+                        try {
+                            manageRecordIssueRecycle.setSignedDate(LocalDate.parse(row.getCell(11).getText(), dateTimeFormatter));
+                        } catch (Exception e) {
+                            manageRecordIssueRecycle.setSignedDate(null);
+                        }
+
+                        ManageRecordIssueRecycle issueRecycle = manageRecordIssueRecycleMapper.selectOne(Wrappers.<ManageRecordIssueRecycle>lambdaQuery()
+                                .eq(ManageRecordIssueRecycle::getDocumentCode, manageRecordIssueRecycle.getDocumentCode())
+                                .eq(ManageRecordIssueRecycle::getDocumentName, manageRecordIssueRecycle.getDocumentName())
+                                .eq(ManageRecordIssueRecycle::getDocumentVersion, manageRecordIssueRecycle.getDocumentVersion()));
+                        if (ObjectUtils.isNotEmpty(issueRecycle)) {
+                            manageRecordIssueRecycle.setId(issueRecycle.getId());
+                        }
+                        manageRecordIssueRecycleList.add(manageRecordIssueRecycle);
+                    }
+                }
+            }
+            saveOrUpdateBatch(manageRecordIssueRecycleList);
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return 0;
+    }
+
+    @Override
+    public int addManageRecordIssueRecycle(ManageRecordIssueRecycle manageRecordIssueRecycle) {
+        return manageRecordIssueRecycleMapper.insert(manageRecordIssueRecycle);
+    }
+
+    @Override
+    public int doManageRecordIssueRecycle(ManageRecordIssueRecycle manageRecordIssueRecycle) {
+        return manageRecordIssueRecycleMapper.updateById(manageRecordIssueRecycle);
+    }
+
+    // 姘村钩鍚堝苟鍗曞厓鏍�
+    private static void mergeCellsHorizontally(XWPFTable table, int row, int fromCol, int toCol) {
+        for (int i = fromCol; i <= toCol; i++) {
+            if (i == fromCol) {
+                table.getRow(row).getCell(i).getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.RESTART);
+            } else {
+                table.getRow(row).getCell(i).getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.CONTINUE);
+            }
+        }
+    }
+
+    // 鍨傜洿鍚堝苟鍗曞厓鏍�
+    private static void mergeCellsVertically(XWPFTable table, int col, int fromRow, int toRow) {
+        for (int i = fromRow; i <= toRow; i++) {
+            if (i == fromRow) {
+                table.getRow(i).getCell(col).getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.RESTART);
+            } else {
+                table.getRow(i).getCell(col).getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.CONTINUE);
+            }
+        }
+    }
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageRecordTotalServiceImpl.java b/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageRecordTotalServiceImpl.java
new file mode 100644
index 0000000..a617f0f
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageRecordTotalServiceImpl.java
@@ -0,0 +1,430 @@
+package com.ruoyi.manage.service.impl;
+
+import cn.hutool.core.lang.UUID;
+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.deepoove.poi.XWPFTemplate;
+import com.deepoove.poi.config.Configure;
+import com.deepoove.poi.config.ConfigureBuilder;
+
+
+import com.deepoove.poi.data.*;
+import com.deepoove.poi.data.style.*;
+import com.ruoyi.common.core.domain.entity.User;
+import com.ruoyi.common.utils.QueryWrappers;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.framework.exception.ErrorException;
+import com.ruoyi.manage.mapper.ManageRecordTotalMapper;
+import com.ruoyi.manage.mapper.ManageRecordVerifyMapper;
+
+import com.ruoyi.manage.pojo.ManageRecordTotal;
+import com.ruoyi.manage.pojo.ManageRecordVerify;
+
+import com.ruoyi.manage.service.ManageRecordTotalService;
+
+import com.ruoyi.system.mapper.UserMapper;
+import org.apache.commons.io.IOUtils;
+import org.apache.poi.xwpf.usermodel.*;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import jakarta.annotation.Resource;
+import java.io.*;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+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;
+
+/**
+ * <p>
+ * 澶栨潵鏂囦欢纭璁板綍鎬诲巻鍙茶褰曡〃 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-12 10:30:08
+ */
+@Service
+@Transactional(rollbackFor = Exception.class)
+public class ManageRecordTotalServiceImpl extends ServiceImpl<ManageRecordTotalMapper, ManageRecordTotal> implements ManageRecordTotalService {
+
+    @Resource
+    private ManageRecordTotalMapper manageRecordTotalMapper;
+
+    @Value("${wordUrl}")
+    private String wordUrl;
+
+
+
+    @Resource
+    private UserMapper userMapper;
+
+    @Value("${file.path}")
+    private String imgUrl;
+
+    @Resource
+    private ManageRecordVerifyMapper manageRecordVerifyMapper;
+
+    @Override
+    public IPage<ManageRecordTotal> pageManageRecordTotal(Page page, ManageRecordTotal manageRecordTotal) {
+        return manageRecordTotalMapper.pageProcessTotaldeal(page, QueryWrappers.queryWrappers(manageRecordTotal));
+    }
+
+    @Override
+    public int submitManageRecordTotal(Integer id) {
+        Integer userId = SecurityUtils.getUserId().intValue();
+        User user = userMapper.selectById(userId);
+        if (ObjectUtils.isEmpty(user.getSignatureUrl())) throw new ErrorException("鏈壘鍒板~琛ㄤ汉鐨勭數瀛愮鍚�,璇蜂笂浼犺嚜宸辩殑鐢靛瓙绛惧悕!");
+        ManageRecordTotal manageRecordTotal = manageRecordTotalMapper.selectById(id);
+        manageRecordTotal.setSubmitUser(userId);
+        manageRecordTotal.setSubmitDate(LocalDate.now());
+        manageRecordTotal.setSubmitUrl(user.getSignatureUrl());
+        //鐢熸垚鏍峰搧澶勭悊鐢宠琛ㄥ苟灏嗗~琛ㄤ汉鐨勭數瀛愮鍚嶅嵃涓�
+        manageRecordTotal.setUrl(recordTotaldeal(id,user.getSignatureUrl()));
+        return manageRecordTotalMapper.updateById(manageRecordTotal);
+    }
+
+    @Override
+    public int ratifyManageRecordTotal(Integer id, String ratifyState) {
+        Integer userId = SecurityUtils.getUserId().intValue();
+        User user = userMapper.selectById(userId);
+        if (ObjectUtils.isEmpty(user.getSignatureUrl())) throw new ErrorException("鏈壘鍒版壒鍑嗕汉鐨勭數瀛愮鍚�,璇蜂笂浼犺嚜宸辩殑鐢靛瓙绛惧悕!");
+        ManageRecordTotal manageRecordTotal = manageRecordTotalMapper.selectById(id);
+        manageRecordTotal.setRatifyUser(userId);
+        manageRecordTotal.setRatifyState(ratifyState);
+        manageRecordTotal.setRatifyDate(LocalDate.now());
+        manageRecordTotal.setRatifyUrl(user.getSignatureUrl());
+        //灏嗘壒鍑嗕汉鐨勭鍚嶅嵃涓�
+        String[] monthNames = {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"};
+        wordInsertUrl(new HashMap<String, Object>() {{
+            put("ratifyDateEn", monthNames[LocalDate.now().getMonthValue() - 1] + " " + LocalDate.now().getDayOfMonth() + ", " + LocalDate.now().getYear());
+            put("ratifyDate", LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy骞碝M鏈坉d鏃�")));
+            put("ratifyUrl", new FilePictureRenderData(100,50,imgUrl + "/" + user.getSignatureUrl()));
+        }},  wordUrl+"/"+manageRecordTotal.getUrl());
+        return manageRecordTotalMapper.updateById(manageRecordTotal);
+    }
+
+    public int wordInsertUrl(Map<String, Object> map, String url) {
+        XWPFTemplate template = XWPFTemplate.compile(url).render(map);
+        try {
+            template.writeAndClose(Files.newOutputStream(Paths.get(url)));
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+        return 1;
+    }
+
+
+    private String recordTotaldeal(Integer id,String signatureUrl){
+        List<ManageRecordVerify> manageRecordVerifies = manageRecordVerifyMapper.selectList(Wrappers.<ManageRecordVerify>lambdaQuery().eq(ManageRecordVerify::getManageRecordTotalId,id));
+        String url;
+        try {
+            InputStream inputStream = this.getClass().getResourceAsStream("/static/verify-deal.docx");
+            File file = File.createTempFile("temp", ".tmp");
+            OutputStream outputStream = new FileOutputStream(file);
+            IOUtils.copy(inputStream, outputStream);
+            url = file.getAbsolutePath();
+            inputStream.close();
+            outputStream.close();
+        } catch (FileNotFoundException e) {
+            throw new ErrorException("鎵句笉鍒版ā鏉挎枃浠�");
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+        ConfigureBuilder builder = Configure.builder();
+        builder.useSpringEL(true);
+        String[] monthNames = {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"};
+        List<Map<String, Object>> verifyList = new ArrayList<>();
+        Integer index = 1;
+        Integer index1 = 1;
+        for (int c = 0; c < manageRecordVerifies.size(); c++) {
+            //瓒呰繃21琛屾崲椤�
+            if (c % 20 == 0) {
+                List<RowRenderData> rows = new ArrayList<>();
+                //琛ㄦ牸鐨勮鏁�
+                for (int i = 0; i < 21; i++) {
+                    RowRenderData rowRenderData = new RowRenderData();
+                    RowStyle rowStyle = new RowStyle();
+                    rowStyle.setHeight(40);
+                    rowRenderData.setRowStyle(rowStyle);
+                    List<CellRenderData> cells = new ArrayList<>();
+                    //琛ㄦ牸鐨勫垪鏁�
+                    for (int j = 0; j < 8; j++) {
+                        CellRenderData cellRenderData = new CellRenderData();
+                        CellStyle cellStyle = new CellStyle();
+                        cellStyle.setVertAlign(XWPFTableCell.XWPFVertAlign.CENTER);
+                        cellRenderData.setCellStyle(cellStyle);
+                        List<ParagraphRenderData> paragraphRenderDataList = new ArrayList<>();
+                        ParagraphRenderData paragraphRenderData = new ParagraphRenderData();
+                        ParagraphStyle paragraphStyle = new ParagraphStyle();
+                        paragraphStyle.setAlign(ParagraphAlignment.CENTER);
+                        paragraphRenderData.setParagraphStyle(paragraphStyle);
+                        List<RenderData> renderData = new ArrayList<>();
+                        TextRenderData textRenderData = new TextRenderData();
+                        Style style = new Style();
+                        style.setFontFamily("瀹嬩綋");
+                        style.setColor("000000");
+                        textRenderData.setStyle(style);
+                        if (i == 0) {
+                            //绗竴琛�
+                            if (j == 0) {
+                                //绗竴鍒楀簭鍙�
+                                textRenderData.setText("搴忓彿@No.");
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else if (j == 1) {
+                                //绗簩鍒楁牱鍝佸悕绉�
+                                textRenderData.setText("澶栨潵鏂囦欢鍚嶇О@Foreign file name");
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else if (j == 2) {
+                                //绗笁鍒楁牱鍝佺紪鍙�
+                                textRenderData.setText("鏂囦欢缂栧彿@File number");
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else if (j == 3) {
+                                //绗洓鍒椾緵鏍峰崟浣�
+                                textRenderData.setText("鏍囧噯瑙勮寖鍚嶇О@Standard specification name");
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else if (j == 4) {
+                                //绗簲鍒楁暟閲�
+                                textRenderData.setText("鏍囧噯鍙稝Stanard number");
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else if (j == 5) {
+                                //绗叚鍒楀鐞嗘柟寮�
+                                textRenderData.setText("鐢熸晥鏃ユ湡@Effective Date");
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else if (j == 6) {
+                                //绗竷鍒楀鐞嗘柟寮�
+                                textRenderData.setText("浣滃簾鏃ユ湡@Void date");
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            }else {
+                                //绗叓鍒楁椂闂�
+                                textRenderData.setText("澶囨敞@Remaek");
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            }
+                        }
+                        else {
+                            //鍏朵粬琛�
+                            if (j == 0) {
+                                //绗竴鍒�
+                                try{
+                                    String sampleName = manageRecordVerifies.get((i-1) + (index1 - 1) * 20).getDocumentName();
+                                    textRenderData.setText(index + "");
+                                } catch (Exception e) {
+                                    textRenderData.setText("");
+                                }
+                                index++;
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else if (j == 1) {
+                                try{
+                                    textRenderData.setText(manageRecordVerifies.get((i-1) + (index1 - 1) * 20).getDocumentName());
+                                } catch (Exception e) {
+                                    textRenderData.setText("");
+                                }
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            }
+                            else if (j == 2) {
+                                try{
+                                    textRenderData.setText(manageRecordVerifies.get((i-1) + (index1 - 1) * 20).getDocumentCode());
+                                } catch (Exception e) {
+                                    textRenderData.setText("");
+                                }
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            }
+                            else if (j == 3) {
+                                try{
+                                    textRenderData.setText(manageRecordVerifies.get((i-1) + (index1 - 1) * 20).getStandardName());
+                                } catch (Exception e) {
+                                    textRenderData.setText("");
+                                }
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            }
+                            else if (j == 4) {
+                                try{
+                                    textRenderData.setText(manageRecordVerifies.get((i-1) + (index1 - 1) * 20).getStandardCode());
+                                } catch (Exception e) {
+                                    textRenderData.setText("");
+                                }
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            }
+                            else if (j == 5) {
+                                try{
+                                    textRenderData.setText(manageRecordVerifies.get((i-1) + (index1 - 1) * 20).getEffectiveDate()+"");
+                                } catch (Exception e) {
+                                    textRenderData.setText("");
+                                }
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            }
+                            else if (j==6){
+                                try{
+                                    textRenderData.setText(manageRecordVerifies.get((i-1) + (index1 - 1) * 20).getCancelDate()+"");
+                                } catch (Exception e) {
+                                    textRenderData.setText("");
+                                }
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            }
+                            else {
+                                try{
+                                    textRenderData.setText(manageRecordVerifies.get((i-1) + (index1 - 1) * 20).getNote());
+                                } catch (Exception e) {
+                                    textRenderData.setText("");
+                                }
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            }
+                        }
+                    }
+                    rowRenderData.setCells(cells);
+                    if (rowRenderData.getCells().size() != 0) {
+                        rows.add(rowRenderData);
+                    }
+                }
+                TableRenderData tableRenderData = new TableRenderData();
+                tableRenderData.setRows(rows);
+                int countSize = tableRenderData.getRows().get(0).getCells().size();
+                for (RowRenderData row : tableRenderData.getRows()) {
+                    if (row.getCells().size() != countSize) {
+                        throw new ErrorException("姣忚鍗曞厓鏍间笉鐩哥瓑");
+                    }
+                }
+                TableStyle tableStyle = new TableStyle();
+                tableStyle.setWidth(XWPFTable.DEFAULT_PERCENTAGE_WIDTH);
+                tableStyle.setAlign(TableRowAlign.CENTER);
+                BorderStyle borderStyle = new BorderStyle();
+                borderStyle.setColor("000000");
+                borderStyle.setType(XWPFTable.XWPFBorderType.THICK);
+                borderStyle.setSize(14);
+                tableStyle.setLeftBorder(borderStyle);
+                tableStyle.setTopBorder(borderStyle);
+                tableStyle.setRightBorder(borderStyle);
+                tableStyle.setBottomBorder(borderStyle);
+                tableRenderData.setTableStyle(tableStyle);
+                Map<String, Object> table = new HashMap<>();
+                table.put("verify", tableRenderData);
+                table.put("index1", index1);
+                verifyList.add(table);
+                index1++;
+            }
+        }
+        Integer finalIndex = index1;
+        XWPFTemplate template = XWPFTemplate.compile(url, builder.build()).render(
+                new HashMap<String, Object>() {{
+                    put("verifyList", verifyList);
+                    put("size", finalIndex);
+                    put("submitDate", LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy骞碝M鏈坉d鏃�")));
+                    put("submitDateEn", monthNames[LocalDate.now().getMonthValue() - 1] + " " + LocalDate.now().getDayOfMonth() + ", " + LocalDate.now().getYear());
+                    put("ratifyDate", "{{ratifyDate}}");
+                    put("ratifyDateEn","{{ratifyDateEn}}");
+                    put("ratifyUrl", null);
+                    put("writeUrl", new FilePictureRenderData(100,50,imgUrl + "/" + signatureUrl));
+                }});
+        String name = UUID.randomUUID() + "_鏍峰搧澶勭悊鐢宠琛�" + ".docx";
+        try {
+            template.writeAndClose(Files.newOutputStream(Paths.get(wordUrl + "/" + name)));
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+        //澶勭悊涓嫳鏂囨崲琛岀殑闂
+        String path = wordUrl + "/" + name;
+        try {
+            FileInputStream stream1 = new FileInputStream(path);
+            XWPFDocument document1 = new XWPFDocument(stream1);
+            List<XWPFTable> xwpfTables1 = document1.getTables();
+            for (int i = 0; i < xwpfTables1.size(); i++) {
+                for (int j = 0; j < xwpfTables1.get(i).getRows().size(); j++) {
+                    for (int k = 0; k < xwpfTables1.get(i).getRows().get(j).getTableCells().size(); k++) {
+                        if (xwpfTables1.get(i).getRows().get(j).getTableCells().get(k).getText().contains("@")) {
+                            String text = xwpfTables1.get(i).getRows().get(j).getTableCells().get(k).getText();
+                            String[] split = text.split("@");
+                            xwpfTables1.get(i).getRows().get(j).getTableCells().get(k).removeParagraph(0);
+                            XWPFParagraph xwpfParagraph = xwpfTables1.get(i).getRows().get(j).getTableCells().get(k).addParagraph();
+                            XWPFRun run = xwpfParagraph.createRun();
+                            run.setText(split[0]);
+                            if (ObjectUtils.isNotNull(split[1])) {
+                                run.addBreak();
+                                run.setText(split[1]);
+                            }
+                            xwpfParagraph.setAlignment(ParagraphAlignment.CENTER);
+                        }
+                    }
+                }
+            }
+            FileOutputStream fileOutputStream1 = new FileOutputStream(path);
+            document1.write(fileOutputStream1);
+            fileOutputStream1.close();
+        } catch (FileNotFoundException e) {
+            throw new RuntimeException(e);
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+        return name;
+    }
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageRecordVerifyServiceImpl.java b/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageRecordVerifyServiceImpl.java
new file mode 100644
index 0000000..a49d7b0
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageRecordVerifyServiceImpl.java
@@ -0,0 +1,157 @@
+package com.ruoyi.manage.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.ruoyi.common.utils.QueryWrappers;
+import com.ruoyi.framework.exception.ErrorException;
+import com.ruoyi.manage.mapper.ManageRecordTotalMapper;
+import com.ruoyi.manage.mapper.ManageRecordVerifyMapper;
+import com.ruoyi.manage.pojo.ManageRecordTotal;
+import com.ruoyi.manage.pojo.ManageRecordVerify;
+import com.ruoyi.manage.service.ManageRecordVerifyService;
+
+import org.apache.poi.xwpf.usermodel.XWPFDocument;
+import org.apache.poi.xwpf.usermodel.XWPFTable;
+import org.apache.poi.xwpf.usermodel.XWPFTableRow;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.multipart.MultipartFile;
+
+import jakarta.annotation.Resource;
+import java.io.IOException;
+import java.io.InputStream;
+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;
+
+/**
+ * <p>
+ * 澶栨潵鏂囦欢纭璁板綍 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-12 10:29:44
+ */
+@Service
+@Transactional(rollbackFor = Exception.class)
+public class ManageRecordVerifyServiceImpl extends ServiceImpl<ManageRecordVerifyMapper, ManageRecordVerify> implements ManageRecordVerifyService {
+
+    @Resource
+    private ManageRecordVerifyMapper manageRecordVerifyMapper;
+
+    @Resource
+    private ManageRecordTotalMapper manageRecordTotalMapper;
+
+    @Override
+    public IPage<ManageRecordVerify> pageManageRecordVerify(Page page, ManageRecordVerify manageRecordVerify) {
+        if (ObjectUtils.isEmpty(manageRecordVerify.getManageRecordTotalId())) {
+            //鑾峰彇褰撳墠骞翠唤
+            LocalDate currentDate = LocalDate.now();
+            // 瀹氫箟鏃ユ湡鏍煎紡
+            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy");
+            // 鏍煎紡鍖栧綋鍓嶆棩鏈�
+            String currentMonth = currentDate.format(formatter);
+            //鏌ヨ鍘嗗彶
+            ManageRecordTotal manageRecordTotal = manageRecordTotalMapper.selectOne(Wrappers.<ManageRecordTotal>lambdaQuery().eq(ManageRecordTotal::getYear, currentMonth));
+            manageRecordVerify.setManageRecordTotalId(manageRecordTotal.getId());
+        }
+        return manageRecordVerifyMapper.pageManageRecordVerify(page, QueryWrappers.queryWrappers(manageRecordVerify));
+    }
+
+    @Override
+    public int addManageRecordVerify(ManageRecordVerify manageRecordVerify) {
+        //鑾峰彇褰撳墠骞翠唤
+        LocalDate currentDate = LocalDate.now();
+        // 瀹氫箟鏃ユ湡鏍煎紡
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy");
+        // 鏍煎紡鍖栧綋鍓嶆棩鏈�
+        String currentMonth = currentDate.format(formatter);
+        ManageRecordTotal manageRecordTotal = manageRecordTotalMapper.selectOne(Wrappers.<ManageRecordTotal>lambdaQuery().eq(ManageRecordTotal::getYear, currentMonth));
+        manageRecordVerify.setManageRecordTotalId(manageRecordTotal.getId());
+        manageRecordVerifyMapper.insert(manageRecordVerify);
+        manageRecordTotal.setTotalNum(1 + manageRecordTotal.getTotalNum());
+        return manageRecordTotalMapper.updateById(manageRecordTotal);
+    }
+
+    @Override
+    public int delManageRecordVerify(Integer id) {
+        ManageRecordVerify manageRecordVerify = manageRecordVerifyMapper.selectById(id);
+        manageRecordVerifyMapper.deleteById(id);
+        ManageRecordTotal manageRecordTotal = manageRecordTotalMapper.selectById(manageRecordVerify.getManageRecordTotalId());
+        manageRecordTotal.setTotalNum(manageRecordTotal.getTotalNum() - 1);
+        return manageRecordTotalMapper.updateById(manageRecordTotal);
+    }
+
+    @Override
+    public int exportManageRecordVerify(MultipartFile file) {
+        List<ManageRecordVerify> manageRecordVerifyList = new ArrayList<>();
+        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+        //鑾峰彇褰撳墠骞翠唤
+        LocalDate currentDate = LocalDate.now();
+        // 瀹氫箟鏃ユ湡鏍煎紡
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy");
+        // 鏍煎紡鍖栧綋鍓嶆棩鏈�
+        String currentMonth = currentDate.format(formatter);
+        ManageRecordTotal manageRecordTotal = manageRecordTotalMapper.selectOne(Wrappers.<ManageRecordTotal>lambdaQuery().eq(ManageRecordTotal::getYear, currentMonth));
+        try {
+            InputStream inputStream = file.getInputStream();
+            XWPFDocument document = new XWPFDocument(inputStream);
+            List<XWPFTable> tables = document.getTables();
+            if (tables.isEmpty()) {
+                throw new ErrorException("鏂囨。涓病鏈夎〃鏍�");
+            }
+
+            for (XWPFTable table : tables) {
+                List<XWPFTableRow> rows = table.getRows();
+                if (rows.size() <= 1) {
+                    throw new ErrorException("琛ㄦ牸娌℃湁鏁版嵁琛�");
+                }
+                for (int i = 1; i < rows.size(); i++) { // 浠庣浜岃寮�濮嬶紝璺宠繃琛ㄥご
+                    XWPFTableRow row = rows.get(i);
+                    if (row.getTableCells().size() != 8) {
+                        continue;
+                    }
+                    if (ObjectUtils.isNotEmpty(row.getCell(1).getText())) {
+                        ManageRecordVerify manageRecordVerify = new ManageRecordVerify();
+                        manageRecordVerify.setDocumentName(row.getCell(1).getText());
+                        manageRecordVerify.setDocumentCode(row.getCell(2).getText());
+                        manageRecordVerify.setStandardName(row.getCell(3).getText());
+                        manageRecordVerify.setStandardCode(row.getCell(4).getText());
+                        try {
+                            manageRecordVerify.setEffectiveDate(LocalDate.parse(row.getCell(5).getText(), dateTimeFormatter));
+                        } catch (Exception e) {
+                            manageRecordVerify.setEffectiveDate(null);
+                        }
+                        try {
+                            manageRecordVerify.setCancelDate(LocalDate.parse(row.getCell(6).getText(), dateTimeFormatter));
+                        } catch (Exception e) {
+                            manageRecordVerify.setCancelDate(null);
+                        }
+                        manageRecordVerify.setNote(row.getCell(7).getText());
+                        manageRecordVerify.setManageRecordTotalId(manageRecordTotal.getId());
+                        if (manageRecordVerifyMapper.selectCount(Wrappers.<ManageRecordVerify>lambdaQuery()
+                                .eq(ManageRecordVerify::getDocumentCode, manageRecordVerify.getDocumentCode())
+                                .eq(ManageRecordVerify::getDocumentName, manageRecordVerify.getDocumentName())
+                                .eq(ManageRecordVerify::getStandardName, manageRecordVerify.getStandardName())
+                                .eq(ManageRecordVerify::getStandardCode, manageRecordVerify.getStandardCode())
+                                .eq(ManageRecordVerify::getManageRecordTotalId, manageRecordVerify.getManageRecordTotalId())) <= 0) {
+                            manageRecordVerifyList.add(manageRecordVerify);
+                        }
+                    }
+                }
+            }
+            saveBatch(manageRecordVerifyList);
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return 0;
+    }
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageReviewProgramFileServiceImpl.java b/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageReviewProgramFileServiceImpl.java
new file mode 100644
index 0000000..bb5fa31
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageReviewProgramFileServiceImpl.java
@@ -0,0 +1,76 @@
+package com.ruoyi.manage.service.impl;
+
+import cn.hutool.core.lang.UUID;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.manage.mapper.ManageReviewProgramFileMapper;
+import com.ruoyi.manage.mapper.ManageReviewProgramMapper;
+import com.ruoyi.manage.pojo.ManageReviewProgram;
+import com.ruoyi.manage.pojo.ManageReviewProgramFile;
+import com.ruoyi.manage.service.ManageReviewProgramFileService;
+import com.ruoyi.manage.vo.ReviewProgramDetailsVo;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
+
+import jakarta.annotation.Resource;
+import java.io.File;
+import java.util.List;
+
+/**
+ * <p>
+ * 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-09 04:15:47
+ */
+@Service
+public class ManageReviewProgramFileServiceImpl extends ServiceImpl<ManageReviewProgramFileMapper, ManageReviewProgramFile> implements ManageReviewProgramFileService {
+
+    @Value("${wordUrl}")
+    private String wordUrl;
+
+    @Resource
+    ManageReviewProgramMapper manageReviewProgramMapper;
+
+    @Override
+    public ReviewProgramDetailsVo selectFile(Integer id) {
+        ManageReviewProgram program = manageReviewProgramMapper.selectById(id);
+        LambdaQueryWrapper<ManageReviewProgramFile> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(ManageReviewProgramFile::getReviewId, id);
+        List<ManageReviewProgramFile> files = list(queryWrapper);
+        ReviewProgramDetailsVo vo = new ReviewProgramDetailsVo();
+        vo.setProgram(program);
+        vo.setFileList(files);
+        return vo;
+    }
+
+    @Override
+    public void addFile(MultipartFile file, Integer id) {
+        String urlString;
+        String pathName;
+        String path;
+        String filename = file.getOriginalFilename();
+        ManageReviewProgramFile manageReviewProgramFile = new ManageReviewProgramFile();
+        manageReviewProgramFile.setFileName(filename);
+        manageReviewProgramFile.setReviewId(id);
+        // 鏄枃浠�
+        path = wordUrl;
+        try {
+            File realpath = new File(path);
+            if (!realpath.exists()) {
+                realpath.mkdirs();
+            }
+            pathName = UUID.randomUUID() + "_" + file.getOriginalFilename();
+            urlString = realpath + "/" + pathName;
+            file.transferTo(new File(urlString));
+            manageReviewProgramFile.setUrl(pathName);
+            this.baseMapper.insert(manageReviewProgramFile);
+        } catch (Exception e) {
+            e.printStackTrace();
+            System.err.println("闄勪欢涓婁紶閿欒");
+        }
+
+    }
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageReviewProgramServiceImpl.java b/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageReviewProgramServiceImpl.java
new file mode 100644
index 0000000..c958e90
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageReviewProgramServiceImpl.java
@@ -0,0 +1,125 @@
+package com.ruoyi.manage.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.deepoove.poi.XWPFTemplate;
+import com.deepoove.poi.config.Configure;
+import com.deepoove.poi.config.ConfigureBuilder;
+import com.deepoove.poi.data.FilePictureRenderData;
+import com.ruoyi.common.core.domain.entity.User;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.framework.exception.ErrorException;
+import com.ruoyi.manage.mapper.ManageReviewProgramMapper;
+import com.ruoyi.manage.pojo.ManageReviewProgram;
+import com.ruoyi.manage.service.ManageReviewProgramService;
+import com.ruoyi.system.mapper.UserMapper;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletResponse;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URLEncoder;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ *  鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-09 03:05:42
+ */
+@Service
+public class ManageReviewProgramServiceImpl extends ServiceImpl<ManageReviewProgramMapper, ManageReviewProgram> implements ManageReviewProgramService {
+
+
+    @Resource
+    private UserMapper userMapper;
+
+    @Value("${file.path}")
+    private String imgUrl;
+
+
+
+
+
+    @Override
+    public IPage<ManageReviewProgram> page(Page page, String startTime,String endTime, String judgingLocation) {
+        IPage<ManageReviewProgram> iPage = this.baseMapper.page(page,startTime,endTime,judgingLocation);
+        return iPage;
+    }
+
+    @Override
+    public void exportReviewProgram(Integer id, HttpServletResponse response) {
+        ManageReviewProgram reviewProgram = baseMapper.selectById(id);
+        List<String> name = new ArrayList<>();
+        for (String s : reviewProgram.getParticipants().split(",")) {
+            User user = userMapper.selectById(Integer.parseInt(s));
+            name.add(user.getName());
+        }
+        String participantsName = name.stream().collect(Collectors.joining(","));
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy骞碝M鏈坉d鏃�");
+        //缂栧埗浜虹鍚�
+        User user1 = userMapper.selectOne(Wrappers.<User>lambdaQuery().eq(User::getName, reviewProgram.getEditor()));
+        if (ObjectUtils.isEmpty(user1.getSignatureUrl())){
+            throw new ErrorException(user1.getName()+"娌℃湁涓婁紶涓汉绛惧悕,璇蜂笂浼�!");
+        }
+        String signatureUrl1 = user1.getSignatureUrl();
+        //鎵瑰噯浜虹鍚�
+        if (ObjectUtils.isEmpty(reviewProgram.getApprove())){
+            throw new ErrorException("娌℃湁杩涜鎵瑰噯");
+        }
+        User user2 = userMapper.selectOne(Wrappers.<User>lambdaQuery().eq(User::getName, reviewProgram.getApprove()));
+        if (ObjectUtils.isEmpty(user2.getSignatureUrl())){
+            throw new ErrorException(user2.getName()+"娌℃湁涓婁紶涓汉绛惧悕,璇蜂笂浼�!");
+        }
+        String signatureUrl2 = user2.getSignatureUrl();
+
+        InputStream inputStream = this.getClass().getResourceAsStream("/static/review-program.docx");
+        ConfigureBuilder builder = Configure.builder();
+        builder.useSpringEL(true);
+        XWPFTemplate template = XWPFTemplate.compile(inputStream, builder.build()).render(
+                new HashMap<String, Object>() {{
+                    put("reviewProgram", reviewProgram);
+                    put("writeUrl", new FilePictureRenderData(100,50,imgUrl + "/" + signatureUrl1));
+                    put("ratifyUrl", new FilePictureRenderData(100,50,imgUrl + "/" + signatureUrl2));
+                    put("editorDate", reviewProgram.getEditorDate().format(formatter));
+                    put("approveDate", reviewProgram.getApproveDate().format(formatter));
+                    put("participantsName",participantsName);
+                }});
+
+        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();
+            inputStream.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException("瀵煎嚭澶辫触");
+        }
+    }
+
+    @Override
+    public int addReviewProgram(ManageReviewProgram manageReviewProgram) {
+        Integer userId = SecurityUtils.getUserId().intValue();
+        String name = userMapper.selectById(userId).getName();
+        manageReviewProgram.setEditor(name);
+        manageReviewProgram.setEditorDate(LocalDateTime.now());
+        return baseMapper.insert(manageReviewProgram);
+    }
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageReviewReportServiceImpl.java b/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageReviewReportServiceImpl.java
new file mode 100644
index 0000000..958566a
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageReviewReportServiceImpl.java
@@ -0,0 +1,138 @@
+package com.ruoyi.manage.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.deepoove.poi.XWPFTemplate;
+import com.deepoove.poi.config.Configure;
+import com.deepoove.poi.config.ConfigureBuilder;
+import com.deepoove.poi.data.FilePictureRenderData;
+import com.ruoyi.common.core.domain.entity.User;
+import com.ruoyi.framework.exception.ErrorException;
+import com.ruoyi.manage.mapper.ManageReviewReportMapper;
+import com.ruoyi.manage.pojo.ManageReviewReport;
+import com.ruoyi.manage.service.ManageReviewReportService;
+import com.ruoyi.system.mapper.UserMapper;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import jakarta.annotation.Resource;
+import jakarta.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.stream.Collectors;
+
+/**
+ * <p>
+ * 绠$悊璇勫鎶ュ憡 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-12 04:44:39
+ */
+@Service
+public class ManageReviewReportServiceImpl extends ServiceImpl<ManageReviewReportMapper, ManageReviewReport> implements ManageReviewReportService {
+
+    @Resource
+    UserMapper userMapper;
+
+    @Value("${file.path}")
+    private String imgUrl;
+
+    @Override
+    public IPage<ManageReviewReport> page(Page page, String startTime, String endTime, String place) {
+        IPage<ManageReviewReport> iPage = this.baseMapper.page(page, startTime, endTime, place);
+        return iPage;
+    }
+
+    @Override
+    public void exportReviewReport(Integer id, HttpServletResponse response) {
+        ManageReviewReport manageReviewReport = baseMapper.selectById(id);
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy骞碝M鏈坉d鏃�");
+        //瀹屾垚鏃堕棿
+        String completionDate = "";
+        if (ObjectUtils.isNotEmpty(manageReviewReport.getCompletionDate())) {
+            completionDate = manageReviewReport.getCompletionDate().format(formatter);
+        }
+        //鍑哄腑浜哄憳
+        String attendessName=null;
+        if (ObjectUtils.isNotEmpty(manageReviewReport.getAttendess())) {
+            List<String> name = new ArrayList<>();
+            for (String s : manageReviewReport.getAttendess().split(",")) {
+                User user = userMapper.selectById(Integer.parseInt(s));
+                name.add(user.getName());
+            }
+            attendessName = name.stream().collect(Collectors.joining(","));
+        }
+        //鏃ユ湡
+        String createTime = manageReviewReport.getCreateTime().format(formatter);
+        //瀹℃牳浜�
+        String signatureUrl1 = null;
+        if (ObjectUtils.isNotEmpty(manageReviewReport.getAudit())) {
+            User user1 = userMapper.selectOne(Wrappers.<User>lambdaQuery().eq(User::getName, manageReviewReport.getAudit()));
+            if (ObjectUtils.isEmpty(user1.getSignatureUrl())) {
+                throw new ErrorException(user1.getName() + "鐨勪釜浜虹鍚嶆病鏈変笂浼�");
+            }
+            signatureUrl1 = user1.getSignatureUrl();
+        }
+        //鎵瑰噯浜�
+        String signatureUrl2 = null;
+        if (ObjectUtils.isNotEmpty(manageReviewReport.getApproval())) {
+            User user2 = userMapper.selectOne(Wrappers.<User>lambdaQuery().eq(User::getName, manageReviewReport.getApproval()));
+            if (ObjectUtils.isEmpty(user2.getSignatureUrl())) {
+                throw new ErrorException(user2.getName() + "鐨勪釜浜虹鍚嶆病鏈変笂浼�");
+            }
+            signatureUrl2 = user2.getSignatureUrl();
+        }
+
+
+        InputStream inputStream = this.getClass().getResourceAsStream("/static/review-report.docx");
+        ConfigureBuilder builder = Configure.builder();
+        builder.useSpringEL(true);
+        String finalCompletionDate = completionDate;
+        FilePictureRenderData picture1=null;
+        FilePictureRenderData picture2=null;
+        if (signatureUrl1!=null){
+             picture1 = new FilePictureRenderData(100, 50, imgUrl + "/" + signatureUrl1);
+        }
+        if (signatureUrl2!=null) {
+             picture2 = new FilePictureRenderData(100, 50, imgUrl + "/" + signatureUrl2);
+        }
+        FilePictureRenderData finalPicture1 = picture1;
+        FilePictureRenderData finalPicture2 = picture2;
+        String finalAttendessName = attendessName;
+        XWPFTemplate template = XWPFTemplate.compile(inputStream, builder.build()).render(
+                new HashMap<String, Object>() {{
+                    put("report", manageReviewReport);
+                    put("completionDate", finalCompletionDate);
+                    put("date", manageReviewReport.getDate().format(formatter));
+                    put("createTime", createTime);
+                    put("examineUrl", finalPicture1);
+                    put("ratifyUrl", finalPicture2);
+                    put("attendessName", finalAttendessName);
+                }});
+
+        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();
+            inputStream.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException("瀵煎嚭澶辫触");
+        }
+
+    }
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageRiskAssessmentResultsServiceImpl.java b/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageRiskAssessmentResultsServiceImpl.java
new file mode 100644
index 0000000..ff20588
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageRiskAssessmentResultsServiceImpl.java
@@ -0,0 +1,124 @@
+package com.ruoyi.manage.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.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.ruoyi.common.utils.DateImageUtil;
+import com.ruoyi.framework.exception.ErrorException;
+import com.ruoyi.inspect.util.HackLoopTableRenderPolicy;
+import com.ruoyi.manage.mapper.ManageRiskAssessmentResultsMapper;
+import com.ruoyi.manage.pojo.ManageRiskAssessmentResults;
+import com.ruoyi.manage.service.ManageRiskAssessmentResultsService;
+import com.ruoyi.manage.vo.ManageRiskAssessmentResultsVo;
+import com.ruoyi.system.mapper.UserMapper;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import jakarta.servlet.http.HttpServletResponse;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URLEncoder;
+import java.util.HashMap;
+
+/**
+ * <p>
+ * 鍗遍櫓鍥犵礌杈ㄨ瘑涓庨闄╄瘎浠风粨鏋滀竴瑙堣〃 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-15 02:58:51
+ */
+@Service
+public class ManageRiskAssessmentResultsServiceImpl extends ServiceImpl<ManageRiskAssessmentResultsMapper, ManageRiskAssessmentResults> implements ManageRiskAssessmentResultsService {
+
+    @Autowired
+    private UserMapper userMapper;
+
+    @Value("${file.path}")
+    private String imgUrl;
+
+    @Override
+    public IPage<ManageRiskAssessmentResultsVo> getPageResults(Page page) {
+        return baseMapper.getPageResults(page, false);
+    }
+
+    @Override
+    public void exportPersonTraining(HttpServletResponse response) {
+        // 鏌ヨ璇︽儏
+        IPage<ManageRiskAssessmentResultsVo> detailedDtos = baseMapper.getPageResults(new Page(1, -1), true);
+        if (detailedDtos.getRecords().isEmpty()) {
+            throw new ErrorException("瀹℃牳閫氳繃鐨勬暟鎹负绌猴紒璇峰鏍搁�氳繃鍚庡湪瀵煎嚭");
+        }
+        ManageRiskAssessmentResultsVo manageRiskAssessmentResultsVo = detailedDtos.getRecords().get(0);
+
+        //鑾峰彇缂栧埗浜虹殑绛惧悕鍦板潃
+        String writeUrl = userMapper.selectById(manageRiskAssessmentResultsVo.getEditor()).getSignatureUrl();
+        if (ObjectUtils.isEmpty(writeUrl) || writeUrl.equals("")) {
+            throw new ErrorException("鎵句笉鍒版楠屼汉鐨勭鍚�");
+        }
+
+        //鑾峰彇澶嶆牳浜虹殑绛惧悕鍦板潃
+        String examineUrl = null;
+        if (manageRiskAssessmentResultsVo.getApproval() != null) {
+            examineUrl = userMapper.selectById(manageRiskAssessmentResultsVo.getApproval()).getSignatureUrl();
+            if (StringUtils.isBlank(examineUrl)) {
+                throw new ErrorException("鎵句笉鍒板鏍镐汉鐨勭鍚�");
+            }
+        }
+
+        //鑾峰彇鎵瑰噯浜虹殑绛惧悕鍦板潃
+        String ratifyUrl = null;
+        if (manageRiskAssessmentResultsVo.getApproval() != null) {
+            ratifyUrl = userMapper.selectById(manageRiskAssessmentResultsVo.getApproval()).getSignatureUrl();
+            if (StringUtils.isBlank(ratifyUrl)) {
+                throw new ErrorException("鎵句笉鍒板鏍镐汉鐨勭鍚�");
+            }
+        }
+
+        int index = 1;
+        for (ManageRiskAssessmentResultsVo detailedDto : detailedDtos.getRecords()) {
+            detailedDto.setIndex(index);
+            index++;
+        }
+        // 鑾峰彇璺緞
+        InputStream inputStream = this.getClass().getResourceAsStream("/static/risk-factor-identification-risk.docx");
+        String finalExamineUrl = examineUrl;
+        String finalRatifyUrl = ratifyUrl;
+        Configure configure = Configure.builder()
+                .bind("trainingDetailedList", new HackLoopTableRenderPolicy())
+                .build();
+        XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
+                new HashMap<String, Object>() {{
+                    put("trainingDetailedList", detailedDtos.getRecords());
+                    put("writeUrl", StringUtils.isNotBlank(writeUrl) ? Pictures.ofLocal(imgUrl + "/" + writeUrl).create() : null);
+                    put("examineUrl", StringUtils.isNotBlank(finalExamineUrl) ? Pictures.ofLocal(imgUrl + "/" + finalExamineUrl).create() : null);
+                    put("ratifyUrl", StringUtils.isNotBlank(finalRatifyUrl) ? Pictures.ofLocal(imgUrl + "/" + finalRatifyUrl).create() : null);
+                    put("writeDateUrl", manageRiskAssessmentResultsVo.getEditorDate() != null ?
+                            Pictures.ofStream(DateImageUtil.createDateImage(manageRiskAssessmentResultsVo.getEditorDate())).create() : null);
+                    put("examineDateUrl", manageRiskAssessmentResultsVo.getApproveDate() != null ?
+                            Pictures.ofStream(DateImageUtil.createDateImage(manageRiskAssessmentResultsVo.getApproveDate())).create() : null);
+                    put("ratifyDateUrl", manageRiskAssessmentResultsVo.getApproveDate() != null ?
+                            Pictures.ofStream(DateImageUtil.createDateImage(manageRiskAssessmentResultsVo.getApproveDate())).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();
+            inputStream.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException("瀵煎嚭澶辫触");
+        }
+    }
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/vo/ManageControlPlanListVo.java b/cnas-manage/src/main/java/com/ruoyi/manage/vo/ManageControlPlanListVo.java
new file mode 100644
index 0000000..4fea215
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/vo/ManageControlPlanListVo.java
@@ -0,0 +1,20 @@
+package com.ruoyi.manage.vo;
+
+import com.ruoyi.manage.pojo.ManageControlPlanList;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+@Data
+public class ManageControlPlanListVo extends ManageControlPlanList {
+    @Schema(description = "缂栧埗濮撳悕")
+    private String editorName;
+
+    @Schema(description = "瀹℃壒濮撳悕")
+    private String approvalName;
+
+    @Schema(description = "鎵瑰噯濮撳悕")
+    private String approveName;
+
+    @Schema(description = "瀵煎嚭")
+    private Integer index;
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/vo/ManageRiskAssessmentResultsVo.java b/cnas-manage/src/main/java/com/ruoyi/manage/vo/ManageRiskAssessmentResultsVo.java
new file mode 100644
index 0000000..db4547f
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/vo/ManageRiskAssessmentResultsVo.java
@@ -0,0 +1,21 @@
+package com.ruoyi.manage.vo;
+
+import com.ruoyi.manage.pojo.ManageRiskAssessmentResults;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+@Data
+public class ManageRiskAssessmentResultsVo extends ManageRiskAssessmentResults {
+
+    @Schema(description = "缂栧埗濮撳悕")
+    private String editorName;
+
+    @Schema(description = "瀹℃壒濮撳悕")
+    private String approvalName;
+
+    @Schema(description = "鎵瑰噯濮撳悕")
+    private String approveName;
+
+    @Schema(description = "瀵煎嚭搴忓彿")
+    private Integer index;
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/vo/MeetingParticipantsDetailsVo.java b/cnas-manage/src/main/java/com/ruoyi/manage/vo/MeetingParticipantsDetailsVo.java
new file mode 100644
index 0000000..1f6de8e
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/vo/MeetingParticipantsDetailsVo.java
@@ -0,0 +1,15 @@
+package com.ruoyi.manage.vo;
+
+import com.ruoyi.manage.pojo.ManageMeeting;
+import com.ruoyi.manage.pojo.ManageMeetingParticipants;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class MeetingParticipantsDetailsVo {
+
+    private ManageMeeting manageMeeting;
+
+    private List<ManageMeetingParticipants> participantsList;
+}
diff --git a/cnas-manage/src/main/java/com/ruoyi/manage/vo/ReviewProgramDetailsVo.java b/cnas-manage/src/main/java/com/ruoyi/manage/vo/ReviewProgramDetailsVo.java
new file mode 100644
index 0000000..713f4d8
--- /dev/null
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/vo/ReviewProgramDetailsVo.java
@@ -0,0 +1,15 @@
+package com.ruoyi.manage.vo;
+
+import com.ruoyi.manage.pojo.ManageReviewProgram;
+import com.ruoyi.manage.pojo.ManageReviewProgramFile;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class ReviewProgramDetailsVo {
+
+    private ManageReviewProgram program;
+
+    private List<ManageReviewProgramFile> fileList;
+}
diff --git a/cnas-manage/src/main/resources/lib/license.xml b/cnas-manage/src/main/resources/lib/license.xml
new file mode 100644
index 0000000..ecd46c1
--- /dev/null
+++ b/cnas-manage/src/main/resources/lib/license.xml
@@ -0,0 +1,13 @@
+<License>
+    <Data>
+        <Products>
+            <Product>Aspose.Total for Java</Product>
+            <Product>Aspose.Words for Java</Product>
+        </Products>
+        <EditionType>Enterprise</EditionType>
+        <SubscriptionExpiry>20991231</SubscriptionExpiry>
+        <LicenseExpiry>20991231</LicenseExpiry>
+        <SerialNumber>8bfe198c-7f0c-4ef8-8ff0-acc3237bf0d7</SerialNumber>
+    </Data>
+    <Signature>sNLLKGMUdF0r8O1kKilWAGdgfs2BvJb/2Xp8p5iuDVfZXmhppo+d0Ran1P9TKdjV4ABwAgKXxJ3jcQTqE/2IRfqwnPf8itN8aFZlV3TJPYeD3yWE7IT55Gz6EijUpC7aKeoohTb4w2fpox58wWoF3SNp6sK6jDfiAUGEHYJ9pjU=</Signature>
+</License>
diff --git a/cnas-manage/src/main/resources/mapper/ClientSatisfactionAnalyseFileMapper.xml b/cnas-manage/src/main/resources/mapper/ClientSatisfactionAnalyseFileMapper.xml
new file mode 100644
index 0000000..c957aee
--- /dev/null
+++ b/cnas-manage/src/main/resources/mapper/ClientSatisfactionAnalyseFileMapper.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.ruoyi.manage.mapper.ClientSatisfactionAnalyseFileMapper">
+
+    <!-- 瀹㈡埛婊℃剰搴﹀垎鏋愰檮浠跺垪琛� -->
+    <select id="pageAnalyseFile" resultType="com.ruoyi.manage.pojo.ClientSatisfactionAnalyseFile">
+        select *
+        from (select ccf.*,
+                     u.name user_name
+              from cnas_client_satisfaction_analyse_file ccf
+                       left join user u on u.id = ccf.create_user
+              order by ccf.create_time desc
+             ) a
+        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
+            ${ew.customSqlSegment}
+        </if>
+    </select>
+</mapper>
diff --git a/cnas-manage/src/main/resources/mapper/ClientSatisfactionMapper.xml b/cnas-manage/src/main/resources/mapper/ClientSatisfactionMapper.xml
new file mode 100644
index 0000000..ea097e1
--- /dev/null
+++ b/cnas-manage/src/main/resources/mapper/ClientSatisfactionMapper.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+<mapper namespace="com.ruoyi.manage.mapper.ClientSatisfactionMapper">
+
+    <!-- 瀹㈡埛婊℃剰搴﹁皟鏌� -->
+    <select id="pageClientSatisfaction" resultType="com.ruoyi.manage.pojo.ClientSatisfaction">
+        select *
+        from (select *
+              from cnas_client_satisfaction
+              order by create_time desc
+             ) a
+        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
+            ${ew.customSqlSegment}
+        </if>
+    </select>
+    <select id="exportWordClientSatisfaction" resultType="com.ruoyi.manage.dto.ClientSatisfactionDto">
+        select *,
+               CASE WHEN service_attitude = 0 THEN '鈽�'
+                   ELSE '鈻�' END AS serviceAttitude0,
+               CASE WHEN service_attitude = 1 THEN '鈽�'
+                   ELSE '鈻�' END AS serviceAttitude1,
+               CASE WHEN service_attitude = 2 THEN '鈽�'
+                   ELSE '鈻�' END AS serviceAttitude2,
+               service_attitude_suggestion,
+               CASE WHEN technical_competence = 0 THEN '鈽�'
+                    ELSE '鈻�' END AS technicalCompetence0,
+               CASE WHEN technical_competence = 1 THEN '鈽�'
+                    ELSE '鈻�' END AS technicalCompetence1,
+               CASE WHEN technical_competence = 2 THEN '鈽�'
+                    ELSE '鈻�' END AS technicalCompetence2,
+               technical_competence_suggestion,
+               CASE WHEN inspection_work = 0 THEN '鈽�'
+                    ELSE '鈻�' END AS inspectionWork0,
+               CASE WHEN inspection_work = 1 THEN '鈽�'
+                    ELSE '鈻�' END AS inspectionWork1,
+               CASE WHEN inspection_work = 2 THEN '鈽�'
+                    ELSE '鈻�' END AS inspectionWork2,
+               inspection_work_suggestion,
+               CASE WHEN reasonable_fees = 0 THEN '鈽�'
+                    ELSE '鈻�' END AS reasonableFees0,
+               CASE WHEN reasonable_fees = 1 THEN '鈽�'
+                    ELSE '鈻�' END AS reasonableFees1,
+               CASE WHEN reasonable_fees = 2 THEN '鈽�'
+                    ELSE '鈻�' END AS reasonableFees2
+        from cnas_client_satisfaction
+        where client_satisfaction_id = #{clientSatisfactionId}
+    </select>
+</mapper>
diff --git a/cnas-manage/src/main/resources/mapper/InternalCheckMapper.xml b/cnas-manage/src/main/resources/mapper/InternalCheckMapper.xml
new file mode 100644
index 0000000..f7168c7
--- /dev/null
+++ b/cnas-manage/src/main/resources/mapper/InternalCheckMapper.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+<mapper namespace="com.ruoyi.manage.mapper.InternalCheckMapper">
+
+    <!-- 鍐呴儴瀹℃煡鍒嗛〉鏌ヨ -->
+    <select id="pageInternalCheck" resultType="com.ruoyi.manage.dto.InternalCheckDto">
+        select *
+        from (select *
+        from cnas_internal_check
+        order by create_time desc) a
+        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
+            ${ew.customSqlSegment}
+        </if>
+    </select>
+</mapper>
diff --git a/cnas-manage/src/main/resources/mapper/InternalCorrectFileMapper.xml b/cnas-manage/src/main/resources/mapper/InternalCorrectFileMapper.xml
new file mode 100644
index 0000000..aa64435
--- /dev/null
+++ b/cnas-manage/src/main/resources/mapper/InternalCorrectFileMapper.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.ruoyi.manage.mapper.InternalCorrectFileMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.ruoyi.manage.pojo.InternalCorrectFile">
+        <id column="supervise_details_correct_file_id" property="correctFileId" />
+        <result column="correct_id" property="correctId" />
+        <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-manage/src/main/resources/mapper/InternalCorrectMapper.xml b/cnas-manage/src/main/resources/mapper/InternalCorrectMapper.xml
new file mode 100644
index 0000000..71efb96
--- /dev/null
+++ b/cnas-manage/src/main/resources/mapper/InternalCorrectMapper.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.manage.mapper.InternalCorrectMapper">
+
+    <select id="pageInternalAccording" resultType="com.ruoyi.manage.pojo.InternalCorrect">
+        select *
+        from (select *
+        from cnas_internal_correct
+        order by create_time desc) a
+        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
+            ${ew.customSqlSegment}
+        </if>
+    </select>
+
+</mapper>
diff --git a/cnas-manage/src/main/resources/mapper/InternalImplementMapper.xml b/cnas-manage/src/main/resources/mapper/InternalImplementMapper.xml
new file mode 100644
index 0000000..b41e6ee
--- /dev/null
+++ b/cnas-manage/src/main/resources/mapper/InternalImplementMapper.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+<mapper namespace="com.ruoyi.manage.mapper.InternalImplementMapper">
+    <!-- 鍐呭瀹炴柦璁″垝鍒嗛〉鏌ヨ -->
+    <select id="pageInternalImplement" resultType="com.ruoyi.manage.dto.InternalImplementDto">
+        select *
+        from (select *
+              from cnas_internal_implement
+              order by create_time desc) a
+        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
+            ${ew.customSqlSegment}
+        </if>
+    </select>
+</mapper>
diff --git a/cnas-manage/src/main/resources/mapper/InternalMeetingDetailMapper.xml b/cnas-manage/src/main/resources/mapper/InternalMeetingDetailMapper.xml
new file mode 100644
index 0000000..8bf3b54
--- /dev/null
+++ b/cnas-manage/src/main/resources/mapper/InternalMeetingDetailMapper.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.manage.mapper.InternalMeetingDetailMapper">
+
+
+</mapper>
diff --git a/cnas-manage/src/main/resources/mapper/InternalMeetingMapper.xml b/cnas-manage/src/main/resources/mapper/InternalMeetingMapper.xml
new file mode 100644
index 0000000..d5cec24
--- /dev/null
+++ b/cnas-manage/src/main/resources/mapper/InternalMeetingMapper.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.ruoyi.manage.mapper.InternalMeetingMapper">
+
+    <select id="pageInternalMeeting" resultType="com.ruoyi.manage.dto.InternalMeetingDto">
+        select *
+        from (select cim.*,
+        (select GROUP_CONCAT(name)
+        from user
+        where find_in_set(id, cim.participant)) participant_name
+        from cnas_internal_meeting cim
+        order by cim.create_time desc
+        ) a
+        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
+            ${ew.customSqlSegment}
+        </if>
+    </select>
+</mapper>
diff --git a/cnas-manage/src/main/resources/mapper/InternalPlanDetailMapper.xml b/cnas-manage/src/main/resources/mapper/InternalPlanDetailMapper.xml
new file mode 100644
index 0000000..6264605
--- /dev/null
+++ b/cnas-manage/src/main/resources/mapper/InternalPlanDetailMapper.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.manage.mapper.InternalPlanDetailMapper">
+
+
+</mapper>
diff --git a/cnas-manage/src/main/resources/mapper/InternalPlanMapper.xml b/cnas-manage/src/main/resources/mapper/InternalPlanMapper.xml
new file mode 100644
index 0000000..8200dfe
--- /dev/null
+++ b/cnas-manage/src/main/resources/mapper/InternalPlanMapper.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.manage.mapper.InternalPlanMapper">
+    <!-- 鍐呭骞村害璁″垝鍒嗛〉鏌ヨ -->
+    <select id="pageInternalPlan" resultType="com.ruoyi.manage.dto.InternalPlanDto">
+        select *
+        from (select *
+        from cnas_internal_plan
+        order by create_time desc) a
+        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
+            ${ew.customSqlSegment}
+        </if>
+    </select>
+</mapper>
diff --git a/cnas-manage/src/main/resources/mapper/InternalReportMapper.xml b/cnas-manage/src/main/resources/mapper/InternalReportMapper.xml
new file mode 100644
index 0000000..08ed7e8
--- /dev/null
+++ b/cnas-manage/src/main/resources/mapper/InternalReportMapper.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+<mapper namespace="com.ruoyi.manage.mapper.InternalReportMapper">
+    <!-- 鍐呭鎶ュ憡鍒嗛〉鏌ヨ -->
+    <select id="pageInternalReport" resultType="com.ruoyi.manage.pojo.InternalReport">
+        select *
+        from (select *
+        from cnas_internal_report
+        order by create_time desc) a
+        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
+            ${ew.customSqlSegment}
+        </if>
+    </select>
+</mapper>
diff --git a/cnas-manage/src/main/resources/mapper/ManageControlPlanListMapper.xml b/cnas-manage/src/main/resources/mapper/ManageControlPlanListMapper.xml
new file mode 100644
index 0000000..967e653
--- /dev/null
+++ b/cnas-manage/src/main/resources/mapper/ManageControlPlanListMapper.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.ruoyi.manage.mapper.ManageControlPlanListMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.ruoyi.manage.pojo.ManageControlPlanList">
+        <id column="id" property="id" />
+        <result column="job_activity" property="jobActivity" />
+        <result column="category" property="category" />
+        <result column="description" property="description" />
+        <result column="result" property="result" />
+        <result column="intolerable" property="intolerable" />
+        <result column="plan" property="plan" />
+        <result column="editor" property="editor" />
+        <result column="editor_date" property="editorDate" />
+        <result column="approval" property="approval" />
+        <result column="approval_date" property="approvalDate" />
+        <result column="approve" property="approve" />
+        <result column="approve_date" property="approveDate" />
+    </resultMap>
+
+    <select id="getPageList" resultType="com.ruoyi.manage.vo.ManageControlPlanListVo">
+        select c.*, u1.name editor_name, u2.name approval_name, u3.name approve_name
+        from cnas_manage_control_plan_list c
+                 left join user u1 on u1.id = c.editor
+                 left join user u2 on u2.id = c.approval
+                 left join user u3 on u3.id = c.approve
+        <if test="itSExporting == true">
+            where c.approve_status = 1
+            and c.approval_status = 1
+        </if>
+    </select>
+</mapper>
diff --git a/cnas-manage/src/main/resources/mapper/ManageDocumentAlterMapper.xml b/cnas-manage/src/main/resources/mapper/ManageDocumentAlterMapper.xml
new file mode 100644
index 0000000..3bef9a0
--- /dev/null
+++ b/cnas-manage/src/main/resources/mapper/ManageDocumentAlterMapper.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.manage.mapper.ManageDocumentAlterMapper">
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.ruoyi.manage.pojo.ManageDocumentAlter">
+        <id column="id" property="id"/>
+        <result column="code" property="code"/>
+        <result column="create_user" property="createUser"/>
+        <result column="createUserName" property="createUserName"/>
+        <result column="update_user" property="updateUser"/>
+        <result column="create_time" property="createTime"/>
+        <result column="update_time" property="updateTime"/>
+        <result column="expect_alter_date" property="expectAlterDate"/>
+        <result column="actually_alter_date" property="actuallyAlterDate"/>
+        <result column="state" property="state"/>
+        <result column="check_user" property="checkUser"/>
+        <result column="checkUserName" property="checkUserName"/>
+        <result column="alter_note" property="alterNote"/>
+        <result column="alter_before_code" property="alterBeforeCode"/>
+        <result column="alter_before_name" property="alterBeforeName"/>
+        <result column="alter_before_version" property="alterBeforeVersion"/>
+        <result column="alter_after_code" property="alterAfterCode"/>
+        <result column="alter_after_name" property="alterAfterName"/>
+        <result column="alter_after_version" property="alterAfterVersion"/>
+        <result column="alter_after_url" property="alterAfterUrl"/>
+        <result column="method" property="method"/>
+    </resultMap>
+
+    <select id="pageManageDocumentAlter" resultMap="BaseResultMap">
+        select * from (select cmda.*,
+        name createUserName
+        from cnas_manage_document_alter cmda
+        left join user u on cmda.create_user = u.id) A
+        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
+            ${ew.customSqlSegment}
+        </if>
+    </select>
+
+    <select id="getManageDocumentAlter" resultMap="BaseResultMap">
+        select cmda.*,
+               u1.name createUserName,
+               u2.name checkUserName
+        from cnas_manage_document_alter cmda
+                 left join user u1 on cmda.create_user = u1.id
+                 left join user u2 on cmda.check_user = u2.id
+        where cmda.id = #{id}
+    </select>
+</mapper>
diff --git a/cnas-manage/src/main/resources/mapper/ManageDocumentCancelMapper.xml b/cnas-manage/src/main/resources/mapper/ManageDocumentCancelMapper.xml
new file mode 100644
index 0000000..c25cfe5
--- /dev/null
+++ b/cnas-manage/src/main/resources/mapper/ManageDocumentCancelMapper.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.ruoyi.manage.mapper.ManageDocumentCancelMapper">
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.ruoyi.manage.pojo.ManageDocumentCancel">
+        <id column="id" property="id"/>
+        <result column="create_user" property="createUser"/>
+        <result column="createUserName" property="createUserName"/>
+        <result column="update_user" property="updateUser"/>
+        <result column="create_time" property="createTime"/>
+        <result column="update_time" property="updateTime"/>
+        <result column="document_code" property="documentCode"/>
+        <result column="name" property="name"/>
+        <result column="version" property="version"/>
+        <result column="document_state" property="documentState"/>
+        <result column="method" property="method"/>
+        <result column="cancel_note" property="cancelNote"/>
+        <result column="check_user" property="checkUser"/>
+        <result column="checkUserName" property="checkUserName"/>
+        <result column="expect_cancel_date" property="expectCancelDate"/>
+        <result column="actually_cancel_date" property="actuallyCancelDate"/>
+        <result column="state" property="state"/>
+    </resultMap>
+
+    <select id="pageManageDocumentCancel" resultMap="BaseResultMap">
+        select * from (select mdc.*,
+        u.name createUserName
+        from cnas_manage_document_cancel mdc
+        left join user u on mdc.create_user = u.id)A
+        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
+            ${ew.customSqlSegment}
+        </if>
+    </select>
+
+    <select id="getManageDocumentCancel" resultMap="BaseResultMap">
+        select mdc.*,
+               u1.name createUserName,
+               u2.name checkUserName
+        from cnas_manage_document_cancel mdc
+                 left join user u1 on mdc.create_user = u1.id
+                 left join user u2 on mdc.check_user = u2.id
+        where mdc.id=#{id}
+    </select>
+</mapper>
diff --git a/cnas-manage/src/main/resources/mapper/ManageDocumentControlledMapper.xml b/cnas-manage/src/main/resources/mapper/ManageDocumentControlledMapper.xml
new file mode 100644
index 0000000..554119e
--- /dev/null
+++ b/cnas-manage/src/main/resources/mapper/ManageDocumentControlledMapper.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.manage.mapper.ManageDocumentControlledMapper">
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.ruoyi.manage.pojo.ManageDocumentControlled">
+        <id column="id" property="id"/>
+        <result column="document_code" property="documentCode"/>
+        <result column="type" property="type"/>
+        <result column="name" property="name"/>
+        <result column="version" property="version"/>
+        <result column="writer" property="writer"/>
+        <result column="submit_date" property="submitDate"/>
+        <result column="instructions" property="instructions"/>
+        <result column="state" property="state"/>
+        <result column="url" property="url"/>
+        <result column="duty_user" property="dutyUser"/>
+        <result column="dutyUserName" property="dutyUserName"/>
+        <result column="create_user" property="createUser"/>
+        <result column="createUserName" property="createUserName"/>
+        <result column="createUserDepartLims" property="createUserDepartLims"/>
+        <result column="update_user" property="updateUser"/>
+        <result column="create_time" property="createTime"/>
+        <result column="update_time" property="updateTime"/>
+    </resultMap>
+
+    <select id="pageManageDocumentControlled" resultMap="BaseResultMap">
+        select * from (select cmdc.*, u1.name createUserName, u2.name dutyUserName
+        from cnas_manage_document_controlled cmdc
+        left join user u1 on cmdc.create_user = u1.id
+        left join user u2 on cmdc.duty_user = u2.id)A
+        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
+            ${ew.customSqlSegment}
+        </if>
+    </select>
+
+    <select id="getManageDocumentControlled" resultMap="BaseResultMap">
+        select cmdc.*, u1.name createUserName, u2.name dutyUserName
+        from cnas_manage_document_controlled cmdc
+                 left join user u1 on cmdc.create_user = u1.id
+                 left join user u2 on cmdc.duty_user = u2.id
+    </select>
+</mapper>
diff --git a/cnas-manage/src/main/resources/mapper/ManageDocumentIssueRecycleMapper.xml b/cnas-manage/src/main/resources/mapper/ManageDocumentIssueRecycleMapper.xml
new file mode 100644
index 0000000..01d95b7
--- /dev/null
+++ b/cnas-manage/src/main/resources/mapper/ManageDocumentIssueRecycleMapper.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.manage.mapper.ManageDocumentIssueRecycleMapper">
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.ruoyi.manage.pojo.ManageDocumentIssueRecycle">
+        <id column="id" property="id"/>
+        <result column="document_code" property="documentCode"/>
+        <result column="name" property="name"/>
+        <result column="version" property="version"/>
+        <result column="state" property="state"/>
+        <result column="document_state" property="documentState"/>
+        <result column="issue_code" property="issueCode"/>
+        <result column="issue_user" property="issueUser"/>
+        <result column="issue_date" property="issueDate"/>
+        <result column="issue_note" property="issueNote"/>
+        <result column="receive_user" property="receiveUser"/>
+        <result column="receive_date" property="receiveDate"/>
+        <result column="recycle_code" property="recycleCode"/>
+        <result column="recycle_user" property="recycleUser"/>
+        <result column="recycle_date" property="recycleDate"/>
+        <result column="recycle_note" property="recycleNote"/>
+        <result column="create_user" property="createUser"/>
+        <result column="update_user" property="updateUser"/>
+        <result column="create_time" property="createTime"/>
+        <result column="update_time" property="updateTime"/>
+        <result column="url" property="url"/>
+    </resultMap>
+
+    <select id="pageManageDocumentIssueRecycle" resultType="com.ruoyi.manage.dto.ManageDocumentIssueRecycleDto">
+        select * from (select cmdir.*,
+        u1.name issueUserName,
+        u2.name recycleUserName,
+        u3.name receiveUserName
+        from cnas_manage_document_issue_recycle cmdir
+        left join user u1 on issue_user=u1.id
+        left join user u2 on recycle_user=u2.id
+        left join user u3 on receive_user=u3.id) A
+        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
+            ${ew.customSqlSegment}
+        </if>
+    </select>
+
+    <select id="getManageDocumentIssueRecycle" resultType="com.ruoyi.manage.dto.ManageDocumentIssueRecycleDto">
+        select cmdir.*,
+               u1.name issueUserName,
+               u2.name recycleUserName,
+               u3.name receiveUserNmae
+        from cnas_manage_document_issue_recycle cmdir
+                 left join user u1 on issue_user=u1.id
+                 left join user u2 on recycle_user=u2.id
+                 left join user u3 on receive_user=u3.id
+        where cmdir.id=#{id}
+    </select>
+</mapper>
diff --git a/cnas-manage/src/main/resources/mapper/ManageDocumentListMapper.xml b/cnas-manage/src/main/resources/mapper/ManageDocumentListMapper.xml
new file mode 100644
index 0000000..d4bf823
--- /dev/null
+++ b/cnas-manage/src/main/resources/mapper/ManageDocumentListMapper.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.manage.mapper.ManageDocumentListMapper">
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.ruoyi.manage.pojo.ManageDocumentList">
+        <id column="id" property="id"/>
+        <result column="document_code" property="documentCode"/>
+        <result column="type" property="type"/>
+        <result column="name" property="name"/>
+        <result column="version" property="version"/>
+        <result column="writer" property="writer"/>
+        <result column="effective_date" property="effectiveDate"/>
+        <result column="state" property="state"/>
+        <result column="url" property="url"/>
+        <result column="create_user" property="createUser"/>
+        <result column="update_user" property="updateUser"/>
+        <result column="create_time" property="createTime"/>
+        <result column="update_time" property="updateTime"/>
+    </resultMap>
+    <select id="pageManageDocumentList" resultType="com.ruoyi.manage.pojo.ManageDocumentList">
+        select * from (select * from cnas_manage_document_list ) A
+        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
+            ${ew.customSqlSegment}
+        </if>
+    </select>
+</mapper>
diff --git a/cnas-manage/src/main/resources/mapper/ManageMeetingMapper.xml b/cnas-manage/src/main/resources/mapper/ManageMeetingMapper.xml
new file mode 100644
index 0000000..700c5dd
--- /dev/null
+++ b/cnas-manage/src/main/resources/mapper/ManageMeetingMapper.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.manage.mapper.ManageMeetingMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.ruoyi.manage.pojo.ManageMeeting">
+        <id column="id" property="id" />
+        <result column="meeting_time" property="meetingTime" />
+        <result column="place" property="place" />
+        <result column="compere" property="compere" />
+        <result column="content" property="content" />
+        <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="page" resultType="com.ruoyi.manage.dto.ManageMeetingDto">
+        select cmm.* from cnas_manage_meeting  cmm
+        <where>
+            <if test="startTime != null and startTime != ''">
+                meeting_time >= #{startTime}
+            </if>
+            <if test="endTime != null and endTime != ''">
+                and #{endTime} >= meeting_time
+            </if>
+            <if test="place != null and place != ''">
+                and place = #{place}
+            </if>
+        </where>
+    </select>
+
+</mapper>
diff --git a/cnas-manage/src/main/resources/mapper/ManageMeetingParticipantsMapper.xml b/cnas-manage/src/main/resources/mapper/ManageMeetingParticipantsMapper.xml
new file mode 100644
index 0000000..f866b80
--- /dev/null
+++ b/cnas-manage/src/main/resources/mapper/ManageMeetingParticipantsMapper.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.manage.mapper.ManageMeetingParticipantsMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.ruoyi.manage.pojo.ManageMeetingParticipants">
+        <id column="id" property="id" />
+        <result column="participants" property="participants" />
+        <result column="department" property="department" />
+        <result column="meeting_id" property="meetingId" />
+        <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-manage/src/main/resources/mapper/ManageRecordAuditMapper.xml b/cnas-manage/src/main/resources/mapper/ManageRecordAuditMapper.xml
new file mode 100644
index 0000000..2e216f4
--- /dev/null
+++ b/cnas-manage/src/main/resources/mapper/ManageRecordAuditMapper.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.manage.mapper.ManageRecordAuditMapper">
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.ruoyi.manage.pojo.ManageRecordAudit">
+        <id column="id" property="id"/>
+        <result column="document_code" property="documentCode"/>
+        <result column="document_name" property="documentName"/>
+        <result column="capter" property="capter"/>
+        <result column="pages" property="pages"/>
+        <result column="number" property="number"/>
+        <result column="before_version" property="beforeVersion"/>
+        <result column="after_version" property="afterVersion"/>
+        <result column="alter_thing" property="alterThing"/>
+        <result column="alter_user" property="alterUser"/>
+        <result column="alterUserName" property="alterUserName"/>
+        <result column="ratify_user" property="ratifyUser"/>
+        <result column="ratifyUserName" property="ratifyUserName"/>
+        <result column="ratifyUserUrl" property="ratifyUserUrl"/>
+        <result column="date" property="date"/>
+        <result column="create_user" property="createUser"/>
+        <result column="createUserName" property="createUserName"/>
+        <result column="createUserDepart" property="createUserDepart"/>
+        <result column="update_user" property="updateUser"/>
+        <result column="create_time" property="createTime"/>
+        <result column="update_time" property="updateTime"/>
+        <result column="reason" property="reason"/>
+        <result column="before_depart" property="beforeDepart"/>
+        <result column="after_depart" property="afterDepart"/>
+        <result column="applicant" property="applicant"/>
+        <result column="formulation" property="formulation"/>
+        <result column="audit" property="audit"/>
+        <result column="method" property="method"/>
+    </resultMap>
+
+    <select id="pageManageRecordAudit" resultMap="BaseResultMap">
+        select * from (select cmra.*,
+        u1.name createUserName,
+        u2.name alterUserName,
+        u3.signature_url ratifyUserUrl,
+        u3.name ratifyUserName
+        from cnas_manage_record_audit cmra
+        left join user u1 on cmra.create_user = u1.id
+        left join user u2 on cmra.alter_user = u2.id
+        left join user u3 on cmra.ratify_user = u3.id)A
+        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
+            ${ew.customSqlSegment}
+        </if>
+    </select>
+</mapper>
diff --git a/cnas-manage/src/main/resources/mapper/ManageRecordCancelMapper.xml b/cnas-manage/src/main/resources/mapper/ManageRecordCancelMapper.xml
new file mode 100644
index 0000000..039ec0f
--- /dev/null
+++ b/cnas-manage/src/main/resources/mapper/ManageRecordCancelMapper.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.ruoyi.manage.mapper.ManageRecordCancelMapper">
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.ruoyi.manage.pojo.ManageRecordCancel">
+        <id column="id" property="id"/>
+        <result column="document_code" property="documentCode"/>
+        <result column="document_name" property="documentName"/>
+        <result column="qty" property="qty"/>
+        <result column="reason" property="reason"/>
+        <result column="create_user" property="createUser"/>
+        <result column="createUserName" property="createUserName"/>
+        <result column="update_user" property="updateUser"/>
+        <result column="create_time" property="createTime"/>
+        <result column="update_time" property="updateTime"/>
+        <result column="ratify_user" property="ratifyUser"/>
+        <result column="ratify_state" property="ratifyState"/>
+        <result column="ratifyUserName" property="ratifyUserName"/>
+        <result column="ratify_time" property="ratifyTime"/>
+        <result column="remark" property="remark"/>
+    </resultMap>
+
+    <select id="pageManageRecordCancel" resultMap="BaseResultMap">
+        select * from (select cmrc.*,
+        u1.name createUserName,
+        u2.name ratifyUserName
+        from cnas_manage_record_cancel cmrc
+        left join user u1 on cmrc.create_user = u1.id
+        left join user u2 on cmrc.ratify_user = u2.id)A
+        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
+            ${ew.customSqlSegment}
+        </if>
+    </select>
+</mapper>
diff --git a/cnas-manage/src/main/resources/mapper/ManageRecordCheckMapper.xml b/cnas-manage/src/main/resources/mapper/ManageRecordCheckMapper.xml
new file mode 100644
index 0000000..e320c4a
--- /dev/null
+++ b/cnas-manage/src/main/resources/mapper/ManageRecordCheckMapper.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.manage.mapper.ManageRecordCheckMapper">
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.ruoyi.manage.pojo.ManageRecordCheck">
+        <id column="id" property="id"/>
+        <result column="document_name" property="documentName"/>
+        <result column="document_code" property="documentCode"/>
+        <result column="document_version" property="documentVersion"/>
+        <result column="write_user" property="writeUser"/>
+        <result column="writeUserName" property="writeUserName"/>
+        <result column="check_user" property="checkUser"/>
+        <result column="checkUserName" property="checkUserName"/>
+        <result column="check_state" property="checkState"/>
+        <result column="ratify_user" property="ratifyUser"/>
+        <result column="ratifyUserName" property="ratifyUserName"/>
+        <result column="ratify_state" property="ratifyState"/>
+        <result column="ratify_date" property="ratifyDate"/>
+        <result column="remark" property="remark"/>
+    </resultMap>
+
+    <select id="pageManageRecordCheck" resultMap="BaseResultMap">
+        select * from (select cmrc.*,
+        u1.name writeUserName,
+        u2.name checkUserName,
+        u3.name ratifyUserName
+        from cnas_manage_record_check cmrc
+        left join user u1 on write_user=u1.id
+        left join user u2 on check_user=u2.id
+        left join user u3 on ratify_user=u3.id)A
+        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
+            ${ew.customSqlSegment}
+        </if>
+    </select>
+</mapper>
diff --git a/cnas-manage/src/main/resources/mapper/ManageRecordIntervalsMapper.xml b/cnas-manage/src/main/resources/mapper/ManageRecordIntervalsMapper.xml
new file mode 100644
index 0000000..bc59cb3
--- /dev/null
+++ b/cnas-manage/src/main/resources/mapper/ManageRecordIntervalsMapper.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.ruoyi.manage.mapper.ManageRecordIntervalsMapper">
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.ruoyi.manage.pojo.ManageRecordIntervals">
+        <id column="id" property="id"/>
+        <result column="document_name" property="documentName"/>
+        <result column="document_code" property="documentCode"/>
+        <result column="document_version" property="documentVersion"/>
+        <result column="revision" property="revision"/>
+        <result column="suitability" property="suitability"/>
+        <result column="remark" property="remark"/>
+        <result column="create_user" property="createUser"/>
+        <result column="update_user" property="updateUser"/>
+        <result column="create_time" property="createTime"/>
+        <result column="update_time" property="updateTime"/>
+        <result column="record_intervals_total_id" property="recordIntervalsTotalId"/>
+    </resultMap>
+
+    <select id="pageManageRecordIntervals" resultMap="BaseResultMap">
+        select *
+        from (select * from cnas_manage_record_intervals) A
+        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
+            ${ew.customSqlSegment}
+        </if>
+    </select>
+</mapper>
diff --git a/cnas-manage/src/main/resources/mapper/ManageRecordIntervalsTotalMapper.xml b/cnas-manage/src/main/resources/mapper/ManageRecordIntervalsTotalMapper.xml
new file mode 100644
index 0000000..da181ed
--- /dev/null
+++ b/cnas-manage/src/main/resources/mapper/ManageRecordIntervalsTotalMapper.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.ruoyi.manage.mapper.ManageRecordIntervalsTotalMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.ruoyi.manage.pojo.ManageRecordIntervalsTotal">
+        <id column="id" property="id" />
+        <result column="ratify_user" property="ratifyUser"/>
+        <result column="ratifyUserName" property="ratifyUserName"/>
+        <result column="ratify_state" property="ratifyState"/>
+        <result column="ratify_date" property="ratifyDate"/>
+        <result column="ratify_url" property="ratifyUrl"/>
+        <result column="submit_user" property="submitUser"/>
+        <result column="submitUserName" property="submitUserName"/>
+        <result column="submit_url" property="submitUrl"/>
+        <result column="submit_date" property="submitDate"/>
+        <result column="year" property="year"/>
+        <result column="total_num" property="totalNum"/>
+        <result column="url" property="url"/>
+    </resultMap>
+
+    <select id="pageManageRecordIntervalsTotal" resultMap="BaseResultMap">
+        select * from (select cmrit.*,
+        u1.name submitUserName,
+        u2.name ratifyUserName
+        from cnas_manage_record_intervals_total cmrit
+        left join user u1 on u1.id=submit_user
+        left join user u2 on u2.id=ratify_user)A
+        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
+            ${ew.customSqlSegment}
+        </if>
+    </select>
+</mapper>
diff --git a/cnas-manage/src/main/resources/mapper/ManageRecordIssueRecycleMapper.xml b/cnas-manage/src/main/resources/mapper/ManageRecordIssueRecycleMapper.xml
new file mode 100644
index 0000000..fead5a3
--- /dev/null
+++ b/cnas-manage/src/main/resources/mapper/ManageRecordIssueRecycleMapper.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.ruoyi.manage.mapper.ManageRecordIssueRecycleMapper">
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.ruoyi.manage.pojo.ManageRecordIssueRecycle">
+        <id column="id" property="id"/>
+        <result column="document_code" property="documentCode"/>
+        <result column="document_name" property="documentName"/>
+        <result column="document_version" property="documentVersion"/>
+        <result column="pages" property="pages"/>
+        <result column="document_type" property="documentType"/>
+        <result column="number" property="number"/>
+        <result column="depart_lims" property="departLims"/>
+        <result column="receive_user" property="receiveUser"/>
+        <result column="receiveUserName" property="receiveUserName"/>
+        <result column="receive_date" property="receiveDate"/>
+        <result column="signed_user" property="signedUser"/>
+        <result column="signedUserName" property="signedUserName"/>
+        <result column="signed_date" property="signedDate"/>
+    </resultMap>
+
+    <select id="pageManageRecordIssueRecycle" resultMap="BaseResultMap">
+        select * from (select cmrir.*,
+        u1.name receiveUserName,
+        u2.name signedUserName
+        from cnas_manage_record_issue_recycle cmrir
+        left join user u1 on receive_user=u1.id
+        left join user u2 on signed_user=u2.id)A
+        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
+            ${ew.customSqlSegment}
+        </if>
+    </select>
+</mapper>
diff --git a/cnas-manage/src/main/resources/mapper/ManageRecordTotalMapper.xml b/cnas-manage/src/main/resources/mapper/ManageRecordTotalMapper.xml
new file mode 100644
index 0000000..a06dbc1
--- /dev/null
+++ b/cnas-manage/src/main/resources/mapper/ManageRecordTotalMapper.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.manage.mapper.ManageRecordTotalMapper">
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.ruoyi.manage.pojo.ManageRecordTotal">
+        <id column="id" property="id"/>
+        <result column="ratify_user" property="ratifyUser"/>
+        <result column="ratifyUserName" property="ratifyUserName"/>
+        <result column="ratify_state" property="ratifyState"/>
+        <result column="ratify_date" property="ratifyDate"/>
+        <result column="ratify_url" property="ratifyUrl"/>
+        <result column="submit_user" property="submitUser"/>
+        <result column="submitUserName" property="submitUserName"/>
+        <result column="submit_url" property="submitUrl"/>
+        <result column="submit_date" property="submitDate"/>
+        <result column="year" property="year"/>
+        <result column="total_num" property="totalNum"/>
+        <result column="url" property="url"/>
+    </resultMap>
+
+    <select id="pageProcessTotaldeal" resultMap="BaseResultMap">
+        select * from (select cmrt.*,
+        u1.name submitUserName,
+        u2.name ratifyUserName
+        from cnas_manage_record_total cmrt
+        left join user u1 on u1.id=submit_user
+        left join user u2 on u2.id=ratify_user)A
+        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
+            ${ew.customSqlSegment}
+        </if>
+    </select>
+</mapper>
diff --git a/cnas-manage/src/main/resources/mapper/ManageRecordVerifyMapper.xml b/cnas-manage/src/main/resources/mapper/ManageRecordVerifyMapper.xml
new file mode 100644
index 0000000..0cc2170
--- /dev/null
+++ b/cnas-manage/src/main/resources/mapper/ManageRecordVerifyMapper.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.ruoyi.manage.mapper.ManageRecordVerifyMapper">
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.ruoyi.manage.pojo.ManageRecordVerify">
+        <id column="id" property="id"/>
+        <result column="document_name" property="documentName"/>
+        <result column="document_code" property="documentCode"/>
+        <result column="standard_name" property="standardName"/>
+        <result column="standard_code" property="standardCode"/>
+        <result column="effective_date" property="effectiveDate"/>
+        <result column="cancel_date" property="cancelDate"/>
+        <result column="note" property="note"/>
+        <result column="manage_record_total_id" property="manageRecordTotalId"/>
+    </resultMap>
+
+    <select id="pageManageRecordVerify" resultMap="BaseResultMap">
+        select * from (select * from cnas_manage_record_verify)A
+        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
+            ${ew.customSqlSegment}
+        </if>
+    </select>
+</mapper>
diff --git a/cnas-manage/src/main/resources/mapper/ManageReviewProgramFileMapper.xml b/cnas-manage/src/main/resources/mapper/ManageReviewProgramFileMapper.xml
new file mode 100644
index 0000000..068211c
--- /dev/null
+++ b/cnas-manage/src/main/resources/mapper/ManageReviewProgramFileMapper.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.manage.mapper.ManageReviewProgramFileMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.ruoyi.manage.pojo.ManageReviewProgramFile">
+        <id column="id" property="id" />
+        <result column="file_name" property="fileName" />
+        <result column="review_id" property="reviewId" />
+        <result column="url" property="url" />
+        <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-manage/src/main/resources/mapper/ManageReviewProgramMapper.xml b/cnas-manage/src/main/resources/mapper/ManageReviewProgramMapper.xml
new file mode 100644
index 0000000..7ec06a9
--- /dev/null
+++ b/cnas-manage/src/main/resources/mapper/ManageReviewProgramMapper.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.manage.mapper.ManageReviewProgramMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.ruoyi.manage.pojo.ManageReviewProgram">
+        <id column="id" property="id" />
+        <result column="review_time" property="reviewTime" />
+        <result column="judging_location" property="judgingLocation" />
+        <result column="judging_purpose" property="judgingPurpose" />
+        <result column="judging_method" property="judgingMethod" />
+        <result column="participants" property="participants" />
+        <result column="judging_scope" property="judgingScope" />
+        <result column="judging_basis" property="judgingBasis" />
+        <result column="main_context" property="mainContext" />
+        <result column="preparation_requirements" property="preparationRequirements" />
+        <result column="editor" property="editor" />
+        <result column="editor_date" property="editorDate" />
+        <result column="approve" property="approve" />
+        <result column="approve_date" property="approveDate" />
+        <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="page" resultType="com.ruoyi.manage.pojo.ManageReviewProgram">
+        select * from cnas_manage_review_program
+        <where>
+            <if test="startTime != null and startTime != ''">
+                 review_time >= #{startTime}
+            </if>
+            <if test="endTime != null and endTime != ''">
+                and #{endTime} >= review_time
+            </if>
+            <if test="judgingLocation != null and judgingLocation != ''">
+                and judging_location = #{judgingLocation}
+            </if>
+        </where>
+    </select>
+
+</mapper>
diff --git a/cnas-manage/src/main/resources/mapper/ManageReviewReportMapper.xml b/cnas-manage/src/main/resources/mapper/ManageReviewReportMapper.xml
new file mode 100644
index 0000000..5f59653
--- /dev/null
+++ b/cnas-manage/src/main/resources/mapper/ManageReviewReportMapper.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.manage.mapper.ManageReviewReportMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.ruoyi.manage.pojo.ManageReviewReport">
+        <id column="id" property="id" />
+        <result column="objective" property="objective" />
+        <result column="place" property="place" />
+        <result column="compere" property="compere" />
+        <result column="record_people" property="recordPeople" />
+        <result column="date" property="date" />
+        <result column="page" property="page" />
+        <result column="judging_method" property="judgingMethod" />
+        <result column="review_basis" property="reviewBasis" />
+        <result column="attendess" property="attendess" />
+        <result column="review_inputs" property="reviewInputs" />
+        <result column="review_process" property="reviewProcess" />
+        <result column="main_topic" property="mainTopic" />
+        <result column="matters" property="matters" />
+        <result column="head" property="head" />
+        <result column="completion_date" property="completionDate" />
+        <result column="tracking_confirmed" property="trackingConfirmed" />
+        <result column="foller_up" property="follerUp" />
+        <result column="overall_evaluation" property="overallEvaluation" />
+        <result column="audit" property="audit" />
+        <result column="approval" property="approval" />
+        <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="page" resultType="com.ruoyi.manage.pojo.ManageReviewReport">
+        select * from cnas_manage_review_report
+        <where>
+            <if test="startTime != null and startTime != ''">
+                `date` >= #{startTime}
+            </if>
+            <if test="endTime != null and endTime != ''">
+                and #{endTime} >= `date`
+            </if>
+            <if test="place != null and place != ''">
+                and place = #{place}
+            </if>
+        </where>
+    </select>
+
+</mapper>
diff --git a/cnas-manage/src/main/resources/mapper/ManageRiskAssessmentResultsMapper.xml b/cnas-manage/src/main/resources/mapper/ManageRiskAssessmentResultsMapper.xml
new file mode 100644
index 0000000..bb4e2c6
--- /dev/null
+++ b/cnas-manage/src/main/resources/mapper/ManageRiskAssessmentResultsMapper.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.manage.mapper.ManageRiskAssessmentResultsMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.ruoyi.manage.pojo.ManageRiskAssessmentResults">
+        <id column="id" property="id" />
+        <result column="venue" property="venue" />
+        <result column="hazard" property="hazard" />
+        <result column="accidents" property="accidents" />
+        <result column="injury" property="injury" />
+        <result column="risk_L" property="riskL" />
+        <result column="risk_E" property="riskE" />
+        <result column="risk_C" property="riskC" />
+        <result column="risk_D" property="riskD" />
+        <result column="level" property="level" />
+        <result column="conclusion" property="conclusion" />
+        <result column="measures" property="measures" />
+        <result column="editor" property="editor" />
+        <result column="editor_date" property="editorDate" />
+        <result column="approval" property="approval" />
+        <result column="approval_date" property="approvalDate" />
+        <result column="approve" property="approve" />
+        <result column="approve_date" property="approveDate" />
+    </resultMap>
+
+    <select id="getPageResults" resultType="com.ruoyi.manage.vo.ManageRiskAssessmentResultsVo">
+        select c.*, u1.name editor_name, u2.name approval_name, u3.name approve_name
+        from cnas_manage_risk_assessment_results c
+                 left join user u1 on u1.id = c.editor
+                 left join user u2 on u2.id = c.approval
+                 left join user u3 on u3.id = c.approve
+        <if test="itSExporting == true">
+            where c.approve_status = 1
+            and c.approval_status = 1
+        </if>
+    </select>
+</mapper>
diff --git a/cnas-manage/src/main/resources/static/analysis-risk-factors.docx b/cnas-manage/src/main/resources/static/analysis-risk-factors.docx
new file mode 100644
index 0000000..2a43d7a
--- /dev/null
+++ b/cnas-manage/src/main/resources/static/analysis-risk-factors.docx
Binary files differ
diff --git a/cnas-manage/src/main/resources/static/audit-deal.docx b/cnas-manage/src/main/resources/static/audit-deal.docx
new file mode 100644
index 0000000..5f10163
--- /dev/null
+++ b/cnas-manage/src/main/resources/static/audit-deal.docx
Binary files differ
diff --git a/cnas-manage/src/main/resources/static/cancel-deal.docx b/cnas-manage/src/main/resources/static/cancel-deal.docx
new file mode 100644
index 0000000..fee34ad
--- /dev/null
+++ b/cnas-manage/src/main/resources/static/cancel-deal.docx
Binary files differ
diff --git a/cnas-manage/src/main/resources/static/check-deal.docx b/cnas-manage/src/main/resources/static/check-deal.docx
new file mode 100644
index 0000000..20a6735
--- /dev/null
+++ b/cnas-manage/src/main/resources/static/check-deal.docx
Binary files differ
diff --git a/cnas-manage/src/main/resources/static/customer-satisfaction-questionnaire.docx b/cnas-manage/src/main/resources/static/customer-satisfaction-questionnaire.docx
new file mode 100644
index 0000000..dca145e
--- /dev/null
+++ b/cnas-manage/src/main/resources/static/customer-satisfaction-questionnaire.docx
Binary files differ
diff --git a/cnas-manage/src/main/resources/static/internal-check.docx b/cnas-manage/src/main/resources/static/internal-check.docx
new file mode 100644
index 0000000..7875182
--- /dev/null
+++ b/cnas-manage/src/main/resources/static/internal-check.docx
Binary files differ
diff --git a/cnas-manage/src/main/resources/static/internal-correct.docx b/cnas-manage/src/main/resources/static/internal-correct.docx
new file mode 100644
index 0000000..abf9817
--- /dev/null
+++ b/cnas-manage/src/main/resources/static/internal-correct.docx
Binary files differ
diff --git a/cnas-manage/src/main/resources/static/internal-implement.docx b/cnas-manage/src/main/resources/static/internal-implement.docx
new file mode 100644
index 0000000..6dcf362
--- /dev/null
+++ b/cnas-manage/src/main/resources/static/internal-implement.docx
Binary files differ
diff --git a/cnas-manage/src/main/resources/static/internal-meeting.docx b/cnas-manage/src/main/resources/static/internal-meeting.docx
new file mode 100644
index 0000000..f126cbf
--- /dev/null
+++ b/cnas-manage/src/main/resources/static/internal-meeting.docx
Binary files differ
diff --git a/cnas-manage/src/main/resources/static/internal-plan.docx b/cnas-manage/src/main/resources/static/internal-plan.docx
new file mode 100644
index 0000000..83890be
--- /dev/null
+++ b/cnas-manage/src/main/resources/static/internal-plan.docx
Binary files differ
diff --git a/cnas-manage/src/main/resources/static/internal-report.docx b/cnas-manage/src/main/resources/static/internal-report.docx
new file mode 100644
index 0000000..480641f
--- /dev/null
+++ b/cnas-manage/src/main/resources/static/internal-report.docx
Binary files differ
diff --git a/cnas-manage/src/main/resources/static/intervals-deal.docx b/cnas-manage/src/main/resources/static/intervals-deal.docx
new file mode 100644
index 0000000..4cb9c58
--- /dev/null
+++ b/cnas-manage/src/main/resources/static/intervals-deal.docx
Binary files differ
diff --git a/cnas-manage/src/main/resources/static/recycle-deal.docx b/cnas-manage/src/main/resources/static/recycle-deal.docx
new file mode 100644
index 0000000..bc57eb3
--- /dev/null
+++ b/cnas-manage/src/main/resources/static/recycle-deal.docx
Binary files differ
diff --git a/cnas-manage/src/main/resources/static/review-meet.docx b/cnas-manage/src/main/resources/static/review-meet.docx
new file mode 100644
index 0000000..a9cfd92
--- /dev/null
+++ b/cnas-manage/src/main/resources/static/review-meet.docx
Binary files differ
diff --git a/cnas-manage/src/main/resources/static/review-program.docx b/cnas-manage/src/main/resources/static/review-program.docx
new file mode 100644
index 0000000..eb57164
--- /dev/null
+++ b/cnas-manage/src/main/resources/static/review-program.docx
Binary files differ
diff --git a/cnas-manage/src/main/resources/static/review-report.docx b/cnas-manage/src/main/resources/static/review-report.docx
new file mode 100644
index 0000000..4054db5
--- /dev/null
+++ b/cnas-manage/src/main/resources/static/review-report.docx
Binary files differ
diff --git a/cnas-manage/src/main/resources/static/risk-factor-identification-risk.docx b/cnas-manage/src/main/resources/static/risk-factor-identification-risk.docx
new file mode 100644
index 0000000..af89f9d
--- /dev/null
+++ b/cnas-manage/src/main/resources/static/risk-factor-identification-risk.docx
Binary files differ
diff --git a/cnas-manage/src/main/resources/static/verify-deal.docx b/cnas-manage/src/main/resources/static/verify-deal.docx
new file mode 100644
index 0000000..f7929c2
--- /dev/null
+++ b/cnas-manage/src/main/resources/static/verify-deal.docx
Binary files differ
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonBasicInfoController.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonBasicInfoController.java
new file mode 100644
index 0000000..f4bb37f
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonBasicInfoController.java
@@ -0,0 +1,243 @@
+package com.ruoyi.personnel.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.common.core.domain.entity.DepartmentDto;
+import com.ruoyi.common.core.domain.entity.DepartmentLims;
+import com.ruoyi.common.utils.FileSaveUtil;
+import com.ruoyi.framework.exception.ErrorException;
+import com.ruoyi.personnel.dto.PersonBasicInfoDetailsDto;
+import com.ruoyi.personnel.dto.PersonBasicInfoDto;
+import com.ruoyi.personnel.dto.UserPageDto;
+import com.ruoyi.personnel.pojo.Annex;
+import com.ruoyi.personnel.pojo.PersonBasicInfoFile;
+import com.ruoyi.personnel.pojo.PersonBasicInfoWork;
+import com.ruoyi.personnel.service.AnnexService;
+import com.ruoyi.personnel.service.PersonBasicInfoFileService;
+import com.ruoyi.personnel.service.PersonBasicInfoService;
+import com.ruoyi.personnel.service.PersonBasicInfoWorkService;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletResponse;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ *  鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-08-30 09:19:57
+ */
+@Tag(name = "浜哄憳-浜哄憳鍩烘湰淇℃伅")
+@RestController
+@RequestMapping("/personBasicInfo")
+public class PersonBasicInfoController {
+
+    @Resource
+    private PersonBasicInfoService personBasicInfoService;
+
+    @Resource
+    private PersonBasicInfoFileService personBasicInfoFileService;
+    @Resource
+    private PersonBasicInfoWorkService personBasicInfoWorkService;
+
+    @Resource
+    private AnnexService annexService;
+
+
+    @Operation(summary = "鏌ヨCNAS浜哄憳渚ц竟鏍�")
+    @GetMapping("/selectCNSAPersonTree")
+    public Result<List<DepartmentDto>> selectCNSAPersonTree() {
+        return Result.success(personBasicInfoService.selectCNSAPersonTree());
+    }
+
+    @Operation(summary = "鑾峰彇CNAS浜哄憳鍩烘湰淇℃伅")
+    @GetMapping("/getCNASPersonnelInfo")
+    public Result getCNASPersonnelInfo(Integer userId) {
+        return Result.success(personBasicInfoService.getCNASPersonnelInfo(userId));
+    }
+
+    @Operation(summary = "淇濆瓨CNAS浜哄憳鍩烘湰淇℃伅")
+    @PostMapping("/saveCNASPersonnelInfo")
+    public Result saveCNASPersonnelInfo(@RequestBody PersonBasicInfoDto personBasicInfoDto) {
+        personBasicInfoService.saveCNASPersonnelInfo(personBasicInfoDto);
+        return Result.success();
+    }
+
+    @Operation(summary = "浜哄憳鏄庣粏鍒嗛〉鏌ヨ")
+    @GetMapping("basicInformationOfPersonnelSelectPage")
+    public Result<IPage<Map<String, Object>>> basicInformationOfPersonnelSelectPage(Page page, String name, Integer departmentId) {
+        return Result.success(personBasicInfoService.basicInformationOfPersonnelSelectPage(page, name, departmentId));
+    }
+
+    // 涓婁紶鏂囦欢鎺ュ彛
+    @Operation(summary = "涓婁紶鏂囦欢鎺ュ彛")
+    @PostMapping("/saveCNASFile")
+    public Result saveFile(@RequestPart("file") MultipartFile file) {
+        String s = FileSaveUtil.uploadWordFile(file);
+        return Result.success(s, "涓婁紶鎴愬姛");
+    }
+
+    @GetMapping("/getAnnexByUserId")
+    public Result<List<Annex>> getAnnexByUserId(Integer userId) {
+        List<Annex> list = annexService.list(new LambdaQueryWrapper<Annex>().eq(Annex::getUserId, userId));
+        return Result.success(list);
+    }
+
+    // 鍒犻櫎鏂囦欢
+    @DeleteMapping("/deleteCNASFile")
+    public Result saveFile(String fileName) {
+        String[] split = fileName.split(",");
+        for (String s : split) {
+            FileSaveUtil.DeleteFile(s);
+        }
+        return Result.success();
+
+    }
+
+    /**
+     * 浜哄憳鍩烘湰淇℃伅闄勪欢鏂板
+     */
+    @PostMapping("/addAnnex")
+    public Result addAnnex(@RequestBody Annex annex) {
+        annexService.save(annex);
+        return Result.success();
+    }
+
+    @GetMapping("/getAnnex")
+    public Result<Annex> getAnnex(Integer id) {
+        return Result.success(annexService.getById(id));
+    }
+    /**
+     * 浜哄憳鍩烘湰淇℃伅闄勪欢鍒犻櫎
+     */
+    @DeleteMapping("/deleteAnnex")
+    public Result deleteAnnex(Integer id) {
+        annexService.removeById(id);
+        return Result.success();
+    }
+
+    /**
+     * 浜哄憳鍩烘湰淇℃伅闄勪欢淇敼
+     *
+     */
+    @PostMapping("/updateAnnex")
+    public Result updateAnnex(@RequestBody Annex annex) {
+        annexService.updateById(annex);
+        return Result.success();
+    }
+
+    @Operation(summary = "瀵煎嚭浜哄憳鍩烘湰淇℃伅")
+    @GetMapping("/exportPersonBasicInfo")
+    public void exportPersonBasicInfo(UserPageDto userPageDto, HttpServletResponse response) throws Exception {
+        personBasicInfoService.exportPersonBasicInfo(userPageDto,response);
+    }
+
+    @Operation(summary = "涓嬭浇浜哄憳妗f鍗�")
+    @GetMapping("/exportPersonBasicInfoById")
+    public Result exportPersonBasicInfoById(Integer id, HttpServletResponse response) {
+        return Result.success(personBasicInfoService.exportPersonBasicInfoById(id,response));
+    }
+
+    /**
+     * 浜哄憳鍩硅鍩烘湰淇℃伅闄勪欢鏂板
+     * @param userId
+     * @param file
+     * @return
+     */
+    @Operation(summary = "浜哄憳鍩硅鍩烘湰淇℃伅闄勪欢鏂板")
+    @PostMapping("/uploadBasicInfoFile")
+    public Result<?> uploadBasicInfoFile(Integer userId, MultipartFile file) {
+        return Result.success(personBasicInfoService.uploadBasicInfoFile(userId, file));
+    }
+
+
+    /**
+     * 浜哄憳鍩硅鍩烘湰淇℃伅闄勪欢鍒楄〃
+     * @return
+     */
+    @Operation(summary = "浜哄憳鍩硅鍩烘湰淇℃伅闄勪欢鍒楄〃")
+    @GetMapping("/getBasicInfoFileList")
+    public Result<List<PersonBasicInfoFile>> getBasicInfoFileList(Integer userId){
+        return Result.success(personBasicInfoFileService.list(Wrappers.<PersonBasicInfoFile>lambdaQuery()
+                .eq(PersonBasicInfoFile::getUserId, userId)));
+    }
+
+    /**
+     * 浜哄憳鍩硅鍩烘湰淇℃伅闄勪欢鍒犻櫎
+     * @return
+     */
+    @Operation(summary = "浜哄憳鍩硅鍩烘湰淇℃伅闄勪欢鍒犻櫎")
+    @DeleteMapping("/delBasicInfoFileList")
+    public Result delBasicInfoFileList(Integer basicInfoFileId){
+        return Result.success(personBasicInfoFileService.removeById(basicInfoFileId));
+    }
+
+    /**
+     * 浜哄憳鍩硅鍩烘湰淇℃伅宸ヤ綔缁忓巻鏂板
+     * @return
+     */
+    @Operation(summary = "浜哄憳鍩硅鍩烘湰淇℃伅宸ヤ綔缁忓巻鏂板")
+    @PostMapping("/addBasicInfoWork")
+    public Result<?> addBasicInfoWork(@RequestBody PersonBasicInfoWork basicInfoWork) {
+        if (basicInfoWork.getUserId() == null) {
+            throw new ErrorException("缂哄皯浜哄憳id");
+        }
+        basicInfoWork.setUserId(basicInfoWork.getUserId());
+        return Result.success(personBasicInfoWorkService.save(basicInfoWork));
+    }
+
+
+    /**
+     * 浜哄憳宸ヤ綔缁忓巻鍒楄〃
+     * @return
+     */
+    @Operation(summary = "浜哄憳宸ヤ綔缁忓巻鍒楄〃")
+    @GetMapping("/getBasicInfoWorkList")
+    public Result<List<PersonBasicInfoWork>> getBasicInfoWorkList(Integer userId){
+        return Result.success(personBasicInfoWorkService.list(Wrappers.<PersonBasicInfoWork>lambdaQuery()
+                .eq(PersonBasicInfoWork::getUserId, userId)));
+    }
+
+    /**
+     * 浜哄憳宸ヤ綔缁忓巻鍒犻櫎
+     * @return
+     */
+    @Operation(summary = "浜哄憳宸ヤ綔缁忓巻鍒犻櫎")
+    @DeleteMapping("/delBasicInfoWorkList")
+    public Result delBasicInfoWorkList(Integer basicInfoWorkId){
+        return Result.success(personBasicInfoWorkService.removeById(basicInfoWorkId));
+    }
+
+    /**
+     * 浜哄憳鍩烘湰淇℃伅闄勪欢鍒犻櫎
+     * @return
+     */
+    @Operation(summary = "浜哄憳宸ヤ綔缁忓巻淇敼")
+    @PostMapping("/updateBasicInfoWorkList")
+    public Result updateBasicInfoWorkList(@RequestBody PersonBasicInfoWork basicInfoWork){
+        return Result.success(personBasicInfoWorkService.updateById(basicInfoWork));
+    }
+
+
+    @Operation(summary = "娣诲姞缁勭粐鏋舵瀯")
+    @PostMapping("/addDepartmentLims")
+    public Result addDepartmentLims(@RequestBody DepartmentLims department) {
+        return Result.success(personBasicInfoService.addDepartment(department));
+    }
+
+    @Operation(summary = "鍒犻櫎缁勭粐鏋舵瀯")
+    @DeleteMapping("/delDepartmentLims")
+    public Result delDepartmentLims(Integer id) {
+        return Result.success(personBasicInfoService.delDepartment(id));
+    }
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonCommunicationAbilityController.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonCommunicationAbilityController.java
new file mode 100644
index 0000000..ad9566b
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonCommunicationAbilityController.java
@@ -0,0 +1,61 @@
+package com.ruoyi.personnel.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.personnel.dto.PersonCommunicationAbilityDto;
+import com.ruoyi.personnel.pojo.PersonCommunicationAbility;
+import com.ruoyi.personnel.service.PersonCommunicationAbilityService;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import jakarta.servlet.http.HttpServletResponse;
+
+/**
+ * <p>
+ * 娌熼�氳褰� 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author
+ * @since 2024-10-09 12:00:57
+ */
+@Tag(name = "浜哄憳 - 娌熼�氳褰�")
+@RestController
+@RequestMapping("/personCommunicationAbility")
+public class PersonCommunicationAbilityController {
+
+    @Autowired
+    private PersonCommunicationAbilityService personCommunicationAbilityService;
+
+    @Operation(summary = "鏂板/鏇存柊 娌熼�氳褰�")
+    @PostMapping("addOrUpdatePersonCommunicationAbility")
+    public Result<?> addOrUpdatePersonCommunicationAbility(@RequestBody PersonCommunicationAbility personCommunicationAbility) {
+        personCommunicationAbilityService.saveOrUpdate(personCommunicationAbility);
+        return Result.success();
+    }
+
+    @Operation(summary = "鍒犻櫎 娌熼�氳褰�")
+    @DeleteMapping("deletePersonCommunicationAbility")
+    public Result<?> deletePersonCommunicationAbility(@RequestParam("id") Integer id) {
+        personCommunicationAbilityService.removeById(id);
+        return Result.success();
+    }
+
+
+    @Operation(summary = "鏌ヨ 娌熼�氳褰�")
+    @GetMapping("personPersonCommunicationAbilityPage")
+    public Result<IPage<PersonCommunicationAbilityDto>> personPersonCommunicationAbilityPage(Page page,
+                                                                                             Integer departLimsId,
+                                                                                             Integer userId,
+                                                                                             String userName) {
+        return Result.success(personCommunicationAbilityService.personPersonCommunicationAbilityPage(page, departLimsId, userId, userName));
+    }
+
+    @Operation(summary = "瀵煎嚭娌熼�氳褰�")
+    @GetMapping("exportPersonCommunicationAbility")
+    public void exportPersonCommunicationAbility(Integer id, HttpServletResponse response) throws Exception{
+        personCommunicationAbilityService.exportPersonCommunicationAbility(id,response);
+    }
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonJobResponsibilitiesController.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonJobResponsibilitiesController.java
new file mode 100644
index 0000000..76ed308
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonJobResponsibilitiesController.java
@@ -0,0 +1,60 @@
+package com.ruoyi.personnel.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.personnel.dto.PersonJobResponsibilitiesDto;
+import com.ruoyi.personnel.pojo.PersonJobResponsibilities;
+import com.ruoyi.personnel.service.PersonJobResponsibilitiesService;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import jakarta.servlet.http.HttpServletResponse;
+
+/**
+ * <p>
+ * 宀椾綅鑱岃矗 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author
+ * @since 2024-10-09 02:07:49
+ */
+@Tag(name = "浜哄憳 - 宀椾綅鑱岃矗")
+@RestController
+@RequestMapping("/personJobResponsibilities")
+public class PersonJobResponsibilitiesController {
+    @Autowired
+    private PersonJobResponsibilitiesService personJobResponsibilitiesService;
+
+    @Operation(summary = "鏂板/鏇存柊 宀椾綅鑱岃矗")
+    @PostMapping("/personJobResponsibilitiesSave")
+    public Result<?> personJobResponsibilitiesSave(@RequestBody PersonJobResponsibilities personJobResponsibilities) {
+        personJobResponsibilitiesService.saveOrUpdate(personJobResponsibilities);
+        return Result.success();
+    }
+
+
+    @Operation(summary = "鍒犻櫎 宀椾綅鑱岃矗")
+    @DeleteMapping("/personJobResponsibilitiesDelete")
+    public Result<?> personJobResponsibilitiesDelete(@RequestParam("id") Integer id) {
+        personJobResponsibilitiesService.removeById(id);
+        return Result.success();
+    }
+
+
+    @Operation(summary = "鏌ヨ 宀椾綅鑱岃矗")
+    @GetMapping("/personJobResponsibilitiesSelect")
+    public Result personJobResponsibilitiesSelect(Page page, String userId, String departmentId, String userName) {
+        IPage<PersonJobResponsibilitiesDto> iPage = personJobResponsibilitiesService.personJobResponsibilitiesSelect(page, userId, departmentId, userName);
+        return Result.success(iPage);
+    }
+
+
+    @Operation(summary = "瀵煎嚭浠昏亴宀椾綅璇存槑璇�")
+    @PostMapping("/exportPersonJobResponsibilities")
+    public void exportPersonJobResponsibilities(Integer id, HttpServletResponse response){
+        personJobResponsibilitiesService.exportPersonJobResponsibilities(id,response);
+    }
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonPersonnelCapacityController.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonPersonnelCapacityController.java
new file mode 100644
index 0000000..814664f
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonPersonnelCapacityController.java
@@ -0,0 +1,92 @@
+package com.ruoyi.personnel.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.ruoyi.common.core.domain.Result;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.personnel.dto.PersonPersonnelCapacityDto;
+import com.ruoyi.personnel.pojo.PersonPersonnelCapacity;
+import com.ruoyi.personnel.service.PersonPersonnelCapacityService;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import jakarta.servlet.http.HttpServletResponse;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 浜哄憳鑳藉姏 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author
+ * @since 2024-10-10 11:26:18
+ */
+@Tag(name = "浜哄憳 - 浜哄憳鑳藉姏")
+@RestController
+@RequestMapping("/personPersonnelCapacity")
+public class PersonPersonnelCapacityController {
+
+    @Autowired
+    private PersonPersonnelCapacityService personPersonnelCapacityService;
+
+
+    @Operation(summary = "鏂板/鏇存柊 浜哄憳鑳藉姏")
+    @PostMapping("addOrUpdatePersonPersonnelCapacity")
+    public Result<?> addOrUpdatePersonPersonnelCapacity(@RequestBody PersonPersonnelCapacity personPersonnelCapacity) {
+        personPersonnelCapacityService.saveOrUpdate(personPersonnelCapacity);
+        return Result.success();
+    }
+
+    @Operation(summary = "鍒犻櫎 浜哄憳鑳藉姏")
+    @DeleteMapping("deletePersonPersonnelCapacity")
+    public Result<?> deletePersonPersonnelCapacity(@RequestParam("id") Integer id) {
+        // 鍒犻櫎鏁版嵁
+        personPersonnelCapacityService.removeById(id);
+        return Result.success();
+    }
+
+    @Operation(summary = "鏌ヨ 浜哄憳鑳藉姏")
+    @GetMapping("personPersonnelCapacityPage")
+    public Result<IPage<PersonPersonnelCapacityDto>> personPersonnelCapacityPage(Page page,
+                                                                                 Integer departmentId,
+                                                                                 Integer userId,
+                                                                                 String userName) {
+        return Result.success(personPersonnelCapacityService.personPersonnelCapacityPage(page, departmentId, userId, userName));
+    }
+
+    @Operation(summary = "纭 浜哄憳鑳藉姏")
+    @PostMapping("confirmPersonnelCapability")
+    public Result<?> confirmPersonnelCapability(@RequestBody PersonPersonnelCapacity personPersonnelCapacity) {
+        Integer userId = SecurityUtils.getUserId().intValue();
+        personPersonnelCapacityService.update(Wrappers.<PersonPersonnelCapacity>lambdaUpdate()
+                .eq(PersonPersonnelCapacity::getId, personPersonnelCapacity.getId())
+                .set(PersonPersonnelCapacity::getConfirmOperatingPersonnelId, userId)
+                .set(PersonPersonnelCapacity::getConfirmDate, personPersonnelCapacity.getConfirmDate()));
+        return Result.success();
+    }
+
+    /**
+     * 瀵煎嚭浜哄憳鑳藉姏
+     * @return
+     */
+    @Operation(summary = "瀵煎嚭浜哄憳鑳藉姏")
+    @GetMapping("/exportPersonnelCapacity")
+    public void exportPersonnelCapacity(Integer id, HttpServletResponse response){
+        personPersonnelCapacityService.exportPersonnelCapacity(id, response);
+    }
+
+    /**
+     * 鎻愪氦纭浜哄憳鑳藉姏
+     * @param personPersonnelCapacity
+     * @return
+     */
+    @Operation(summary = "鎻愪氦")
+    @PostMapping("submitConfirmPersonnelCapability")
+    public Result<?> submitConfirmPersonnelCapability(@RequestBody PersonPersonnelCapacity personPersonnelCapacity) {
+        personPersonnelCapacityService.submitConfirmPersonnelCapability(personPersonnelCapacity);
+        return Result.success();
+    }
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonPostAuthorizationRecordController.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonPostAuthorizationRecordController.java
new file mode 100644
index 0000000..d5b5893
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonPostAuthorizationRecordController.java
@@ -0,0 +1,66 @@
+package com.ruoyi.personnel.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.common.utils.FileSaveUtil;
+import com.ruoyi.personnel.dto.PersonPostAuthorizationRecordDto;
+import com.ruoyi.personnel.pojo.PersonPostAuthorizationRecord;
+import com.ruoyi.personnel.service.PersonPostAuthorizationRecordService;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import jakarta.servlet.http.HttpServletResponse;
+
+/**
+ * <p>
+ * 浠昏亴鎺堟潈璁板綍 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author
+ * @since 2024-10-09 10:48:17
+ */
+@Tag(name = "浜哄憳 - 浠昏亴鎺堟潈璁板綍")
+@RestController
+@RequestMapping("/personPostAuthorizationRecord")
+public class PersonPostAuthorizationRecordController {
+
+    @Autowired
+    private PersonPostAuthorizationRecordService personPostAuthorizationRecordService;
+
+    @Operation(summary = "鏂板/鏇存柊 浠昏亴鎺堟潈璁板綍")
+    @PostMapping("/addOrUpdatePersonPostAuthorizationRecord")
+    public Result<?> addOrUpdatePersonPostAuthorizationRecord(@RequestBody PersonPostAuthorizationRecord personRewardPunishmentRecord) {
+        personPostAuthorizationRecordService.saveOrUpdate(personRewardPunishmentRecord);
+        return Result.success();
+    }
+
+    @Operation(summary = "鍒犻櫎 浠昏亴鎺堟潈璁板綍")
+    @DeleteMapping("/deletePersonPostAuthorizationRecord")
+    public Result<?> deletePersonPostAuthorizationRecord(@RequestParam("id") Integer id) {
+        // 鍒犻櫎鏂囦欢
+        PersonPostAuthorizationRecord postAuthorizationRecord = personPostAuthorizationRecordService.getById(id);
+        FileSaveUtil.DeleteFile(postAuthorizationRecord.getSystemFileName());
+        // 鍒犻櫎鏁版嵁
+        personPostAuthorizationRecordService.removeById(id);
+        return Result.success();
+    }
+
+
+    @Operation(summary = "鏌ヨ 浠昏亴鎺堟潈璁板綍")
+    @GetMapping("/PersonPostAuthorizationRecordPage")
+    public Result<IPage<PersonPostAuthorizationRecordDto>> PersonPostAuthorizationRecordPage(Page page,
+                                                                                             Integer departLimsId,
+                                                                                             Integer userId,
+                                                                                             String userName) {
+        return Result.success(personPostAuthorizationRecordService.personPostAuthorizationRecordPage(page, departLimsId, userId, userName));
+    }
+
+    @Operation(summary = "瀵煎嚭宀椾綅鑱屼笟璧勬牸璇佷功")
+    @GetMapping("/exportPersonPostAuthorizationRecord")
+    public void exportPersonPostAuthorizationRecord(Integer id, HttpServletResponse response){
+        personPostAuthorizationRecordService.exportPersonPostAuthorizationRecord(id,response);
+    }
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonRewardPunishmentRecordController.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonRewardPunishmentRecordController.java
new file mode 100644
index 0000000..3e5bfe5
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonRewardPunishmentRecordController.java
@@ -0,0 +1,100 @@
+package com.ruoyi.personnel.controller;
+
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.personnel.dto.PersonRewardPunishmentRecordDto;
+import com.ruoyi.personnel.excel.PersonRewardPunishmentRecordExcel;
+import com.ruoyi.personnel.pojo.PersonRewardPunishmentRecord;
+import com.ruoyi.personnel.service.PersonRewardPunishmentRecordService;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
+import lombok.SneakyThrows;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import jakarta.servlet.http.HttpServletResponse;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * <p>
+ * 濂栨儵璁板綍 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author
+ * @since 2024-10-08 11:25:02
+ */
+@Tag(name = "浜哄憳 - 濂栨儵璁板綍")
+@RestController
+@RequestMapping("/personRewardPunishmentRecord")
+public class PersonRewardPunishmentRecordController {
+
+    @Autowired
+    private PersonRewardPunishmentRecordService personRewardPunishmentRecordService;
+
+    @Operation(summary = "鏂板/鏇存柊 濂栨儵璁板綍")
+    @PostMapping("/addOrUpdateRewardPunishment")
+    public Result<?> PersonTrainingSave(@RequestBody PersonRewardPunishmentRecord personRewardPunishmentRecord) {
+        personRewardPunishmentRecordService.saveOrUpdate(personRewardPunishmentRecord);
+        return Result.success();
+    }
+
+    @Operation(summary = "鍒犻櫎濂栨儵璁板綍")
+    @DeleteMapping("/deleteRewardPunishment")
+    public Result<?> deleteRewardPunishment(@RequestParam("id") Integer id) {
+        personRewardPunishmentRecordService.removeById(id);
+        return Result.success();
+    }
+
+    @Operation(summary = "鏌ヨ 濂栨儵璁板綍")
+    @GetMapping("/rewardPunishmentPage")
+    @SneakyThrows
+    public Result<IPage<PersonRewardPunishmentRecordDto>> rewardPunishmentPage(Page page,
+                                                                               Integer userId,
+                                                                               Integer departmentId,
+                                                                               String userName,
+                                                                               @RequestParam(value = "startTime",required = false) String startTimeStr,
+                                                                               @RequestParam(value = "endTime",required = false) String endTimeStr) {
+        Date startTime = null;
+        Date endTime = null;
+        if (StringUtils.isNotEmpty(startTimeStr) || StringUtils.isNotEmpty(endTimeStr)) {
+            SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
+            startTime = formatter.parse(startTimeStr);
+            endTime = formatter.parse(endTimeStr);
+        }
+        return Result.success(personRewardPunishmentRecordService.rewardPunishmentPage(page, userId, userName, startTime, endTime, departmentId));
+    }
+
+    @Operation(summary = "濂栨儵璁板綍瀵煎嚭")
+    @GetMapping("/rewardPunishmentExport")
+    public void rewardPunishmentExport(Integer userId,
+                                       Integer departmentId,
+                                       String userName,
+                                       @RequestParam(value = "startTime",required = false) String startTimeStr,
+                                       @RequestParam(value = "endTime",required = false) String endTimeStr,
+                                       HttpServletResponse response) throws Exception {
+        Date startTime = null;
+        Date endTime = null;
+        if (StringUtils.isNotEmpty(startTimeStr) || StringUtils.isNotEmpty(endTimeStr)) {
+            SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
+            startTime = formatter.parse(startTimeStr);
+            endTime = formatter.parse(endTimeStr);
+        }
+        List<PersonRewardPunishmentRecordExcel> data = personRewardPunishmentRecordService.rewardPunishmentExport(userId, departmentId, userName, startTime, endTime);
+        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(PersonRewardPunishmentRecordExcel.class)
+                .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()) // 鑷�傚簲鍒楀
+                .sheet()
+                .doWrite(data);
+    }
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonTrainingController.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonTrainingController.java
new file mode 100644
index 0000000..e25a6e0
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonTrainingController.java
@@ -0,0 +1,246 @@
+package com.ruoyi.personnel.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.common.numgen.NumberGenerator;
+import com.ruoyi.personnel.dto.PersonTrainingDetailedDto;
+import com.ruoyi.personnel.dto.PersonTrainingDto;
+import com.ruoyi.personnel.dto.PersonTrainingRecordDto;
+import com.ruoyi.personnel.dto.PersonTrainingRecordSubmitDto;
+import com.ruoyi.personnel.mapper.PersonTrainingDetailedFileMapper;
+import com.ruoyi.personnel.pojo.PersonTraining;
+import com.ruoyi.personnel.pojo.PersonTrainingDetailed;
+import com.ruoyi.personnel.pojo.PersonTrainingDetailedFile;
+import com.ruoyi.personnel.pojo.PersonTrainingRecord;
+import com.ruoyi.personnel.service.PersonTrainingDetailedService;
+import com.ruoyi.personnel.service.PersonTrainingRecordService;
+import com.ruoyi.personnel.service.PersonTrainingService;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import jakarta.servlet.http.HttpServletResponse;
+import java.util.List;
+
+/**
+ * <p>
+ * 鍩硅璁″垝 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author
+ * @since 2024-10-11 01:11:49
+ */
+@Tag(name = "浜哄憳 - 鍩硅璁″垝")
+@RestController
+@RequestMapping("/personTraining")
+public class PersonTrainingController {
+
+    @Autowired
+    private PersonTrainingService personTrainingService;
+
+    @Autowired
+    private PersonTrainingDetailedService personTrainingDetailedService;
+
+    @Autowired
+    private PersonTrainingRecordService personTrainingRecordService;
+
+    @Autowired
+    private PersonTrainingDetailedFileMapper personTrainingDetailedFileMapper;
+
+    @Autowired
+    private NumberGenerator<PersonTrainingDetailed> numberGenerator;
+
+    @Operation(summary = "鍩硅璁″垝 瀵煎叆")
+    @PostMapping("personTrainingImport")
+    public Result<?> personTrainingImport(@RequestPart("file") MultipartFile file, PersonTraining training) {
+        personTrainingService.personTrainingImport(file, training);
+        return Result.success();
+    }
+
+    @Operation(summary = "鍩硅璁″垝 鍒犻櫎")
+    @DeleteMapping("personTrainingDelete")
+    public Result<?> personTrainingDelete(@RequestParam("id") Integer id) {
+        personTrainingService.personTrainingDelete(id);
+        return Result.success();
+    }
+
+    @Operation(summary = "鍩硅璁″垝 鏌ヨ")
+    @GetMapping("personTrainingSelect")
+    public Result<IPage<PersonTrainingDto>> personTrainingSelect(Page page, String compilerName, String departmentId) {
+        IPage<PersonTrainingDto> iPage = personTrainingService.personTrainingSelect(page, compilerName, departmentId);
+        return Result.success(iPage);
+    }
+
+    @Operation(summary = "骞村害鍩硅璁″垝 瀹℃牳")
+    @PostMapping("reviewAnnualPersonnelTraining")
+    public Result<?> reviewAnnualPersonnelTraining(@RequestBody PersonTraining training) {
+        personTrainingService.reviewAnnualPersonnelTraining(training);
+        return Result.success();
+    }
+
+    @Operation(summary = "鍩硅璁″垝 鎵瑰噯")
+    @PostMapping("approveAnnualPersonnelTraining")
+    public Result<?> approveAnnualPersonnelTraining(@RequestBody PersonTraining training) {
+        personTrainingService.approveAnnualPersonnelTraining(training);
+        return Result.success();
+    }
+
+
+    @Operation(summary = "骞村害璁″垝鏄庣粏琛� 鏂板/缂栬緫")
+    @PostMapping("addOrUpdatePersonTrainingDetailed")
+    public Result<?> addOrUpdatePersonTrainingDetailed(@RequestBody PersonTrainingDetailed personTrainingDetailed) {
+        if (ObjectUtils.isEmpty(personTrainingDetailed.getId())) {
+            personTrainingDetailed.setState(3);
+        }
+        personTrainingDetailedService.saveOrUpdate(personTrainingDetailed);
+        return Result.success();
+    }
+
+
+    @Operation(summary = "骞村害璁″垝鏄庣粏琛� 鎵归噺鍒犻櫎")
+    @DeleteMapping("deleteAnnualPlanDetailTable")
+    public Result<?> deleteAnnualPlanDetailTable(String ids) {
+        personTrainingDetailedService.deleteAnnualPlanDetailTable(ids);
+        return Result.success();
+    }
+
+
+    @Operation(summary = "骞村害璁″垝鏄庣粏琛� 鏌ヨ")
+    @GetMapping("queryTheAnnualPlanDetailsTable")
+    public Result<IPage<PersonTrainingDetailedDto>> queryTheAnnualPlanDetailsTable(Page page,
+                                                                                   String trainingLecturerName, String courseCode,
+                                                                                   String trainingDate, Integer id, Integer userId) {
+        IPage<PersonTrainingDetailedDto> iPage = personTrainingDetailedService.queryTheAnnualPlanDetailsTable(page,
+                trainingLecturerName, courseCode, trainingDate, id, userId);
+        return Result.success(iPage);
+    }
+
+
+    @Operation(summary = "鍩硅涓庤�冩牳璁板綍 鏌ヨ")
+    @GetMapping("trainingAndAssessmentRecordsPage")
+    public Result<List<PersonTrainingRecordDto>> trainingAndAssessmentRecordsPage(Integer trainingDetailedId,
+                                                                                   String userName) {
+        List<PersonTrainingRecordDto> list = personTrainingRecordService.trainingAndAssessmentRecordsPage(trainingDetailedId, userName);
+        return Result.success(list);
+    }
+
+
+    @Operation(summary = "鍩硅涓庤�冩牳璁板綍 鏂板浜哄憳")
+    @PostMapping("newPersonnelAddedToTrainingRecords")
+    public Result<?> newPersonnelAddedToTrainingRecords(@RequestBody List<PersonTrainingRecord> personTrainingRecord) {
+        personTrainingRecordService.saveBatch(personTrainingRecord);
+        return Result.success();
+    }
+
+
+    @Operation(summary = "鍩硅涓庤�冩牳璁板綍 璁ら")
+    @PostMapping("claimOfTrainingAndAssessmentRecords")
+    public Result<?> claimOfTrainingAndAssessmentRecords(@RequestParam("claimAndClaim") Boolean claimAndClaim,
+                                                         @RequestParam("courseId") Integer courseId) {
+        personTrainingRecordService.claimOfTrainingAndAssessmentRecords(claimAndClaim, courseId);
+        return Result.success();
+    }
+
+
+    @Operation(summary = "鍩硅涓庤�冩牳璁板綍 鎻愪氦/鎾ら攢")
+    @PostMapping("trainingAndAssessmentRecordsAdded")
+    public Result<?> trainingAndAssessmentRecordsAdded(@RequestBody PersonTrainingRecordSubmitDto personTrainingRecordSubmitDto) {
+        personTrainingRecordService.trainingAndAssessmentRecordsAdded(personTrainingRecordSubmitDto);
+        return Result.success();
+    }
+
+    @Operation(summary = "鍩硅涓庤�冩牳璁板綍 璇勪环")
+    @PostMapping("trainingAndAssessmentRecordsEvaluate")
+    public Result<?> trainingAndAssessmentRecordsEvaluate(@RequestBody PersonTrainingRecordSubmitDto personTrainingRecordSubmitDto) {
+        personTrainingDetailedService.update(Wrappers.<PersonTrainingDetailed>lambdaUpdate()
+                .eq(PersonTrainingDetailed::getId, personTrainingRecordSubmitDto.getTrainingDetailedId())
+                .set(PersonTrainingDetailed::getComprehensiveAssessment, personTrainingRecordSubmitDto.getComprehensiveAssessment())
+                .set(PersonTrainingDetailed::getAssessmentDate, personTrainingRecordSubmitDto.getAssessmentDate())
+                .set(PersonTrainingDetailed::getState, personTrainingRecordSubmitDto.getState()));
+        return Result.success();
+    }
+
+
+    @Operation(summary = "鍩硅涓庤�冩牳璁板綍 鍒犻櫎")
+    @DeleteMapping("deleteTrainingAndAssessmentRecords")
+    public Result<?> deleteTrainingAndAssessmentRecords(String ids) {
+        personTrainingRecordService.deleteTrainingAndAssessmentRecords(ids);
+        return Result.success();
+    }
+
+    @PostMapping("outOfFocusPreservation")
+    public Result<?> outOfFocusPreservation(@RequestBody PersonTrainingRecord personTrainingRecord) {
+        personTrainingRecordService.updateById(personTrainingRecord);
+        return Result.success();
+    }
+
+    /**
+     * 瀵煎嚭浜哄憳鍩硅璁″垝
+     * @return
+     */
+
+    @Operation(summary = "瀵煎嚭浜哄憳鍩硅璁″垝")
+    @GetMapping("/exportPersonTraining")
+    public void exportPersonTraining(Integer id, HttpServletResponse response){
+        personTrainingService.exportPersonTraining(id, response);
+    }
+
+    /**
+     * 瀵煎嚭浜哄憳鍩硅涓庤�冩牳璁板綍
+     * @return
+     */
+    @Operation(summary = "瀵煎嚭浜哄憳鍩硅涓庤�冩牳璁板綍")
+    @GetMapping("/exportPersonTrainingRecord")
+    public void exportPersonTrainingRecord(Integer id, HttpServletResponse response){
+        personTrainingService.exportPersonTrainingRecord(id, response);
+    }
+
+    /**
+     * 浜哄憳鍩硅璇︽儏闄勪欢鏂板
+     * @param trainingDetailedId
+     * @param file
+     * @return
+     */
+    @Operation(summary = "浜哄憳鍩硅璇︽儏闄勪欢鏂板")
+    @PostMapping("/uploadTrainingDetailedFile")
+    public Result<?> uploadTrainingDetailedFile(Integer trainingDetailedId, MultipartFile file) {
+        return Result.success(personTrainingService.uploadTrainingDetailedFile(trainingDetailedId, file));
+    }
+
+
+    /**
+     * 浜哄憳鍩硅璇︽儏闄勪欢鍒楄〃
+     * @return
+     */
+    @Operation(summary = "浜哄憳鍩硅璇︽儏闄勪欢鍒楄〃")
+    @GetMapping("/getTrainingDetailedFileList")
+    public Result<List<PersonTrainingDetailedFile>> getTrainingDetailedFileList(Integer trainingDetailedId){
+        return Result.success(personTrainingDetailedFileMapper.selectList(Wrappers.<PersonTrainingDetailedFile>lambdaQuery()
+                .eq(PersonTrainingDetailedFile::getTrainingDetailedId, trainingDetailedId)));
+    }
+
+    /**
+     * 浜哄憳鍩硅璇︽儏闄勪欢鍒犻櫎
+     * @return
+     */
+    @Operation(summary = "浜哄憳鍩硅璇︽儏闄勪欢鍒犻櫎")
+    @DeleteMapping("/delTrainingDetailedFileList")
+    public Result delTrainingDetailedFileList(Integer detailedFileId){
+        return Result.success(personTrainingDetailedFileMapper.deleteById(detailedFileId));
+    }
+
+    /**
+     * 鏌ヨ浠婂勾浜哄憳鍩硅淇℃伅
+     * @return
+     */
+    @Operation(summary = "鏌ヨ浠婂勾浜哄憳鍩硅淇℃伅")
+    @GetMapping("/getThisYearTrainingDetailed")
+    public Result<List<PersonTrainingDetailed>> getThisYearTrainingDetailed(){
+        return Result.success(personTrainingService.getThisYearTrainingDetailed());
+    }
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonTrainingRecordController.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonTrainingRecordController.java
new file mode 100644
index 0000000..ed855d3
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonTrainingRecordController.java
@@ -0,0 +1,59 @@
+package com.ruoyi.personnel.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.personnel.dto.PersonTrainingRecordListDto;
+import com.ruoyi.personnel.dto.TrainingRecordPersonDetailedDto;
+import com.ruoyi.personnel.service.PersonTrainingRecordService;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import jakarta.servlet.http.HttpServletResponse;
+
+/**
+ * <p>
+ * 鍩硅璁″垝 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author
+ * @since 2024-10-11 01:11:49
+ */
+@Tag(name = "浜哄憳 - 鍩硅璁板綍")
+@RestController
+@RequestMapping("/personTrainingRecord")
+public class PersonTrainingRecordController {
+
+    @Autowired
+    private PersonTrainingRecordService personTrainingRecordService;
+
+    @Operation(summary = "鏌ヨ浜哄憳 鍩硅璁板綍")
+    @GetMapping("trainingSelectTrainingRecord")
+    public Result<IPage<PersonTrainingRecordListDto>> trainingSelectTrainingRecord(Page page, String userName, Integer userId, Integer departmentId) {
+        IPage<PersonTrainingRecordListDto> iPage = personTrainingRecordService.personnelTrainingPersonnel(page, userName, userId, departmentId);
+        return Result.success(iPage);
+    }
+
+
+    @Operation(summary = "鏌ヨ浜哄憳鏄庣粏 鍩硅璁板綍")
+    @GetMapping("queryPersonnelDetails")
+    public Result<IPage<TrainingRecordPersonDetailedDto>> queryPersonnelDetails(Page page, Integer userId, Integer trainingDate) {
+        IPage<TrainingRecordPersonDetailedDto> iPage = personTrainingRecordService.queryPersonnelDetailsOfUserIdAndYear(page, userId, trainingDate); // 鏂板鏍规嵁骞翠唤鏌ヨ
+        return Result.success(iPage);
+    }
+
+    /**
+     * 瀵煎嚭浜哄憳鍩硅璁板綍
+     * @return
+     */
+    @Operation(summary = "瀵煎嚭浜哄憳鍩硅璁板綍")
+    @GetMapping("/exportTrainingRecord")
+    public void exportTrainingRecord(Integer userId, Integer trainingDate, HttpServletResponse response){
+        personTrainingRecordService.exportTrainingRecordAddTrainingDate(userId, trainingDate, response);// 鏂板鏍规嵁骞翠唤鏌ヨ
+
+    }
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonBasicInfoDetailsDto.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonBasicInfoDetailsDto.java
new file mode 100644
index 0000000..d5646f4
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonBasicInfoDetailsDto.java
@@ -0,0 +1,65 @@
+package com.ruoyi.personnel.dto;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+/**
+ * Author: yuan
+ * Date: 2024-12-13 鏄熸湡浜� 13:52:52
+ * Description:
+ */
+@Data
+public class PersonBasicInfoDetailsDto {
+
+    @Schema(description = "鐢ㄦ埛id")
+    private Integer userId;
+
+    @Schema(description = "鐢ㄦ埛濮撳悕")
+    private String name;
+
+    @Schema(description = "鍏ヨ亴鏃堕棿")
+    private String entryTimeStr;
+
+    @Schema(description = "瀹為檯瀹炰範缁撴潫")
+    private String endPracticalPracticeStr;
+
+    @Schema(description = "绫嶈疮")
+    private String nativePlace;
+
+    @Schema(description = "韬唤璇佸彿")
+    private String identityCard;
+
+    @Schema(description = "韬唤璇佸湴鍧�")
+    private String idAddress;
+
+    @Schema(description = "鐢ㄦ埛鎵嬫満鍙�")
+    private String phone;
+
+    @Schema(description = "姣曚笟闄㈡牎")
+    private String graduatedInstitutions1;
+
+    @Schema(description = "涓撲笟")
+    private String major1;
+
+    @Schema(description = "姣曚笟鏃堕棿1")
+    private LocalDateTime graduationTime1;
+
+    @Schema(description = "鏈�楂樺鍘�")
+    private String officialAcademicRedentials;
+
+    @Schema(description = "鏈�楂樺浣�")
+    private String highestDegree;
+
+    @Schema(description = "鑱岀О")
+    private String professionalTitle;
+
+    // 鑱屼笟鑳藉姏
+
+    @Schema(description = "绱ф�ヨ仈绯讳汉")
+    private String emergencyContact;
+
+    @Schema(description = "绱ф�ヨ仈绯讳汉鐢佃瘽")
+    private String emergencyContactPhone;
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonBasicInfoDto.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonBasicInfoDto.java
new file mode 100644
index 0000000..a1231e6
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonBasicInfoDto.java
@@ -0,0 +1,47 @@
+package com.ruoyi.personnel.dto;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.ruoyi.personnel.pojo.PersonBasicInfo;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+@Data
+@JsonIgnoreProperties(ignoreUnknown = true)
+@ExcelIgnoreUnannotated
+public class PersonBasicInfoDto extends PersonBasicInfo {
+    @Schema(description = "璐﹀彿")
+    @ExcelProperty("鍛樺伐缂栧彿")
+    private String account;
+
+    @Schema(description = "濮撳悕")
+    @ExcelProperty("濮撳悕")
+    private String name;
+
+    @Schema(description = "濮撳悕(鑻辨枃)")
+    private String nameEn;
+
+    @Schema(description = "骞撮緞")
+    private Integer age;
+
+    @Schema(description = "鐢佃瘽鍙风爜")
+    @ExcelProperty("鎵嬫満鍙�")
+    private String phone;
+
+    @Schema(description = "閭")
+    private String email;
+
+    @Schema(description = "閮ㄩ棬")
+    private String department;
+
+    @Schema(description = "lims缁勭粐鏋舵瀯")
+    private String departLimsId;
+
+    @Schema(description = "绛惧悕鐓х墖鍦板潃")
+    private String signatureUrl;
+
+    @Schema(description = "鑷韩鐓х墖鍦板潃")
+    private String pictureUrl;
+
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonBasicInfoWorkDto.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonBasicInfoWorkDto.java
new file mode 100644
index 0000000..f781560
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonBasicInfoWorkDto.java
@@ -0,0 +1,16 @@
+package com.ruoyi.personnel.dto;
+
+import com.ruoyi.personnel.pojo.PersonBasicInfoWork;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * @Author zhuo
+ * @Date 2025/1/14
+ */
+@Data
+public class PersonBasicInfoWorkDto extends PersonBasicInfoWork {
+
+    @Schema(description = "濉厖浣跨敤")
+    private String fill;
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonCommunicationAbilityDto.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonCommunicationAbilityDto.java
new file mode 100644
index 0000000..d3cb18e
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonCommunicationAbilityDto.java
@@ -0,0 +1,14 @@
+package com.ruoyi.personnel.dto;
+
+import com.ruoyi.personnel.pojo.PersonCommunicationAbility;
+import lombok.Data;
+
+@Data
+public class PersonCommunicationAbilityDto extends PersonCommunicationAbility {
+
+    private String userName;
+
+    private String account;
+
+    private String createUserName;
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonJobResponsibilitiesDto.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonJobResponsibilitiesDto.java
new file mode 100644
index 0000000..096f8d3
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonJobResponsibilitiesDto.java
@@ -0,0 +1,16 @@
+package com.ruoyi.personnel.dto;
+
+import com.ruoyi.personnel.pojo.PersonJobResponsibilities;
+import lombok.Data;
+
+@Data
+public class PersonJobResponsibilitiesDto extends PersonJobResponsibilities {
+
+    private String incumbentName;
+
+    private String supervisorName;
+
+    private String departLimsName;
+
+    private String account;
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonPersonnelCapacityDto.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonPersonnelCapacityDto.java
new file mode 100644
index 0000000..4dd0c80
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonPersonnelCapacityDto.java
@@ -0,0 +1,30 @@
+package com.ruoyi.personnel.dto;
+
+import com.ruoyi.personnel.pojo.PersonPersonnelCapacity;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+@Data
+public class PersonPersonnelCapacityDto extends PersonPersonnelCapacity {
+
+    @Schema(description = "鎿嶄綔浜哄鍚�")
+    private String confirmOperatingPersonnelName;
+
+    @Schema(description = "浜哄憳濮撳悕")
+    private String userName;
+
+    @Schema(description = "宀椾綅鍚嶇О")
+    private String postName;
+
+    @Schema(description = "宀椾綅鑱岃矗")
+    private String responsibilities;
+
+    @Schema(description = "宸ヤ綔缁忓巻")
+    private String placeWork;
+
+    @Schema(description = "涓撲笟")
+    private String major;
+
+    @Schema(description = "鑱岀О")
+    private String professionalTitle;
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonPersonnelCapacityExportDto.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonPersonnelCapacityExportDto.java
new file mode 100644
index 0000000..3266dba
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonPersonnelCapacityExportDto.java
@@ -0,0 +1,101 @@
+package com.ruoyi.personnel.dto;
+
+import com.ruoyi.personnel.pojo.PersonPersonnelCapacity;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * @Author zhuo
+ * @Date 2024/11/28
+ */
+@Data
+public class PersonPersonnelCapacityExportDto extends PersonPersonnelCapacity {
+
+    @Schema(description = "宀椾綅鍚嶇О")
+    private String postName;
+
+    @Schema(description = "浜哄憳濮撳悕")
+    private String userName;
+
+    @Schema(description = "瀛﹀巻")
+    private String officialAcademicRedentials;
+
+    @Schema(description = "涓撲笟")
+    private String major;
+
+    @Schema(description = "鑱岀О")
+    private String professionalTitle;
+
+    @Schema(description = "宸ヤ綔缁忓巻")
+    private String placeWork;
+
+    @Schema(description = "瀛﹀巻 绗﹀悎涓庡惁(1锛氱鍚�)")
+    private String academicConformNot1 = "鈻�";
+    @Schema(description = "瀛﹀巻 绗﹀悎涓庡惁(2锛氫笉绗﹀悎)")
+    private String academicConformNot2 = "鈻�";
+    @Schema(description = "瀛﹀巻 绗﹀悎涓庡惁(3锛氫笉閫傜敤)")
+    private String academicConformNot3 = "鈻�";
+
+    @Schema(description = "鐩稿叧骞撮檺  绗﹀悎涓庡惁(1锛氱鍚�)")
+    private String relatedYearsConformNot1 = "鈻�";
+    @Schema(description = "鐩稿叧骞撮檺  绗﹀悎涓庡惁(2锛氫笉绗﹀悎)")
+    private String relatedYearsConformNot2 = "鈻�";
+    @Schema(description = "鐩稿叧骞撮檺  绗﹀悎涓庡惁(3锛氫笉閫傜敤)")
+    private String relatedYearsConformNot3 = "鈻�";
+
+    @Schema(description = "鐩稿叧鍩硅 绗﹀悎涓庡惁(1锛氱鍚�)")
+    private String relatedTrainingConformNot1 = "鈻�";
+    @Schema(description = "鐩稿叧鍩硅 绗﹀悎涓庡惁(2锛氫笉绗﹀悎)")
+    private String relatedTrainingConformNot2 = "鈻�";
+    @Schema(description = "鐩稿叧鍩硅 绗﹀悎涓庡惁(3锛氫笉閫傜敤)")
+    private String relatedTrainingConformNot3 = "鈻�";
+
+    @Schema(description = "鐩稿叧缁忛獙 绗﹀悎涓庡惁(1锛氱鍚�)")
+    private String relevantExperienceConformNot1 = "鈻�";
+    @Schema(description = "鐩稿叧缁忛獙 绗﹀悎涓庡惁(2锛氫笉绗﹀悎)")
+    private String relevantExperienceConformNot2 = "鈻�";
+    @Schema(description = "鐩稿叧缁忛獙 绗﹀悎涓庡惁(3锛氫笉閫傜敤)")
+    private String relevantExperienceConformNot3 = "鈻�";
+
+    @Schema(description = "涓婂矖璇� 绗﹀悎涓庡惁(1锛氱鍚�)")
+    private String workLicenseConformNot1 = "鈻�";
+    @Schema(description = "涓婂矖璇� 绗﹀悎涓庡惁(2锛氫笉绗﹀悎)")
+    private String workLicenseConformNot2 = "鈻�";
+    @Schema(description = "涓婂矖璇� 绗﹀悎涓庡惁(3锛氫笉閫傜敤)")
+    private String workLicenseConformNot3 = "鈻�";
+
+    @Schema(description = "宀椾綅鑱岃矗1(鐔熸倝鏈矖浣嶇殑浜у搧妫�娴嬫牱鍝佸埗澶囧拰鐩稿叧浜у搧鍩虹鐭ヨ瘑)")
+    private String jobResponsibilities1 = "鈻�";
+    @Schema(description = "宀椾綅鑱岃矗2(鐔熸倝鏈矖浣嶆牱鍝佹娴嬫祦绋�)")
+    private String jobResponsibilities2 = "鈻�";
+    @Schema(description = "宀椾綅鑱岃矗3(姝g‘鐔熺粌鎿嶄綔鏈矖浣嶄华琛ㄨ澶�)")
+    private String jobResponsibilities3 = "鈻�";
+    @Schema(description = "宀椾綅鑱岃矗4(鐔熸倝鏈矖浣嶇浉鍏虫娴嬫爣鍑�)")
+    private String jobResponsibilities4 = "鈻�";
+    @Schema(description = "宀椾綅鑱岃矗5(鐔熸倝鏈矖浣嶄骇鍝佹�ц兘鍙婄粨鏋滃垽鏂�佸垎鏋�)")
+    private String jobResponsibilities5 = "鈻�";
+    @Schema(description = "宀椾綅鑱岃矗6(瀹屾垚鐩稿簲鐨勫巶楠屻�佽璇�)")
+    private String jobResponsibilities6 = "鈻�";
+    @Schema(description = "宀椾綅鑱岃矗7(缂栧啓鐩稿叧妫�娴嬫墜椤�)")
+    private String jobResponsibilities7 = "鈻�";
+    @Schema(description = "宀椾綅鑱岃矗8(浜嗚В浠櫒璁惧鍩烘湰缁撴瀯涓庣畝鍗曠淮鎶や繚鍏�)")
+    private String jobResponsibilities8 = "鈻�";
+    @Schema(description = "宀椾綅鑱岃矗9(鍏峰鎶�鑳藉煿璁殑鑳藉姏)")
+    private String jobResponsibilities9 = "鈻�";
+    @Schema(description = "宀椾綅鑱岃矗10(鍏峰妫�娴嬩华鍣ㄦ敼閫犺兘鍔�)")
+    private String jobResponsibilities10 = "鈻�";
+
+    @Schema(description = "宀椾綅鑱岃矗 绗﹀悎涓庡惁(1锛氱鍚�)")
+    private String jobResponsibilitiesConformNot1 = "鈻�";
+    @Schema(description = "宀椾綅鑱岃矗 绗﹀悎涓庡惁(2锛氫笉绗﹀悎)")
+    private String jobResponsibilitiesConformNot2 = "鈻�";
+    @Schema(description = "宀椾綅鑱岃矗 绗﹀悎涓庡惁(3锛氫笉閫傜敤)")
+    private String jobResponsibilitiesConformNot3 = "鈻�";
+
+    @Schema(description = "缁煎悎璇勪环1(鍙儨浠昏宀椾綅)")
+    private String comprehensiveAssessment1 = "鈻�";
+    @Schema(description = "缁煎悎璇勪环2(鍙竟鍩硅杈逛笂宀�)")
+    private String comprehensiveAssessment2 = "鈻�";
+    @Schema(description = "缁煎悎璇勪环3(涓嶈儨浠昏宀椾綅)")
+    private String comprehensiveAssessment3 = "鈻�";
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonPostAuthorizationRecordDto.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonPostAuthorizationRecordDto.java
new file mode 100644
index 0000000..33dd76c
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonPostAuthorizationRecordDto.java
@@ -0,0 +1,14 @@
+package com.ruoyi.personnel.dto;
+
+import com.ruoyi.personnel.pojo.PersonPostAuthorizationRecord;
+import lombok.Data;
+
+@Data
+public class PersonPostAuthorizationRecordDto extends PersonPostAuthorizationRecord {
+
+    private String userName;
+
+    private String account;
+
+    private String createUserName;
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonRewardPunishmentRecordDto.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonRewardPunishmentRecordDto.java
new file mode 100644
index 0000000..5be270b
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonRewardPunishmentRecordDto.java
@@ -0,0 +1,14 @@
+package com.ruoyi.personnel.dto;
+
+import com.ruoyi.personnel.pojo.PersonRewardPunishmentRecord;
+import lombok.Data;
+
+@Data
+public class PersonRewardPunishmentRecordDto extends PersonRewardPunishmentRecord {
+
+    private String userName;
+
+    private String account;
+
+    private String createUserName;
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonTrainingDetailedDto.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonTrainingDetailedDto.java
new file mode 100644
index 0000000..c42193c
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonTrainingDetailedDto.java
@@ -0,0 +1,36 @@
+package com.ruoyi.personnel.dto;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.deepoove.poi.data.PictureRenderData;
+import com.ruoyi.personnel.pojo.PersonTrainingDetailed;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+@Data
+public class PersonTrainingDetailedDto extends PersonTrainingDetailed {
+
+    @Schema(description = "涓惧姙閮ㄩ棬鍚嶇О")
+    private String holdingDepartmentName;
+
+    @Schema(description = "鍩硅璁插笀鍚嶇О")
+    private String trainingLecturerName;
+
+    @Schema(description = "鍩硅鑰佸笀鍦板潃")
+    private String trainingLecturerSignatureUrl;
+
+    @Schema(description = "鍩硅鑰佸笀鍦板潃娴�")
+    private PictureRenderData trainingLecturerRender;
+
+    @Schema(description = "褰撳墠鐧诲綍浜烘槸鍚﹁棰�")
+    private Boolean whetherClaim;
+
+
+    @Schema(description = "鍩硅鏃ユ湡")
+    private String trainingDateString;
+
+    // 瀵煎嚭浣跨敤
+    @TableField(select = false, exist = false)
+    @Schema(description = "搴忓彿(瀵煎嚭浣跨敤)")
+    private Integer index;
+
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonTrainingDto.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonTrainingDto.java
new file mode 100644
index 0000000..1a6c3fa
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonTrainingDto.java
@@ -0,0 +1,22 @@
+package com.ruoyi.personnel.dto;
+
+import com.ruoyi.personnel.pojo.PersonTraining;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+@Data
+@Schema(description = "鍩硅璁″垝")
+public class PersonTrainingDto extends PersonTraining {
+
+    @Schema(description = "缂栧埗浜哄鍚�")
+    private String compilerName;
+
+    @Schema(description = "瀹℃牳浜哄鍚�")
+    private String reviewerName;
+
+    @Schema(description = "鎵瑰噯浜哄鍚�")
+    private String approverName;
+
+    @Schema(description = "鍒涘缓浜哄鍚�")
+    private String createUserName;
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonTrainingRecordDto.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonTrainingRecordDto.java
new file mode 100644
index 0000000..db78507
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonTrainingRecordDto.java
@@ -0,0 +1,27 @@
+package com.ruoyi.personnel.dto;
+
+import com.deepoove.poi.data.PictureRenderData;
+import com.ruoyi.personnel.pojo.PersonTrainingRecord;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+@Data
+public class PersonTrainingRecordDto extends PersonTrainingRecord {
+    @Schema(description = "濮撳悕")
+    private String userName;
+
+    @Schema(description = "宸ュ彿")
+    private String account;
+
+    @Schema(description = "瑙掕壊")
+    private String roleName;
+
+    @Schema(description = "鐢佃瘽鍙风爜")
+    private String phone;
+
+    @Schema(description = "閮ㄩ棬")
+    private String department;
+
+    @Schema(description = "鍩硅浜哄憳鍥剧墖")
+    private String signatureUrl;
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonTrainingRecordListDto.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonTrainingRecordListDto.java
new file mode 100644
index 0000000..5d234e1
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonTrainingRecordListDto.java
@@ -0,0 +1,37 @@
+package com.ruoyi.personnel.dto;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Data
+public class PersonTrainingRecordListDto {
+
+    @Schema(description = "鐢ㄦ埛id")
+    private Integer userId;
+
+    @Schema(description = "鍛樺伐缂栧彿")
+    private String account;
+
+    @Schema(description = "鐢ㄦ埛濮撳悕")
+    private String name;
+
+    @Schema(description = "鎵�鍦ㄩ儴闂�")
+    private String departLimsName;
+
+    @Schema(description = "鑱岀О")
+    private String professionalTitle;
+
+    @Schema(description = "鏈�楂樺鍘�")
+    private String officialAcademicRedentials;
+
+    @Schema(description = "鍏ュ崟浣嶆椂闂�")
+    private LocalDateTime unitTime;
+
+    @Schema(description = "鍏ュ崟浣嶆椂闂�")
+    private String unitTimeSting;
+
+    @Schema(description = "涓撲笟")
+    private String major1;
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonTrainingRecordSubmitDto.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonTrainingRecordSubmitDto.java
new file mode 100644
index 0000000..ec9b26e
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonTrainingRecordSubmitDto.java
@@ -0,0 +1,35 @@
+package com.ruoyi.personnel.dto;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDate;
+
+@Data
+public class PersonTrainingRecordSubmitDto {
+
+    @Schema(description = "骞村害璁″垝鏄庣粏ID")
+    private Integer trainingDetailedId;
+
+    @Schema(description = "鍩硅鍦扮偣")
+    private String placeTraining;
+
+    @Schema(description = "鍩硅瀹屾垚鏃堕棿")
+    private LocalDate openingTime;
+
+    @Schema(description = "鑰冩牳鏂瑰紡")
+    private String assessmentMethod;
+
+    @Schema(description = "鏈鍩硅缁煎悎璇勪环")
+    private String comprehensiveAssessment;
+
+    @Schema(description = "璇勪环浜�")
+    private Integer assessmentUserId;
+
+    @Schema(description = "璇勪环鏃堕棿")
+    private LocalDate assessmentDate;
+
+    private Integer state;
+
+
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/TrainingRecordExportDto.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/TrainingRecordExportDto.java
new file mode 100644
index 0000000..fa2a9c9
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/TrainingRecordExportDto.java
@@ -0,0 +1,36 @@
+package com.ruoyi.personnel.dto;
+
+import com.deepoove.poi.data.PictureRenderData;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * @Author zhuo
+ * @Date 2024/11/25
+ */
+@Data
+public class TrainingRecordExportDto {
+
+    @Schema(description = "鐢ㄦ埛鍚嶇О1")
+    private PictureRenderData userNameRender1;
+
+    @Schema(description = "閮ㄩ棬1")
+    private String department1;
+
+    @Schema(description = "鑰冩牳缁撴灉1")
+    private String examinationResults1;
+
+    @Schema(description = "鐢ㄦ埛鍚嶇О2")
+    private PictureRenderData userNameRender2;
+
+    @Schema(description = "閮ㄩ棬1")
+    private String department2;
+
+    @Schema(description = "鑰冩牳缁撴灉1")
+    private String examinationResults2;
+
+
+
+
+
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/TrainingRecordPersonDetailedDto.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/TrainingRecordPersonDetailedDto.java
new file mode 100644
index 0000000..fde3faf
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/TrainingRecordPersonDetailedDto.java
@@ -0,0 +1,26 @@
+package com.ruoyi.personnel.dto;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+@Data
+public class TrainingRecordPersonDetailedDto {
+
+    @Schema(description = "鍩硅鏃ユ湡")
+    private String trainingDateString;
+
+    @Schema(description = "鍩硅鏃ユ湡")
+    private String trainingDate;
+
+    @Schema(description = "鍩硅鍐呭")
+    private String trainingContent;
+
+    @Schema(description = "璇炬椂")
+    private Integer classHour;
+
+    @Schema(description = "鑰冩牳缁撴灉")
+    private String examinationResults;
+
+    @Schema(description = "澶囨敞")
+    private String remarks;
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/UserPageDto.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/UserPageDto.java
new file mode 100644
index 0000000..77c257d
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/UserPageDto.java
@@ -0,0 +1,24 @@
+package com.ruoyi.personnel.dto;
+
+import com.ruoyi.common.core.domain.entity.User;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class UserPageDto extends User {
+
+    @Schema(description = "鍒涘缓鐢ㄦ埛")
+    private String createUserName;
+
+    @Schema(description = "鏇存柊鐢ㄦ埛")
+    private String updateUserName;
+
+    @Schema(description = "瑙掕壊")
+    private String roleName;
+
+
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/excel/PersonRewardPunishmentRecordExcel.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/excel/PersonRewardPunishmentRecordExcel.java
new file mode 100644
index 0000000..84456f3
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/excel/PersonRewardPunishmentRecordExcel.java
@@ -0,0 +1,34 @@
+package com.ruoyi.personnel.excel;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import lombok.Data;
+
+@Data
+public class PersonRewardPunishmentRecordExcel {
+    @ExcelProperty("鍛樺伐缂栧彿")
+    private String account;
+
+    @ExcelProperty("濮撳悕")
+    private String userName;
+
+    @ExcelProperty("濂栨儵绾у埆")
+    private String rewardPunishLevel;
+
+    @ExcelProperty("濂栨儵鍚嶇О")
+    private String rewardPunishName;
+
+    @ExcelProperty("濂栨儵鏃堕棿")
+    private String rewardPunishTime;
+
+    @ExcelProperty("濂栨儵鍗曚綅")
+    private String rewardPunishWorkUnit;
+
+    @ExcelProperty("濂栨儵鍐呭")
+    private String rewardPunishContent;
+
+    @ExcelProperty("鍒涘缓鏃堕棿")
+    private String createTime;
+
+    @ExcelProperty("鍒涘缓浜�")
+    private String createUserName;
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/excel/PersonTrainingDetailedListener.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/excel/PersonTrainingDetailedListener.java
new file mode 100644
index 0000000..9effe23
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/excel/PersonTrainingDetailedListener.java
@@ -0,0 +1,42 @@
+package com.ruoyi.personnel.excel;
+
+import com.alibaba.excel.context.AnalysisContext;
+import com.alibaba.excel.event.AnalysisEventListener;
+import com.ruoyi.personnel.service.PersonTrainingDetailedService;
+import lombok.Data;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Data
+public class PersonTrainingDetailedListener extends AnalysisEventListener<PersonTrainingDetailedUpload> {
+
+    private Integer planId;
+
+    private static final int BATCH_COUNT = 1000;
+    List<PersonTrainingDetailedUpload> list = new ArrayList<>();
+
+    private PersonTrainingDetailedService personTrainingDetailedService;
+
+    public PersonTrainingDetailedListener(PersonTrainingDetailedService personTrainingDetailedService) {
+        this.personTrainingDetailedService = personTrainingDetailedService;
+    }
+
+    @Override
+    public void invoke(PersonTrainingDetailedUpload data, AnalysisContext context) {
+        list.add(data);
+        if (list.size() >= BATCH_COUNT) {
+            save();
+            list.clear();
+        }
+    }
+
+    @Override
+    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
+        save();
+    }
+
+    private void save() {
+        personTrainingDetailedService.importExcel(list, this.planId);
+    }
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/excel/PersonTrainingDetailedUpload.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/excel/PersonTrainingDetailedUpload.java
new file mode 100644
index 0000000..f5dd8b3
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/excel/PersonTrainingDetailedUpload.java
@@ -0,0 +1,38 @@
+package com.ruoyi.personnel.excel;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import lombok.Data;
+
+@Data
+public class PersonTrainingDetailedUpload {
+
+    @ExcelProperty("鍩硅澶х被")
+    private String trainingCategory;
+
+    @ExcelProperty("鍩硅鐩爣")
+    private String trainingObjectives;
+
+    @ExcelProperty("鍩硅鍐呭")
+    private String trainingContent;
+
+    @ExcelProperty("鍩硅鏂瑰紡")
+    private String trainingMode;
+
+    @ExcelProperty("鍙傚姞瀵硅薄")
+    private String participants;
+
+    @ExcelProperty("涓惧姙閮ㄩ棬")
+    private String holdingDepartment;
+
+    @ExcelProperty("鍩硅璁插笀")
+    private String trainingLecturerName;
+
+    @ExcelProperty("鍩硅鏃堕棿")
+    private String trainingDate;
+
+    @ExcelProperty("璇炬椂")
+    private Integer classHour;
+
+    @ExcelProperty("澶囨敞")
+    private String remarks;
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/AnnexMapper.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/AnnexMapper.java
new file mode 100644
index 0000000..9fee604
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/AnnexMapper.java
@@ -0,0 +1,9 @@
+package com.ruoyi.personnel.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.personnel.pojo.Annex;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface AnnexMapper extends BaseMapper<Annex> {
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonBasicInfoFileMapper.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonBasicInfoFileMapper.java
new file mode 100644
index 0000000..fb0e2f5
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonBasicInfoFileMapper.java
@@ -0,0 +1,16 @@
+package com.ruoyi.personnel.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.personnel.pojo.PersonBasicInfoFile;
+
+/**
+ * <p>
+ * 浜哄憳鍩烘湰淇℃伅闄勪欢 Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2025-01-09 05:28:55
+ */
+public interface PersonBasicInfoFileMapper extends BaseMapper<PersonBasicInfoFile> {
+
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonBasicInfoMapper.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonBasicInfoMapper.java
new file mode 100644
index 0000000..b915ccf
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonBasicInfoMapper.java
@@ -0,0 +1,43 @@
+package com.ruoyi.personnel.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.ruoyi.common.core.domain.entity.DepartmentDto;
+import com.ruoyi.personnel.dto.PersonBasicInfoDto;
+import com.ruoyi.personnel.pojo.PersonBasicInfo;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ *  Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-08-30 09:19:57
+ */
+public interface PersonBasicInfoMapper extends BaseMapper<PersonBasicInfo> {
+
+    List<DepartmentDto> selectLimsUser();
+
+    PersonBasicInfoDto getCNASPersonnelInfo(Integer userId);
+
+    /**
+     * 浜哄憳鍩烘湰淇℃伅鍒嗛〉鏌ヨ
+     * @param page
+     * @param name
+     * @param departmentId
+     * @return
+     */
+    IPage<Map<String, Object>> selectPersonBasecInfoAndUser(Page page, @Param("name") String name, @Param("departmentId") Integer departmentId);
+
+    /**
+     * 瀵煎嚭鏌ヨ浜哄憳淇℃伅
+     * @param userId
+     * @return
+     */
+    Map<String, Object> selectexportPersonBasic(Integer userId);
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonBasicInfoWorkMapper.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonBasicInfoWorkMapper.java
new file mode 100644
index 0000000..df8d2d4
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonBasicInfoWorkMapper.java
@@ -0,0 +1,16 @@
+package com.ruoyi.personnel.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.personnel.pojo.PersonBasicInfoWork;
+
+/**
+ * <p>
+ * 浜哄憳鍩烘湰淇℃伅 Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2025-01-09 05:45:04
+ */
+public interface PersonBasicInfoWorkMapper extends BaseMapper<PersonBasicInfoWork> {
+
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonCommunicationAbilityMapper.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonCommunicationAbilityMapper.java
new file mode 100644
index 0000000..b309b95
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonCommunicationAbilityMapper.java
@@ -0,0 +1,21 @@
+package com.ruoyi.personnel.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.ruoyi.personnel.dto.PersonCommunicationAbilityDto;
+import com.ruoyi.personnel.pojo.PersonCommunicationAbility;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * <p>
+ * 娌熼�氳兘鍔� Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author
+ * @since 2024-10-09 12:00:57
+ */
+public interface PersonCommunicationAbilityMapper extends BaseMapper<PersonCommunicationAbility> {
+
+    IPage<PersonCommunicationAbilityDto> personPersonCommunicationAbilityPage(Page page, @Param("departLimsId") Integer departLimsId, @Param("userId") Integer userId, @Param("userName") String userName);
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonJobResponsibilitiesMapper.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonJobResponsibilitiesMapper.java
new file mode 100644
index 0000000..cf13fd2
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonJobResponsibilitiesMapper.java
@@ -0,0 +1,21 @@
+package com.ruoyi.personnel.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.ruoyi.personnel.dto.PersonJobResponsibilitiesDto;
+import com.ruoyi.personnel.pojo.PersonJobResponsibilities;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * <p>
+ * 宀椾綅鑱岃矗 Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author
+ * @since 2024-10-09 02:07:49
+ */
+public interface PersonJobResponsibilitiesMapper extends BaseMapper<PersonJobResponsibilities> {
+
+    IPage<PersonJobResponsibilitiesDto> personJobResponsibilitiesSelect(Page page, @Param("userId") String userId, @Param("departmentId") String departmentId, @Param("userName") String userName);
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonPersonnelCapacityMapper.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonPersonnelCapacityMapper.java
new file mode 100644
index 0000000..4574a32
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonPersonnelCapacityMapper.java
@@ -0,0 +1,29 @@
+package com.ruoyi.personnel.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.ruoyi.personnel.dto.PersonPersonnelCapacityDto;
+import com.ruoyi.personnel.dto.PersonPersonnelCapacityExportDto;
+import com.ruoyi.personnel.pojo.PersonPersonnelCapacity;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * <p>
+ * 浜哄憳鑳藉姏 Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 
+ * @since 2024-10-10 11:26:18
+ */
+public interface PersonPersonnelCapacityMapper extends BaseMapper<PersonPersonnelCapacity> {
+
+    IPage<PersonPersonnelCapacityDto> personPersonnelCapacityPage(Page page, @Param("departLimsId") Integer departLimsId,@Param("userId") Integer userId,@Param("userName") String userName);
+
+    /**
+     * 鏌ヨ浜哄憳鑳藉姏鎺ュ彛
+     * @param id
+     * @return
+     */
+    PersonPersonnelCapacityExportDto selectExportPersonnelCapacity(@Param("id") Integer id);
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonPostAuthorizationRecordMapper.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonPostAuthorizationRecordMapper.java
new file mode 100644
index 0000000..a10a7e7
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonPostAuthorizationRecordMapper.java
@@ -0,0 +1,21 @@
+package com.ruoyi.personnel.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.ruoyi.personnel.dto.PersonPostAuthorizationRecordDto;
+import com.ruoyi.personnel.pojo.PersonPostAuthorizationRecord;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * <p>
+ * 浠昏亴鎺堟潈璁板綍 Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 
+ * @since 2024-10-09 10:48:17
+ */
+public interface PersonPostAuthorizationRecordMapper extends BaseMapper<PersonPostAuthorizationRecord> {
+
+    IPage<PersonPostAuthorizationRecordDto> personPostAuthorizationRecordPage(Page page, @Param("departLimsId") Integer departLimsId, @Param("userId") Integer userId, @Param("userName") String userName);
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonRewardPunishmentRecordMapper.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonRewardPunishmentRecordMapper.java
new file mode 100644
index 0000000..b0633b3
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonRewardPunishmentRecordMapper.java
@@ -0,0 +1,27 @@
+package com.ruoyi.personnel.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.ruoyi.personnel.dto.PersonRewardPunishmentRecordDto;
+import com.ruoyi.personnel.excel.PersonRewardPunishmentRecordExcel;
+import com.ruoyi.personnel.pojo.PersonRewardPunishmentRecord;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * <p>
+ * 濂栨儵璁板綍 Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author
+ * @since 2024-10-08 11:25:02
+ */
+public interface PersonRewardPunishmentRecordMapper extends BaseMapper<PersonRewardPunishmentRecord> {
+
+    IPage<PersonRewardPunishmentRecordDto> rewardPunishmentPage(Page page, @Param("userId") Integer userId, @Param("userName") String userName,@Param("startTime") Date startTime, @Param("endTime") Date endTime,@Param("departmentId") Integer departmentId);
+
+    List<PersonRewardPunishmentRecordExcel> rewardPunishmentExport(@Param("userId") Integer userId, @Param("departmentId") Integer departmentId, @Param("userName") String userName, @Param("startTime") Date startTime, @Param("endTime") Date endTime);
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonTrainingDetailedFileMapper.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonTrainingDetailedFileMapper.java
new file mode 100644
index 0000000..88b2531
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonTrainingDetailedFileMapper.java
@@ -0,0 +1,15 @@
+package com.ruoyi.personnel.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.personnel.pojo.PersonTrainingDetailedFile;
+
+/**
+ * 浜哄憳鍩硅璁″垝璇︽儏闄勪欢琛�(CnasPersonTrainingDetailedFile)$desc
+ *
+ * @author makejava
+ * @since 2024-12-25 14:18:22
+ */
+public interface PersonTrainingDetailedFileMapper extends BaseMapper<PersonTrainingDetailedFile> {
+
+}
+
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonTrainingDetailedMapper.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonTrainingDetailedMapper.java
new file mode 100644
index 0000000..2802d6e
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonTrainingDetailedMapper.java
@@ -0,0 +1,49 @@
+package com.ruoyi.personnel.mapper;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.framework.mybatis_config.MyBaseMapper;
+import com.ruoyi.personnel.dto.PersonTrainingDetailedDto;
+import com.ruoyi.personnel.pojo.PersonTrainingDetailed;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 鍩硅璁″垝璇︽儏 Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author
+ * @since 2024-10-11 01:46:27
+ */
+public interface PersonTrainingDetailedMapper extends MyBaseMapper<PersonTrainingDetailed> {
+
+    IPage<PersonTrainingDetailedDto> queryTheAnnualPlanDetailsTable(Page page,
+                                                                    @Param("trainingLecturerName") String trainingLecturerName,
+                                                                    @Param("courseCode") String courseCode,
+                                                                    @Param("trainingDate") String trainingDate,
+                                                                    @Param("id") Integer id,
+                                                                    @Param("userId") Integer userId,
+                                                                    @Param("loginUserId") Integer loginUserId);
+
+    /**
+     * 鏍规嵁涓昏〃id鏌ヨ璇︽儏
+     * @param trainingId
+     * @return
+     */
+    List<PersonTrainingDetailedDto> selectTrainingList(@Param("trainingId") Integer trainingId);
+
+    /**
+     * 鏌ヨ璇︾粏
+     * @param id
+     * @return
+     */
+    PersonTrainingDetailedDto selectTrainingDetail(@Param("id") Integer id);
+
+    /**
+     * 鏌ヨ浠婂勾浜哄憳鍩硅淇℃伅
+     * @return
+     */
+    List<PersonTrainingDetailed> getThisYearTrainingDetailed();
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonTrainingMapper.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonTrainingMapper.java
new file mode 100644
index 0000000..d10c5b4
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonTrainingMapper.java
@@ -0,0 +1,21 @@
+package com.ruoyi.personnel.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.ruoyi.personnel.dto.PersonTrainingDto;
+import com.ruoyi.personnel.pojo.PersonTraining;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * <p>
+ * 鍩硅璁″垝 Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 
+ * @since 2024-10-11 01:11:49
+ */
+public interface PersonTrainingMapper extends BaseMapper<PersonTraining> {
+
+    IPage<PersonTrainingDto> personTrainingSelect(Page page, @Param("compilerName") String compilerName,@Param("departLimsId") String departLimsId);
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonTrainingRecordMapper.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonTrainingRecordMapper.java
new file mode 100644
index 0000000..f0ddb1d
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonTrainingRecordMapper.java
@@ -0,0 +1,67 @@
+package com.ruoyi.personnel.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.ruoyi.personnel.dto.PersonTrainingRecordDto;
+import com.ruoyi.personnel.dto.PersonTrainingRecordListDto;
+import com.ruoyi.personnel.dto.TrainingRecordPersonDetailedDto;
+import com.ruoyi.personnel.pojo.PersonTrainingRecord;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 鍩硅璁板綍 Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author
+ * @since 2024-10-12 04:50:48
+ */
+public interface PersonTrainingRecordMapper extends BaseMapper<PersonTrainingRecord> {
+
+    List<PersonTrainingRecordDto> trainingAndAssessmentRecordsPage(@Param("trainingDetailedId") Integer trainingDetailedId,@Param("userName") String userName);
+
+    IPage<PersonTrainingRecordListDto> personnelTrainingPersonnel(Page page, @Param("userName") String userName, @Param("userId") Integer userId,@Param("departLimsId") Integer departLimsId);
+
+    IPage<TrainingRecordPersonDetailedDto> queryPersonnelDetails(Page page, Integer userId);
+
+    /**
+     * 鏍规嵁璇︽儏id鏌ヨ鍩硅浜哄憳
+     * @param trainingDetailedId
+     * @return
+     */
+    List<PersonTrainingRecordDto> selectListByTrainingDetailedId(@Param("trainingDetailedId") Integer trainingDetailedId);
+
+    /**
+     * 鏌ヨ浜哄憳淇℃伅
+     * @param userId
+     * @return
+     */
+    PersonTrainingRecordListDto selectUserTraining(@Param("userId") Integer userId);
+
+    /**
+     * 鏍规嵁鐢ㄦ埛id鏌ヨ鍩硅璁板綍
+     * @param userId
+     * @return
+     */
+    List<TrainingRecordPersonDetailedDto> selectPersonDetailedDtos(Integer userId);
+
+    /**
+     * 鏍规嵁鐢ㄦ埛id鍜屽勾浠芥煡璇汉鍛樻槑缁� 鍩硅璁板綍
+     * @param page
+     * @param userId
+     * @param year
+     * @return
+     */
+    IPage<TrainingRecordPersonDetailedDto> queryPersonnelDetailsOfUserIdAndYear(Page page, @Param("userId") Integer userId, @Param("year") Integer year);
+
+    /**
+     * 鏍规嵁鐢ㄦ埛id鍜屽勾浠芥煡璇汉鍛樻槑缁� 鍩硅璁板綍瀵煎嚭
+     * @param userId
+     * @param trainingDate
+     * @return
+     */
+    List<TrainingRecordPersonDetailedDto> selectPersonDetailedDtosByTrainingDate(@Param("userId") Integer userId, @Param("year") Integer year);
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/Annex.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/Annex.java
new file mode 100644
index 0000000..0f82eaa
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/Annex.java
@@ -0,0 +1,47 @@
+package com.ruoyi.personnel.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+@Data
+@TableName("cnas_annex")
+@Schema(description = "浜哄憳鍩烘湰淇℃伅闄勪欢琛�")
+public class Annex implements Serializable {
+
+    @TableId(type = IdType.AUTO)
+    private Integer id;
+
+    @Schema(description = "user琛╥d")
+    private Integer userId;
+
+    @Schema(description = "璇佷欢鍙�")
+    private String idNumber;
+
+    @Schema(description = "鍙戣瘉鍗曚綅")
+    private String issueUnit;
+
+    @Schema(description = "鏂囦欢鍚嶇О")
+    private String fileName;
+
+    @Schema(description = "绾у埆")
+    private String level;
+
+    @Schema(description = "鏈夋晥鏈�")
+    private String periodValidity;
+
+    @Schema(description = "娣诲姞鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @Schema(description = "澶嶅嵃浠�")
+    private String copy;
+
+    @Schema(description = "鍘熶欢")
+    private String original;
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonBasicInfo.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonBasicInfo.java
new file mode 100644
index 0000000..40154d6
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonBasicInfo.java
@@ -0,0 +1,155 @@
+package com.ruoyi.personnel.pojo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-08-30 09:19:57
+ */
+@Getter
+@Setter
+@TableName("cnas_person_basic_info")
+@Schema(description = "")
+public class PersonBasicInfo implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @Schema(description = "涓婚敭id")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @Schema(description = "褰撳墠鐘舵��")
+    private String currentState;
+
+    @Schema(description = "鑱岀О")
+    @ExcelProperty("鑱岀О")
+    private String professionalTitle;
+
+    @Schema(description = "鎬у埆")
+    private String sex;
+
+    @Schema(description = "浜哄憳鍒嗙被")
+    private String personnelClassification;
+
+    @Schema(description = "鍑虹敓鏃ユ湡")
+    @TableField(updateStrategy = FieldStrategy.ALWAYS) // 涓虹┖鍙互鏇存柊
+    private LocalDateTime dateBirth;
+
+    @Schema(description = "韬唤璇佸彿")
+    @ExcelProperty("璇佷欢鍙风爜")
+    private String identityCard;
+
+    @Schema(description = "姘戞棌")
+    private String nation;
+
+    @Schema(description = "鏀挎不闈㈣矊")
+    private String politicalStatus;
+
+    @Schema(description = "鏈�楂樺鍘�")
+    @ExcelProperty("鏈�楂樺鍘�")
+    private String officialAcademicRedentials;
+
+    @Schema(description = "姣曚笟鏃堕棿1")
+    @ExcelProperty("姣曚笟鏃堕棿")
+    private LocalDateTime graduationTime1;
+
+    @Schema(description = "姣曚笟闄㈡牎1")
+    @ExcelProperty("姣曚笟闄㈡牎")
+    private String graduatedInstitutions1;
+
+    @Schema(description = "涓撲笟1")
+    @ExcelProperty("鎵�瀛︿笓涓�")
+    private String major1;
+
+    @Schema(description = "姣曚笟鏃堕棿2")
+    @TableField(updateStrategy = FieldStrategy.ALWAYS) // 涓虹┖鍙互鏇存柊
+    private LocalDateTime graduationTime2;
+
+    @Schema(description = "姣曚笟闄㈡牎2")
+    private String graduatedInstitutions2;
+
+    @Schema(description = "涓撲笟2")
+    private String major2;
+
+    @Schema(description = "鎵嬫満鍙�")
+    private String telephone;
+
+    @Schema(description = "澶囨敞")
+    private String remarks;
+
+    @Schema(description = "鐢ㄦ埛琛紙user锛塱d")
+    private Integer userId;
+
+    @Schema(description = "鍏徃鍚嶇О")
+    private String corporateName;
+
+    @Schema(description = "宀椾綅鍚嶇О")
+    private String postName;
+
+    @Schema(description = "鍏ラ泦鍥㈡椂闂�")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
+    @TableField(updateStrategy = FieldStrategy.ALWAYS) // 涓虹┖鍙互鏇存柊
+    @ExcelProperty("鍏ラ泦鍥㈡椂闂�")
+    private LocalDateTime groupTime;
+
+    @Schema(description = "鍔冲姩鍏崇郴")
+    private Integer laborRelations;
+
+    @Schema(description = "宸ヤ綔鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
+    @TableField(updateStrategy = FieldStrategy.ALWAYS) // 涓虹┖鍙互鏇存柊
+    private LocalDateTime workingTime;
+
+    @Schema(description = "鍚堝悓鏈夋晥鏈�")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
+    @TableField(updateStrategy = FieldStrategy.ALWAYS) // 涓虹┖鍙互鏇存柊
+    private LocalDateTime contractLifeTime;
+
+    @Schema(description = "绫嶈疮")
+    @ExcelProperty("绫嶈疮")
+    private String nativePlace;
+
+    @Schema(description = "璇佷欢鏈夋晥鏈�")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
+    @TableField(updateStrategy = FieldStrategy.ALWAYS) // 涓虹┖鍙互鏇存柊
+    private LocalDateTime validityPeriod;
+
+    @Schema(description = "濠氬Щ鐘跺喌")
+    private Integer maritalStatus;
+
+    @Schema(description = "璇佷欢鍦板潃")
+    @ExcelProperty("璇佷欢鍦板潃")
+    private String idAddress;
+
+    @Schema(description = "璇佷欢璇︾粏鍦板潃")
+    private String idDetailAddress;
+
+    @Schema(description = "鍏ュ厷/鍥㈡椂闂�")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
+    @TableField(updateStrategy = FieldStrategy.ALWAYS) // 涓虹┖鍙互鏇存柊
+    private LocalDateTime dumplingTime;
+
+    @Schema(description = "鏈�楂樺浣�")
+    @ExcelProperty("鏈�楂樺浣�")
+    private String highestDegree;
+
+    @Schema(description = "鏈�鍚庢洿鏂版椂闂�")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime lastUpdateTime;
+
+
+
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonBasicInfoFile.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonBasicInfoFile.java
new file mode 100644
index 0000000..f233695
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonBasicInfoFile.java
@@ -0,0 +1,57 @@
+package com.ruoyi.personnel.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 浜哄憳鍩烘湰淇℃伅闄勪欢
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2025-01-09 05:28:55
+ */
+@Getter
+@Setter
+@TableName("cnas_person_basic_info_file")
+@Schema(description = "浜哄憳鍩烘湰淇℃伅闄勪欢")
+public class PersonBasicInfoFile implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "basic_info_file_id", type = IdType.AUTO)
+    private Integer basicInfoFileId;
+
+    @Schema(description = "浜哄憳鍩烘湰淇℃伅id")
+    private Integer userId;
+
+    @Schema(description = "绫诲瀷:1鍥剧墖/2鏂囦欢")
+    private Integer type;
+
+    @Schema(description = "闄勪欢璺緞")
+    private String fileUrl;
+
+    @Schema(description = "闄勪欢鍚嶇О")
+    private String fileName;
+
+    @Schema(description = "鍒涘缓浜�")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @Schema(description = "鍒涘缓鏃堕棿")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @Schema(description = "淇敼浜�")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    @Schema(description = "淇敼鏃堕棿")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonBasicInfoWork.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonBasicInfoWork.java
new file mode 100644
index 0000000..928923a
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonBasicInfoWork.java
@@ -0,0 +1,52 @@
+package com.ruoyi.personnel.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 浜哄憳鍩烘湰淇℃伅
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2025-01-09 05:45:04
+ */
+@Getter
+@Setter
+@TableName("cnas_person_basic_info_work")
+@Schema(description = "浜哄憳鍩烘湰淇℃伅")
+public class PersonBasicInfoWork implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "basic_info_work_id", type = IdType.AUTO)
+    private Integer basicInfoWorkId;
+
+    @Schema(description = "浜哄憳id")
+    private Integer userId;
+
+    @Schema(description = "宸ヤ綔缁忓巻")
+    private String workExperience;
+
+    @Schema(description = "鍒涘缓浜�")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @Schema(description = "鍒涘缓鏃堕棿")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @Schema(description = "淇敼浜�")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    @Schema(description = "淇敼鏃堕棿")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonCommunicationAbility.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonCommunicationAbility.java
new file mode 100644
index 0000000..4f39583
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonCommunicationAbility.java
@@ -0,0 +1,60 @@
+package com.ruoyi.personnel.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 娌熼�氳褰�
+ * </p>
+ *
+ * @author
+ * @since 2024-10-09 12:00:57
+ */
+@Getter
+@Setter
+@TableName("cnas_person_communication_ability")
+@Schema(description = "娌熼�氳褰�")
+public class PersonCommunicationAbility implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @Schema(description = "涓婚敭id")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @Schema(description = "娌熼�氫汉id")
+    private String userId;
+
+    @Schema(description = "娌熼�氭椂闂�")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime communicationTime;
+
+    @Schema(description = "娌熼�氬湴鐐�")
+    private String communicationPlace;
+
+    @Schema(description = "娌熼�氬唴瀹�")
+    private String communicationContent;
+
+    @Schema(description = "鍒涘缓浜篿d")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @Schema(description = "鏇存柊浜篿d", hidden = true)
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    @Schema(description = "鍒涘缓鏃堕棿", hidden = true)
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @Schema(description = "鏇存柊鏃堕棿", hidden = true)
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonJobResponsibilities.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonJobResponsibilities.java
new file mode 100644
index 0000000..4cdd931
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonJobResponsibilities.java
@@ -0,0 +1,77 @@
+package com.ruoyi.personnel.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 宀椾綅鑱岃矗
+ * </p>
+ *
+ * @author
+ * @since 2024-10-09 02:07:49
+ */
+@Getter
+@Setter
+@TableName("cnas_person_job_responsibilities")
+@Schema(description = "宀椾綅鑱岃矗")
+public class PersonJobResponsibilities implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @Schema(description = "涓婚敭id")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @Schema(description = "1宀椾綅鍚嶇О")
+    private String postName;
+
+    @Schema(description = "1宸ヤ綔鐩爣")
+    private String jobObjective;
+
+    @Schema(description = "1宀椾綅鑱岃矗")
+    private String jobResponsibilities;
+
+    @Schema(description = "1浠昏亴浜篿d")
+    private String incumbentId;
+
+    @Schema(description = "1 鎻愪氦鎿嶄綔浜�")
+    private String submittingOperator;
+
+    @Schema(description = "1鎻愪氦鏃ユ湡")
+    private LocalDateTime submittingDate;
+
+    @Schema(description = "2 浠昏亴浜� 涓荤id")
+    private Integer supervisorId;
+
+    @Schema(description = "2 浠昏亴浜� 鎿嶄綔浜�")
+    private String incumbentOperator;
+
+    @Schema(description = "2 浠昏亴浜� 鏃ユ湡")
+    private LocalDateTime incumbentDate;
+
+    @Schema(description = "3 涓荤 鎿嶄綔浜�")
+    private String supervisorOperator;
+
+    @Schema(description = "3 涓荤 鏃ユ湡")
+    private LocalDateTime supervisorDate;
+
+    @Schema(description = "鍒涘缓浜篿d", hidden = true)
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @Schema(description = "褰撳墠鐘舵��")
+    private String currentState;
+
+    @Schema(description = "鍒涘缓鏃ユ湡 / 鎻愪氦鏃ユ湡", hidden = true)
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @Schema(description = "褰撳墠璐熻矗浜�")
+    private String currentResponsible;
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonPersonnelCapacity.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonPersonnelCapacity.java
new file mode 100644
index 0000000..242607d
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonPersonnelCapacity.java
@@ -0,0 +1,113 @@
+package com.ruoyi.personnel.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 浜哄憳鑳藉姏
+ * </p>
+ *
+ * @author
+ * @since 2024-10-10 11:26:18
+ */
+@Getter
+@Setter
+@TableName("cnas_person_personnel_capacity")
+@Schema(description = "浜哄憳鑳藉姏")
+public class PersonPersonnelCapacity implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @Schema(description = "涓婚敭id")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @Schema(description = "瀛﹀巻")
+    private String academicDegree;
+
+    @Schema(description = "瀛﹀巻 绗﹀悎涓庡惁(1锛氱鍚堬紱2锛氫笉绗﹀悎锛�3锛氫笉閫傜敤)")
+    private Integer academicConformNot;
+
+    @Schema(description = "瀛﹀巻 澶囨敞")
+    private String academicRemarks;
+
+    @Schema(description = "鐩稿叧骞撮檺")
+    private String relatedYears;
+
+    @Schema(description = "鐩稿叧骞撮檺  绗﹀悎涓庡惁(1锛氱鍚堬紱2锛氫笉绗﹀悎锛�3锛氫笉閫傜敤)")
+    private Integer relatedYearsConformNot;
+
+    @Schema(description = "鐩稿叧骞撮檺 澶囨敞")
+    private String relatedYearsRemarks;
+
+    @Schema(description = "鐩稿叧鍩硅")
+    private String relatedTraining;
+
+    @Schema(description = "鐩稿叧鍩硅 绗﹀悎涓庡惁(1锛氱鍚堬紱2锛氫笉绗﹀悎锛�3锛氫笉閫傜敤)")
+    private Integer relatedTrainingConformNot;
+
+    @Schema(description = "鐩稿叧鍩硅 澶囨敞")
+    private String relatedTrainingRemarks;
+
+    @Schema(description = "鐩稿叧缁忛獙")
+    private String relevantExperience;
+
+    @Schema(description = "鐩稿叧缁忛獙 绗﹀悎涓庡惁(1锛氱鍚堬紱2锛氫笉绗﹀悎锛�3锛氫笉閫傜敤)")
+    private Integer relevantExperienceConformNot;
+
+    @Schema(description = "鐩稿叧缁忛獙 澶囨敞")
+    private String relevantExperienceRemarks;
+
+    @Schema(description = "涓婂矖璇�")
+    private String workLicense;
+
+    @Schema(description = "涓婂矖璇� 绗﹀悎涓庡惁(1锛氱鍚堬紱2锛氫笉绗﹀悎锛�3锛氫笉閫傜敤)")
+    private Integer workLicenseConformNot;
+
+    @Schema(description = "涓婂矖璇� 澶囨敞")
+    private String workLicenseRemarks;
+
+    @Schema(description = "宀椾綅鑱岃矗")
+    private String jobResponsibilities;
+
+    @Schema(description = "宀椾綅鑱岃矗 绗﹀悎涓庡惁(1锛氱鍚堬紱2锛氫笉绗﹀悎锛�3锛氫笉閫傜敤)")
+    private Integer jobResponsibilitiesConformNot;
+
+    @Schema(description = "宀椾綅鑱岃矗 澶囨敞")
+    private String jobResponsibilitiesRemarks;
+
+    @Schema(description = "缁煎悎璇勪环")
+    private String comprehensiveAssessment;
+
+    @Schema(description = "2 纭浜� userId涓婚敭")
+    private Integer confirmOperatingPersonnelId;
+
+    @Schema(description = "2 纭浜� 鏃ユ湡")
+    private LocalDateTime confirmDate;
+
+    @Schema(description = "鍒涘缓鏃ユ湡", hidden = true)
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @Schema(description = "鏇存柊鏃ユ湡", hidden = true)
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+
+    @Schema(description = "鍒涘缓浜�", hidden = true)
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @Schema(description = "鏇存柊浜�", hidden = true)
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    @Schema(description = "浜哄憳濮撳悕 id")
+    private Integer userId;
+
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonPostAuthorizationRecord.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonPostAuthorizationRecord.java
new file mode 100644
index 0000000..8fd0b49
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonPostAuthorizationRecord.java
@@ -0,0 +1,73 @@
+package com.ruoyi.personnel.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 浠昏亴鎺堟潈璁板綍
+ * </p>
+ *
+ * @author 
+ * @since 2024-10-09 10:48:17
+ */
+@Getter
+@Setter
+@TableName("cnas_person_post_authorization_record")
+@Schema(description = "浠昏亴鎺堟潈璁板綍")
+public class PersonPostAuthorizationRecord implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @Schema(description = "涓婚敭id")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @Schema(description = "璇佷功缂栧彿")
+    private String certificateNumber;
+
+    @Schema(description = "琚换鑱屼汉鍛榠d")
+    private String userId;
+
+    @Schema(description = "浠昏亴宀椾綅")
+    private String post;
+
+    @Schema(description = "鎿嶄綔绫诲瀷")
+    private String operationType;
+
+    @Schema(description = "鍘熸枃浠跺悕绉�")
+    private String fileName;
+
+    @Schema(description = "绯荤粺鐢熸垚鏂囦欢鍚嶇О")
+    private String systemFileName;
+
+    @Schema(description = "澶囨敞")
+    private String remarks;
+
+    @Schema(description = "鍒涘缓鏃堕棿", hidden = true)
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @Schema(description = "鏇存柊鏃堕棿", hidden = true)
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+
+    @Schema(description = "鏇存柊浜篿d", hidden = true)
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    @Schema(description = "鍒涘缓浜篿d", hidden = true)
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @Schema(description = "鐞嗚鐭ヨ瘑鑰冭瘯鎴愮哗")
+    private String num1;
+
+    @Schema(description = "鎿嶄綔鎶�鑳借�冭瘯鎴愮哗")
+    private String num2;
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonRewardPunishmentRecord.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonRewardPunishmentRecord.java
new file mode 100644
index 0000000..489f610
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonRewardPunishmentRecord.java
@@ -0,0 +1,60 @@
+package com.ruoyi.personnel.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 濂栨儵璁板綍
+ * </p>
+ *
+ * @author
+ * @since 2024-10-08 11:25:02
+ */
+@Getter
+@Setter
+@TableName("cnas_person_reward_punishment_record")
+@Schema(description = "濂栨儵璁板綍")
+public class PersonRewardPunishmentRecord implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @Schema(description = "涓婚敭id")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @Schema(description = "濂栨儵绾у埆")
+    private String rewardPunishLevel;
+
+    @Schema(description = "濂栨儵鍚嶇О")
+    private String rewardPunishName;
+
+    @Schema(description = "濂栨儵鏃堕棿")
+    private LocalDateTime rewardPunishTime;
+
+    @Schema(description = "濂栨儵鍗曚綅")
+    private String rewardPunishWorkUnit;
+
+    @Schema(description = "濂栨儵鍐呭")
+    private String rewardPunishContent;
+
+    @Schema(description = "鐢ㄦ埛id")
+    private Integer userId;
+
+    @Schema(description = "鍒涘缓鏃堕棿", hidden = true)
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @Schema(description = "鏇存柊鏃堕棿", hidden = true)
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime updateTime;
+
+    @Schema(description = "鍒涘缓浜�", hidden = true)
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonTraining.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonTraining.java
new file mode 100644
index 0000000..6ea9853
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonTraining.java
@@ -0,0 +1,82 @@
+package com.ruoyi.personnel.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 鍩硅璁″垝
+ * </p>
+ *
+ * @author 
+ * @since 2024-10-11 01:11:49
+ */
+@Getter
+@Setter
+@TableName("cnas_person_training")
+@Schema(description = "鍩硅璁″垝")
+public class PersonTraining implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @Schema(description = "涓婚敭id")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @Schema(description = "鏂囦欢鍚嶇О")
+    private String fileName;
+
+    @Schema(description = "璁″垝骞翠唤")
+    private String planYear;
+
+    @Schema(description = "缂栧埗浜篿d")
+    private Integer compilerId;
+
+    @Schema(description = "缂栧埗鏃ユ湡")
+    private LocalDateTime compilationDate;
+
+    @Schema(description = "瀹℃牳浜篿d")
+    private Integer reviewerId;
+
+    @Schema(description = "瀹℃牳鏃ユ湡")
+    private LocalDateTime auditDate;
+
+    @Schema(description = "瀹℃牳鐘舵��")
+    private Integer reviewerStatus;
+
+    @Schema(description = "瀹℃牳澶囨敞")
+    private String auditRemarks;
+
+    @Schema(description = "鎵瑰噯浜篿d")
+    private Integer approverId;
+
+    @Schema(description = "鎵瑰噯澶囨敞")
+    private String approvalRemarks;
+
+    @Schema(description = "鎵瑰噯鐘舵��(1锛氭壒鍑嗭紱2锛氫笉鎵瑰噯)")
+    private Integer approvalStatus;
+
+    @Schema(description = "鎵瑰噯鏃ユ湡")
+    private LocalDateTime approvalDate;
+
+    @Schema(description = "鍒涘缓鏃ユ湡")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @Schema(description = "鍒涘缓浜篿d")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @Schema(description = "鏇存柊鏃堕棿")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+
+    @Schema(description = "鏇存柊浜篿d")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonTrainingDetailed.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonTrainingDetailed.java
new file mode 100644
index 0000000..aabc0b1
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonTrainingDetailed.java
@@ -0,0 +1,101 @@
+package com.ruoyi.personnel.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 鍩硅璁″垝璇︽儏
+ * </p>
+ *
+ * @author
+ * @since 2024-10-11 01:46:27
+ */
+@Getter
+@Setter
+@TableName("cnas_person_training_detailed")
+@Schema(description = "鍩硅璁″垝璇︽儏")
+public class PersonTrainingDetailed implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @Schema(description = "鍩硅璁″垝")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @Schema(description = "鍩硅澶х被")
+    private String trainingCategory;
+
+    @Schema(description = "鍩硅鐩爣")
+    private String trainingObjectives;
+
+    @Schema(description = "鍩硅鍐呭")
+    private String trainingContent;
+
+    @Schema(description = "鍩硅鏂瑰紡")
+    private String trainingMode;
+
+    @Schema(description = "鐘舵��(1锛氬凡瀹屾垚锛�2锛氬緟璇勪环锛�3: 鏈紑濮�)")
+    private Integer state;
+
+    @Schema(description = "鍙傚姞瀵硅薄")
+    private String participants;
+
+    @Schema(description = "涓惧姙閮ㄩ棬")
+    private String holdingDepartment;
+
+    @Schema(description = "鍩硅鍦扮偣")
+    private String placeTraining;
+
+    @Schema(description = "鍩硅璁插笀_id")
+    private Integer trainingLecturerId;
+
+    @Schema(description = "璁″垝鍩硅鏃ユ湡")
+    private String trainingDate;
+
+    @Schema(description = "鍩硅瀹屾垚鏃堕棿")
+    private LocalDate openingTime;
+
+    @Schema(description = "璇炬椂")
+    private Integer classHour;
+
+    @Schema(description = "澶囨敞")
+    private String remarks;
+
+    @Schema(description = "鍩硅璁″垝id")
+    private Integer planId;
+
+    @Schema(description = "鍒涘缓鏃堕棿", hidden = true)
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @Schema(description = "鍒涘缓浜篿d", hidden = true)
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @Schema(description = "鏇存柊浜篿d", hidden = true)
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    @Schema(description = "鏇存柊鏃堕棿", hidden = true)
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+
+    @Schema(description = "鑰冩牳鏂瑰紡")
+    private String assessmentMethod;
+
+    @Schema(description = "鏈鍩硅缁煎悎璇勪环")
+    private String comprehensiveAssessment;
+
+    @Schema(description = "璇勪环浜�")
+    private Integer assessmentUserId;
+
+    @Schema(description = "璇勪环鏃堕棿")
+    private LocalDate assessmentDate;
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonTrainingDetailedFile.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonTrainingDetailedFile.java
new file mode 100644
index 0000000..e040159
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonTrainingDetailedFile.java
@@ -0,0 +1,49 @@
+package com.ruoyi.personnel.pojo;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * 浜哄憳鍩硅璁″垝璇︽儏闄勪欢琛�(CnasPersonTrainingDetailedFile)$desc
+ *
+ * @author makejava
+ * @since 2024-12-25 14:18:22
+ */
+@Data
+@TableName("cnas_person_training_detailed_file")
+public class PersonTrainingDetailedFile {
+
+    @TableId(type = IdType.AUTO)
+    private Integer detailedFileId;
+
+    @Schema(description = "浜哄憳浣犲煿璁鍒掕鎯卛d")
+    private Integer trainingDetailedId;
+
+    @Schema(description = "绫诲瀷:1鍥剧墖/2鏂囦欢")
+    private Integer type;
+
+    @Schema(description = "闄勪欢璺緞")
+    private String fileUrl;
+
+    @Schema(description = "闄勪欢鍚嶇О")
+    private String fileName;
+
+    @Schema(description = "鍒涘缓浜�")
+    private Integer createUser;
+
+    @Schema(description = "鍒涘缓鏃堕棿")
+    private Date createTime;
+
+    @Schema(description = "淇敼浜�")
+    private Integer updateUser;
+
+    @Schema(description = "淇敼鏃堕棿")
+    private Date updateTime;
+
+}
+
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonTrainingRecord.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonTrainingRecord.java
new file mode 100644
index 0000000..600263e
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonTrainingRecord.java
@@ -0,0 +1,40 @@
+package com.ruoyi.personnel.pojo;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 鍩硅璁板綍
+ * </p>
+ *
+ * @author
+ * @since 2024-10-12 04:50:48
+ */
+@Getter
+@Setter
+@TableName("cnas_person_training_record")
+@Schema(description = "鍩硅璁板綍")
+public class PersonTrainingRecord implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @Schema(description = "涓婚敭id")
+    @TableId(value = "training_record_id", type = IdType.AUTO)
+    private Integer trainingRecordId;
+
+    @Schema(description = "鐢ㄦ埛琛ㄦ牸锛坲ser锛変富閿�")
+    private Integer userId;
+
+    @Schema(description = "鍩硅璁″垝璇︽儏 - 瀛� id")
+    private Integer courseId;
+
+    @Schema(description = "鑰冩牳缁撴灉")
+    private String examinationResults;
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/service/AnnexService.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/AnnexService.java
new file mode 100644
index 0000000..8de7b15
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/AnnexService.java
@@ -0,0 +1,7 @@
+package com.ruoyi.personnel.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.personnel.pojo.Annex;
+
+public interface AnnexService extends IService<Annex> {
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonBasicInfoFileService.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonBasicInfoFileService.java
new file mode 100644
index 0000000..1fb5ba6
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonBasicInfoFileService.java
@@ -0,0 +1,16 @@
+package com.ruoyi.personnel.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.personnel.pojo.PersonBasicInfoFile;
+
+/**
+ * <p>
+ * 浜哄憳鍩烘湰淇℃伅闄勪欢 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2025-01-09 05:28:55
+ */
+public interface PersonBasicInfoFileService extends IService<PersonBasicInfoFile> {
+
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonBasicInfoService.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonBasicInfoService.java
new file mode 100644
index 0000000..35a4aed
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonBasicInfoService.java
@@ -0,0 +1,60 @@
+package com.ruoyi.personnel.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.common.core.domain.entity.DepartmentDto;
+import com.ruoyi.common.core.domain.entity.DepartmentLims;
+import com.ruoyi.personnel.dto.PersonBasicInfoDto;
+import com.ruoyi.personnel.dto.UserPageDto;
+import com.ruoyi.personnel.pojo.PersonBasicInfo;
+import org.springframework.web.multipart.MultipartFile;
+
+import jakarta.servlet.http.HttpServletResponse;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ *  鏈嶅姟绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-08-30 09:19:57
+ */
+public interface PersonBasicInfoService extends IService<PersonBasicInfo> {
+
+    List<DepartmentDto> selectCNSAPersonTree();
+
+    Map<String,Object> getCNASPersonnelInfo(Integer userId);
+
+    void saveCNASPersonnelInfo(PersonBasicInfoDto personBasicInfoDto);
+
+    IPage<Map<String, Object>> basicInformationOfPersonnelSelectPage(Page page, String name, Integer departmentId);
+
+    void exportPersonBasicInfo(UserPageDto userPageDto, HttpServletResponse response) throws Exception;
+
+    String exportPersonBasicInfoById(Integer id, HttpServletResponse response);
+
+    /**
+     * 浜哄憳鍩硅鍩烘湰淇℃伅闄勪欢鏂板
+     * @param basicInfoId
+     * @param file
+     * @return
+     */
+    boolean uploadBasicInfoFile(Integer basicInfoId, MultipartFile file);
+
+    /**
+     * 娣诲姞缁勭粐鏋舵瀯
+     * @param department
+     * @return
+     */
+    int addDepartment(DepartmentLims department);
+
+    /**
+     * 鍒犻櫎缁勭粐鏋舵瀯
+     * @param id
+     * @return
+     */
+    boolean delDepartment(Integer id);
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonBasicInfoWorkService.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonBasicInfoWorkService.java
new file mode 100644
index 0000000..cfd944f
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonBasicInfoWorkService.java
@@ -0,0 +1,16 @@
+package com.ruoyi.personnel.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.personnel.pojo.PersonBasicInfoWork;
+
+/**
+ * <p>
+ * 浜哄憳鍩烘湰淇℃伅 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2025-01-09 05:45:04
+ */
+public interface PersonBasicInfoWorkService extends IService<PersonBasicInfoWork> {
+
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonCommunicationAbilityService.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonCommunicationAbilityService.java
new file mode 100644
index 0000000..949c28d
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonCommunicationAbilityService.java
@@ -0,0 +1,25 @@
+package com.ruoyi.personnel.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.personnel.dto.PersonCommunicationAbilityDto;
+import com.ruoyi.personnel.pojo.PersonCommunicationAbility;
+
+import jakarta.servlet.http.HttpServletResponse;
+
+/**
+ * <p>
+ * 娌熼�氳兘鍔� 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 
+ * @since 2024-10-09 12:00:57
+ */
+public interface PersonCommunicationAbilityService extends IService<PersonCommunicationAbility> {
+
+    IPage<PersonCommunicationAbilityDto> personPersonCommunicationAbilityPage(Page page,
+                                                                              Integer departLimsId, Integer userId, String userName);
+
+    void exportPersonCommunicationAbility(Integer id, HttpServletResponse response)throws Exception;
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonJobResponsibilitiesService.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonJobResponsibilitiesService.java
new file mode 100644
index 0000000..d7abf0b
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonJobResponsibilitiesService.java
@@ -0,0 +1,27 @@
+package com.ruoyi.personnel.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.personnel.dto.PersonJobResponsibilitiesDto;
+import com.ruoyi.personnel.pojo.PersonJobResponsibilities;
+
+import jakarta.servlet.http.HttpServletResponse;
+
+/**
+ * <p>
+ * 宀椾綅鑱岃矗 鏈嶅姟绫�
+ * </p>
+ *
+ * @author
+ * @since 2024-10-09 02:07:49
+ */
+public interface PersonJobResponsibilitiesService extends IService<PersonJobResponsibilities> {
+
+    IPage<PersonJobResponsibilitiesDto> personJobResponsibilitiesSelect(Page page,
+                                                                        String userId,
+                                                                        String departmentId,
+                                                                        String userName);
+
+    void exportPersonJobResponsibilities(Integer id, HttpServletResponse response);
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonPersonnelCapacityService.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonPersonnelCapacityService.java
new file mode 100644
index 0000000..a7b8bf3
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonPersonnelCapacityService.java
@@ -0,0 +1,35 @@
+package com.ruoyi.personnel.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.personnel.dto.PersonPersonnelCapacityDto;
+import com.ruoyi.personnel.pojo.PersonPersonnelCapacity;
+
+import jakarta.servlet.http.HttpServletResponse;
+
+/**
+ * <p>
+ * 浜哄憳鑳藉姏 鏈嶅姟绫�
+ * </p>
+ *
+ * @author
+ * @since 2024-10-10 11:26:18
+ */
+public interface PersonPersonnelCapacityService extends IService<PersonPersonnelCapacity> {
+
+    IPage<PersonPersonnelCapacityDto> personPersonnelCapacityPage(Page page, Integer departLimsId, Integer userId, String userName);
+
+    /**
+     * 瀵煎嚭浜哄憳鑳藉姏
+     * @param id
+     * @param response
+     */
+    void exportPersonnelCapacity(Integer id, HttpServletResponse response);
+
+    /**
+     * submitConfirmPersonnelCapability
+     * @param personPersonnelCapacity
+     */
+    void submitConfirmPersonnelCapability(PersonPersonnelCapacity personPersonnelCapacity);
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonPostAuthorizationRecordService.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonPostAuthorizationRecordService.java
new file mode 100644
index 0000000..033e2aa
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonPostAuthorizationRecordService.java
@@ -0,0 +1,27 @@
+package com.ruoyi.personnel.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.personnel.dto.PersonPostAuthorizationRecordDto;
+import com.ruoyi.personnel.pojo.PersonPostAuthorizationRecord;
+
+import jakarta.servlet.http.HttpServletResponse;
+
+/**
+ * <p>
+ * 浠昏亴鎺堟潈璁板綍 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 
+ * @since 2024-10-09 10:48:17
+ */
+public interface PersonPostAuthorizationRecordService extends IService<PersonPostAuthorizationRecord> {
+
+    IPage<PersonPostAuthorizationRecordDto> personPostAuthorizationRecordPage(Page page,
+                                                                              Integer departLimsId,
+                                                                              Integer userId,
+                                                                              String userName);
+
+    void exportPersonPostAuthorizationRecord(Integer id, HttpServletResponse response);
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonRewardPunishmentRecordService.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonRewardPunishmentRecordService.java
new file mode 100644
index 0000000..ecb6fa1
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonRewardPunishmentRecordService.java
@@ -0,0 +1,31 @@
+package com.ruoyi.personnel.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.personnel.dto.PersonRewardPunishmentRecordDto;
+import com.ruoyi.personnel.excel.PersonRewardPunishmentRecordExcel;
+import com.ruoyi.personnel.pojo.PersonRewardPunishmentRecord;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * <p>
+ * 濂栨儵璁板綍 鏈嶅姟绫�
+ * </p>
+ *
+ * @author
+ * @since 2024-10-08 11:25:02
+ */
+public interface PersonRewardPunishmentRecordService extends IService<PersonRewardPunishmentRecord> {
+
+    IPage<PersonRewardPunishmentRecordDto> rewardPunishmentPage(Page page,
+                                                                Integer userId,
+                                                                String userName,
+                                                                Date startTime,
+                                                                Date endTime,
+                                                                Integer departmentId);
+
+    List<PersonRewardPunishmentRecordExcel> rewardPunishmentExport(Integer userId, Integer departmentId, String userName, Date startTime, Date endTime);
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonTrainingDetailedService.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonTrainingDetailedService.java
new file mode 100644
index 0000000..454914c
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonTrainingDetailedService.java
@@ -0,0 +1,29 @@
+package com.ruoyi.personnel.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.personnel.dto.PersonTrainingDetailedDto;
+import com.ruoyi.personnel.excel.PersonTrainingDetailedUpload;
+import com.ruoyi.personnel.pojo.PersonTrainingDetailed;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 鍩硅璁″垝璇︽儏 鏈嶅姟绫�
+ * </p>
+ *
+ * @author
+ * @since 2024-10-11 01:46:27
+ */
+public interface PersonTrainingDetailedService extends IService<PersonTrainingDetailed> {
+
+    void importExcel(List<PersonTrainingDetailedUpload> list, Integer planId);
+
+    void deleteAnnualPlanDetailTable(String ids);
+
+    IPage<PersonTrainingDetailedDto> queryTheAnnualPlanDetailsTable(Page page,
+                                                                    String trainingLecturerName,
+                                                                    String courseCode, String trainingDate, Integer id, Integer userId);
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonTrainingRecordService.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonTrainingRecordService.java
new file mode 100644
index 0000000..34cd2ab
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonTrainingRecordService.java
@@ -0,0 +1,59 @@
+package com.ruoyi.personnel.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.personnel.dto.PersonTrainingRecordDto;
+import com.ruoyi.personnel.dto.PersonTrainingRecordListDto;
+import com.ruoyi.personnel.dto.PersonTrainingRecordSubmitDto;
+import com.ruoyi.personnel.dto.TrainingRecordPersonDetailedDto;
+import com.ruoyi.personnel.pojo.PersonTrainingRecord;
+
+import jakarta.servlet.http.HttpServletResponse;
+import java.util.List;
+
+/**
+ * <p>
+ * 鍩硅璁板綍 鏈嶅姟绫�
+ * </p>
+ *
+ * @author
+ * @since 2024-10-12 04:50:48
+ */
+public interface PersonTrainingRecordService extends IService<PersonTrainingRecord> {
+
+    List<PersonTrainingRecordDto> trainingAndAssessmentRecordsPage(Integer trainingDetailedId, String userName);
+
+    void deleteTrainingAndAssessmentRecords(String ids);
+
+    IPage<PersonTrainingRecordListDto> personnelTrainingPersonnel(Page page,
+                                                                  String userName, Integer userId, Integer departLimsId);
+
+
+    void claimOfTrainingAndAssessmentRecords(Boolean claimAndClaim, Integer courseId);
+
+
+    /**
+     * 鏍规嵁鐢ㄦ埛id鍜屽勾浠芥煡璇汉鍛樻槑缁� 鍩硅璁板綍
+     * @param page
+     * @param userId
+     * @param year
+     * @return
+     */
+    IPage<TrainingRecordPersonDetailedDto> queryPersonnelDetailsOfUserIdAndYear(Page page, Integer userId, Integer year);
+
+    /**
+     * 瀵煎嚭浜哄憳鍩硅璁板綍
+     * @param userId
+     * @param trainingDate
+     * @param response
+     */
+    void exportTrainingRecordAddTrainingDate(Integer userId, Integer trainingDate, HttpServletResponse response);
+
+    /**
+     * 鍩硅鎻愪氦
+     * @param personTrainingRecordSubmitDto
+     */
+    void trainingAndAssessmentRecordsAdded(PersonTrainingRecordSubmitDto personTrainingRecordSubmitDto);
+
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonTrainingService.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonTrainingService.java
new file mode 100644
index 0000000..4bba16f
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonTrainingService.java
@@ -0,0 +1,64 @@
+package com.ruoyi.personnel.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.personnel.dto.PersonTrainingDto;
+import com.ruoyi.personnel.pojo.PersonTraining;
+import com.ruoyi.personnel.pojo.PersonTrainingDetailed;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.web.multipart.MultipartFile;
+
+import jakarta.servlet.http.HttpServletResponse;
+import java.util.List;
+
+/**
+ * <p>
+ * 鍩硅璁″垝 鏈嶅姟绫�
+ * </p>
+ *
+ * @author
+ * @since 2024-10-11 01:11:49
+ */
+public interface PersonTrainingService extends IService<PersonTraining> {
+
+    IPage<PersonTrainingDto> personTrainingSelect(Page page,
+                                                  @Param("compilerName") String compilerName, @Param("departmentId") String departmentId);
+
+    void personTrainingImport(MultipartFile file, PersonTraining training);
+
+    void personTrainingDelete(Integer id);
+
+    void reviewAnnualPersonnelTraining(PersonTraining training);
+
+    void approveAnnualPersonnelTraining(PersonTraining training);
+
+    /**
+     * 瀵煎嚭浜哄憳鍩硅璁″垝
+     * @param id
+     * @param response
+     */
+    void exportPersonTraining(Integer id, HttpServletResponse response);
+
+    /**
+     * 瀵煎嚭浜哄憳鍩硅涓庤�冩牳璁板綍
+     * @param id
+     * @param response
+     */
+    void exportPersonTrainingRecord(Integer id, HttpServletResponse response);
+
+    /**
+     * 浜哄憳鍩硅璇︽儏闄勪欢鏂板
+     * @param trainingDetailedId
+     * @param file
+     * @return
+     */
+    boolean uploadTrainingDetailedFile(Integer trainingDetailedId, MultipartFile file);
+
+    /**
+     * 鏌ヨ浠婂勾浜哄憳鍩硅淇℃伅
+     * @return
+     */
+    List<PersonTrainingDetailed> getThisYearTrainingDetailed();
+
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/AnnexServiceImpl.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/AnnexServiceImpl.java
new file mode 100644
index 0000000..d944b3b
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/AnnexServiceImpl.java
@@ -0,0 +1,13 @@
+package com.ruoyi.personnel.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.personnel.mapper.AnnexMapper;
+import com.ruoyi.personnel.pojo.Annex;
+import com.ruoyi.personnel.service.AnnexService;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+
+@Service
+@AllArgsConstructor
+public class AnnexServiceImpl extends ServiceImpl<AnnexMapper, Annex> implements AnnexService {
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonBasicInfoFileServiceImpl.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonBasicInfoFileServiceImpl.java
new file mode 100644
index 0000000..a70f196
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonBasicInfoFileServiceImpl.java
@@ -0,0 +1,20 @@
+package com.ruoyi.personnel.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.personnel.mapper.PersonBasicInfoFileMapper;
+import com.ruoyi.personnel.pojo.PersonBasicInfoFile;
+import com.ruoyi.personnel.service.PersonBasicInfoFileService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 浜哄憳鍩烘湰淇℃伅闄勪欢 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2025-01-09 05:28:55
+ */
+@Service
+public class PersonBasicInfoFileServiceImpl extends ServiceImpl<PersonBasicInfoFileMapper, PersonBasicInfoFile> implements PersonBasicInfoFileService {
+
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonBasicInfoServiceImpl.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonBasicInfoServiceImpl.java
new file mode 100644
index 0000000..3e4049a
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonBasicInfoServiceImpl.java
@@ -0,0 +1,383 @@
+package com.ruoyi.personnel.service.impl;
+
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.ExcelWriter;
+import com.alibaba.excel.write.metadata.WriteSheet;
+import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
+import com.alibaba.fastjson2.JSON;
+import com.alibaba.fastjson2.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+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.deepoove.poi.XWPFTemplate;
+import com.deepoove.poi.config.Configure;
+import com.ruoyi.common.core.domain.entity.DepartmentDto;
+import com.ruoyi.common.core.domain.entity.DepartmentLims;
+import com.ruoyi.common.core.domain.entity.User;
+import com.ruoyi.common.utils.QueryWrappers;
+import com.ruoyi.framework.exception.ErrorException;
+import com.ruoyi.inspect.util.HackLoopTableRenderPolicy;
+import com.ruoyi.personnel.dto.PersonBasicInfoDto;
+import com.ruoyi.personnel.dto.PersonBasicInfoWorkDto;
+import com.ruoyi.personnel.dto.UserPageDto;
+import com.ruoyi.personnel.mapper.AnnexMapper;
+import com.ruoyi.personnel.mapper.PersonBasicInfoFileMapper;
+import com.ruoyi.personnel.mapper.PersonBasicInfoMapper;
+import com.ruoyi.personnel.mapper.PersonBasicInfoWorkMapper;
+import com.ruoyi.personnel.pojo.Annex;
+import com.ruoyi.personnel.pojo.PersonBasicInfo;
+import com.ruoyi.personnel.pojo.PersonBasicInfoFile;
+import com.ruoyi.personnel.pojo.PersonBasicInfoWork;
+import com.ruoyi.personnel.service.PersonBasicInfoService;
+import com.ruoyi.system.mapper.DepartmentLimsMapper;
+import com.ruoyi.system.mapper.UserMapper;
+import org.apache.poi.xwpf.usermodel.XWPFTable;
+import org.openxmlformats.schemas.wordprocessingml.x2006.main.STMerge;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.multipart.MultipartFile;
+
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletResponse;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URLEncoder;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ *  鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-08-30 09:19:57
+ */
+
+@Service
+@Transactional(rollbackFor = Exception.class)
+public class PersonBasicInfoServiceImpl extends ServiceImpl<PersonBasicInfoMapper, PersonBasicInfo> implements PersonBasicInfoService {
+
+    @Autowired
+    private DepartmentLimsMapper departmentMapper;
+
+    @Value("${file.path}")
+    private String imgUrl;
+    @Value("${wordUrl}")
+    private String wordUrl;
+    @Resource
+    private UserMapper userMapper;
+    @Resource
+    private AnnexMapper annexMapper;
+    @Resource
+    private PersonBasicInfoFileMapper personBasicInfoFileMapper;
+    @Resource
+    private PersonBasicInfoWorkMapper personBasicInfoWorkMapper;
+
+    @Override
+    public List<DepartmentDto> selectCNSAPersonTree() {
+        List<DepartmentDto> departments = departmentMapper.selectDepartment();
+        List<DepartmentDto> limsUser = baseMapper.selectLimsUser();
+        departments.addAll(limsUser);
+        //鑾峰彇鐖惰妭鐐�
+        return departments.stream().filter(m -> m.getFatherId() == null).peek(
+                (m) -> m.setChildren(getChildren(m, departments))
+        ).collect(Collectors.toList());
+    }
+
+    @Override
+    public Map<String,Object> getCNASPersonnelInfo(Integer userId) {
+        Map<String, Object> map = new HashMap<>();
+        Map<Integer,List<DepartmentLims>>  childrenMap = new HashMap<>();
+        List<DepartmentLims> deptS = departmentMapper.selectList(null);
+        for (DepartmentLims dept : deptS) {
+            if(!Objects.isNull(dept.getFatherId())) {
+                if(!childrenMap.containsKey(dept.getFatherId())) {
+                        childrenMap.put(dept.getFatherId(),new ArrayList<>());
+                }
+                childrenMap.get(dept.getFatherId()).add(dept);
+            }
+        }
+        // 鐖惰妭鐐�
+        List<DepartmentLims> deptF = new ArrayList<>();
+        for (DepartmentLims dept : deptS) {
+            if(Objects.isNull(dept.getFatherId())) {
+                deptF.add(buildTree(dept,childrenMap));
+            }
+        }
+        map.put("department",deptF);
+        map.put("PersonBasicInfoDto",baseMapper.getCNASPersonnelInfo(userId));
+        map.put("annexList",annexMapper.selectList(new LambdaQueryWrapper<Annex>().eq(Annex::getUserId,userId)));
+        return map;
+    }
+
+    private DepartmentLims buildTree(DepartmentLims departmentLims, Map<Integer,List<DepartmentLims>> childrenMap) {
+        if(childrenMap.containsKey(departmentLims.getId())) {
+            departmentLims.setChildren(childrenMap.get(departmentLims.getId()));
+            for (DepartmentLims departmentLims1 : departmentLims.getChildren()) {
+                buildTree(departmentLims1,childrenMap);
+            }
+        }
+        return departmentLims;
+    }
+
+    @Override
+    public void saveCNASPersonnelInfo(PersonBasicInfoDto personBasicInfoDto) {
+        User user = new User();
+        user.setId(personBasicInfoDto.getUserId());
+        user.setAccount(personBasicInfoDto.getAccount());
+        user.setName(personBasicInfoDto.getName());
+        user.setNameEn(personBasicInfoDto.getNameEn());
+        user.setAge(personBasicInfoDto.getAge());
+        user.setPhone(personBasicInfoDto.getPhone());
+        user.setEmail(personBasicInfoDto.getEmail());
+        user.setSignatureUrl(personBasicInfoDto.getSignatureUrl());
+        user.setPictureUrl(personBasicInfoDto.getPictureUrl());
+        user.setDepartLimsId(personBasicInfoDto.getDepartLimsId());
+        userMapper.updateById(user);
+        PersonBasicInfo personBasicInfo = JSONObject.parseObject(JSON.toJSONString(personBasicInfoDto), PersonBasicInfo.class);
+        PersonBasicInfo one = baseMapper.selectOne(new LambdaQueryWrapper<PersonBasicInfo>()
+                .eq(PersonBasicInfo::getUserId, personBasicInfoDto.getUserId()));
+        if(Objects.isNull(one)) {
+            baseMapper.insert(personBasicInfo);
+        }else {
+            baseMapper.updateById(personBasicInfo);
+        }
+    }
+
+    @Override
+    public IPage<Map<String, Object>> basicInformationOfPersonnelSelectPage(Page page, String name, Integer departmentId) {
+        return baseMapper.selectPersonBasecInfoAndUser(page, name, departmentId);
+    }
+
+    @Override
+    public void exportPersonBasicInfo(UserPageDto userPageDto, HttpServletResponse response) throws Exception {
+        ArrayList<PersonBasicInfoDto> data = new ArrayList<>();
+        List<User> list = userMapper.selectList(null);
+        for (User user : list) {
+            PersonBasicInfoDto personBasicInfoDto = new PersonBasicInfoDto();
+            PersonBasicInfo personBasicInfo = baseMapper.selectOne(Wrappers.<PersonBasicInfo>lambdaQuery().eq(PersonBasicInfo::getUserId, user.getId()));
+            if (ObjectUtils.isNotEmpty(personBasicInfo)) {
+                BeanUtils.copyProperties(personBasicInfo, personBasicInfoDto);
+            }
+            personBasicInfoDto.setName(user.getName());
+            personBasicInfoDto.setAccount(user.getAccount());
+            personBasicInfoDto.setPhone(ObjectUtils.isNotEmpty(user.getPhone()) ? user.getPhone() : " ");
+            data.add(personBasicInfoDto);
+        }
+        response.setContentType("application/vnd.ms-excel");
+        response.setCharacterEncoding("UTF-8");
+        String fileName = URLEncoder.encode("浜哄憳鍩烘湰淇℃伅鍒楄〃瀵煎嚭", "UTF-8");
+        response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
+        try {
+            // 鏂板缓ExcelWriter
+            ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()).build();
+            WriteSheet mainSheet = EasyExcel.writerSheet(0, "浜哄憳鍩烘湰淇℃伅瀵煎嚭").head(PersonBasicInfoDto.class).build();
+            excelWriter.write(data, mainSheet);
+            // 鍏抽棴娴�
+            excelWriter.finish();
+        } catch (IOException e) {
+            throw new RuntimeException("瀵煎嚭澶辫触");
+        }
+    }
+
+    @Override
+    public String exportPersonBasicInfoById(Integer id, HttpServletResponse response) {
+        Map<String, Object> userMap = baseMapper.selectexportPersonBasic(id);
+        User user = userMapper.selectById(id);
+        PersonBasicInfo personBasicInfo = baseMapper.selectOne(Wrappers.<PersonBasicInfo>lambdaQuery().eq(PersonBasicInfo::getUserId, user.getId()));
+        if (ObjectUtils.isEmpty(personBasicInfo)){
+            throw new ErrorException("璇ョ敤鎴风殑鍩烘湰淇℃伅娌℃湁褰曞叆,鏆傛棤娉曞鍑�");
+        }
+        // 璇佷欢
+        List<Annex> annexList = annexMapper.selectList(Wrappers.<Annex>lambdaQuery()
+                .eq(Annex::getUserId, id));
+        // 宸ヤ綔缁忓巻
+        List<PersonBasicInfoWork> personBasicInfoWorks = personBasicInfoWorkMapper.selectList(Wrappers.<PersonBasicInfoWork>lambdaQuery()
+                .eq(PersonBasicInfoWork::getUserId, id));
+
+        List<PersonBasicInfoWorkDto> workList = personBasicInfoWorks.stream().map(basicInfoWork -> {
+            PersonBasicInfoWorkDto personBasicInfoWorkDto = new PersonBasicInfoWorkDto();
+            personBasicInfoWorkDto.setWorkExperience(basicInfoWork.getWorkExperience());
+            personBasicInfoWorkDto.setFill("涓昏宸ヤ綔缁忓巻\nMain work experience鈭�1");
+            return personBasicInfoWorkDto;
+        }).collect(Collectors.toList());
+
+        // 妫�鏌ュ垪琛ㄩ暱搴﹀苟濉厖绌哄璞�
+        while (annexList.size() < 10) {
+            annexList.add(new Annex());
+        }
+
+        // 妫�鏌ュ垪琛ㄩ暱搴﹀苟濉厖绌哄璞�
+        while (workList.size() < 4) {
+            workList.add(new PersonBasicInfoWorkDto());
+        }
+
+        // 鑾峰彇璺緞
+        InputStream inputStream = this.getClass().getResourceAsStream("/static/person-basic-info.docx");
+        Configure configure = Configure.builder()
+                .bind("annexList", new HackLoopTableRenderPolicy())
+                .bind("workList", new HackLoopTableRenderPolicy())
+                .build();
+        XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
+                new HashMap<String, Object>() {{
+                    put("user", userMap);
+                    put("annexList", annexList);
+                    put("workList", workList);
+                }});
+
+        try {
+            response.setContentType("application/msword");
+            String fileName = URLEncoder.encode(
+                    userMap.get("name") + "浜哄憳妗f", "UTF-8");
+            response.setHeader("Content-disposition",
+                    "attachment;filename=" + fileName + ".docx");
+            OutputStream os = response.getOutputStream();
+            template.write(os);
+            os.flush();
+            os.close();
+            inputStream.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException("瀵煎嚭澶辫触");
+        }
+
+        return null;
+    }
+
+    /**
+     * 浜哄憳鍩硅鍩烘湰淇℃伅闄勪欢鏂板
+     * @param userId
+     * @param file
+     * @return
+     */
+    @Override
+    public boolean uploadBasicInfoFile(Integer userId, MultipartFile file) {
+        if (userId == null) {
+            throw new ErrorException("缂哄皯浜哄憳id");
+        }
+
+        String urlString;
+        String pathName;
+        String path;
+        String filename = file.getOriginalFilename();
+        String contentType = file.getContentType();
+        PersonBasicInfoFile personBasicInfoFile = new PersonBasicInfoFile();
+        personBasicInfoFile.setUserId(userId);
+        personBasicInfoFile.setFileName(filename);
+        if (contentType != null && contentType.startsWith("image/")) {
+            // 鏄浘鐗�
+            path = imgUrl;
+            personBasicInfoFile.setType(1);
+        } else {
+            // 鏄枃浠�
+            path = wordUrl;
+            personBasicInfoFile.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));
+            personBasicInfoFile.setFileUrl(pathName);
+            personBasicInfoFileMapper.insert(personBasicInfoFile);
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            System.err.println("闄勪欢涓婁紶閿欒");
+            return false;
+        }
+    }
+
+    /**
+     * 鏂板缁勭粐鏍�
+     * @param department
+     * @return
+     */
+    @Override
+    public int addDepartment(DepartmentLims department) {
+        departmentMapper.insert(department);
+        return department.getId();
+    }
+
+    /**
+     * 鍒犻櫎缁勭粐鏍�
+     * @param id
+     * @return
+     */
+    @Override
+    public boolean delDepartment(Integer id) {
+        //鍒ゆ柇鏄惁鏈夊瓙绫�,鐩村埌娌℃湁涓烘
+        List<DepartmentLims> department = getDepartment(id);
+        List<Integer> ids = department.stream().map(DepartmentLims::getId).collect(Collectors.toList());
+        departmentMapper.delete(Wrappers.<DepartmentLims>lambdaQuery()
+                .in(DepartmentLims::getId, ids));
+        return true;
+    }
+
+    //鍒ゆ柇鏄惁鏈夊瓙绫�,鐩村埌娌℃湁涓烘
+    public List<DepartmentLims> getDepartment(Integer id) {
+        List<DepartmentLims> list = new ArrayList<>();
+        DepartmentLims depart = departmentMapper.selectById(id);
+        list.add(depart);
+        List<DepartmentLims> departments = departmentMapper.selectList(Wrappers.<DepartmentLims>lambdaQuery().eq(DepartmentLims::getFatherId, id));
+        if (ObjectUtils.isNotEmpty(departments)) {
+            list.addAll(departments);
+            for (DepartmentLims department : departments) {
+                list.addAll(getDepartment(department.getId()));
+            }
+        }
+        return list;
+    }
+
+    /**
+     * 閫掑綊鏌ヨ瀛愯妭鐐�
+     * @param root  鏍硅妭鐐�
+     * @param all   鎵�鏈夎妭鐐�
+     * @return 鏍硅妭鐐逛俊鎭�
+     */
+    private List<DepartmentDto> getChildren(DepartmentDto root, List<DepartmentDto> all) {
+        if (ObjectUtils.isNotEmpty(root.getId())) {
+            return all.stream().filter(m -> Objects.equals(m.getFatherId(), root.getId())).peek(
+                    (m) -> m.setChildren(getChildren(m, all))
+            ).collect(Collectors.toList());
+        } else {
+            return Collections.emptyList();
+        }
+    }
+
+    // 姘村钩鍚堝苟鍗曞厓鏍�
+    private static void mergeCellsHorizontally(XWPFTable table, int row, int fromCol, int toCol) {
+        for (int i = fromCol; i <= toCol; i++) {
+            if (i == fromCol) {
+                table.getRow(row).getCell(i).getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.RESTART);
+            } else {
+                table.getRow(row).getCell(i).getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.CONTINUE);
+            }
+        }
+    }
+
+    // 鍨傜洿鍚堝苟鍗曞厓鏍�
+    private static void mergeCellsVertically(XWPFTable table, int col, int fromRow, int toRow) {
+        for (int i = fromRow; i <= toRow; i++) {
+            if (i == fromRow) {
+                table.getRow(i).getCell(col).getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.RESTART);
+            } else {
+                table.getRow(i).getCell(col).getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.CONTINUE);
+            }
+        }
+    }
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonBasicInfoWorkServiceImpl.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonBasicInfoWorkServiceImpl.java
new file mode 100644
index 0000000..3ed8882
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonBasicInfoWorkServiceImpl.java
@@ -0,0 +1,20 @@
+package com.ruoyi.personnel.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.personnel.mapper.PersonBasicInfoWorkMapper;
+import com.ruoyi.personnel.pojo.PersonBasicInfoWork;
+import com.ruoyi.personnel.service.PersonBasicInfoWorkService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 浜哄憳鍩烘湰淇℃伅 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2025-01-09 05:45:04
+ */
+@Service
+public class PersonBasicInfoWorkServiceImpl extends ServiceImpl<PersonBasicInfoWorkMapper, PersonBasicInfoWork> implements PersonBasicInfoWorkService {
+
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonCommunicationAbilityServiceImpl.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonCommunicationAbilityServiceImpl.java
new file mode 100644
index 0000000..34f937b
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonCommunicationAbilityServiceImpl.java
@@ -0,0 +1,114 @@
+package com.ruoyi.personnel.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.deepoove.poi.XWPFTemplate;
+import com.deepoove.poi.config.Configure;
+import com.deepoove.poi.config.ConfigureBuilder;
+import com.ruoyi.common.core.domain.entity.User;
+import com.ruoyi.personnel.dto.PersonCommunicationAbilityDto;
+import com.ruoyi.personnel.mapper.PersonCommunicationAbilityMapper;
+import com.ruoyi.personnel.pojo.PersonCommunicationAbility;
+import com.ruoyi.personnel.service.PersonCommunicationAbilityService;
+import com.ruoyi.system.mapper.UserMapper;
+import org.springframework.stereotype.Service;
+
+import jakarta.annotation.Resource;
+import jakarta.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.stream.Collectors;
+
+/**
+ * <p>
+ * 娌熼�氳兘鍔� 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author
+ * @since 2024-10-09 12:00:57
+ */
+@Service
+public class PersonCommunicationAbilityServiceImpl extends ServiceImpl<PersonCommunicationAbilityMapper, PersonCommunicationAbility> implements PersonCommunicationAbilityService {
+
+    @Resource
+    private UserMapper userMapper;
+
+    @Override
+    public IPage<PersonCommunicationAbilityDto> personPersonCommunicationAbilityPage(Page page, Integer departLimsId, Integer userId, String userName) {
+        IPage<PersonCommunicationAbilityDto> personCommunicationAbilityDtoIPage = baseMapper.personPersonCommunicationAbilityPage(page, departLimsId, userId, userName);
+        List<PersonCommunicationAbilityDto> collect = personCommunicationAbilityDtoIPage.getRecords().stream().map(personCommunicationAbilityDto -> {
+            if (ObjectUtils.isNotEmpty(personCommunicationAbilityDto.getUserId())) {
+                List<String> account = new ArrayList<>();
+                List<String> name = new ArrayList<>();
+                for (String s : personCommunicationAbilityDto.getUserId().split(",")) {
+                    User user = userMapper.selectById(Integer.parseInt(s));
+                    account.add(user.getAccount());
+                    name.add(user.getName());
+                }
+                personCommunicationAbilityDto.setAccount(account.stream().collect(Collectors.joining(",")));
+                personCommunicationAbilityDto.setUserName(name.stream().collect(Collectors.joining(",")));
+            }
+            return personCommunicationAbilityDto;  // 杩欓噷鍙互瀵硅繑鍥炵殑鏁版嵁杩涜澶勭悊锛屽娣诲姞涓�浜涙柊鐨勫睘鎬ф垨杞崲绛夈��
+        }).collect(Collectors.toList());
+        personCommunicationAbilityDtoIPage.setRecords(collect);
+        return personCommunicationAbilityDtoIPage;
+    }
+
+    @Override
+    public void exportPersonCommunicationAbility(Integer id, HttpServletResponse response) throws Exception {
+        PersonCommunicationAbility personCommunicationAbility = baseMapper.selectById(id);
+        //娌熼�氫汉
+        String collect = " ";
+        if (ObjectUtils.isNotEmpty(personCommunicationAbility.getUserId())) {
+            List<String> name = new ArrayList<>();
+            for (String s : personCommunicationAbility.getUserId().split(",")) {
+                User user = userMapper.selectById(Integer.parseInt(s));
+                name.add(user.getName());
+            }
+            collect = name.stream().collect(Collectors.joining(","));
+        }
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy骞碝M鏈坉d鏃�");
+
+        //鏃堕棿
+        String communicationTime = "";
+        if (ObjectUtils.isNotEmpty(personCommunicationAbility.getCommunicationTime())) {
+            communicationTime = personCommunicationAbility.getCommunicationTime().format(formatter);
+        }
+
+        InputStream inputStream = this.getClass().getResourceAsStream("/static/communication-deal.docx");
+        ConfigureBuilder builder = Configure.builder();
+        builder.useSpringEL(true);
+        String finalCollect = collect;
+        String finalCommunicationTime = communicationTime;
+        XWPFTemplate template = XWPFTemplate.compile(inputStream, builder.build()).render(
+                new HashMap<String, Object>() {{
+                    put("userName", finalCollect);
+                    put("communicationTime", finalCommunicationTime);
+                    put("communicationPlace", personCommunicationAbility.getCommunicationPlace());
+                    put("communicationContent", personCommunicationAbility.getCommunicationContent());
+                }});
+
+        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();
+            inputStream.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException("瀵煎嚭澶辫触");
+        }
+    }
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonJobResponsibilitiesServiceImpl.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonJobResponsibilitiesServiceImpl.java
new file mode 100644
index 0000000..e34c522
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonJobResponsibilitiesServiceImpl.java
@@ -0,0 +1,114 @@
+package com.ruoyi.personnel.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.deepoove.poi.XWPFTemplate;
+import com.deepoove.poi.config.Configure;
+import com.deepoove.poi.config.ConfigureBuilder;
+import com.ruoyi.common.core.domain.entity.User;
+import com.ruoyi.personnel.dto.PersonJobResponsibilitiesDto;
+import com.ruoyi.personnel.mapper.PersonJobResponsibilitiesMapper;
+import com.ruoyi.personnel.pojo.PersonJobResponsibilities;
+import com.ruoyi.personnel.service.PersonJobResponsibilitiesService;
+import com.ruoyi.system.mapper.UserMapper;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+
+import jakarta.annotation.Resource;
+import jakarta.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-10-09 02:07:49
+ */
+@Service
+@AllArgsConstructor
+public class PersonJobResponsibilitiesServiceImpl extends ServiceImpl<PersonJobResponsibilitiesMapper, PersonJobResponsibilities> implements PersonJobResponsibilitiesService {
+
+    @Resource
+    private UserMapper userMapper;
+
+
+    @Override
+    public IPage<PersonJobResponsibilitiesDto> personJobResponsibilitiesSelect(Page page, String userId, String departmentId, String userName) {
+        return baseMapper.personJobResponsibilitiesSelect(page, userId, departmentId, userName);
+    }
+
+    @Override
+    public void exportPersonJobResponsibilities(Integer id, HttpServletResponse response) {
+        PersonJobResponsibilities personJobResponsibilities = baseMapper.selectById(id);
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy骞碝M鏈坉d鏃�");
+        //宀椾綅鍚嶇О
+        String name = personJobResponsibilities.getPostName();
+        //鎵�灞為儴闂�
+        String departLims = userMapper.selectUserDepartmentLimsName(Integer.parseInt(personJobResponsibilities.getIncumbentId()));
+        //宸ヤ綔鐩爣
+        String objective = personJobResponsibilities.getJobObjective();
+        //宀椾綅鑱岃矗
+        String responsibilities = personJobResponsibilities.getJobResponsibilities();
+        //浠昏亴浜�
+        User user = userMapper.selectById(Integer.parseInt(personJobResponsibilities.getIncumbentId()));
+        String incumbent = user.getName();
+        //浠昏亴鏃堕棿
+        String incumbentDate = "";
+        if (ObjectUtils.isNotEmpty(personJobResponsibilities.getIncumbentDate())) {
+            incumbentDate = personJobResponsibilities.getIncumbentDate().format(formatter);
+        }
+        //涓荤
+        String supervisor = "";
+        if (ObjectUtils.isNotEmpty(personJobResponsibilities.getSupervisorId())) {
+            supervisor = userMapper.selectById(personJobResponsibilities.getSupervisorId()).getName();
+        }
+        //涓荤鏃堕棿
+        String supervisorDate = "";
+        if (ObjectUtils.isNotEmpty(personJobResponsibilities.getSupervisorDate())) {
+            supervisorDate = personJobResponsibilities.getSupervisorDate().format(formatter);
+        }
+
+        InputStream inputStream = this.getClass().getResourceAsStream("/static/explain-deal.docx");
+        ConfigureBuilder builder = Configure.builder();
+        builder.useSpringEL(true);
+        String finalIncumbentDate = incumbentDate;
+        String finalSupervisor = supervisor;
+        String finalSupervisorDate = supervisorDate;
+        XWPFTemplate template = XWPFTemplate.compile(inputStream, builder.build()).render(
+                new HashMap<String, Object>() {{
+                    put("name", name);
+                    put("account", user.getAccount());
+                    put("departLims", departLims);
+                    put("objective", objective);
+                    put("responsibilities", responsibilities);
+                    put("incumbent", incumbent);
+                    put("incumbentDate", finalIncumbentDate);
+                    put("supervisor", finalSupervisor);
+                    put("supervisorDate", finalSupervisorDate);
+                }});
+
+        try {
+            response.setContentType("application/msword");
+            String fileName = URLEncoder.encode(
+                    name + "鐨勪换鑱屽矖浣嶈鏄庝功", "UTF-8");
+            response.setHeader("Content-disposition",
+                    "attachment;filename=" + fileName + ".docx");
+            OutputStream os = response.getOutputStream();
+            template.write(os);
+            os.flush();
+            os.close();
+            inputStream.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException("瀵煎嚭澶辫触");
+        }
+    }
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonPersonnelCapacityServiceImpl.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonPersonnelCapacityServiceImpl.java
new file mode 100644
index 0000000..2974840
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonPersonnelCapacityServiceImpl.java
@@ -0,0 +1,160 @@
+package com.ruoyi.personnel.service.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+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.config.ConfigureBuilder;
+import com.deepoove.poi.data.Pictures;
+import com.ruoyi.common.constant.MenuJumpPathConstants;
+import com.ruoyi.common.core.domain.entity.InformationNotification;
+import com.ruoyi.common.core.domain.entity.User;
+import com.ruoyi.common.utils.DateImageUtil;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.common.utils.WxCpUtils;
+import com.ruoyi.framework.exception.ErrorException;
+import com.ruoyi.personnel.dto.PersonPersonnelCapacityDto;
+import com.ruoyi.personnel.dto.PersonPersonnelCapacityExportDto;
+import com.ruoyi.personnel.pojo.PersonPersonnelCapacity;
+import com.ruoyi.personnel.mapper.PersonPersonnelCapacityMapper;
+import com.ruoyi.personnel.service.PersonPersonnelCapacityService;
+import com.ruoyi.system.mapper.UserMapper;
+import com.ruoyi.system.service.InformationNotificationService;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletResponse;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URLEncoder;
+import java.util.HashMap;
+
+/**
+ * <p>
+ * 浜哄憳鑳藉姏 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author
+ * @since 2024-10-10 11:26:18
+ */
+@Service
+public class PersonPersonnelCapacityServiceImpl extends ServiceImpl<PersonPersonnelCapacityMapper, PersonPersonnelCapacity> implements PersonPersonnelCapacityService {
+
+    @Resource
+    private UserMapper userMapper;
+    @Resource
+    private InformationNotificationService informationNotificationService;
+
+    @Resource
+    private ThreadPoolTaskExecutor threadPoolTaskExecutor;
+
+
+    @Value("${file.path}")
+    private String imgUrl;
+
+    @Override
+    public IPage<PersonPersonnelCapacityDto> personPersonnelCapacityPage(Page page, Integer departLimsId, Integer userId, String userName) {
+        return baseMapper.personPersonnelCapacityPage(page, departLimsId, userId, userName);
+    }
+
+    /**
+     * 瀵煎嚭浜哄憳鑳藉姏
+     * @param id
+     * @param response
+     */
+    @Override
+    public void exportPersonnelCapacity(Integer id, HttpServletResponse response) {
+        PersonPersonnelCapacityExportDto capacityExportDto = baseMapper.selectExportPersonnelCapacity(id);
+
+        // 纭浜�
+        String confirmUrl = null;
+        if (capacityExportDto.getConfirmOperatingPersonnelId() != null) {
+            confirmUrl = userMapper.selectById(capacityExportDto.getConfirmOperatingPersonnelId()).getSignatureUrl();
+            if (StringUtils.isBlank(confirmUrl)) {
+                throw new ErrorException("缂哄皯纭浜虹鍚�");
+            }
+        }
+
+        // 鑾峰彇璺緞
+        InputStream inputStream = this.getClass().getResourceAsStream("/static/personnel-capacity.docx");
+        ConfigureBuilder builder = Configure.builder();
+        builder.useSpringEL(true);
+        String finalConfirmUrl = confirmUrl;
+        XWPFTemplate template = XWPFTemplate.compile(inputStream, builder.build()).render(
+                new HashMap<String, Object>() {{
+                    put("capacity", capacityExportDto);
+                    put("confirmUrl", StringUtils.isNotBlank(finalConfirmUrl) ? Pictures.ofLocal(imgUrl + "/" + finalConfirmUrl).create() : null);
+                    put("confirmDateUrl", capacityExportDto.getConfirmDate() != null ?
+                            Pictures.ofStream(DateImageUtil.createDateImage(capacityExportDto.getConfirmDate())).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();
+            inputStream.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException("瀵煎嚭澶辫触");
+        }
+    }
+
+    /**
+     * 鎻愪氦纭浜哄憳鑳藉姏
+     * @param personPersonnelCapacity
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void submitConfirmPersonnelCapability(PersonPersonnelCapacity personPersonnelCapacity) {
+        if (personPersonnelCapacity.getConfirmOperatingPersonnelId() == null) {
+            throw new ErrorException("缂哄皯纭浜�");
+        }
+        User formUser = userMapper.selectById(personPersonnelCapacity.getUserId());
+
+        Integer userId = SecurityUtils.getUserId().intValue();
+        User user = userMapper.selectById(userId);
+        // 娑堟伅鍙戦��
+        InformationNotification info = new InformationNotification();
+        // 鍙戦�佷汉
+        info.setCreateUser(user.getName());
+        info.setMessageType("6");
+        info.setTheme("CNAS浜哄憳鑳藉姏纭閫氱煡");
+        info.setContent(formUser.getName() + "鐨勪汉鍛樿兘鍔涘緟纭");
+        info.setSenderId(userId);
+        // 鎺ユ敹浜�
+        info.setConsigneeId(personPersonnelCapacity.getConfirmOperatingPersonnelId());
+        info.setJumpPath(MenuJumpPathConstants.PERSONNEL);
+        informationNotificationService.addInformationNotification(info);
+        this.saveOrUpdate(personPersonnelCapacity);
+
+        // 鍙戦�佷紒涓氬井淇¢�氱煡
+        threadPoolTaskExecutor.execute(() -> {
+            // 鏌ヨ鎺ユ敹浜�
+            User personnel = userMapper.selectById(personPersonnelCapacity.getConfirmOperatingPersonnelId());
+
+            String message = "";
+            message += "CNAS浜哄憳鑳藉姏纭閫氱煡";
+            message += "\n璇峰幓璧勬簮绠$悊-浜哄憳-浜哄憳鑳藉姏濉啓";
+            message += "\n" + formUser.getName() + "鐨勪汉鍛樿兘鍔涘緟纭";
+            //鍙戦�佷紒涓氬井淇℃秷鎭�氱煡
+            try {
+                WxCpUtils.inform(personnel.getAccount(), message, null);
+            } catch (Exception e) {
+                throw new RuntimeException(e);
+            }
+        });
+
+    }
+
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonPostAuthorizationRecordServiceImpl.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonPostAuthorizationRecordServiceImpl.java
new file mode 100644
index 0000000..4f45be8
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonPostAuthorizationRecordServiceImpl.java
@@ -0,0 +1,133 @@
+package com.ruoyi.personnel.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.deepoove.poi.XWPFTemplate;
+import com.deepoove.poi.config.Configure;
+import com.deepoove.poi.config.ConfigureBuilder;
+import com.deepoove.poi.data.FilePictureRenderData;
+import com.ruoyi.common.core.domain.entity.User;
+import com.ruoyi.framework.exception.ErrorException;
+import com.ruoyi.personnel.dto.PersonPostAuthorizationRecordDto;
+import com.ruoyi.personnel.mapper.PersonPostAuthorizationRecordMapper;
+import com.ruoyi.personnel.pojo.PersonPostAuthorizationRecord;
+import com.ruoyi.personnel.service.PersonPostAuthorizationRecordService;
+import com.ruoyi.system.mapper.UserMapper;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletResponse;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URLEncoder;
+import java.time.LocalDateTime;
+import java.util.HashMap;
+
+/**
+ * <p>
+ * 浠昏亴鎺堟潈璁板綍 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author
+ * @since 2024-10-09 10:48:17
+ */
+@Service
+public class PersonPostAuthorizationRecordServiceImpl extends ServiceImpl<PersonPostAuthorizationRecordMapper, PersonPostAuthorizationRecord> implements PersonPostAuthorizationRecordService {
+
+    @Resource
+    private UserMapper userMapper;
+
+    @Value("${file.path}")
+    private String imgUrl;
+
+    @Override
+    public IPage<PersonPostAuthorizationRecordDto> personPostAuthorizationRecordPage(Page page, Integer departLimsId, Integer userId, String userName) {
+        return baseMapper.personPostAuthorizationRecordPage(page, departLimsId, userId, userName);
+    }
+
+    @Override
+    public void exportPersonPostAuthorizationRecord(Integer id, HttpServletResponse response) {
+        PersonPostAuthorizationRecord personPostAuthorizationRecord = baseMapper.selectById(id);
+        //濮撳悕
+        User user = userMapper.selectById(personPostAuthorizationRecord.getUserId());
+        String name = user.getName();
+        //todo: 浜哄憳浠昏亴鎺堟潈璁板綍濮撳悕鑻辨枃
+//        HanyuPinyinOutputFormat format = new HanyuPinyinOutputFormat();
+//        format.setCaseType(HanyuPinyinCaseType.LOWERCASE);
+//        format.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
+//        StringBuilder pinyinBuilder = new StringBuilder();
+//        for (int i = 0; i < name.length(); i++) {
+//            char c = name.charAt(i);
+//            // 鍒ゆ柇鏄惁鏄眽瀛�
+//            if (Character.toString(c).matches("[\\u4E00-\\u9FFF]")) {
+//                // 鑾峰彇姹夊瓧鐨勬嫾闊虫暟缁�
+//                String[] pinyinArray = new String[0];
+//                try {
+//                    pinyinArray = PinyinHelper.toHanyuPinyinStringArray(c, format);
+//                } catch (BadHanyuPinyinOutputFormatCombination badHanyuPinyinOutputFormatCombination) {
+//
+//                }
+//                if (pinyinArray!= null && pinyinArray.length > 0) {
+//                    pinyinBuilder.append(pinyinArray[0]);
+//                }
+//            } else {
+//                pinyinBuilder.append(c);
+//            }
+//        }
+//        String nameEn = pinyinBuilder.toString();
+        String nameEn = user.getNameEn();
+        //鐞嗚鐭ヨ瘑鑰冭瘯鎴愮哗
+        String num1=personPostAuthorizationRecord.getNum1();
+        //鎿嶄綔鎶�鑳借�冭瘯鎴愮哗
+        String num2=personPostAuthorizationRecord.getNum2();
+        //璇佷功缂栧彿
+        String code = personPostAuthorizationRecord.getCertificateNumber();
+        //鍙戣瘉鏃堕棿
+        LocalDateTime createTime = personPostAuthorizationRecord.getCreateTime();
+        String year = createTime.getYear() + "";
+        String mon = createTime.getMonth().getValue() + "";
+        String day = createTime.getDayOfMonth() + "";
+        //涓汉鐓х墖
+        if (ObjectUtils.isEmpty(user.getPictureUrl())) {
+            throw new ErrorException(name+"鐨勪釜浜虹収鐗囨病鏈変笂浼�");
+        }
+        String pictureUrl = user.getPictureUrl();
+
+
+        InputStream inputStream = this.getClass().getResourceAsStream("/static/credentials-deal.docx");
+        ConfigureBuilder builder = Configure.builder();
+        builder.useSpringEL(true);
+        XWPFTemplate template = XWPFTemplate.compile(inputStream, builder.build()).render(
+                new HashMap<String, Object>() {{
+                    put("name", name);
+                    put("nameEn", nameEn);
+                    put("num1", num1);
+                    put("num2", num2);
+                    put("code", code);
+                    put("year", year);
+                    put("mon", mon);
+                    put("day", day);
+                    put("writeUrl", new FilePictureRenderData(100,50,imgUrl + "/" + pictureUrl));
+                }});
+
+        try {
+            response.setContentType("application/msword");
+            String fileName = URLEncoder.encode(
+                    name+"鐨勫矖浣嶈亴涓氳祫鏍兼寮�", "UTF-8");
+            response.setHeader("Content-disposition",
+                    "attachment;filename=" + fileName + ".docx");
+            OutputStream os = response.getOutputStream();
+            template.write(os);
+            os.flush();
+            os.close();
+            inputStream.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException("瀵煎嚭澶辫触");
+        }
+
+    }
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonRewardPunishmentRecordServiceImpl.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonRewardPunishmentRecordServiceImpl.java
new file mode 100644
index 0000000..ed82a41
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonRewardPunishmentRecordServiceImpl.java
@@ -0,0 +1,36 @@
+package com.ruoyi.personnel.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.ruoyi.personnel.dto.PersonRewardPunishmentRecordDto;
+import com.ruoyi.personnel.excel.PersonRewardPunishmentRecordExcel;
+import com.ruoyi.personnel.mapper.PersonRewardPunishmentRecordMapper;
+import com.ruoyi.personnel.pojo.PersonRewardPunishmentRecord;
+import com.ruoyi.personnel.service.PersonRewardPunishmentRecordService;
+import org.springframework.stereotype.Service;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * <p>
+ * 濂栨儵璁板綍 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author
+ * @since 2024-10-08 11:25:02
+ */
+@Service
+public class PersonRewardPunishmentRecordServiceImpl extends ServiceImpl<PersonRewardPunishmentRecordMapper, PersonRewardPunishmentRecord> implements PersonRewardPunishmentRecordService {
+
+    @Override
+    public IPage<PersonRewardPunishmentRecordDto> rewardPunishmentPage(Page page, Integer userId, String userName, Date startTime, Date endTime, Integer departmentId) {
+        return baseMapper.rewardPunishmentPage(page, userId, userName, startTime, endTime, departmentId);
+    }
+
+    @Override
+    public List<PersonRewardPunishmentRecordExcel> rewardPunishmentExport(Integer userId, Integer departmentId, String userName, Date startTime, Date endTime) {
+        return baseMapper.rewardPunishmentExport(userId, departmentId, userName, startTime, endTime);
+    }
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonTrainingDetailedServiceImpl.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonTrainingDetailedServiceImpl.java
new file mode 100644
index 0000000..7c05355
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonTrainingDetailedServiceImpl.java
@@ -0,0 +1,85 @@
+package com.ruoyi.personnel.service.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.common.core.domain.entity.User;
+import com.ruoyi.common.numgen.NumberGenerator;
+import com.ruoyi.framework.exception.ErrorException;
+import com.ruoyi.personnel.dto.PersonTrainingDetailedDto;
+import com.ruoyi.personnel.excel.PersonTrainingDetailedUpload;
+import com.ruoyi.personnel.mapper.PersonTrainingDetailedMapper;
+import com.ruoyi.personnel.pojo.PersonTrainingDetailed;
+import com.ruoyi.personnel.service.PersonTrainingDetailedService;
+import com.ruoyi.system.mapper.UserMapper;
+import lombok.AllArgsConstructor;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * <p>
+ * 鍩硅璁″垝璇︽儏 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author
+ * @since 2024-10-11 01:46:27
+ */
+@Service
+@Transactional(rollbackFor = Exception.class)
+@AllArgsConstructor
+public class PersonTrainingDetailedServiceImpl extends ServiceImpl<PersonTrainingDetailedMapper, PersonTrainingDetailed> implements PersonTrainingDetailedService {
+
+
+    private UserMapper userMapper;
+
+    @Override
+    public void importExcel(List<PersonTrainingDetailedUpload> list, Integer planId) {
+        List<PersonTrainingDetailed> personTrainingDetailedList = new ArrayList<>();
+        list.forEach(i -> {
+            PersonTrainingDetailed personTrainingDetailed = new PersonTrainingDetailed();
+            BeanUtils.copyProperties(i, personTrainingDetailed);
+
+            // 鍖归厤璁插笀
+            User user = userMapper.selectOne(Wrappers.<User>lambdaQuery()
+                    .eq(User::getName, i.getTrainingLecturerName()));
+            if (ObjectUtils.isEmpty(user)) {
+                throw new ErrorException("鏈壘鍒拌璁插笀锛�" + i.getTrainingLecturerName());
+            }
+            personTrainingDetailed.setTrainingLecturerId(user.getId());
+            personTrainingDetailed.setPlanId(planId);
+            personTrainingDetailed.setState(3);
+
+            personTrainingDetailed.setTrainingDate(i.getTrainingDate());
+
+
+            personTrainingDetailedList.add(personTrainingDetailed);
+        });
+        // 鎵归噺鏂板
+        if (CollectionUtils.isNotEmpty(personTrainingDetailedList)) {
+            baseMapper.insertBatchSomeColumn(personTrainingDetailedList);
+        }
+    }
+
+    @Override
+    public void deleteAnnualPlanDetailTable(String ids) {
+        String[] split = ids.split(",");
+        if (split.length > 0) {
+            for (String s : split) {
+                baseMapper.deleteById(s);
+            }
+        }
+    }
+
+    @Override
+    public IPage<PersonTrainingDetailedDto> queryTheAnnualPlanDetailsTable(Page page, String trainingLecturerName, String courseCode, String trainingDate, Integer id, Integer userId) {
+        return baseMapper.queryTheAnnualPlanDetailsTable(page, trainingLecturerName, courseCode, trainingDate, id, userId, null);
+    }
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonTrainingRecordServiceImpl.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonTrainingRecordServiceImpl.java
new file mode 100644
index 0000000..badf239
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonTrainingRecordServiceImpl.java
@@ -0,0 +1,179 @@
+package com.ruoyi.personnel.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.ruoyi.common.constant.MenuJumpPathConstants;
+import com.ruoyi.common.core.domain.entity.InformationNotification;
+import com.ruoyi.common.core.domain.entity.User;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.common.utils.WxCpUtils;
+import com.ruoyi.inspect.util.HackLoopTableRenderPolicy;
+import com.ruoyi.personnel.dto.PersonTrainingRecordDto;
+import com.ruoyi.personnel.dto.PersonTrainingRecordListDto;
+import com.ruoyi.personnel.dto.PersonTrainingRecordSubmitDto;
+import com.ruoyi.personnel.dto.TrainingRecordPersonDetailedDto;
+import com.ruoyi.personnel.mapper.PersonTrainingRecordMapper;
+import com.ruoyi.personnel.pojo.PersonTrainingDetailed;
+import com.ruoyi.personnel.pojo.PersonTrainingRecord;
+import com.ruoyi.personnel.service.PersonTrainingDetailedService;
+import com.ruoyi.personnel.service.PersonTrainingRecordService;
+import com.ruoyi.system.mapper.UserMapper;
+import com.ruoyi.system.service.InformationNotificationService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import jakarta.annotation.Resource;
+import jakarta.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-10-12 04:50:48
+ */
+@Transactional(rollbackFor = Exception.class)
+@Service
+public class PersonTrainingRecordServiceImpl extends ServiceImpl<PersonTrainingRecordMapper, PersonTrainingRecord> implements PersonTrainingRecordService {
+
+    @Autowired
+    private PersonTrainingDetailedService personTrainingDetailedService;
+    @Resource
+    private InformationNotificationService informationNotificationService;
+    @Resource
+    private ThreadPoolTaskExecutor threadPoolTaskExecutor;
+    @Resource
+    private UserMapper userMapper;
+
+    @Override
+    public List<PersonTrainingRecordDto> trainingAndAssessmentRecordsPage(Integer trainingDetailedId, String userName) {
+        return baseMapper.trainingAndAssessmentRecordsPage(trainingDetailedId, userName);
+    }
+
+    @Override
+    public void deleteTrainingAndAssessmentRecords(String ids) {
+        String[] split = ids.split(",");
+        if (split.length > 0) {
+            for (String s : split) {
+                baseMapper.deleteById(s);
+            }
+        }
+    }
+
+    @Override
+    public IPage<PersonTrainingRecordListDto> personnelTrainingPersonnel(Page page, String userName, Integer userId, Integer departLimsId) {
+        return baseMapper.personnelTrainingPersonnel(page, userName, userId, departLimsId);
+    }
+
+    @Override
+    public void claimOfTrainingAndAssessmentRecords(Boolean claimAndClaim, Integer courseId) {
+
+    }
+
+
+    @Override
+    public IPage<TrainingRecordPersonDetailedDto> queryPersonnelDetailsOfUserIdAndYear(Page page, Integer userId, Integer year) {
+        return baseMapper.queryPersonnelDetailsOfUserIdAndYear(page, userId, year);
+    }
+
+    @Override
+    public void exportTrainingRecordAddTrainingDate(Integer userId, Integer trainingDate, HttpServletResponse response) {
+        // 鏌ヨ浜哄憳浜轰俊鎭�
+        PersonTrainingRecordListDto trainingRecordListDto = baseMapper.selectUserTraining(userId);
+
+        // 鏌ヨ鍩硅璁板綍
+        List<TrainingRecordPersonDetailedDto> personDetailedDtos = baseMapper.selectPersonDetailedDtosByTrainingDate(userId, trainingDate);
+
+
+        // 鑾峰彇璺緞
+        InputStream inputStream = this.getClass().getResourceAsStream("/static/training-record.docx");
+        Configure configure = Configure.builder()
+                .bind("personnelDetailsLisat", new HackLoopTableRenderPolicy())
+                .build();
+        XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
+                new HashMap<String, Object>() {{
+                    put("traning", trainingRecordListDto);
+                    put("personnelDetailsLisat", personDetailedDtos);
+                }});
+        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();
+            inputStream.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException("瀵煎嚭澶辫触");
+        }
+    }
+
+    /**
+     * 鍩硅鎻愪氦
+     * @param personTrainingRecordSubmitDto
+     */
+    @Override
+    public void trainingAndAssessmentRecordsAdded(PersonTrainingRecordSubmitDto personTrainingRecordSubmitDto) {
+        personTrainingDetailedService.update(Wrappers.<PersonTrainingDetailed>lambdaUpdate()
+                .eq(PersonTrainingDetailed::getId, personTrainingRecordSubmitDto.getTrainingDetailedId())
+                .set(PersonTrainingDetailed::getAssessmentMethod, personTrainingRecordSubmitDto.getAssessmentMethod())
+                .set(PersonTrainingDetailed::getPlaceTraining, personTrainingRecordSubmitDto.getPlaceTraining())
+                .set(PersonTrainingDetailed::getOpeningTime, personTrainingRecordSubmitDto.getOpeningTime())
+                .set(PersonTrainingDetailed::getAssessmentUserId, personTrainingRecordSubmitDto.getAssessmentUserId())
+                .set(PersonTrainingDetailed::getState, personTrainingRecordSubmitDto.getState()));
+
+        // 鍙戦�佹秷鎭�氱煡
+        if (personTrainingRecordSubmitDto.getState().equals(2)) {
+            PersonTrainingDetailed personPersonnelCapacity = personTrainingDetailedService.getById(personTrainingRecordSubmitDto.getTrainingDetailedId());
+
+            Integer userId = SecurityUtils.getUserId().intValue();
+            User user = userMapper.selectById(userId);
+            // 娑堟伅鍙戦��
+            InformationNotification info = new InformationNotification();
+            // 鍙戦�佷汉
+            info.setCreateUser(user.getName());
+            info.setMessageType("6");
+            info.setTheme("CNAS浜哄憳鍩硅璁″垝寰呰瘎浠�");
+            info.setContent("鍩硅鍐呭:" + personPersonnelCapacity.getTrainingContent() + "鐨勪汉鍛樺煿璁緟璇勪环");
+            info.setSenderId(userId);
+            // 鎺ユ敹浜�
+            info.setConsigneeId(personTrainingRecordSubmitDto.getAssessmentUserId());
+            info.setJumpPath(MenuJumpPathConstants.PERSONNEL);
+            informationNotificationService.addInformationNotification(info);
+
+            // 鍙戦�佷紒涓氬井淇¢�氱煡
+            threadPoolTaskExecutor.execute(() -> {
+                // 鏌ヨ鎺ユ敹浜�
+                User personnel = userMapper.selectById(personTrainingRecordSubmitDto.getAssessmentUserId());
+
+                String message = "";
+                message += "CNAS浜哄憳鍩硅璁″垝寰呰瘎浠�";
+                message += "\n璇峰幓璧勬簮绠$悊-浜哄憳-浜哄憳鍩硅璁″垝";
+                message += "\n" + "鍩硅鍐呭:" + personPersonnelCapacity.getTrainingContent() + "鐨勪汉鍛樺煿璁緟璇勪环";
+                //鍙戦�佷紒涓氬井淇℃秷鎭�氱煡
+                try {
+                    WxCpUtils.inform(personnel.getAccount(), message, null);
+                } catch (Exception e) {
+                    throw new RuntimeException(e);
+                }
+            });
+        }
+    }
+
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonTrainingServiceImpl.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonTrainingServiceImpl.java
new file mode 100644
index 0000000..e5d2c50
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonTrainingServiceImpl.java
@@ -0,0 +1,438 @@
+package com.ruoyi.personnel.service.impl;
+
+import com.alibaba.excel.EasyExcel;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+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.ruoyi.common.constant.MenuJumpPathConstants;
+import com.ruoyi.common.core.domain.entity.InformationNotification;
+import com.ruoyi.common.core.domain.entity.User;
+import com.ruoyi.common.utils.DateImageUtil;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.common.utils.WxCpUtils;
+import com.ruoyi.framework.exception.ErrorException;
+import com.ruoyi.inspect.util.HackLoopTableRenderPolicy;
+import com.ruoyi.personnel.dto.PersonTrainingDetailedDto;
+import com.ruoyi.personnel.dto.PersonTrainingDto;
+import com.ruoyi.personnel.dto.PersonTrainingRecordDto;
+import com.ruoyi.personnel.dto.TrainingRecordExportDto;
+import com.ruoyi.personnel.excel.PersonTrainingDetailedListener;
+import com.ruoyi.personnel.excel.PersonTrainingDetailedUpload;
+import com.ruoyi.personnel.mapper.PersonTrainingDetailedFileMapper;
+import com.ruoyi.personnel.mapper.PersonTrainingDetailedMapper;
+import com.ruoyi.personnel.mapper.PersonTrainingMapper;
+import com.ruoyi.personnel.mapper.PersonTrainingRecordMapper;
+import com.ruoyi.personnel.pojo.PersonTraining;
+import com.ruoyi.personnel.pojo.PersonTrainingDetailed;
+import com.ruoyi.personnel.pojo.PersonTrainingDetailedFile;
+import com.ruoyi.personnel.service.PersonTrainingDetailedService;
+import com.ruoyi.personnel.service.PersonTrainingService;
+import com.ruoyi.system.mapper.UserMapper;
+import com.ruoyi.system.service.InformationNotificationService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.multipart.MultipartFile;
+
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletResponse;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URLEncoder;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Optional;
+
+/**
+ * <p>
+ * 鍩硅璁″垝 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author
+ * @since 2024-10-11 01:11:49
+ */
+@Service
+@Transactional(rollbackFor = Exception.class)
+public class PersonTrainingServiceImpl extends ServiceImpl<PersonTrainingMapper, PersonTraining> implements PersonTrainingService {
+
+    @Autowired
+    private PersonTrainingDetailedService personTrainingDetailedService;
+    @Autowired
+    private UserMapper userMapper;
+    @Autowired
+    private PersonTrainingDetailedMapper personTrainingDetailedMapper;
+    @Autowired
+    private PersonTrainingRecordMapper personTrainingRecordMapper;
+    @Autowired
+    private PersonTrainingDetailedFileMapper personTrainingDetailedFileMapper;
+    @Resource
+    private InformationNotificationService informationNotificationService;
+    @Resource
+    private ThreadPoolTaskExecutor threadPoolTaskExecutor;
+    @Value("${file.path}")
+    private String imgUrl;
+
+    @Value("${wordUrl}")
+    private String wordUrl;
+
+    @Override
+    public IPage<PersonTrainingDto> personTrainingSelect(Page page, String compilerName, String departmentId) {
+
+        return baseMapper.personTrainingSelect(page, compilerName, departmentId);
+    }
+
+    @Override
+    public void personTrainingImport(MultipartFile file, PersonTraining training) {
+
+        Integer userId = SecurityUtils.getUserId().intValue();
+        // 骞村害璁″垝鐖剁骇鏂板鏁版嵁
+        PersonTraining personSupervisePlan = new PersonTraining();
+        String fileName = file.getOriginalFilename().substring(0, file.getOriginalFilename().lastIndexOf("."));
+        personSupervisePlan.setFileName(fileName);
+        personSupervisePlan.setPlanYear(training.getPlanYear());
+        personSupervisePlan.setCompilerId(userId);
+        personSupervisePlan.setReviewerId(training.getReviewerId());
+        personSupervisePlan.setCompilationDate(LocalDateTime.now());
+        baseMapper.insert(personSupervisePlan);
+        User user = userMapper.selectById(userId);
+        // 娑堟伅鍙戦��
+        InformationNotification info = new InformationNotification();
+        // 鍙戦�佷汉
+        info.setCreateUser(user.getName());
+        info.setMessageType("6");
+        info.setTheme("CNAS鍩硅璁″垝瀹℃牳閫氱煡");
+        info.setContent("鎮ㄦ湁涓�鏉″煿璁鍒掑緟瀹℃牳");
+        info.setSenderId(userId);
+        // 鎺ユ敹浜�
+        info.setConsigneeId(training.getApproverId());
+        info.setJumpPath(MenuJumpPathConstants.PERSONNEL);
+        informationNotificationService.addInformationNotification(info);
+
+        // 鍙戦�佷紒涓氬井淇¢�氱煡
+        threadPoolTaskExecutor.execute(() -> {
+            // 鏌ヨ鎺ユ敹浜�
+            User personnel = userMapper.selectById(training.getApproverId());
+
+            String message = "";
+            message += "CNAS鍩硅璁″垝瀹℃牳閫氱煡";
+            message += "\n璇峰幓璧勬簮绠$悊-浜哄憳-鍩硅璁″垝濉啓";
+            message += "\n" + fileName + "鐨勫煿璁鍒掑緟瀹℃牳";
+            //鍙戦�佷紒涓氬井淇℃秷鎭�氱煡
+            try {
+                WxCpUtils.inform(personnel.getAccount(), message, null);
+            } catch (Exception e) {
+                throw new RuntimeException(e);
+            }
+        });
+
+        // 骞村害璁″垝璇︽儏 鏂板
+        try {
+            PersonTrainingDetailedListener personSupervisePlanDetailsListener = new PersonTrainingDetailedListener(personTrainingDetailedService);
+            personSupervisePlanDetailsListener.setPlanId(personSupervisePlan.getId());
+            EasyExcel.read(file.getInputStream(), PersonTrainingDetailedUpload.class, personSupervisePlanDetailsListener).sheet().doRead();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+
+    @Override
+    public void personTrainingDelete(Integer id) {
+        personTrainingDetailedService.remove(Wrappers.<PersonTrainingDetailed>lambdaQuery()
+                .eq(PersonTrainingDetailed::getPlanId, id));
+        baseMapper.deleteById(id);
+    }
+
+    @Override
+    public void reviewAnnualPersonnelTraining(PersonTraining training) {
+        PersonTraining personTraining = new PersonTraining();
+        personTraining.setId(training.getId());
+        personTraining.setApproverId(training.getApproverId());// 娣诲姞鎵瑰噯浜�
+        personTraining.setAuditDate(LocalDateTime.now());
+        personTraining.setAuditRemarks(training.getAuditRemarks());
+        personTraining.setReviewerStatus(training.getReviewerStatus());
+
+        PersonTraining old = baseMapper.selectById(training.getId());
+
+        // 娑堟伅鍙戦��
+        Integer userId = SecurityUtils.getUserId().intValue();
+        User user = userMapper.selectById(userId);
+        InformationNotification info = new InformationNotification();
+        // 鍙戦�佷汉
+        info.setCreateUser(user.getName());
+        info.setMessageType("6");
+        info.setTheme("CNAS鍩硅璁″垝瀹℃牳閫氱煡");
+        info.setContent("鎮ㄦ湁涓�鏉″煿璁鍒掑緟鎵瑰噯");
+        info.setSenderId(userId);
+        // 鎺ユ敹浜�
+        info.setConsigneeId(training.getApproverId());
+        info.setJumpPath(MenuJumpPathConstants.PERSONNEL);
+        informationNotificationService.addInformationNotification(info);
+
+        // 鍙戦�佷紒涓氬井淇¢�氱煡
+        threadPoolTaskExecutor.execute(() -> {
+            // 鏌ヨ鎺ユ敹浜�
+            User personnel = userMapper.selectById(training.getApproverId());
+
+            String message = "";
+            message += "CNAS鍩硅璁″垝鎵瑰噯閫氱煡";
+            message += "\n璇峰幓璧勬簮绠$悊-浜哄憳-鍩硅璁″垝濉啓";
+            message += "\n" + old.getFileName() + "鐨勫煿璁鍒掑緟鎵瑰噯";
+            //鍙戦�佷紒涓氬井淇℃秷鎭�氱煡
+            try {
+                WxCpUtils.inform(personnel.getAccount(), message, null);
+            } catch (Exception e) {
+                throw new RuntimeException(e);
+            }
+        });
+
+        baseMapper.updateById(personTraining);
+    }
+
+    @Override
+    public void approveAnnualPersonnelTraining(PersonTraining training) {
+        LambdaUpdateWrapper<PersonTraining> wrapper = Wrappers.<PersonTraining>lambdaUpdate()
+                .eq(PersonTraining::getId, training.getId())
+                .set(PersonTraining::getApprovalDate, LocalDateTime.now())
+                .set(PersonTraining::getApprovalRemarks, training.getApprovalRemarks())
+                .set(PersonTraining::getApprovalStatus, training.getApprovalStatus());
+        baseMapper.update(new PersonTraining(), wrapper);
+    }
+
+    /**
+     * 瀵煎嚭浜哄憳鍩硅璁″垝
+     * @param id
+     * @param response
+     */
+    @Override
+    public void exportPersonTraining(Integer id, HttpServletResponse response) {
+
+        // 鏌ヨ璇︽儏
+        PersonTraining personTraining = baseMapper.selectById(id);
+
+        //鑾峰彇鎻愪氦浜虹殑绛惧悕鍦板潃
+        String writeUrl = userMapper.selectById(personTraining.getCompilerId()).getSignatureUrl();
+        if (ObjectUtils.isEmpty(writeUrl) || writeUrl.equals("")) {
+            throw new ErrorException("鎵句笉鍒版楠屼汉鐨勭鍚�");
+        }
+
+        //鑾峰彇澶嶆牳浜虹殑绛惧悕鍦板潃
+        String examineUrl = null;
+        if (personTraining.getReviewerId() != null) {
+            examineUrl = userMapper.selectById(personTraining.getReviewerId()).getSignatureUrl();
+            if (StringUtils.isBlank(examineUrl)) {
+                throw new ErrorException("鎵句笉鍒板鏍镐汉鐨勭鍚�");
+            }
+        }
+
+        //鑾峰彇鎵瑰噯浜虹殑绛惧悕鍦板潃
+        String ratifyUrl = null;
+        if (personTraining.getApproverId() != null) {
+            ratifyUrl = userMapper.selectById(personTraining.getApproverId()).getSignatureUrl();
+            if (StringUtils.isBlank(ratifyUrl)) {
+                throw new ErrorException("鎵句笉鍒板鏍镐汉鐨勭鍚�");
+            }
+        }
+
+        // 鏌ヨ璇︽儏
+        List<PersonTrainingDetailedDto> detailedDtos = personTrainingDetailedMapper.selectTrainingList(id);
+
+        int index = 1;
+        for (PersonTrainingDetailedDto detailedDto : detailedDtos) {
+            detailedDto.setTrainingDateString(detailedDto.getTrainingDate());
+            detailedDto.setIndex(index);
+            index++;
+        }
+
+        // 鑾峰彇璺緞
+        InputStream inputStream = this.getClass().getResourceAsStream("/static/person-training.docx");
+        String finalExamineUrl = examineUrl;
+        String finalRatifyUrl = ratifyUrl;
+        Configure configure = Configure.builder()
+                .bind("trainingDetailedList", new HackLoopTableRenderPolicy())
+                .build();
+        XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
+                new HashMap<String, Object>() {{
+                    put("year", personTraining.getPlanYear());
+                    put("trainingDetailedList", detailedDtos);
+                    put("writeUrl", StringUtils.isNotBlank(writeUrl) ? Pictures.ofLocal(imgUrl + "/" + writeUrl).create() : null);
+                    put("examineUrl", StringUtils.isNotBlank(finalExamineUrl) ? Pictures.ofLocal(imgUrl + "/" + finalExamineUrl).create() : null);
+                    put("ratifyUrl", StringUtils.isNotBlank(finalRatifyUrl) ? Pictures.ofLocal(imgUrl + "/" + finalRatifyUrl).create() : null);
+                    put("writeDateUrl", personTraining.getCompilationDate() != null ?
+                            Pictures.ofStream(DateImageUtil.createDateImage(personTraining.getCompilationDate())).create() : null);
+                    put("examineDateUrl", personTraining.getAuditDate() != null ?
+                            Pictures.ofStream(DateImageUtil.createDateImage(personTraining.getAuditDate())).create() : null);
+                    put("ratifyDateUrl", personTraining.getApprovalDate() != null ?
+                            Pictures.ofStream(DateImageUtil.createDateImage(personTraining.getApprovalDate())).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();
+            inputStream.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException("瀵煎嚭澶辫触");
+        }
+
+    }
+
+    /**
+     * 瀵煎嚭浜哄憳鍩硅涓庤�冩牳璁板綍
+     * @param id
+     * @param response
+     */
+    @Override
+    public void exportPersonTrainingRecord(Integer id, HttpServletResponse response) {
+        // 鏌ヨ浜哄憳鍩硅鏄庣粏
+        PersonTrainingDetailedDto detailedDto = personTrainingDetailedMapper.selectTrainingDetail(id);
+
+        // 鐢熸垚鍩硅鑰佸笀绛惧悕
+        detailedDto.setTrainingLecturerRender(StringUtils.isNotBlank(detailedDto.getTrainingLecturerSignatureUrl())
+                    ? Pictures.ofLocal(imgUrl + "/" + detailedDto.getTrainingLecturerSignatureUrl()).create() : null);
+
+        // 鏌ヨ鍩硅鐨勪汉鍛�
+        List<PersonTrainingRecordDto> recordDtos = personTrainingRecordMapper.selectListByTrainingDetailedId(id);
+
+        List<TrainingRecordExportDto> exportDtoList = new ArrayList<>();
+        TrainingRecordExportDto exportDto = new TrainingRecordExportDto();
+
+        int count = 0;
+        for (PersonTrainingRecordDto recordDto : recordDtos) {
+            switch (count) {
+                case 0:
+                    exportDto.setUserNameRender1(StringUtils.isNotBlank(recordDto.getSignatureUrl())
+                            ? Pictures.ofLocal(imgUrl + "/" + recordDto.getSignatureUrl()).create() : null);
+                    exportDto.setDepartment1(recordDto.getDepartment());
+                    exportDto.setExaminationResults1(recordDto.getExaminationResults());
+                    count ++;
+                    break;
+                case 1:
+                    exportDto.setUserNameRender2(StringUtils.isNotBlank(recordDto.getSignatureUrl())
+                            ? Pictures.ofLocal(imgUrl + "/" + recordDto.getSignatureUrl()).create() : null);
+                    exportDto.setDepartment2(recordDto.getDepartment());
+                    exportDto.setExaminationResults2(recordDto.getExaminationResults());
+                    exportDtoList.add(exportDto);
+                    exportDto = new TrainingRecordExportDto();
+                    count = 0;
+                    break;
+            }
+        }
+        exportDtoList.add(exportDto);
+
+        // 璐ㄩ噺璐熻矗浜�
+        String assessmentUserUrl = null;
+        if (detailedDto.getAssessmentUserId() != null) {
+            assessmentUserUrl = userMapper.selectById(detailedDto.getAssessmentUserId()).getSignatureUrl();
+            if (StringUtils.isBlank(assessmentUserUrl)) {
+                throw new ErrorException("鎵句笉鍒拌瘎浠蜂汉鐨勭鍚�");
+            }
+        }
+
+
+        // 鑾峰彇璺緞
+        InputStream inputStream = this.getClass().getResourceAsStream("/static/person-training-record.docx");
+        Configure configure = Configure.builder()
+                .bind("trainingRecordsList", new HackLoopTableRenderPolicy())
+                .build();
+        String finalAssessmentUserUrl = assessmentUserUrl;
+        XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
+                new HashMap<String, Object>() {{
+                    put("trainingDetail", detailedDto);
+                    put("trainingRecordsList", exportDtoList);
+                    put("assessmentUserUrl", StringUtils.isNotBlank(finalAssessmentUserUrl) ? Pictures.ofLocal(imgUrl + "/" + finalAssessmentUserUrl).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();
+            inputStream.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException("瀵煎嚭澶辫触");
+        }
+
+
+    }
+
+    /**
+     * 浜哄憳鍩硅璇︽儏闄勪欢鏂板
+     * @param trainingDetailedId
+     * @param file
+     * @return
+     */
+    @Override
+    public boolean uploadTrainingDetailedFile(Integer trainingDetailedId, MultipartFile file) {
+        if (trainingDetailedId == null) {
+            throw new ErrorException("缂哄皯楠屾敹id");
+        }
+
+        String urlString;
+        String pathName;
+        String path;
+        String filename = file.getOriginalFilename();
+        String contentType = file.getContentType();
+        PersonTrainingDetailedFile detailedFile = new PersonTrainingDetailedFile();
+        detailedFile.setTrainingDetailedId(trainingDetailedId);
+        detailedFile.setFileName(filename);
+        if (contentType != null && contentType.startsWith("image/")) {
+            // 鏄浘鐗�
+            path = imgUrl;
+            detailedFile.setType(1);
+        } else {
+            // 鏄枃浠�
+            path = wordUrl;
+            detailedFile.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));
+            detailedFile.setFileUrl(pathName);
+            personTrainingDetailedFileMapper.insert(detailedFile);
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            System.err.println("闄勪欢涓婁紶閿欒");
+            return false;
+        }
+    }
+
+    /**
+     * 鏌ヨ浠婂勾浜哄憳鍩硅淇℃伅
+     * @return
+     */
+    @Override
+    public List<PersonTrainingDetailed> getThisYearTrainingDetailed() {
+        return personTrainingDetailedMapper.getThisYearTrainingDetailed();
+    }
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/task/PersonTrainingSchedule.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/task/PersonTrainingSchedule.java
new file mode 100644
index 0000000..9eac72f
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/task/PersonTrainingSchedule.java
@@ -0,0 +1,65 @@
+package com.ruoyi.personnel.task;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.ruoyi.common.core.domain.entity.User;
+import com.ruoyi.common.utils.WxCpUtils;
+import com.ruoyi.personnel.mapper.PersonTrainingDetailedMapper;
+import com.ruoyi.personnel.pojo.PersonTrainingDetailed;
+import com.ruoyi.system.mapper.UserMapper;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+import org.springframework.stereotype.Component;
+
+import jakarta.annotation.Resource;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.List;
+
+/**
+ * 鍩硅璁″垝浣跨敤鎻愰啋璁板綍鎻愰啋
+ */
+@Component
+public class PersonTrainingSchedule {
+    @Resource
+    private PersonTrainingDetailedMapper personTrainingDetailedMapper;
+    @Resource
+    private UserMapper userMapper;
+    @Resource
+    private ThreadPoolTaskExecutor threadPoolTaskExecutor;
+
+    /**
+     * 鎻愰啋濉啓浜哄憳鍩硅璁板綍
+     */
+//    @Scheduled(cron = "0/5 * * * * *")
+    @Scheduled(cron = "0 0 9 1,15 * *") // 姣忔湀涓�鍙锋墽琛�
+    public void task1() {
+        // 鏌ヨ褰撴湀鍩硅璁″垝
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy.M");
+        String format = LocalDateTime.now().format(formatter);
+        List<PersonTrainingDetailed> personTrainingDetaileds = personTrainingDetailedMapper.selectList(Wrappers.<PersonTrainingDetailed>lambdaQuery()
+                .eq(PersonTrainingDetailed::getTrainingDate, format));
+
+        for (PersonTrainingDetailed personTrainingDetailed : personTrainingDetaileds) {
+            threadPoolTaskExecutor.execute(() -> {
+                // 鏌ヨ鍩硅璁插笀
+                User user = userMapper.selectById(personTrainingDetailed.getTrainingLecturerId());
+                // 浼佷笟寰俊閫氱煡鍩硅
+                String message = "";
+                message += "浜哄憳鍩硅璁″垝鎻愰啋閫氱煡";
+                message += "\n鍩硅鐩爣: " + personTrainingDetailed.getTrainingObjectives();
+                message += "\n鍩硅鍐呭: " + personTrainingDetailed.getTrainingContent();
+                message += "\n鍙傚姞瀵硅薄: " + personTrainingDetailed.getParticipants();
+                message += "\n鍩硅鏃ユ湡: " + personTrainingDetailed.getTrainingDate();
+                message += "\n璁″垝褰撴湀杩涜鍩硅";
+
+                //鍙戦�佷紒涓氬井淇℃秷鎭�氱煡
+                try {
+                    WxCpUtils.inform(user.getAccount(), message, null);
+                } catch (Exception e) {
+                    throw new RuntimeException(e);
+                }
+            });
+        }
+    }
+
+}
diff --git a/cnas-personnel/src/main/resources/mapper/PersonBasicInfoMapper.xml b/cnas-personnel/src/main/resources/mapper/PersonBasicInfoMapper.xml
new file mode 100644
index 0000000..da32169
--- /dev/null
+++ b/cnas-personnel/src/main/resources/mapper/PersonBasicInfoMapper.xml
@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.personnel.mapper.PersonBasicInfoMapper">
+
+    <select id="selectLimsUser" resultType="com.ruoyi.common.core.domain.entity.DepartmentDto">
+        SELECT u.id userId, u.name, SUBSTRING_INDEX(SUBSTRING_INDEX(u.depart_lims_id, ',', -2), ',', 1) AS fatherId
+        FROM user u
+        where u.is_custom = 0
+          and u.depart_lims_id is not null
+          and u.depart_lims_id != ''
+    </select>
+
+    <select id="getCNASPersonnelInfo" resultType="com.ruoyi.personnel.dto.PersonBasicInfoDto">
+        SELECT *
+        FROM user u
+                 left join cnas_person_basic_info cpbi on cpbi.user_id = u.id
+        where u.id = #{userId}
+    </select>
+
+    <select id="selectPersonBasecInfoAndUser" resultType="java.util.Map">
+        select
+            u.id  userId,
+            u.`name`  name,
+            u.account account,
+            DATE_FORMAT(cpbi.group_time, '%Y-%m-%d') groupTime,
+            cpbi.native_place nativePlace,
+            cpbi.identity_card identityCard,
+            cpbi.id_address idAddress,
+            u.phone telephone,
+            cpbi.graduated_institutions1 graduatedInstitutions1,
+            cpbi.major1 major1,
+            DATE_FORMAT(cpbi.graduation_time1, '%Y-%m-%d')  graduationTime1,
+            cpbi.official_academic_redentials officialAcademicRedentials,
+            cpbi.highest_degree highestDegree,
+            cpbi.professional_title professionalTitle
+        from user u
+                 left join cnas_person_basic_info cpbi on cpbi.user_id = u.id
+        <where>
+            FIND_IN_SET(#{departmentId},u.depart_lims_id)
+            <if test="name != null and name != ''">
+                and u.name like concat('%',#{name},'%')
+            </if>
+        </where>
+    </select>
+
+    <!-- 瀵煎嚭鏌ヨ浜哄憳淇℃伅 -->
+    <select id="selectexportPersonBasic" resultType="java.util.Map">
+        select DATE_FORMAT(cpbi.last_update_time, '%Y骞�%m鏈�%d鏃�') lastUpdateTimeString,
+               u.account,
+               u.`name`,
+               cpbi.sex,
+               cpbi.post_name postName,
+               u.age,
+               DATE_FORMAT(cpbi.working_time, '%Y骞�%m鏈�')   workingTimeString,
+               cpbi.major1,
+               DATE_FORMAT(cpbi.graduation_time1, '%Y骞�%m鏈�')   graduationTime1string,
+               cpbi.official_academic_redentials officialAcademicRedentials,
+               cpbi.graduated_institutions1 graduatedInstitutions1,
+               cpbi.remarks
+        from user u
+                 left join cnas_person_basic_info cpbi on cpbi.user_id = u.id
+        where u.id = #{userId}
+    </select>
+</mapper>
diff --git a/cnas-personnel/src/main/resources/mapper/PersonCommunicationAbilityMapper.xml b/cnas-personnel/src/main/resources/mapper/PersonCommunicationAbilityMapper.xml
new file mode 100644
index 0000000..2ea0c72
--- /dev/null
+++ b/cnas-personnel/src/main/resources/mapper/PersonCommunicationAbilityMapper.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.personnel.mapper.PersonCommunicationAbilityMapper">
+
+
+    <select id="personPersonCommunicationAbilityPage" resultType="com.ruoyi.personnel.dto.PersonCommunicationAbilityDto">
+        select cpca.*, us.name create_user_name
+        from cnas_person_communication_ability cpca
+        left join user us on cpca.create_user = us.id
+        <where>
+            <if test="userId != null and userId != ''">
+                and FIND_IN_SET(#{userId},cpca.user_id)
+            </if>
+            <if test="departLimsId != null and departLimsId != ''">
+                and FIND_IN_SET(#{departLimsId},us.depart_lims_id)
+            </if>
+        </where>
+    </select>
+</mapper>
diff --git a/cnas-personnel/src/main/resources/mapper/PersonJobResponsibilitiesMapper.xml b/cnas-personnel/src/main/resources/mapper/PersonJobResponsibilitiesMapper.xml
new file mode 100644
index 0000000..ace613b
--- /dev/null
+++ b/cnas-personnel/src/main/resources/mapper/PersonJobResponsibilitiesMapper.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.personnel.mapper.PersonJobResponsibilitiesMapper">
+
+
+    <select id="personJobResponsibilitiesSelect" resultType="com.ruoyi.personnel.dto.PersonJobResponsibilitiesDto">
+        select cpt.*, u.name incumbent_name, su.name supervisor_name, dl.name depart_lims_name, u.account
+        from cnas_person_job_responsibilities cpt
+        left join user u on cpt.incumbent_id = u.id
+        left join user su on cpt.supervisor_id = su.id
+        left join department_lims dl on dl.id = SUBSTRING_INDEX(SUBSTRING_INDEX(u.depart_lims_id, ',', -2), ',', 1)
+        <where>
+            <if test="userId != null and userId != ''">
+                and cpt.incumbent_id = #{userId}
+            </if>
+            <if test="departmentId != null and departmentId != ''">
+                and FIND_IN_SET(#{departmentId}, u.depart_lims_id)
+            </if>
+            <if test="userName != null and userName != ''">
+                and u.name like concat('%', #{userName}, '%')
+            </if>
+        </where>
+    </select>
+</mapper>
diff --git a/cnas-personnel/src/main/resources/mapper/PersonPersonnelCapacityMapper.xml b/cnas-personnel/src/main/resources/mapper/PersonPersonnelCapacityMapper.xml
new file mode 100644
index 0000000..a4d9133
--- /dev/null
+++ b/cnas-personnel/src/main/resources/mapper/PersonPersonnelCapacityMapper.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.ruoyi.personnel.mapper.PersonPersonnelCapacityMapper">
+
+    <select id="personPersonnelCapacityPage" resultType="com.ruoyi.personnel.dto.PersonPersonnelCapacityDto">
+        select cppc.*,
+        u2.name confirm_operating_personnel_name,
+        u3.name user_name,
+        cpbi.post_name,
+        ecp.responsibilities,
+        cpbi.professional_title,
+        TRIM(',' FROM CONCAT(cpbi.major1, ',', cpbi.major2)) AS major
+        from cnas_person_personnel_capacity cppc
+        left join user u2 on cppc.confirm_operating_personnel_id = u2.id
+        left join user u3 on cppc.user_id = u3.id
+        -- 鍙栧矖浣�
+        left join cnas_person_basic_info cpbi on cpbi.user_id = cppc.user_id
+        -- 鍙栦汉鍛樿兘鍔涚殑宀椾綅鑱岃矗
+        left join (SELECT GROUP_CONCAT(e.dict_label) responsibilities, cppc.id
+        from cnas_person_personnel_capacity cppc
+        left join sys_dict_data e on FIND_IN_SET(e.dict_value, cppc.job_responsibilities)
+        where e.dict_type = 'responsibilities_list'
+        GROUP BY cppc.id) ecp on ecp.id = cppc.id
+        <where>
+            <if test="userId != null and userId != ''">
+                and cppc.user_id = #{userId}
+            </if>
+            <if test="departLimsId != null and departLimsId != ''">
+                and FIND_IN_SET(#{departLimsId}, u3.depart_lims_id)
+            </if>
+            <if test="userName != null and userName != ''">
+                and u3.name like concat('%', #{userName}, '%')
+            </if>
+        </where>
+    </select>
+
+    <!-- 鏌ヨ浜哄憳鑳藉姏鎺ュ彛 -->
+    <select id="selectExportPersonnelCapacity"
+            resultType="com.ruoyi.personnel.dto.PersonPersonnelCapacityExportDto">
+        select cppc.*,
+               cpbi.post_name,
+               u1.name   userName,
+               cpbi.official_academic_redentials,
+               cpbi.major1,
+               cpbi.professional_title,
+               p.place_work,
+               TRIM(',' FROM CONCAT(cpbi.major1, ',', cpbi.major2)) AS major,
+               case when cppc.academic_conform_not = 1 then '鈽�'
+                    else '鈻�' end academicConformNot1,-- 瀛﹀巻
+               case when cppc.academic_conform_not = 2 then '鈽�'
+                    else '鈻�' end academicConformNot2,
+               case when cppc.academic_conform_not = 3 then '鈽�'
+                    else '鈻�' end academicConformNot3,
+               case when cppc.related_years_conform_not = 1 then '鈽�'
+                    else '鈻�' end relatedYearsConformNot1,-- 鐩稿叧骞撮檺
+               case when cppc.related_years_conform_not = 2 then '鈽�'
+                    else '鈻�' end relatedYearsConformNot2,
+               case when cppc.related_years_conform_not = 3 then '鈽�'
+                    else '鈻�' end relatedYearsConformNot3,
+               case when cppc.related_training_conform_not = 1 then '鈽�'
+                    else '鈻�' end relatedTrainingConformNot1,-- 鐩稿叧鍩硅
+               case when cppc.related_training_conform_not = 2 then '鈽�'
+                    else '鈻�' end relatedTrainingConformNot2,
+               case when cppc.related_training_conform_not = 3 then '鈽�'
+                    else '鈻�' end relatedTrainingConformNot3,
+               case when cppc.relevant_experience_conform_not = 1 then '鈽�'
+                    else '鈻�' end relevantExperienceConformNot1,-- 鐩稿叧缁忛獙
+               case when cppc.relevant_experience_conform_not = 2 then '鈽�'
+                    else '鈻�' end relevantExperienceConformNot2,
+               case when cppc.relevant_experience_conform_not = 3 then '鈽�'
+                    else '鈻�' end relevantExperienceConformNot3,
+               case when cppc.work_license_conform_not = 1 then '鈽�'
+                    else '鈻�' end workLicenseConformNot1,-- 涓婂矖璇�
+               case when cppc.work_license_conform_not = 2 then '鈽�'
+                    else '鈻�' end workLicenseConformNot2,
+               case when cppc.work_license_conform_not = 3 then '鈽�'
+                    else '鈻�' end workLicenseConformNot3,
+               case when cppc.job_responsibilities_conform_not = 1 then '鈽�'
+                    else '鈻�' end jobResponsibilitiesConformNot1,-- 宀椾綅鑱岃矗
+               case when cppc.job_responsibilities_conform_not = 2 then '鈽�'
+                    else '鈻�' end jobResponsibilitiesConformNot2,
+               case when cppc.job_responsibilities_conform_not = 3 then '鈽�'
+                    else '鈻�' end jobResponsibilitiesConformNot3,
+               case when cppc.comprehensive_assessment = 'Qualified this position' then '鈽�'
+                    else '鈻�' end comprehensiveAssessment1,-- 缁煎悎璇勪环
+               case when cppc.comprehensive_assessment = 'You can work while training' then '鈽�'
+                    else '鈻�' end comprehensiveAssessment2,
+               case when cppc.comprehensive_assessment = 'Iconpetent for the position' then '鈽�'
+                    else '鈻�' end comprehensiveAssessment3,
+               case when find_in_set(1, cppc.job_responsibilities) then '鈽�'
+                    else '鈻�' end jobResponsibilities1,
+               case when find_in_set(2, cppc.job_responsibilities) then '鈽�'
+                    else '鈻�' end jobResponsibilities2,
+               case when find_in_set(3, cppc.job_responsibilities) then '鈽�'
+                    else '鈻�' end jobResponsibilities3,
+               case when find_in_set(4, cppc.job_responsibilities) then '鈽�'
+                    else '鈻�' end jobResponsibilities4,
+               case when find_in_set(5, cppc.job_responsibilities) then '鈽�'
+                    else '鈻�' end jobResponsibilities5,
+               case when find_in_set(6, cppc.job_responsibilities) then '鈽�'
+                    else '鈻�' end jobResponsibilities6,
+               case when find_in_set(7, cppc.job_responsibilities) then '鈽�'
+                    else '鈻�' end jobResponsibilities7,
+               case when find_in_set(8, cppc.job_responsibilities) then '鈽�'
+                    else '鈻�' end jobResponsibilities8,
+               case when find_in_set(9, cppc.job_responsibilities) then '鈽�'
+                    else '鈻�' end jobResponsibilities9,
+               case when find_in_set(10, cppc.job_responsibilities) then '鈽�'
+                    else '鈻�' end jobResponsibilities10
+        from cnas_person_personnel_capacity cppc
+                 left join user u1 on cppc.user_id = u1.id
+                 left join cnas_person_basic_info cpbi on cpbi.user_id = cppc.user_id
+                 left join (select GROUP_CONCAT(cptr.work_experience) place_work, cptr.user_id
+                            from cnas_person_basic_info_work cptr
+                            GROUP BY cptr.user_id) p on u1.id = p.user_id
+        where cppc.id = #{id}
+    </select>
+</mapper>
diff --git a/cnas-personnel/src/main/resources/mapper/PersonPostAuthorizationRecordMapper.xml b/cnas-personnel/src/main/resources/mapper/PersonPostAuthorizationRecordMapper.xml
new file mode 100644
index 0000000..bb3ef16
--- /dev/null
+++ b/cnas-personnel/src/main/resources/mapper/PersonPostAuthorizationRecordMapper.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.ruoyi.personnel.mapper.PersonPostAuthorizationRecordMapper">
+
+
+    <select id="personPostAuthorizationRecordPage" resultType="com.ruoyi.personnel.dto.PersonPostAuthorizationRecordDto">
+        select cppar.*, us.name create_user_name, u.account account, u.name user_name
+        from cnas_person_post_authorization_record cppar
+        left join user u on cppar.user_id = u.id
+        left join user us on cppar.create_user = us.id
+        <where>
+            <if test="userId != null and userId != ''">
+                and cppar.user_id = #{userId}
+            </if>
+            <if test="departLimsId != null and departLimsId != ''">
+                and FIND_IN_SET(#{departLimsId},u.depart_lims_id)
+            </if>
+            <if test="userName != null and userName != ''">
+                and u.name like concat('%', #{userName}, '%')
+            </if>
+        </where>
+    </select>
+</mapper>
diff --git a/cnas-personnel/src/main/resources/mapper/PersonRewardPunishmentRecordMapper.xml b/cnas-personnel/src/main/resources/mapper/PersonRewardPunishmentRecordMapper.xml
new file mode 100644
index 0000000..d92a163
--- /dev/null
+++ b/cnas-personnel/src/main/resources/mapper/PersonRewardPunishmentRecordMapper.xml
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.personnel.mapper.PersonRewardPunishmentRecordMapper">
+
+
+    <select id="rewardPunishmentPage" resultType="com.ruoyi.personnel.dto.PersonRewardPunishmentRecordDto">
+        select cprpr.*, us.name create_user_name, u.account account, u.name user_name
+        from cnas_person_reward_punishment_record cprpr
+        left join user u on cprpr.user_id = u.id
+        left join user us on cprpr.create_user = us.id
+        <where>
+            <if test="userId != null and userId != ''">
+                and cprpr.user_id = #{userId}
+            </if>
+            <if test="userName != null and userName != ''">
+                and u.name like concat('%', #{userName}, '%')
+            </if>
+            <if test="startTime != null and endTime != null">
+                AND DATE(cprpr.reward_punish_time) BETWEEN #{startTime} AND #{endTime}
+            </if>
+            <if test="departmentId != null and departmentId != ''">
+                and FIND_IN_SET(#{departmentId}, u.depart_lims_id)
+            </if>
+        </where>
+    </select>
+
+    <select id="rewardPunishmentExport" resultType="com.ruoyi.personnel.excel.PersonRewardPunishmentRecordExcel">
+        select cprpr.*, us.name create_user_name, u.account account, u.name user_name
+        from cnas_person_reward_punishment_record cprpr
+        left join user u on cprpr.user_id = u.id
+        left join user us on cprpr.create_user = us.id
+        <where>
+            <if test="userId != null and userId != ''">
+                and cprpr.user_id = #{userId}
+            </if>
+            <if test="departmentId != null and departmentId != ''">
+                and FIND_IN_SET(#{departmentId},u.depart_lims_id)
+            </if>
+            <if test="userName != null and userName != ''">
+                and u.name like concat('%', #{userName}, '%')
+            </if>
+            <if test="startTime != null and endTime != null">
+                AND DATE(cprpr.reward_punish_time) BETWEEN #{startTime} AND #{endTime}
+            </if>
+        </where>
+    </select>
+</mapper>
diff --git a/cnas-personnel/src/main/resources/mapper/PersonTrainingDetailedMapper.xml b/cnas-personnel/src/main/resources/mapper/PersonTrainingDetailedMapper.xml
new file mode 100644
index 0000000..e0013ed
--- /dev/null
+++ b/cnas-personnel/src/main/resources/mapper/PersonTrainingDetailedMapper.xml
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.personnel.mapper.PersonTrainingDetailedMapper">
+
+    <select id="queryTheAnnualPlanDetailsTable" resultType="com.ruoyi.personnel.dto.PersonTrainingDetailedDto">
+        SELECT cptd.*,
+        u1.name training_lecturer_name,
+        dl.name holding_department_name, !isnull(cptr.training_record_id) whether_claim
+        FROM cnas_person_training_detailed cptd
+        left join user u1 on cptd.training_lecturer_id = u1.id
+        left join department_lims dl on dl.id = cptd.holding_department
+        left join cnas_person_training_record cptr on cptr.user_id = #{loginUserId} and cptr.course_id = cptd.id
+        <where>
+            <if test="id != null">
+                and cptd.plan_id = #{id}
+            </if>
+            <if test="userId != null">
+                and u1.id = #{userId}
+            </if>
+            <if test="trainingLecturerName != null and trainingLecturerName != ''">
+                and u1.name like concat('%', #{trainingLecturerName}, '%')
+            </if>
+            <if test="trainingDate != null and trainingDate != ''">
+                and date_format(cptd.training_date,'%Y-%m-%d') = #{trainingDate}
+            </if>
+        </where>
+    </select>
+
+    <!-- 鏍规嵁涓昏〃id鏌ヨ璇︽儏 -->
+    <select id="selectTrainingList" resultType="com.ruoyi.personnel.dto.PersonTrainingDetailedDto">
+        SELECT cptd.*,
+               u1.name training_lecturer_name
+        FROM cnas_person_training_detailed cptd
+                 left join user u1 on cptd.training_lecturer_id = u1.id
+        where cptd.plan_id = #{trainingId}
+    </select>
+
+    <!-- 鏌ヨ璇︾粏 -->
+    <select id="selectTrainingDetail" resultType="com.ruoyi.personnel.dto.PersonTrainingDetailedDto">
+        SELECT cptd.*,
+               u1.name training_lecturer_name,
+               u1.signature_url training_lecturer_signature_url
+        FROM cnas_person_training_detailed cptd
+                 left join user u1 on cptd.training_lecturer_id = u1.id
+        where cptd.id = #{id}
+    </select>
+
+    <!-- 鏌ヨ浠婂勾浜哄憳鍩硅淇℃伅 -->
+    <select id="getThisYearTrainingDetailed" resultType="com.ruoyi.personnel.pojo.PersonTrainingDetailed">
+        select cptd.id,
+               cptd.training_objectives
+        from cnas_person_training_detailed cptd
+        where training_date like concat('%', YEAR(NOW()), '%')
+    </select>
+</mapper>
diff --git a/cnas-personnel/src/main/resources/mapper/PersonTrainingMapper.xml b/cnas-personnel/src/main/resources/mapper/PersonTrainingMapper.xml
new file mode 100644
index 0000000..147b493
--- /dev/null
+++ b/cnas-personnel/src/main/resources/mapper/PersonTrainingMapper.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.ruoyi.personnel.mapper.PersonTrainingMapper">
+
+    <!-- 鏍规嵁鍒涘缓浜虹殑閮ㄩ棬绛涢�夋暟鎹紝鍙槸鍒涘缓浜哄彲鑳芥湭鍒嗛厤閮ㄩ棬涔熼渶瑕佹煡鐪� -->
+    <select id="personTrainingSelect" resultType="com.ruoyi.personnel.dto.PersonTrainingDto">
+        SELECT
+        cpt.*,
+        u1.name compiler_name,
+        u2.name reviewer_name,
+        u3.name approver_name,
+        u4.name create_user_name
+        FROM
+        cnas_person_training cpt
+        LEFT JOIN user u1 ON cpt.compiler_id = u1.id
+        LEFT JOIN user u2 ON cpt.reviewer_id = u2.id
+        LEFT JOIN user u3 ON cpt.approver_id = u3.id
+        LEFT JOIN user u4 ON cpt.create_user = u4.id
+        <where>
+            <if test="departLimsId != null and departLimsId != ''">
+                and FIND_IN_SET(#{departLimsId}, u4.depart_lims_id)
+            </if>
+            <if test="compilerName != null and compilerName != ''">
+                and u4.name like concat('%', #{compilerName}, '%')
+            </if>
+        </where>
+        union
+        SELECT
+        cpt.*,
+        u1.name compiler_name,
+        u2.name reviewer_name,
+        u3.name approver_name,
+        u4.name create_user_name
+        FROM
+        cnas_person_training cpt
+        LEFT JOIN user u1 ON cpt.compiler_id = u1.id
+        LEFT JOIN user u2 ON cpt.reviewer_id = u2.id
+        LEFT JOIN user u3 ON cpt.approver_id = u3.id
+        LEFT JOIN user u4 ON cpt.create_user = u4.id
+        WHERE
+        u4.depart_lims_id is not null and length(u4.depart_lims_id) = 0
+        <if test="compilerName != null and compilerName != ''">
+            and u4.name like concat('%', #{compilerName}, '%')
+        </if>
+    </select>
+</mapper>
diff --git a/cnas-personnel/src/main/resources/mapper/PersonTrainingRecordMapper.xml b/cnas-personnel/src/main/resources/mapper/PersonTrainingRecordMapper.xml
new file mode 100644
index 0000000..88eabe4
--- /dev/null
+++ b/cnas-personnel/src/main/resources/mapper/PersonTrainingRecordMapper.xml
@@ -0,0 +1,127 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.personnel.mapper.PersonTrainingRecordMapper">
+
+    <select id="trainingAndAssessmentRecordsPage" resultType="com.ruoyi.personnel.dto.PersonTrainingRecordDto">
+        select cptr.*, u.account, u.name user_name, u.phone
+        from cnas_person_training_record cptr
+                 left join user u on u.id = cptr.user_id
+        where cptr.course_id = #{trainingDetailedId}
+        <if test="userName != null and userName != ''">
+            and u.name like concat('%', #{userName}, '%')
+        </if>
+    </select>
+
+    <select id="personnelTrainingPersonnel" resultType="com.ruoyi.personnel.dto.PersonTrainingRecordListDto">
+        select u.name, u.account, dl.name depart_lims_name, cpbi.professional_title,
+        cpbi.official_academic_redentials, u.id user_id
+        from user u
+        left join cnas_person_basic_info cpbi on cpbi.user_id = u.id
+        left join department_lims dl on dl.id = SUBSTRING_INDEX(SUBSTRING_INDEX(u.depart_lims_id, ',', -2), ',', 1)
+        where u.is_custom = 0
+        <if test="userName != '' and userName != null and userName != 'null'">
+            and u.name like concat('%', #{userName}, '%')
+        </if>
+        <if test="userId != null and userId != ''">
+            and u.id = #{userId}
+        </if>
+        <if test="departLimsId != null and departLimsId != ''">
+            and FIND_IN_SET(#{departLimsId}, u.depart_lims_id)
+        </if>
+    </select>
+
+    <select id="queryPersonnelDetails" resultType="com.ruoyi.personnel.dto.TrainingRecordPersonDetailedDto">
+        select cptd.training_date, cptd.training_content, cptd.class_hour, cptr.examination_results, cptd.remarks
+        from cnas_person_training_record cptr
+                 inner join cnas_person_training_detailed cptd on cptd.id = cptr.course_id
+        <where>
+            <if test="userId != null and userId != ''">
+                and cptr.user_id = #{userId}
+            </if>
+        </where>
+    </select>
+
+    <!-- 鏍规嵁璇︽儏id鏌ヨ鍩硅淇℃伅 -->
+    <select id="selectListByTrainingDetailedId" resultType="com.ruoyi.personnel.dto.PersonTrainingRecordDto">
+        select cptr.*,
+               u.name  userName,
+               dl.name department,
+               u.signature_url
+        from cnas_person_training_record cptr
+                 left join user u on u.id = cptr.user_id
+                 left join department_lims dl on find_in_set(dl.id, u.depart_lims_id) and dl.id != 1
+        where cptr.course_id = #{trainingDetailedId}
+    </select>
+
+    <!-- 鏍规嵁id鏌ヨ浜哄憳淇℃伅 -->
+    <select id="selectUserTraining" resultType="com.ruoyi.personnel.dto.PersonTrainingRecordListDto">
+        select u.name,
+               u.account,
+               dl.name                                    depart_lims_name,
+               cpbi.professional_title,
+               cpbi.official_academic_redentials,
+               cpbi.major1,
+               u.id                                       user_id,
+               DATE_FORMAT(cpbi.group_time, '%Y-%m-%d') AS unitTimeSting
+        from user u
+                 left join cnas_person_basic_info cpbi on cpbi.user_id = u.id
+                 left join department_lims dl on dl.id = SUBSTRING_INDEX(SUBSTRING_INDEX(u.depart_lims_id, ',', -2), ',', 1)
+        where u.is_custom = 0
+        and u.id = #{userId}
+    </select>
+
+    <!-- 鏍规嵁鐢ㄦ埛id鏌ヨ浜哄憳璁板綍 -->
+    <select id="selectPersonDetailedDtos" resultType="com.ruoyi.personnel.dto.TrainingRecordPersonDetailedDto">
+        select cptd.training_date,
+               cptd.training_content,
+               cptd.class_hour,
+               cptr.examination_results,
+               cptd.remarks,
+               DATE_FORMAT(cptd.training_date, '%Y-%m-%d') AS trainingDateString
+        from cnas_person_training_record cptr
+                 inner join cnas_person_training_detailed cptd on cptd.id = cptr.course_id
+            and cptr.user_id = #{userId}
+        <where>
+            <if test="year!= null and year!= ''">
+                and cptd.training_date like concat('%', #{year}, '%')}
+            </if>
+        </where>
+    </select>
+
+    <!--鏍规嵁鐢ㄦ埛id鍜屽勾浠芥煡璇汉鍛樻槑缁� 鍩硅璁板綍-->
+    <select id="queryPersonnelDetailsOfUserIdAndYear"
+            resultType="com.ruoyi.personnel.dto.TrainingRecordPersonDetailedDto">
+        select cptd.training_date, cptd.training_content, cptd.class_hour, cptr.examination_results, cptd.remarks
+        from cnas_person_training_record cptr
+        inner join cnas_person_training_detailed cptd on cptd.id = cptr.course_id
+        <where>
+            <if test="userId != null and userId != ''">
+                and cptr.user_id = #{userId}
+            </if>
+            <if test="year!= null and year!= ''">
+                and cptd.training_date like concat('%', #{year}, '%')
+            </if>
+        </where>
+    </select>
+
+    <!-- 鏍规嵁鐢ㄦ埛id鍜屽勾浠芥煡璇汉鍛樻槑缁� 鍩硅璁板綍瀵煎嚭 -->
+    <select id="selectPersonDetailedDtosByTrainingDate"
+            resultType="com.ruoyi.personnel.dto.TrainingRecordPersonDetailedDto">
+        select cptd.training_date,
+        cptd.training_content,
+        cptd.class_hour,
+        cptr.examination_results,
+        cptd.remarks,
+        cptd.training_date AS trainingDateString
+        from cnas_person_training_record cptr
+        inner join cnas_person_training_detailed cptd on cptd.id = cptr.course_id
+        and cptr.user_id = #{userId}
+        <where>
+            <if test="year!= null and year!= ''">
+                and cptd.training_date like concat('%', #{year}, '%')
+            </if>
+        </where>
+        order by STR_TO_DATE(CONCAT(cptd.training_date, '.01'), '%Y.%m.%d')
+
+    </select>
+</mapper>
diff --git a/cnas-personnel/src/main/resources/static/communication-deal.docx b/cnas-personnel/src/main/resources/static/communication-deal.docx
new file mode 100644
index 0000000..9045072
--- /dev/null
+++ b/cnas-personnel/src/main/resources/static/communication-deal.docx
Binary files differ
diff --git a/cnas-personnel/src/main/resources/static/credentials-deal.docx b/cnas-personnel/src/main/resources/static/credentials-deal.docx
new file mode 100644
index 0000000..2fda5fd
--- /dev/null
+++ b/cnas-personnel/src/main/resources/static/credentials-deal.docx
Binary files differ
diff --git a/cnas-personnel/src/main/resources/static/explain-deal.docx b/cnas-personnel/src/main/resources/static/explain-deal.docx
new file mode 100644
index 0000000..7333bec
--- /dev/null
+++ b/cnas-personnel/src/main/resources/static/explain-deal.docx
Binary files differ
diff --git a/cnas-personnel/src/main/resources/static/person-basic-info.docx b/cnas-personnel/src/main/resources/static/person-basic-info.docx
new file mode 100644
index 0000000..6d1739a
--- /dev/null
+++ b/cnas-personnel/src/main/resources/static/person-basic-info.docx
Binary files differ
diff --git a/cnas-personnel/src/main/resources/static/person-training-record.docx b/cnas-personnel/src/main/resources/static/person-training-record.docx
new file mode 100644
index 0000000..360dbcb
--- /dev/null
+++ b/cnas-personnel/src/main/resources/static/person-training-record.docx
Binary files differ
diff --git a/cnas-personnel/src/main/resources/static/person-training.docx b/cnas-personnel/src/main/resources/static/person-training.docx
new file mode 100644
index 0000000..ab13ad6
--- /dev/null
+++ b/cnas-personnel/src/main/resources/static/person-training.docx
Binary files differ
diff --git a/cnas-personnel/src/main/resources/static/personnel-capacity.docx b/cnas-personnel/src/main/resources/static/personnel-capacity.docx
new file mode 100644
index 0000000..e7ad3b9
--- /dev/null
+++ b/cnas-personnel/src/main/resources/static/personnel-capacity.docx
Binary files differ
diff --git a/cnas-personnel/src/main/resources/static/super-vise-plan.docx b/cnas-personnel/src/main/resources/static/super-vise-plan.docx
new file mode 100644
index 0000000..8e5a56f
--- /dev/null
+++ b/cnas-personnel/src/main/resources/static/super-vise-plan.docx
Binary files differ
diff --git a/cnas-personnel/src/main/resources/static/supervision-control-sheet.docx b/cnas-personnel/src/main/resources/static/supervision-control-sheet.docx
new file mode 100644
index 0000000..dc398e3
--- /dev/null
+++ b/cnas-personnel/src/main/resources/static/supervision-control-sheet.docx
Binary files differ
diff --git a/cnas-personnel/src/main/resources/static/supervision-processing-sheet.docx b/cnas-personnel/src/main/resources/static/supervision-processing-sheet.docx
new file mode 100644
index 0000000..16775b0
--- /dev/null
+++ b/cnas-personnel/src/main/resources/static/supervision-processing-sheet.docx
Binary files differ
diff --git a/cnas-personnel/src/main/resources/static/supervision-record.docx b/cnas-personnel/src/main/resources/static/supervision-record.docx
new file mode 100644
index 0000000..ede4555
--- /dev/null
+++ b/cnas-personnel/src/main/resources/static/supervision-record.docx
Binary files differ
diff --git a/cnas-personnel/src/main/resources/static/training-record.docx b/cnas-personnel/src/main/resources/static/training-record.docx
new file mode 100644
index 0000000..1e6955d
--- /dev/null
+++ b/cnas-personnel/src/main/resources/static/training-record.docx
Binary files differ
diff --git a/cnas-process/src/main/java/com/ruoyi/process/controller/InconsistentDistributionController.java b/cnas-process/src/main/java/com/ruoyi/process/controller/InconsistentDistributionController.java
new file mode 100644
index 0000000..9ee3346
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/controller/InconsistentDistributionController.java
@@ -0,0 +1,94 @@
+package com.ruoyi.process.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.process.dto.InconsistentDistributionDto;
+import com.ruoyi.process.pojo.InconsistentDistribution;
+import com.ruoyi.process.service.InconsistentDistributionService;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+
+import jakarta.servlet.http.HttpServletResponse;
+import java.util.Map;
+
+/**
+ * <p>
+ * 涓嶇鍚堥」鐨勫垎甯� 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 
+ * @since 2024-11-15 09:53:20
+ */
+@Tag(name = "涓嶇鍚堥」鐨勫垎甯�")
+@AllArgsConstructor
+@RestController
+@RequestMapping("/inconsistentDistribution")
+public class InconsistentDistributionController {
+
+    private InconsistentDistributionService inconsistentDistributionService;
+
+    /**
+     * 涓嶇鍚堥」鐨勫垎甯冨垎椤垫煡璇�
+     * @param
+     * @return
+     */
+    @Operation(summary = "涓嶇鍚堥」鐨勫垎甯冨垎椤垫煡璇�")
+    @GetMapping("/pageInconsistentDistribution")
+    public Result<IPage<InconsistentDistributionDto>> pageInconsistentDistribution(Page page, InconsistentDistribution inconsistentDistribution) throws Exception {
+        return Result.success(inconsistentDistributionService.pageInconsistentDistribution(page, inconsistentDistribution));
+    }
+
+    /**
+     * 涓嶇鍚堥」鐨勫垎甯冩柊澧�
+     * @return
+     */
+    @Operation(summary = "涓嶇鍚堥」鐨勫垎甯冩柊澧�")
+    @PostMapping("/addInconsistentDistribution")
+    public Result addInconsistentDistribution(@RequestBody InconsistentDistributionDto inconsistentDistribution){
+        return Result.success(inconsistentDistributionService.addInconsistentDistribution(inconsistentDistribution));
+    }
+
+    /**
+     * 涓嶇鍚堥」鐨勫垎甯冧慨鏀�
+     * @return
+     */
+    @Operation(summary = "涓嶇鍚堥」鐨勫垎甯冧慨鏀�")
+    @PostMapping("/updateInconsistentDistribution")
+    public Result updateInconsistentDistribution(@RequestBody InconsistentDistributionDto inconsistentDistribution){
+        return Result.success(inconsistentDistributionService.updateInconsistentDistribution(inconsistentDistribution));
+    }
+
+    /**
+     * 涓嶇鍚堥」鐨勫垎甯冨垹闄�
+     * @return
+     */
+    @Operation(summary = "涓嶇鍚堥」鐨勫垎甯冨垹闄�")
+    @DeleteMapping("/delInconsistentDistribution")
+    public Result delInconsistentDistribution(Integer distributionId){
+        return Result.success(inconsistentDistributionService.delInconsistentDistribution(distributionId));
+    }
+
+    /**
+     * 涓嶇鍚堥」鐨勫垎甯冩煡鐪嬭鎯�
+     * @return
+     */
+    @Operation(summary = "涓嶇鍚堥」鐨勫垎甯冩煡鐪嬭鎯�")
+    @GetMapping("/getInconsistentDistributionOne")
+    public Result<InconsistentDistributionDto> getInconsistentDistributionOne(Integer distributionId){
+        return Result.success(inconsistentDistributionService.getInconsistentDistributionOne(distributionId));
+    }
+
+    /**
+     * 瀵煎嚭涓嶇鍚堥」鐨勫垎甯�
+     * @return
+     */
+    @Operation(summary = "瀵煎嚭涓嶇鍚堥」鐨勫垎甯�")
+    @GetMapping("/exportInconsistentDistribution")
+    public void exportInconsistentDistribution(Integer distributionId, HttpServletResponse response){
+        inconsistentDistributionService.exportInconsistentDistribution(distributionId, response);
+    }
+
+}
diff --git a/cnas-process/src/main/java/com/ruoyi/process/controller/InspectionOrderController.java b/cnas-process/src/main/java/com/ruoyi/process/controller/InspectionOrderController.java
new file mode 100644
index 0000000..1b9c4c3
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/controller/InspectionOrderController.java
@@ -0,0 +1,126 @@
+package com.ruoyi.process.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.common.utils.JackSonUtil;
+import com.ruoyi.inspect.pojo.InsOrder;
+import com.ruoyi.process.dto.InspectionOrderDto;
+import com.ruoyi.process.pojo.InspectionOrder;
+import com.ruoyi.process.service.InspectionOrderService;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import jakarta.servlet.http.HttpServletResponse;
+import java.util.Map;
+
+/**
+ * <p>
+ * 妫�楠屽鎵樺崟 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-09
+ */
+@Tag(name = "妫�楠屽鎵樺崟")
+@AllArgsConstructor
+@RestController
+@RequestMapping("/inspectionOrder")
+public class InspectionOrderController {
+
+    private InspectionOrderService inspectionOrderService;
+
+    /**
+     * 濮旀墭鍗曟楠屽垎椤垫煡璇�
+     * @return
+     */
+    @Operation(summary = "濮旀墭鍗曟楠屽垎椤垫煡璇�")
+    @GetMapping("/pageInspectionOrder")
+    public Result<IPage<InspectionOrderDto>> pageInspectionOrder(InspectionOrder inspectionOrder,Page page) throws Exception {
+        return Result.success(inspectionOrderService.pageInspectionOrder(page, inspectionOrder));
+    }
+
+    /**
+     * 濮旀墭鍗曟楠屾柊澧�
+     * @return
+     */
+
+    @Operation(summary = "濮旀墭鍗曟楠屾柊澧�")
+    @PostMapping("/addInspectionOrder")
+    public Result addInspectionOrder(@RequestBody InspectionOrderDto InspectionOrder){
+        return Result.success(inspectionOrderService.addInspectionOrder(InspectionOrder));
+    }
+
+    /**
+     * 濮旀墭鍗曟楠屼慨鏀�
+     * @return
+     */
+    @Operation(summary = "濮旀墭鍗曟楠屼慨鏀�")
+    @PostMapping("/updateInspectionOrder")
+    public Result updateInspectionOrder(@RequestBody InspectionOrderDto InspectionOrder){
+        return Result.success(inspectionOrderService.updateInspectionOrder(InspectionOrder));
+    }
+
+    /**
+     * 濮旀墭鍗曟楠屽垹闄�
+     * @return
+     */
+    @Operation(summary = "濮旀墭鍗曟楠屽垹闄�")
+    @DeleteMapping("/delInspectionOrder")
+    public Result delInspectionOrder(Integer inspectionOrderId){
+        return Result.success(inspectionOrderService.delInspectionOrder(inspectionOrderId));
+    }
+
+    /**
+     * 濮旀墭鍗曟楠屾煡鐪嬭鎯�
+     * @return
+     */
+    @Operation(summary = "濮旀墭鍗曟楠屾煡鐪嬭鎯�")
+    @GetMapping("/getInspectionOrderOne")
+    public Result<InspectionOrderDto> getInspectionOrderOne(Integer inspectionOrderId){
+        return Result.success(inspectionOrderService.getInspectionOrderOne(inspectionOrderId));
+    }
+
+    /**
+     * 濮旀墭鍗曟楠屾煡鐪嬭鎯�
+     * @return
+     */
+    @Operation(summary = "鏍规嵁鎴愬搧璁㈠崟鏌ヨ濮旀墭鍗曡鎯�")
+    @GetMapping("/getInspectionOrderByInsOderId")
+    public Result<InspectionOrderDto> getInspectionOrderByInsOderId(Integer insOrderId){
+        return Result.success(inspectionOrderService.getInspectionOrderByInsOderId(insOrderId));
+    }
+
+    /**
+     * 濮旀墭鍗曟煡璇㈡垚鍝佽鍗�
+     * @return
+     */
+    @Operation(summary = "濮旀墭鍗曟煡璇㈡垚鍝佽鍗�")
+    @GetMapping("/getInsOrderOnInspection")
+    public Result<IPage<InsOrder>> getInsOrderOnInspection(Page page ,InsOrder insOrder) throws Exception {
+        return Result.success(inspectionOrderService.getInsOrderOnInspection(page, insOrder));
+    }
+
+    /**
+     * 濮旀墭鍗曟垚鍝佹姤鍛婁笂浼�
+     * @return
+     */
+    @Operation(summary = "濮旀墭鍗曟垚鍝佹姤鍛婁笂浼�")
+    @PostMapping("/uploadInspectionOrderFile")
+    public Result uploadInspectionOrderFile(MultipartFile file, Integer inspectionOrderId) {
+        return Result.success(inspectionOrderService.uploadInspectionOrderFile(file, inspectionOrderId));
+    }
+
+    /**
+     * 瀵煎嚭妫�楠屽鎵樺崟
+     * @return
+     */
+    @Operation(summary = "瀵煎嚭妫�楠屽鎵樺崟")
+    @GetMapping("/exportInspectionOrder")
+    public void exportInspectionOrder(Integer inspectionOrderId, HttpServletResponse response){
+        inspectionOrderService.exportInspectionOrder(inspectionOrderId, response);
+    }
+}
diff --git a/cnas-process/src/main/java/com/ruoyi/process/controller/ProcessComplainController.java b/cnas-process/src/main/java/com/ruoyi/process/controller/ProcessComplainController.java
new file mode 100644
index 0000000..80f42c2
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/controller/ProcessComplainController.java
@@ -0,0 +1,67 @@
+package com.ruoyi.process.controller;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.common.utils.JackSonUtil;
+import com.ruoyi.process.pojo.ProcessComplain;
+import com.ruoyi.process.service.ProcessComplainService;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
+import org.springframework.web.bind.annotation.*;
+
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletResponse;
+import java.util.Map;
+
+/**
+ * <p>
+ * 鎶曡瘔 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-02 09:29:11
+ */
+@RestController
+@RequestMapping("/processComplain")
+@Tag(name = "鎶曡瘔")
+public class ProcessComplainController {
+
+    @Resource
+    private ProcessComplainService processComplainService;
+
+    @Operation(summary = "鎶曡瘔鎯呭喌姹囨�昏〃")
+    @GetMapping("/pageProcessComplain")
+    public Result pageProcessComplain( ProcessComplain processComplain,Page page) throws Exception {
+        return Result.success(processComplainService.pageProcessComplain(page, processComplain));
+    }
+
+    @Operation(summary = "鏂板鎶曡瘔")
+    @PostMapping("/addProcessComplain")
+    public Result addProcessComplain(@RequestBody ProcessComplain processComplain ) {
+        return Result.success(processComplainService.addProcessComplain(processComplain));
+    }
+
+    @Operation(summary = "鍒犻櫎鎶曡瘔")
+    @DeleteMapping("/delProcessComplain")
+    public Result delProcessComplain(Long id) {
+        return Result.success(processComplainService.removeById(id));
+    }
+
+    @Operation(summary = "鎶曡瘔璇︽儏")
+    @GetMapping("/getProcessComplain")
+    public Result getProcessComplain(Long id) {
+        return Result.success(processComplainService.getProcessComplain(id));
+    }
+
+    @Operation(summary = "澶勭悊鎶曡瘔")
+    @PostMapping("/doProcessComplain")
+    public Result doProcessComplain(@RequestBody ProcessComplain processComplain) {
+        return Result.success(processComplainService.doProcessComplain(processComplain));
+    }
+
+    @Operation(summary = "瀵煎嚭鍒楄〃")
+    @GetMapping("/exportProcessComplain")
+    public void exportProcessComplain(ProcessComplain processComplain,HttpServletResponse response) throws Exception {
+        processComplainService.exportProcessComplain(processComplain,response);
+    }
+}
diff --git a/cnas-process/src/main/java/com/ruoyi/process/controller/ProcessDealController.java b/cnas-process/src/main/java/com/ruoyi/process/controller/ProcessDealController.java
new file mode 100644
index 0000000..afccb46
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/controller/ProcessDealController.java
@@ -0,0 +1,51 @@
+package com.ruoyi.process.controller;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.common.utils.JackSonUtil;
+import com.ruoyi.process.pojo.ProcessDeal;
+import com.ruoyi.process.service.ProcessDealService;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
+import org.springframework.web.bind.annotation.*;
+
+import jakarta.annotation.Resource;
+import java.util.Map;
+
+/**
+ * <p>
+ * 妫�娴嬫垨鏍″噯鐗╁搧鐨勫缃� 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-02 02:50:19
+ */
+@RestController
+@RequestMapping("/processDeal")
+@Tag(name = "妫�娴嬫垨鏍″噯鐗╁搧鐨勫缃�")
+public class ProcessDealController {
+
+    @Resource
+    private ProcessDealService processDealService;
+
+    @Operation(summary = "鏂板妫�娴嬫垨鏍″噯鐗╁搧鐨勫缃�")
+    @PostMapping("/addProcessDeal")
+    public Result addProcessDeal(@RequestBody ProcessDeal processDeal) {
+        return Result.success(processDealService.saveOrUpdate(processDeal));
+    }
+
+    @Operation(summary = "鍒犻櫎妫�娴嬫垨鏍″噯鐗╁搧鐨勫缃�")
+    @DeleteMapping("/delProcessDeal")
+    public Result delProcessDeal(Integer id) {
+        return Result.success(processDealService.removeById(id));
+    }
+
+
+    @Operation(summary = "鏌ョ湅妫�娴嬫垨鏍″噯鐗╁搧鐨勫缃�")
+    @GetMapping("/getProcessDeal")
+    public Result getProcessDeal(Integer id) {
+        return Result.success(processDealService.list(Wrappers.<ProcessDeal>lambdaQuery().eq(ProcessDeal::getTotaldealId,id)));
+    }
+
+}
diff --git a/cnas-process/src/main/java/com/ruoyi/process/controller/ProcessEvaluateController.java b/cnas-process/src/main/java/com/ruoyi/process/controller/ProcessEvaluateController.java
new file mode 100644
index 0000000..dac177e
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/controller/ProcessEvaluateController.java
@@ -0,0 +1,62 @@
+package com.ruoyi.process.controller;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.process.pojo.ProcessEvaluate;
+import com.ruoyi.process.service.ProcessEvaluateService;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletResponse;
+import java.util.Map;
+
+/**
+ * <p>
+ * 娴嬮噺涓嶇‘瀹氬害鐨勮瘎浠� 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-02 01:10:43
+ */
+@RestController
+@RequestMapping("/processEvaluate")
+@Tag(name = "娴嬮噺涓嶇‘瀹氬害鐨勮瘎浠�")
+public class ProcessEvaluateController {
+
+    @Resource
+    private ProcessEvaluateService processEvaluateService;
+
+    @Operation(summary = "鏌ヨ娴嬮噺涓嶇‘瀹氬害鐨勮瘎瀹氬垪琛�")
+    @GetMapping("/pageProcessEvaluate")
+    public Result pageProcessEvaluate(ProcessEvaluate processEvaluate,Page page) throws Exception {
+        return Result.success(processEvaluateService.pageProcessEvaluate(page, processEvaluate));
+    }
+
+    @Operation(summary = "鏂板娴嬮噺涓嶇‘瀹氬害鐨勮瘎瀹�")
+    @PostMapping("/addProcessEvaluate")
+    public Result addProcessEvaluate(MultipartFile file){
+        return Result.success(processEvaluateService.addProcessEvaluate(file));
+    }
+
+    @Operation(summary = "璇勪环")
+    @PostMapping("/doProcessEvaluate")
+    public Result doProcessEvaluate(@RequestBody ProcessEvaluate processEvaluate){
+        return Result.success(processEvaluateService.doProcessEvaluate(processEvaluate));
+    }
+
+    @Operation(summary = "鍒犻櫎娴嬮噺涓嶇‘瀹氬害鐨勮瘎瀹�")
+    @DeleteMapping("/delProcessEvaluate")
+    public Result delProcessEvaluate(Long id){
+        return Result.success(processEvaluateService.removeById(id));
+    }
+
+    @Operation(summary = "瀵煎嚭娴嬮噺涓嶇‘瀹氬害鐨勮瘎瀹�")
+    @GetMapping("/exportProcessEvaluate")
+    public void exportProcessEvaluate(ProcessEvaluate processEvaluate, HttpServletResponse response) throws Exception{
+        processEvaluateService.exportProcessEvaluate(processEvaluate,response);
+    }
+
+}
diff --git a/cnas-process/src/main/java/com/ruoyi/process/controller/ProcessMethodSearchNewController.java b/cnas-process/src/main/java/com/ruoyi/process/controller/ProcessMethodSearchNewController.java
new file mode 100644
index 0000000..70e3cb5
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/controller/ProcessMethodSearchNewController.java
@@ -0,0 +1,128 @@
+package com.ruoyi.process.controller;
+
+
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.process.dto.ProcessMethodSearchNewArchivedDto;
+import com.ruoyi.process.dto.ProcessMethodSearchNewBackupsDto;
+import com.ruoyi.process.pojo.ProcessMethodSearchNew;
+import com.ruoyi.process.pojo.ProcessMethodSearchNewArchived;
+import com.ruoyi.process.pojo.ProcessMethodSearchNewBackups;
+import com.ruoyi.process.service.ProcessMethodSearchNewService;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import jakarta.servlet.http.HttpServletResponse;
+import java.util.List;
+import java.util.Map;
+
+
+/**
+ * 鏍囧噯鏌ユ柊
+ *
+ * @author zhuo
+ * @since 2024-11-04
+ */
+@Tag(name = "鏍囧噯鏌ユ柊")
+@AllArgsConstructor
+@RestController
+@RequestMapping("/processMethodSearchNew")
+public class ProcessMethodSearchNewController {
+
+    private ProcessMethodSearchNewService processMethodSearchNewService;
+
+    /**
+     * 鏂板鏍囧噯鏌ユ柊
+     * @param processMethodSearchNewList
+     * @return
+     */
+    @Operation(summary = "鏂板鏍囧噯鏌ユ柊")
+    @PostMapping("/addMethodSearchNew")
+    public Result addMethodSearchNew(@RequestBody List<ProcessMethodSearchNew> processMethodSearchNewList ) {
+        return Result.success(processMethodSearchNewService.addMethodSearchNew(processMethodSearchNewList));
+    }
+
+    /**
+     * 淇敼鏍囧噯鏌ユ柊
+     * @param processMethodSearchNew
+     * @return
+     */
+    @Operation(summary = "淇敼鏍囧噯鏌ユ柊")
+    @PostMapping("/updateMethodSearchNew")
+    public Result updateMethodSearchNew(@RequestBody ProcessMethodSearchNew processMethodSearchNew ) {
+        return Result.success(processMethodSearchNewService.updateById(processMethodSearchNew));
+    }
+
+    /**
+     * 鏍囧噯鏌ユ柊鍒楄〃
+     */
+    @Operation(summary = "鏍囧噯鏌ユ柊鍒楄〃")
+    @GetMapping("/pageMethodSearchNew")
+    public Result<IPage<ProcessMethodSearchNew>> pageMethodSearchNew(ProcessMethodSearchNewBackupsDto processMethodSearchNew,Page page) throws Exception {
+        return Result.success(processMethodSearchNewService.pageMethodSearchNew(page, processMethodSearchNew));
+    }
+
+    @Operation(summary = "鏍囧噯鏌ユ柊瀵煎嚭")
+    @GetMapping("/exportMethodSearchNew")
+    public void exportMethodSearchNew(Integer archivedId, HttpServletResponse response) throws Exception {
+        processMethodSearchNewService.exportMethodSearchNew(archivedId, response);
+    }
+
+    /**
+     * 瀵煎叆鏍囧噯鏌ユ柊
+     * @return
+     */
+    @Operation(summary = "瀵煎叆鏍囧噯鏌ユ柊")
+    @PostMapping("/importMethodSearchNew")
+    public Result importMethodSearchNew(MultipartFile file){
+        return Result.success(processMethodSearchNewService.importMethodSearchNew(file));
+    }
+
+    /**
+     * 鏂板瀛樻。
+     * @param archived
+     * @return
+     */
+    @Operation(summary = "鏂板瀛樻。")
+    @PostMapping("/addSearchNewArchived")
+    public Result addSearchNewApprovalProcess(@RequestBody ProcessMethodSearchNewArchived archived) {
+        return Result.success(processMethodSearchNewService.addSearchNewArchived(archived));
+    }
+
+    /**
+     * 鏂板瀛樻。
+     * @return
+     */
+    @Operation(summary = "鏌ヨ瀛樻。")
+    @GetMapping("/pageSearchNewArchived")
+    public Result pageSearchNewArchived(ProcessMethodSearchNewArchivedDto archived,Page page) throws Exception {
+        return Result.success(processMethodSearchNewService.pageSearchNewArchived(page, archived));
+    }
+
+    /**
+     * 鏍囧噯鏌ユ柊鍒楄〃
+     * @return
+     */
+    @Operation(summary = "鏌ヨ瀛樻。澶囦唤鍒楄〃")
+    @GetMapping("/pageSearchNewBackups")
+    public Result<IPage<ProcessMethodSearchNewBackups>> pageSearchNewBackups(ProcessMethodSearchNewBackups backups,Page page) throws Exception {
+        return Result.success(processMethodSearchNewService.pageSearchNewBackups(page, backups));
+    }
+
+
+    /**
+     * 瀛樻。鎵瑰噯
+     * @return
+     */
+    @Operation(summary = "瀛樻。鎵瑰噯")
+    @PostMapping("/ratifySearchNewArchivedr")
+    public Result ratifySearchNewArchivedr(@RequestBody ProcessMethodSearchNewArchived archived) {
+        return Result.success(processMethodSearchNewService.ratifySearchNewArchivedr(archived));
+    }
+}
+
diff --git a/cnas-process/src/main/java/com/ruoyi/process/controller/ProcessMethodVerifyController.java b/cnas-process/src/main/java/com/ruoyi/process/controller/ProcessMethodVerifyController.java
new file mode 100644
index 0000000..6c04881
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/controller/ProcessMethodVerifyController.java
@@ -0,0 +1,156 @@
+package com.ruoyi.process.controller;
+
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.process.dto.ProcessMethodVerifyDto;
+import com.ruoyi.process.pojo.ProcessMethodVerify;
+import com.ruoyi.process.pojo.ProcessMethodVerifyMethodFile;
+import com.ruoyi.process.service.ProcessMethodVerifyMethodFileService;
+import com.ruoyi.process.service.ProcessMethodVerifyService;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
+import lombok.AllArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletResponse;
+import java.util.List;
+import java.util.Map;
+
+
+/**
+ * 鏍囧噯鏂规硶楠岃瘉
+ *
+ * @author zhuo
+ * @since 2024-11-05
+ */
+@RestController
+@RequestMapping("/processMethodVerify")
+@Tag(name = "鏍囧噯鏂规硶楠岃瘉")
+@AllArgsConstructor
+public class ProcessMethodVerifyController {
+
+    @Resource
+    private ProcessMethodVerifyService processMethodVerifyService;
+
+    @Resource
+    private ProcessMethodVerifyMethodFileService processMethodVerifyMethodFileService;
+
+
+
+    /**
+     * 鏍囧噯鏌ユ柊鍒楄〃
+     * @return
+     */
+    @Operation(summary = "鏍囧噯鏂规硶鏇存柊楠岃瘉鍒楄〃")
+    @GetMapping("/pagesMethodVerify")
+    public Result<IPage<ProcessMethodVerify>> pagesMethodVerify(ProcessMethodVerifyDto methodVerifyDto,Page page) throws Exception {
+        return Result.success(processMethodVerifyService.pagesMethodVerify(page, methodVerifyDto));
+    }
+
+    /**
+     * 鏂板鏍囧噯鏂规硶楠岃瘉
+     * @param methodVerifyDto
+     * @return
+     */
+    @Operation(summary = "鏂板鏍囧噯鏂规硶楠岃瘉")
+    @PostMapping("/addMethodVerify")
+    public Result addMethodVerify(@RequestBody ProcessMethodVerifyDto methodVerifyDto ) {
+        return Result.success(processMethodVerifyService.addMethodSearchNew(methodVerifyDto));
+    }
+
+    /**
+     * 鏌ヨ鏍囧噯鏂规硶楠岃瘉璇︽儏
+     * @param methodVerifyId
+     * @return
+     */
+    @Operation(summary = "鏌ヨ鏍囧噯鏂规硶楠岃瘉璇︽儏")
+    @GetMapping("/getMethodVerifyOne")
+    public Result<ProcessMethodVerifyDto> getMethodVerifyOne(Integer methodVerifyId) {
+        return Result.success(processMethodVerifyService.getMethodVerifyOne(methodVerifyId));
+    }
+
+
+    /**
+     * 淇敼鏍囧噯鏂规硶楠岃瘉
+     * @param methodVerifyDto
+     * @return
+     */
+    @Operation(summary = "淇敼鏍囧噯鏂规硶楠岃瘉")
+    @PostMapping("/updateMethodVerify")
+    public Result updateMethodVerify(@RequestBody ProcessMethodVerifyDto methodVerifyDto ) {
+        return Result.success(processMethodVerifyService.updateMethodVerify(methodVerifyDto));
+    }
+
+    /**
+     * 鍒犻櫎鏍囧噯鏂规硶鏇存柊楠岃瘉
+     * @param methodVerifyId
+     * @return
+     */
+    @Operation(summary = "鍒犻櫎鏍囧噯鏂规硶鏇存柊楠岃瘉")
+    @DeleteMapping("/delMethodVerify")
+    public Result delMethodVerify(Integer methodVerifyId){
+        return Result.success(processMethodVerifyService.delMethodVerify(methodVerifyId));
+    }
+
+    /**
+     * 瀵煎嚭鏍囧噯鏂规硶鏇存柊楠岃瘉
+     * @param methodVerifyId 鏍囧噯鏂规硶楠岃瘉id
+     */
+    @Operation(summary = "瀵煎嚭鏍囧噯鏂规硶鏇存柊楠岃瘉")
+    @GetMapping("/exportMethodVerify")
+    public void exportMethodVerify(Integer methodVerifyId, HttpServletResponse response){
+        processMethodVerifyService.exportMethodVerify(methodVerifyId, response);
+    }
+
+    /**
+     * 楠岃瘉纭
+     * @param methodVerifyId
+     * @return
+     */
+    @Operation(summary = "楠岃瘉纭")
+    @GetMapping("/methodVerifyAffirm")
+    public Result methodVerifyAffirm(Integer methodVerifyId) {
+        return Result.success(processMethodVerifyService.methodVerifyAffirm(methodVerifyId));
+    }
+
+    /**
+     * 鏂规硶楠岃瘉鏂板鍘熷璁板綍
+     * @param methodVerifyId
+     * @param file
+     * @return
+     */
+    @Operation(summary = "鏂规硶楠岃瘉鏂板鍘熷璁板綍")
+    @PostMapping("/uploadVerifyMethodFile")
+    public Result<?> uploadVerifyMethodFile(Integer methodVerifyId, MultipartFile file) {
+        return Result.success(processMethodVerifyService.uploadVerifyMethodFile(methodVerifyId, file));
+    }
+
+
+    /**
+     * 鏍囧噯鏂规硶鏇存柊楠岃瘉鍘熷璁板綍鍒楄〃
+     * @return
+     */
+    @Operation(summary = "鏍囧噯鏂规硶鏇存柊楠岃瘉鍘熷璁板綍鍒楄〃")
+    @GetMapping("/getVerifyMethodFileList")
+    public Result<List<ProcessMethodVerifyMethodFile>> getVerifyMethodFileList(Integer methodVerifyId){
+        return Result.success(processMethodVerifyService.getVerifyMethodFileList(methodVerifyId));
+    }
+
+    /**
+     * 鏍囧噯鏂规硶鍒犻櫎楠岃瘉鍘熷璁板綍鍒楄〃
+     * @return
+     */
+    @Operation(summary = "鏍囧噯鏂规硶鍒犻櫎楠岃瘉鍘熷璁板綍鍒楄〃")
+    @DeleteMapping("/delVerifyMethodFileList")
+    public Result delVerifyMethodFileList(Integer methodFileId){
+        return Result.success(processMethodVerifyMethodFileService.removeById(methodFileId));
+    }
+
+
+}
+
diff --git a/cnas-process/src/main/java/com/ruoyi/process/controller/ProcessOrderDeviceController.java b/cnas-process/src/main/java/com/ruoyi/process/controller/ProcessOrderDeviceController.java
new file mode 100644
index 0000000..255fb8b
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/controller/ProcessOrderDeviceController.java
@@ -0,0 +1,64 @@
+package com.ruoyi.process.controller;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.device.pojo.DeviceRecord;
+import com.ruoyi.device.service.DeviceRecordService;
+import com.ruoyi.process.pojo.ProcessOrderDevice;
+import com.ruoyi.process.service.ProcessOrderDeviceService;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import jakarta.servlet.http.HttpServletResponse;
+
+/**
+ * <p>
+ * cnas璁惧浣跨敤璁板綍琛�(7.1妫�楠屽鎵樺崟) 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author
+ * @since 2025-04-17 03:51:48
+ */
+@Tag(name = "cnas璁惧浣跨敤璁板綍")
+@RestController
+@RequestMapping("/processOrderDevice")
+public class ProcessOrderDeviceController {
+    @Autowired
+    private ProcessOrderDeviceService processOrderDeviceService;
+
+    @Operation(summary = "璁惧浣跨敤璁板綍鏌ヨ")
+    @GetMapping("/deviceRecordPage")
+    public Result deviceRecordPage(Integer deviceId, Page page, String sampleCode, String managementNumber) {
+        return Result.success(processOrderDeviceService.deviceRecordPage(deviceId, page, sampleCode, managementNumber));
+    }
+
+    @Operation(summary = "鏂板")
+    @PostMapping("/saveDeviceRecord")
+    public Result saveDeviceRecords(@RequestBody ProcessOrderDevice processOrderDevice) {
+        return Result.success(processOrderDeviceService.save(processOrderDevice));
+    }
+
+    /**
+     * 缂栬緫璁惧浣跨敤璁板綍
+     * @param processOrderDevice
+     * @return
+     */
+    @Operation(summary = "淇敼")
+    @PostMapping("/updateDeviceRecord")
+    public Result updateDeviceRecord(@RequestBody ProcessOrderDevice processOrderDevice) {
+        return Result.success(processOrderDeviceService.updateById(processOrderDevice));
+    }
+
+    @DeleteMapping("/deleteDeviceRecord")
+    public Result deleteDeviceRecords(@RequestParam("id") Integer id) {
+        return Result.success(processOrderDeviceService.removeById(id));
+    }
+
+    @Operation(summary = "璁惧浣跨敤璁板綍瀵煎嚭")
+    @GetMapping("/exportUseRecord")
+    public void exportUseRecord(Integer deviceId, String exportDate, HttpServletResponse response){
+        //processOrderDeviceService.exportUseRecord(deviceId, exportDate, response);
+    }
+}
diff --git a/cnas-process/src/main/java/com/ruoyi/process/controller/ProcessReportController.java b/cnas-process/src/main/java/com/ruoyi/process/controller/ProcessReportController.java
new file mode 100644
index 0000000..ca16864
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/controller/ProcessReportController.java
@@ -0,0 +1,71 @@
+package com.ruoyi.process.controller;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.process.dto.ProcessReportDto;
+import com.ruoyi.process.pojo.ProcessReport;
+import com.ruoyi.process.service.ProcessReportService;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
+import org.springframework.web.bind.annotation.*;
+
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletResponse;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ * 妫�楠屾姤鍛婂彂鏀剧櫥璁拌〃 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-05 08:58:39
+ */
+@RestController
+@RequestMapping("/processReport")
+@Tag(name = "妫�楠屾姤鍛婂彂鏀剧櫥璁拌〃")
+public class ProcessReportController {
+
+    @Resource
+    private ProcessReportService processReportService;
+
+    @Operation(summary = "鏌ヨ妫�楠屾姤鍛婂彂鏀剧櫥璁板垪琛�")
+    @GetMapping("/pageProcessReport")
+    public Result pageProcessReport(ProcessReportDto processReport , Page page) {
+        return Result.success(processReportService.pageProcessReport(page, processReport));
+    }
+
+    @Operation(summary = "鏂板妫�楠屾姤鍛婂彂鏀剧櫥璁�")
+    @PostMapping("/addProcessReport")
+    public Result  addProcessReport(@RequestBody ProcessReport processReport) {
+        return Result.success(processReportService.save(processReport));
+    }
+
+    @Operation(summary = "鍒犻櫎妫�楠屾姤鍛婂彂鏀剧櫥璁�")
+    @DeleteMapping("/delProcessReport")
+    public Result delProcessReport(Long id) {
+        return Result.success(processReportService.removeById(id));
+    }
+
+    @Operation(summary = "鏌ョ湅妫�楠屾姤鍛婂彂鏀剧櫥璁拌鎯�")
+    @GetMapping("/getProcessReport")
+    public Result getProcessReport(Long id)  {
+        return Result.success(processReportService.getById(id));
+    }
+
+    @Operation(summary = "淇敼妫�楠屾姤鍛婂彂鏀剧櫥璁�")
+    @PostMapping("/doProcessReport")
+    public Result doProcessReport(@RequestBody ProcessReport processReport) {
+        return Result.success(processReportService.updateById(processReport));
+    }
+
+    @Operation(summary = "瀵煎嚭妫�楠屾姤鍛婂彂鏀剧櫥璁拌〃")
+    @GetMapping("/exportProcessReport")
+    public void exportProcessReport(ProcessReportDto dto, HttpServletResponse response) {
+        processReportService.exportProcessReport(dto, response);
+    }
+
+}
diff --git a/cnas-process/src/main/java/com/ruoyi/process/controller/ProcessSampleController.java b/cnas-process/src/main/java/com/ruoyi/process/controller/ProcessSampleController.java
new file mode 100644
index 0000000..54a654a
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/controller/ProcessSampleController.java
@@ -0,0 +1,57 @@
+package com.ruoyi.process.controller;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.process.pojo.ProcessSample;
+import com.ruoyi.process.service.ProcessSampleService;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
+import org.springframework.web.bind.annotation.*;
+
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletResponse;
+import java.util.Map;
+
+/**
+ * <p>
+ * 鏍峰搧鎺ユ敹 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author
+ * @since 2024-12-12 05:02:49
+ */
+@RestController
+@RequestMapping("/processSample")
+@Tag(name = "鏍峰搧鎺ユ敹")
+public class ProcessSampleController {
+
+    @Resource
+    private ProcessSampleService processSampleService;
+
+    @Operation(summary = "鏌ヨ鏍峰搧鎺ユ敹璇︽儏")
+    @GetMapping("/pageProcessSample")
+    public Result pageProcessSample(ProcessSample processSample, Page page){
+        return Result.success(processSampleService.pageProcessSample(page, processSample));
+    }
+
+    @Operation(summary = "鏂板鏍峰搧鎺ユ敹璇︽儏")
+    @PostMapping("/addProcessSample")
+    public Result addProcessSample(@RequestBody ProcessSample processSample) {
+        return Result.success(processSampleService.saveOrUpdate(processSample));
+    }
+
+    @Operation(summary = "鍒犻櫎鏍峰搧鎺ユ敹")
+    @DeleteMapping("/delProcessSample")
+    public Result delProcessSample(Integer id) {
+        return Result.success(processSampleService.removeById(id));
+    }
+
+
+    @Operation(summary = "瀵煎嚭鏍峰搧鎺ユ敹")
+    @GetMapping("/exportProcessSample")
+    public void exportProcessSample(ProcessSample processSample, HttpServletResponse response) {
+        processSampleService.exportProcessSample(processSample,response);
+    }
+
+
+}
diff --git a/cnas-process/src/main/java/com/ruoyi/process/controller/ProcessTotaldealController.java b/cnas-process/src/main/java/com/ruoyi/process/controller/ProcessTotaldealController.java
new file mode 100644
index 0000000..38a91d1
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/controller/ProcessTotaldealController.java
@@ -0,0 +1,74 @@
+package com.ruoyi.process.controller;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.process.pojo.ProcessTotaldeal;
+import com.ruoyi.process.service.ProcessTotaldealService;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
+import org.springframework.web.bind.annotation.*;
+
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletResponse;
+import java.util.Map;
+
+/**
+ * <p>
+ * 妫�娴嬫垨鏍″噯鐗╁搧鐨勫缃�昏〃(鍘嗗彶) 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-02 03:59:09
+ */
+@RestController
+@RequestMapping("/processTotaldeal")
+@Tag(name = "妫�娴嬫垨鏍″噯鐗╁搧鐨勫缃�")
+public class ProcessTotaldealController {
+
+    @Resource
+    private ProcessTotaldealService processTotaldealService;
+
+    @Operation(summary = "鏌ヨ妫�娴嬫垨鏍″噯鐗╁搧鐨勫缃垪琛�")
+    @GetMapping("/pageProcessTotaldeal")
+    public Result pageProcessTotaldeal(ProcessTotaldeal processTotaldeal , Page page) throws Exception {
+        return Result.success(processTotaldealService.pageProcessTotaldeal(page, processTotaldeal));
+    }
+
+    @Operation(summary = "鏂板妫�娴嬫垨鏍″噯鐗╁搧鐨勫缃�")
+    @PostMapping("/addProcessTotaldeal")
+    public Result addProcessTotaldeal(@RequestBody Map<String, String> param) {
+        String month = param.get("month");
+        return Result.success(processTotaldealService.addProcessTotaldeal(month));
+    }
+
+    @Operation(summary = "鎻愪氦妫�娴嬫垨鏍″噯鐗╁搧鐨勫缃�")
+    @PostMapping("/submitProcessTotaldeal")
+    public Result submitProcessTotaldeal(@RequestBody Map<String, Integer> param) {
+        Integer id = param.get("id");
+        return Result.success(processTotaldealService.submitProcessTotaldeal(id));
+    }
+
+    @Operation(summary = "瀹℃牳妫�娴嬫垨鏍″噯鐗╁搧鐨勫缃�")
+    @PostMapping("/checkProcessTotaldeal")
+    public Result checkProcessTotaldeal(@RequestBody Map<String, Object> param) {
+        Integer id = (Integer) param.get("id");
+        String state = (String) param.get("state");
+        return Result.success(processTotaldealService.checkProcessTotaldeal(id, state));
+    }
+
+    @Operation(summary = "鎵瑰噯妫�娴嬫垨鏍″噯鐗╁搧鐨勫缃�")
+    @PostMapping("/ratifyProcessTotaldeal")
+    public Result ratifyProcessTotaldeal(@RequestBody Map<String, Object> param) {
+        Integer id = (Integer) param.get("id");
+        String state = (String) param.get("state");
+        return Result.success(processTotaldealService.ratifyProcessTotaldeal(id,state));
+    }
+
+    @Operation(summary = "瀵煎嚭妫�娴嬫垨鏍″噯鐗╁搧鐨勫缃�")
+    @GetMapping("/exportProcessTotaldeal")
+    public void exportProcessTotaldeal(Integer id, HttpServletResponse response) {
+        processTotaldealService.exportProcessTotaldeal(id,response);
+    }
+
+
+}
diff --git a/cnas-process/src/main/java/com/ruoyi/process/controller/QualityMonitorController.java b/cnas-process/src/main/java/com/ruoyi/process/controller/QualityMonitorController.java
new file mode 100644
index 0000000..31fc4a1
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/controller/QualityMonitorController.java
@@ -0,0 +1,296 @@
+package com.ruoyi.process.controller;
+
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.framework.exception.ErrorException;
+import com.ruoyi.process.dto.QualityMonitorDetailsDto;
+import com.ruoyi.process.dto.QualityMonitorDto;
+import com.ruoyi.process.mapper.QualityMonitorDetailsEvaluateFileMapper;
+import com.ruoyi.process.pojo.*;
+import com.ruoyi.process.service.QualityMonitorDetailsService;
+import com.ruoyi.process.service.QualityMonitorService;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletResponse;
+import java.util.List;
+import java.util.Map;
+
+
+/**
+ * 璐ㄩ噺鐩戞帶璁″垝涓昏〃
+ *
+ * @author zhuo
+ * @since 2024-11-06
+ */
+@Tag(name = "璐ㄩ噺鐩戞帶璁″垝")
+@AllArgsConstructor
+@RestController
+@RequestMapping("/qualityMonitor")
+public class QualityMonitorController {
+
+    @Resource
+    private QualityMonitorService qualityMonitorService;
+
+    @Resource
+    private QualityMonitorDetailsService qualityMonitorDetailsService;
+
+    @Resource
+    private QualityMonitorDetailsEvaluateFileMapper qualityMonitorDetailsEvaluateFileMapper;
+
+    /**
+     * 瀵煎叆鐩戞帶璁″垝
+     * @return
+     */
+    @Operation(summary = "瀵煎叆鐩戞帶璁″垝")
+    @PostMapping("/importQualityMonitor")
+    public Result importQualityMonitor(MultipartFile file, QualityMonitor qualityMonitor) {
+        return Result.success(qualityMonitorService.importQualityMonitor(file, qualityMonitor));
+    }
+
+    /**
+     * 鐩戞帶璁″垝瀹℃牳
+     * @return
+     */
+    @Operation(summary = "鐩戞帶璁″垝瀹℃牳")
+    @PostMapping("/examineQualityMonitor")
+    public Result examineQualityMonitor(@RequestBody QualityMonitor qualityMonitor) {
+        return Result.success(qualityMonitorService.examineQualityMonitor(qualityMonitor));
+    }
+
+    /**
+     * 鐩戞帶璁″垝鍒犻櫎
+     * @return
+     */
+    @Operation(summary = "鐩戞帶璁″垝鍒犻櫎")
+    @DeleteMapping("/delQualitySupervise")
+    public Result delQualitySupervise(Integer qualityMonitorId) {
+        return Result.success(qualityMonitorService.removeById(qualityMonitorId));
+    }
+
+    /**
+     * 鐩戞帶璁″垝鎵瑰噯
+     * @return
+     */
+    @Operation(summary = "鐩戞帶璁″垝鎵瑰噯")
+    @PostMapping("/ratifyQualityMonitor")
+    public Result ratifyQualityMonitor(@RequestBody QualityMonitor qualityMonitor) {
+        return Result.success(qualityMonitorService.ratifyQualityMonitor(qualityMonitor));
+    }
+
+
+    /**
+     * 鐩戞帶璁″垝鍒楄〃
+     * @return
+     */
+    @Operation(summary = "鐩戞帶璁″垝鍒楄〃")
+    @GetMapping("/pageQualityMonitor")
+    public Result<IPage<QualityMonitorDto>> pageQualityMonitor(QualityMonitor qualityMonitor,Page page) throws Exception {
+        return Result.success(qualityMonitorService.pageQualityMonitor(page, qualityMonitor));
+    }
+
+    /**
+     * 鐩戞帶璁″垝璇︽儏鍒楄〃
+     * @param data
+     * @return
+     */
+    @Operation(summary = "鐩戞帶璁″垝璇︽儏鍒楄〃")
+    @GetMapping("/pageQualityMonitorDetail")
+    public Result<IPage<QualityMonitorDetailsDto>> pageQualityMonitorDetail(QualityMonitorDetails qualityMonitorDetails, Page page) throws Exception {
+        return Result.success(qualityMonitorService.pageQualityMonitorDetail(page, qualityMonitorDetails));
+    }
+
+    /**
+     * 鏂板鐩戞帶璁″垝璇︽儏
+     * @return
+     */
+    @Operation(summary = "鏂板鐩戞帶璁″垝璇︽儏")
+    @PostMapping("/addQualityMonitorDetail")
+    public Result addQualityMonitorDetail(@RequestBody QualityMonitorDetails qualityMonitorDetails) {
+        if (qualityMonitorDetails.getQualityMonitorId() == null) {
+            throw new ErrorException("缂哄皯鐩戞帶璁″垝涓昏〃id");
+        }
+        return Result.success(qualityMonitorDetailsService.save(qualityMonitorDetails));
+    }
+
+    /**
+     * 淇敼鐩戞帶璁″垝璇︽儏
+     * @return
+     */
+    @Operation(summary = "淇敼鐩戞帶璁″垝璇︽儏")
+    @PostMapping("/updateQualityMonitorDetail")
+    public Result updateQualityMonitorDetail(@RequestBody QualityMonitorDetails qualityMonitorDetails) {
+        return Result.success(qualityMonitorDetailsService.updateById(qualityMonitorDetails));
+    }
+
+    /**
+     * 鍒犻櫎鐩戞帶璁″垝璇︽儏
+     * @return
+     */
+    @Operation(summary = "鍒犻櫎鐩戞帶璁″垝璇︽儏")
+    @DeleteMapping("/delQualityMonitorDetail")
+    public Result delQualityMonitorDetail(Integer qualityMonitorDetailsId) {
+        return Result.success(qualityMonitorDetailsService.removeById(qualityMonitorDetailsId));
+    }
+
+    /**
+     * 瀵煎嚭鐩戞帶璁″垝
+     * @return
+     */
+    @Operation(summary = "瀵煎嚭鐩戞帶璁″垝")
+    @GetMapping("/exportQualityMonitorDetail")
+    public void exportQualityMonitorDetail(Integer qualityMonitorId, HttpServletResponse response) {
+        qualityMonitorService.exportQualityMonitorDetail(qualityMonitorId, response);
+    }
+
+
+    /************************************************************  瀹炴柦  *******************************************************************/
+
+    /**
+     * 鏌ヨ鐩戞帶璁″垝璇︽儏瀹炴柦淇℃伅
+     * @return
+     */
+    @Operation(summary = "鏌ヨ鐩戞帶璁″垝璇︽儏瀹炴柦淇℃伅")
+    @GetMapping("/getQualityMonitorRatify")
+    public Result<QualityMonitorDetailsRatify> getQualityMonitorRatify(Integer qualityMonitorDetailsId) {
+        return Result.success(qualityMonitorService.getQualityMonitorRatify(qualityMonitorDetailsId));
+    }
+
+    /**
+     * 鏂板鐩戞帶璁″垝璇︽儏瀹炴柦淇℃伅
+     * @return
+     */
+    @Operation(summary = "鏂板鐩戞帶璁″垝璇︽儏瀹炴柦淇℃伅")
+    @PostMapping("/addQualityMonitorRatify")
+    public Result addQualityMonitorRatify(@RequestBody QualityMonitorDetailsRatify qualityMonitorDetailsRatify) {
+        return Result.success(qualityMonitorService.addQualityMonitorRatify(qualityMonitorDetailsRatify));
+    }
+
+    /**
+     * 鐩戞帶璁″垝璇︽儏鎻愪氦鎵瑰噯鎰忚
+     * @return
+     */
+    @Operation(summary = "鐩戞帶璁″垝璇︽儏鎻愪氦鎵瑰噯鎰忚")
+    @PostMapping("/addQualityMonitorRatifyOpinion")
+    public Result addQualityMonitorRatifyOpinion(@RequestBody QualityMonitorDetailsRatify qualityMonitorDetailsRatify) {
+        return Result.success(qualityMonitorService.addQualityMonitorRatifyOpinion(qualityMonitorDetailsRatify));
+    }
+
+    /**
+     * 瀵煎嚭鐩戞帶璁″垝璇︽儏瀹炴柦淇℃伅
+     * @param qualityMonitorDetailsId 鐩戞帶璁″垝璇︽儏瀹炴柦id
+     */
+    @Operation(summary = "瀵煎嚭鐩戞帶璁″垝璇︽儏瀹炴柦淇℃伅")
+    @GetMapping("/exportQualityMonitorRatify")
+    public void exportQualityMonitorRatify(Integer qualityMonitorDetailsId, HttpServletResponse response){
+        qualityMonitorService.exportQualityMonitorRatify(qualityMonitorDetailsId, response);
+    }
+
+    /************************************************************  璇勪环  *******************************************************************/
+
+    /**
+     * 鏌ヨ鐩戞帶璇勪环
+     * @return
+     */
+    @Operation(summary = "鏌ヨ鐩戞帶璇勪环")
+    @GetMapping("/getQualityMonitorEvaluate")
+    public Result<QualityMonitorDetailsEvaluate> getQualityMonitorEvaluate(Integer qualityMonitorDetailsId) {
+        return Result.success(qualityMonitorService.getQualityMonitorEvaluate(qualityMonitorDetailsId));
+    }
+
+    /**
+     * 鏂板鐩戞帶璇勪环
+     * @return
+     */
+    @Operation(summary = "鏂板鐩戞帶璇勪环")
+    @PostMapping("/addQualityMonitorEvaluate")
+    public Result addQualityMonitorEvaluate(@RequestBody QualityMonitorDetailsEvaluate qualityMonitorDetailsEvaluate) {
+        return Result.success(qualityMonitorService.addQualityMonitorEvaluate(qualityMonitorDetailsEvaluate));
+    }
+
+    /**
+     * 瀵煎嚭鐩戞帶璇勪环
+     * @param qualityMonitorDetailsId 鐩戞帶璇勪环id
+     */
+    @Operation(summary = "瀵煎嚭鐩戞帶璇勪环")
+    @GetMapping("/exportQualityMonitorEvaluate")
+    public void exportQualityMonitorEvaluate(Integer qualityMonitorDetailsId, HttpServletResponse response){
+        qualityMonitorService.exportQualityMonitorEvaluate(qualityMonitorDetailsId, response);
+    }
+
+    /**
+     * 鐩戞帶璇勪环鎵瑰噯鎰忚
+     * @return
+     */
+    @Operation(summary = "鐩戞帶璇勪环鎵瑰噯鎰忚")
+    @PostMapping("/addMonitorEvaluateOpinion")
+    public Result addMonitorEvaluateOpinion(@RequestBody QualityMonitorDetailsEvaluate qualityMonitorDetailsEvaluate) {
+        return Result.success(qualityMonitorService.addMonitorEvaluateOpinion(qualityMonitorDetailsEvaluate));
+    }
+
+
+    /**
+     * 鏂板鐩戞帶璇勪环闄勪欢琛�
+     * @param qualityMonitorDetailsId
+     * @param file
+     * @return
+     */
+    @Operation(summary = "鏂板鐩戞帶璇勪环闄勪欢琛�")
+    @PostMapping("/uploadEvaluateFile")
+    public Result<?> uploadEvaluateFile(Integer qualityMonitorDetailsId, MultipartFile file) {
+        return Result.success(qualityMonitorService.uploadEvaluateFile(qualityMonitorDetailsId, file));
+    }
+
+
+    /**
+     * 鏌ヨ鐩戞帶璇勪环闄勪欢鍒楄〃
+     * @return
+     */
+    @Operation(summary = "鏌ヨ鐩戞帶璇勪环闄勪欢鍒楄〃")
+    @GetMapping("/getEvaluateFileList")
+    public Result<List<QualityMonitorDetailsEvaluateFile>> getEvaluateFileList(Integer qualityMonitorDetailsId) {
+        return Result.success(qualityMonitorService.getEvaluateFileList(qualityMonitorDetailsId));
+    }
+
+    /**
+     * 鍒犻櫎鐩戞帶璇勪环闄勪欢琛�
+     * @return
+     */
+    @Operation(summary = "鍒犻櫎鐩戞帶璇勪环闄勪欢琛�")
+    @DeleteMapping("/delVerifyEvaluateFileList")
+    public Result delVerifyMethodFileList(Integer evaluateFileId) {
+        return Result.success(qualityMonitorDetailsEvaluateFileMapper.deleteById(evaluateFileId));
+    }
+
+    /******************************************************** 瀹屾垚鎶ュ憡 ***************************************************************/
+
+    /**
+     * 涓婁紶鐩戞帶瀹屾垚鎶ュ憡
+     * @param file
+     * @param qualityMonitorDetailsId
+     * @return
+     */
+    @Operation(summary = "涓婁紶鐩戞帶瀹屾垚鎶ュ憡")
+    @PostMapping("/uploadFinishReport")
+    public Result uploadFinishReport(MultipartFile file, Integer qualityMonitorDetailsId) {
+        return Result.success(qualityMonitorService.uploadFinishReport(file, qualityMonitorDetailsId));
+    }
+
+
+    /**
+     * 鐩戞帶璁″垝鎵瑰噯
+     * @return
+     */
+    @Operation(summary = "鎵瑰噯瀹屾垚鎶ュ憡")
+    @PostMapping("/ratifyFinishReport")
+    public Result ratifyFinishReport(@RequestBody QualityMonitorDetails qualityMonitorDetails) {
+        return Result.success(qualityMonitorService.ratifyFinishReport(qualityMonitorDetails));
+    }
+}
+
diff --git a/cnas-process/src/main/java/com/ruoyi/process/controller/QualitySuperviseController.java b/cnas-process/src/main/java/com/ruoyi/process/controller/QualitySuperviseController.java
new file mode 100644
index 0000000..900d100
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/controller/QualitySuperviseController.java
@@ -0,0 +1,354 @@
+package com.ruoyi.process.controller;
+
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.framework.exception.ErrorException;
+import com.ruoyi.process.dto.QualitySuperviseDetailsDto;
+import com.ruoyi.process.mapper.QualitySuperviseDetailsCorrectMapper;
+import com.ruoyi.process.pojo.*;
+import com.ruoyi.process.service.QualitySuperviseDetailsService;
+import com.ruoyi.process.service.QualitySuperviseService;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletResponse;
+import java.util.List;
+import java.util.Map;
+
+
+/**
+ * 璐ㄩ噺鐩戠潱涓昏〃
+ *
+ * @author zhuo
+ * @since 2024-11-07
+ */
+@Tag(name = "璐ㄩ噺鐩戠潱璁″垝")
+@AllArgsConstructor
+@RestController
+@RequestMapping("/qualitySupervise")
+public class QualitySuperviseController {
+
+    @Resource
+    private QualitySuperviseService qualitySuperviseService;
+    @Resource
+    private QualitySuperviseDetailsService qualitySuperviseDetailsService;
+    @Resource
+    private QualitySuperviseDetailsCorrectMapper qualitySuperviseDetailsCorrectMapper;
+
+    /**
+     * 瀵煎叆鐩戠潱璁″垝
+     * @return
+     */
+    @Operation(summary = "瀵煎叆鐩戠潱璁″垝")
+    @PostMapping("/importQualitySupervise")
+    public Result importQualitySupervise(MultipartFile file, QualitySupervise qualitySupervise){
+        return Result.success(qualitySuperviseService.importQualitySupervise(file, qualitySupervise));
+    }
+
+    /**
+     * 鐩戠潱璁″垝鍒楄〃
+     * @return
+     */
+    @Operation(summary = "鐩戠潱璁″垝鍒楄〃")
+    @GetMapping("/pageQualitySupervise")
+    public Result<IPage<QualitySupervise>> pageQualitySupervise(QualitySupervise qualitySupervise ,Page page) throws Exception {
+        return Result.success(qualitySuperviseService.pageQualitySupervise(page, qualitySupervise));
+    }
+
+    /**
+     * 鐩戠潱璁″垝鎵瑰噯
+     * @return
+     */
+    @Operation(summary = "鐩戠潱璁″垝鎵瑰噯")
+    @PostMapping("/ratifyQualitySupervise")
+    public Result ratifyQualitySupervise(@RequestBody QualitySupervise qualitySupervise){
+        return Result.success(qualitySuperviseService.ratifyQualitySupervise(qualitySupervise));
+    }
+
+    /**
+     * 鐩戠潱璁″垝鍒犻櫎
+     * @return
+     */
+    @Operation(summary = "鐩戠潱璁″垝鍒犻櫎")
+    @DeleteMapping("/delQualitySupervise")
+    public Result delQualitySupervise(Integer superviseId){
+        return Result.success(qualitySuperviseService.removeById(superviseId));
+    }
+
+    /**
+     * 鐩戠潱璁″垝璇︽儏鍒楄〃
+     * @param qualitySuperviseDetails
+     * @param page
+     * @return
+     */
+    @Operation(summary = "鐩戠潱璁″垝璇︽儏鍒楄〃")
+    @GetMapping("/pageQualitySuperviseDetail")
+    public Result<IPage<QualitySuperviseDetailsDto>> pageQualitySuperviseDetail(QualitySuperviseDetailsDto qualitySuperviseDetails,Page page) throws Exception {
+        return Result.success(qualitySuperviseService.pageQualitySuperviseDetail(page, qualitySuperviseDetails));
+    }
+
+    /**
+     * 鏂板鐩戠潱璁″垝璇︽儏
+     * @return
+     */
+    @Operation(summary = "鏂板鐩戠潱璁″垝璇︽儏")
+    @PostMapping("/addQualitySuperviseDetail")
+    public Result addQualitySuperviseDetail(@RequestBody QualitySuperviseDetails qualitySuperviseDetails){
+        if (qualitySuperviseDetails.getSuperviseId() == null) {
+            throw new ErrorException("缂哄皯鐩戠潱璁″垝涓昏〃id");
+        }
+        return Result.success(qualitySuperviseDetailsService.save(qualitySuperviseDetails));
+    }
+
+    /**
+     * 淇敼鐩戠潱璁″垝璇︽儏
+     * @return
+     */
+    @Operation(summary = "淇敼鐩戠潱璁″垝璇︽儏")
+    @PostMapping("/updateQualitySuperviseDetail")
+    public Result updateQualitySuperviseDetail(@RequestBody QualitySuperviseDetails qualitySuperviseDetails){
+        return Result.success(qualitySuperviseDetailsService.updateById(qualitySuperviseDetails));
+    }
+
+    /**
+     * 鍒犻櫎鐩戠潱璁″垝璇︽儏
+     * @return
+     */
+    @Operation(summary = "鍒犻櫎鐩戠潱璁″垝璇︽儏")
+    @DeleteMapping("/delQualitySuperviseDetail")
+    public Result delQualitySuperviseDetail(Integer superviseDetailsId){
+        return Result.success(qualitySuperviseDetailsService.removeById(superviseDetailsId));
+    }
+
+    /**
+     * 鏌ヨ璇ヨ鍒掔洃鐫e憳
+     * @return
+     */
+    @Operation(summary = "鏌ヨ璇ヨ鍒掔洃鐫e憳")
+    @GetMapping("/getRecordUser")
+    public Result getRecordUser(Integer superviseDetailsId){
+        return Result.success(qualitySuperviseService.getRecordUser(superviseDetailsId));
+    }
+
+
+    /**
+     * 瀵煎嚭鐩戠潱璁″垝
+     * @return
+     */
+    @Operation(summary = "瀵煎嚭鐩戠潱璁″垝")
+    @GetMapping("/exportQualitySupervise")
+    public void exportQualitySupervise(Integer superviseId, HttpServletResponse response){
+        qualitySuperviseService.exportQualitySupervise(superviseId, response);
+    }
+
+
+    /************************************************* 璁板綍 *********************************************************/
+
+    /**
+     * 鏌ヨ鐩戠潱璁板綍淇℃伅
+     * @return
+     */
+    @Operation(summary = "鏌ヨ鐩戠潱璁板綍淇℃伅")
+    @GetMapping("/getSuperviseDetailRecord")
+    public Result<QualitySuperviseDetailsRecord> getSuperviseDetailRecord(Integer superviseDetailsId){
+        return Result.success(qualitySuperviseService.getSuperviseDetailRecord(superviseDetailsId));
+    }
+
+    /**
+     * 鏂板鐩戠潱璁板綍淇℃伅
+     * @return
+     */
+    @Operation(summary = "鏂板鐩戠潱璁板綍淇℃伅")
+    @PostMapping("/addSuperviseDetailRecord")
+    public Result addSuperviseDetailRecord(@RequestBody QualitySuperviseDetailsRecord qualitySuperviseDetailsRecord){
+        return Result.success(qualitySuperviseService.addSuperviseDetailRecord(qualitySuperviseDetailsRecord));
+    }
+
+    /**
+     * 鐩戠潱璁板綍鎵瑰噯
+     * @return
+     */
+    @Operation(summary = "鐩戠潱璁板綍鎵瑰噯")
+    @PostMapping("/addSuperviseRecordOpinion")
+    public Result addSuperviseRecordOpinion(@RequestBody QualitySuperviseDetailsRecord qualitySuperviseDetailsRecord){
+        return Result.success(qualitySuperviseService.addSuperviseRecordOpinion(qualitySuperviseDetailsRecord));
+    }
+
+    /**
+     * 瀵煎嚭璐ㄩ噺鐩戠潱璇︽儏璁板綍琛�
+     * @return
+     */
+    @Operation(summary = "瀵煎嚭鐩戠潱璁板綍琛�")
+    @GetMapping("/exportSuperviseDetailRecord")
+    public void exportSuperviseDetailRecord(Integer superviseDetailsId, HttpServletResponse response){
+        qualitySuperviseService.exportSuperviseDetailRecord(superviseDetailsId, response);
+    }
+
+    /*************************************************  涓嶅悎鏍煎伐浣滄帶鍒跺崟 ********************************************************/
+
+
+    /**
+     * 鏂板鐩戠潱璁板綍涓嶇鍚堟帶鍒朵俊鎭�
+     * @return
+     */
+    @Operation(summary = "鏂板鐩戠潱璁板綍涓嶇鍚堟帶鍒朵俊鎭�")
+    @PostMapping("/addSuperviseDetailAccording")
+    public Result addSuperviseDetailAccording(@RequestBody QualitySuperviseDetailsAccording qualitySuperviseDetailsAccording){
+        return Result.success(qualitySuperviseService.addSuperviseDetailAccording(qualitySuperviseDetailsAccording));
+    }
+
+    /**
+     * 鏂板鐩戠潱璁板綍涓嶇鍚堟帶鍒朵俊鎭�(瑁呭娴佺▼)
+     * @return
+     */
+    @Operation(summary = "(瑁呭娴佺▼)鏂板鐩戠潱璁板綍涓嶇鍚堟帶鍒朵俊鎭�")
+    @PostMapping("/addEquipSuperviseDetailAccording")
+    public Result addEquipSuperviseDetailAccording(@RequestBody QualitySuperviseDetailsAccording qualitySuperviseDetailsAccording){
+        return Result.success(qualitySuperviseService.addEquipSuperviseDetailAccording(qualitySuperviseDetailsAccording));
+    }
+
+    /**
+     * (瑁呭娴佺▼)鎵瑰噯鐩戠潱璁板綍涓嶇鍚堟帶鍒朵俊鎭�
+     * @return
+     */
+    @Operation(summary = "(瑁呭娴佺▼)鎵瑰噯鐩戠潱璁板綍涓嶇鍚堟帶鍒朵俊鎭�")
+    @PostMapping("/approverEquipSuperviseDetailAccording")
+    public Result approverEquipSuperviseDetailAccording(@RequestBody QualitySuperviseDetailsAccording qualitySuperviseDetailsAccording){
+        return Result.success(qualitySuperviseService.approverEquipSuperviseDetailAccording(qualitySuperviseDetailsAccording));
+    }
+
+    /**
+     * 鏌ヨ鐩戠潱璁板綍涓嶇鍚堟帶鍒朵俊鎭�
+     * @return
+     */
+    @Operation(summary = "鏌ヨ鐩戠潱璁板綍涓嶇鍚堟帶鍒朵俊鎭�")
+    @GetMapping("/getSuperviseDetailAccording")
+    public Result<QualitySuperviseDetailsAccording> getSuperviseDetailAccording(Integer superviseDetailsId){
+        return Result.success(qualitySuperviseService.getSuperviseDetailAccording(superviseDetailsId));
+    }
+
+    /**
+     * 鏌ヨ鐩戠潱璁板綍涓嶇鍚堟帶鍒朵俊鎭垪琛�
+     * @return
+     */
+    @Operation(summary = "鏌ヨ鐩戠潱璁板綍涓嶇鍚堟帶鍒朵俊鎭垪琛�")
+    @GetMapping("/pageSuperviseDetailAccording")
+    public Result<IPage<QualitySuperviseDetailsAccording>> pageSuperviseDetailAccording(QualitySuperviseDetailsAccording detailsAccording,Page page) throws Exception {
+        return Result.success(qualitySuperviseService.pageSuperviseDetailAccording(page, detailsAccording));
+    }
+
+    /**
+     * 瀵煎嚭鐩戠潱璁板綍涓嶇鍚堟帶鍒朵俊鎭�
+     * @return
+     */
+    @Operation(summary = "瀵煎嚭鐩戠潱璁板綍涓嶇鍚堟帶鍒朵俊鎭�")
+    @GetMapping("/superviseDetailAccordingExport")
+    public void superviseDetailAccordingExport(@RequestParam("superviseDetailsId") Integer id, HttpServletResponse response){
+        qualitySuperviseService.superviseDetailAccordingExport(id, response);
+    }
+
+
+
+    /*************************************************  绾犳鎺柦澶勭悊鍗� ********************************************************/
+
+
+    /**
+     * 鏂板鐩戠潱绾犳澶勭悊淇℃伅
+     * @return
+     */
+    @Operation(summary = "鏂板鐩戠潱绾犳澶勭悊")
+    @PostMapping("/addSuperviseDetailCorrect")
+    public Result addSuperviseDetailCorrect(@RequestBody QualitySuperviseDetailsCorrect qualitySuperviseDetailsCorrect){
+        return Result.success(qualitySuperviseService.addSuperviseDetailCorrect(qualitySuperviseDetailsCorrect));
+    }
+
+    /**
+     * (瑁呭娴佺▼)鏂板鐩戠潱绾犳澶勭悊淇℃伅
+     * @return
+     */
+    @Operation(summary = "(瑁呭娴佺▼)鏂板鐩戠潱绾犳澶勭悊")
+    @PostMapping("/addEquipSuperviseDetailCorrect")
+    public Result addEquipSuperviseDetailCorrect(@RequestBody QualitySuperviseDetailsCorrect qualitySuperviseDetailsCorrect){
+        return Result.success(qualitySuperviseService.addEquipSuperviseDetailCorrect(qualitySuperviseDetailsCorrect));
+    }
+
+    /**
+     * (瑁呭娴佺▼)鎵瑰噯鐩戠潱绾犳澶勭悊
+     * @return
+     */
+    @Operation(summary = "(瑁呭娴佺▼)鎵瑰噯鐩戠潱绾犳澶勭悊")
+    @PostMapping("/approveEquipSuperviseDetailCorrect")
+    public Result approveEquipSuperviseDetailCorrect(@RequestBody QualitySuperviseDetailsCorrect qualitySuperviseDetailsCorrect){
+        return Result.success(qualitySuperviseService.approveEquipSuperviseDetailCorrect(qualitySuperviseDetailsCorrect));
+    }
+
+    /**
+     * 鏌ヨ鐩戠潱绾犳澶勭悊
+     * @return
+     */
+    @Operation(summary = "鏌ヨ鐩戠潱绾犳澶勭悊")
+    @GetMapping("/getSuperviseDetailCorrect")
+    public Result<QualitySuperviseDetailsCorrect> getSuperviseDetailCorrect(Integer superviseDetailsId){
+        return Result.success(qualitySuperviseService.getSuperviseDetailCorrect(superviseDetailsId));
+    }
+
+    /**
+     * 鏌ヨ鐩戠潱绾犳鎺柦鍒楄〃
+     * @return
+     */
+    @Operation(summary = "鏌ヨ鐩戠潱绾犳鎺柦鍒楄〃")
+    @GetMapping("/pageSuperviseDetailCorrect")
+    public Result<IPage<QualitySuperviseDetailsCorrect>> pageSuperviseDetailCorrect(QualitySuperviseDetailsCorrect detailsCorrect,Page page) throws Exception {
+        return Result.success(qualitySuperviseService.pageSuperviseDetailCorrect(page, detailsCorrect));
+    }
+
+    /**
+     * 鏂板鐩戠潱绾犳鎺柦闄勪欢
+     * @param superviseDetailsCorrectId
+     * @param file
+     * @return
+     */
+    @Operation(summary = "鏂板鐩戠潱绾犳鎺柦闄勪欢")
+    @PostMapping("/uploadSuperviseDetailCorrectFile")
+    public Result<?> uploadSuperviseDetailCorrectFile(Integer superviseDetailsCorrectId, MultipartFile file) {
+        return Result.success(qualitySuperviseService.uploadSuperviseDetailCorrectFile(superviseDetailsCorrectId, file));
+    }
+
+
+    /**
+     * 鏌ヨ鐩戠潱绾犳鎺柦闄勪欢
+     * @return
+     */
+    @Operation(summary = "鏌ヨ鐩戠潱绾犳鎺柦闄勪欢")
+    @GetMapping("/getSuperviseDetailCorrectFileList")
+    public Result<List<QualitySuperviseDetailsCorrectFile>> getSuperviseDetailCorrectFileList(Integer superviseDetailsCorrectId){
+        return Result.success(qualitySuperviseService.getSuperviseDetailCorrectFileList(superviseDetailsCorrectId));
+    }
+
+    /**
+     * 鍒犻櫎鐩戠潱绾犳鎺柦闄勪欢
+     * @return
+     */
+    @Operation(summary = "鍒犻櫎鐩戠潱绾犳鎺柦闄勪欢")
+    @DeleteMapping("/delSuperviseDetailCorrectFile")
+    public Result delSuperviseDetailCorrectFile(Integer superviseDetailsCorrectFileId){
+        return Result.success(qualitySuperviseDetailsCorrectMapper.deleteById(superviseDetailsCorrectFileId));
+    }
+
+    /**
+     * 瀵煎嚭鐩戠潱绾犳鎺柦
+     * @return
+     */
+    @Operation(summary = "瀵煎嚭鐩戠潱绾犳鎺柦")
+    @GetMapping("/exportSuperviseDetaillCorrect")
+    public void exportSuperviseDetaillCorrect(Integer superviseDetailsCorrectId, HttpServletResponse response){
+        qualitySuperviseService.exportSuperviseDetaillCorrect(superviseDetailsCorrectId, response);
+    }
+}
+
diff --git a/cnas-process/src/main/java/com/ruoyi/process/controller/QualitySuperviseManagementReviewController.java b/cnas-process/src/main/java/com/ruoyi/process/controller/QualitySuperviseManagementReviewController.java
new file mode 100644
index 0000000..b981d42
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/controller/QualitySuperviseManagementReviewController.java
@@ -0,0 +1,71 @@
+package com.ruoyi.process.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.process.pojo.QualitySupervise;
+import com.ruoyi.process.pojo.QualitySuperviseManagementReview;
+import com.ruoyi.process.service.QualitySuperviseManagementReviewService;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+
+import jakarta.servlet.http.HttpServletResponse;
+
+/**
+ * <p>
+ * 璐ㄩ噺鐩戠潱绠$悊璇勫杈撳叆鏉愭枡 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author
+ * @since 2025-05-07 10:46:11
+ */
+@RestController
+@RequestMapping("/managementReview")
+@Tag(name = "璐ㄩ噺鐩戠潱绠$悊璇勫杈撳叆鏉愭枡")
+@AllArgsConstructor
+public class QualitySuperviseManagementReviewController {
+
+    private QualitySuperviseManagementReviewService qualitySuperviseManagementReviewService;
+
+    /**
+     * 鍒嗛〉鏌ヨ
+     * @return
+     */
+    @Operation(summary = "鍒嗛〉鏌ヨ")
+    @GetMapping("/pageManagementReview")
+    public Result<IPage<QualitySuperviseManagementReview>> pageManagementReview(QualitySuperviseManagementReview managementReview, Page page) {
+        return Result.success(qualitySuperviseManagementReviewService.pageManagementReview(page, managementReview));
+    }
+
+    /**
+     * 鏂板鎴栦慨鏀�
+     * @return
+     */
+    @Operation(summary = "鏂板鎴栦慨鏀�")
+    @PostMapping("/saveOrUpdateManagementReview")
+    public Result saveOrUpdateManagementReview(@RequestBody QualitySuperviseManagementReview managementReview) {
+        return Result.success(qualitySuperviseManagementReviewService.saveOrUpdate(managementReview));
+    }
+
+    /**
+     * 鍒犻櫎
+     * @return
+     */
+    @Operation(summary = "鍒犻櫎")
+    @DeleteMapping("/deleteManagementReview")
+    public Result deleteManagementReview(Integer managementReviewId) {
+        return Result.success(qualitySuperviseManagementReviewService.removeById(managementReviewId));
+    }
+
+    /**
+     * 瀵煎嚭
+     * @return
+     */
+    @Operation(summary = "瀵煎嚭")
+    @GetMapping("/exportManagementReview")
+    public void exportManagementReview(Integer managementReviewId,HttpServletResponse response) {
+        qualitySuperviseManagementReviewService.exportManagementReview(managementReviewId, response);
+    }
+}
diff --git a/cnas-process/src/main/java/com/ruoyi/process/dto/ImageDemoData.java b/cnas-process/src/main/java/com/ruoyi/process/dto/ImageDemoData.java
new file mode 100644
index 0000000..c0ba3ab
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/dto/ImageDemoData.java
@@ -0,0 +1,43 @@
+package com.ruoyi.process.dto;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ColumnWidth;
+import com.alibaba.excel.annotation.write.style.ContentRowHeight;
+import com.alibaba.excel.converters.string.StringImageConverter;
+import com.alibaba.excel.metadata.data.WriteCellData;
+import lombok.EqualsAndHashCode;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.File;
+import java.io.InputStream;
+import java.net.URL;
+
+@Getter
+@Setter
+@EqualsAndHashCode
+@ContentRowHeight(100)  // 琛岄珮
+@ColumnWidth(100 / 8)  // 鍒楀
+public class ImageDemoData {
+    private File file;
+    private InputStream inputStream;
+    /**
+     * 濡傛灉string绫诲瀷 蹇呴』鎸囧畾杞崲鍣紝string榛樿杞崲鎴恠tring
+     */
+    @ExcelProperty(converter = StringImageConverter.class)
+    private String string;
+    private byte[] byteArray;
+    /**
+     * 鏍规嵁url瀵煎嚭
+     *
+     * @since 2.1.1
+     */
+    private URL url;
+
+    /**
+     * 鏍规嵁鏂囦欢瀵煎嚭 骞惰缃鍑虹殑浣嶇疆銆�
+     *
+     * @since 3.0.0-beta1
+     */
+    private WriteCellData<Void> writeCellDataFile;
+}
\ No newline at end of file
diff --git a/cnas-process/src/main/java/com/ruoyi/process/dto/InconsistentDistributionDto.java b/cnas-process/src/main/java/com/ruoyi/process/dto/InconsistentDistributionDto.java
new file mode 100644
index 0000000..f8e0f60
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/dto/InconsistentDistributionDto.java
@@ -0,0 +1,28 @@
+package com.ruoyi.process.dto;
+
+import com.ruoyi.process.pojo.InconsistentDistribution;
+import com.ruoyi.process.pojo.InconsistentDistributionDetail;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @Author zhuo
+ * @Date 2024/11/15
+ */
+@Data
+public class InconsistentDistributionDto extends InconsistentDistribution {
+
+    @Schema(description = "鍒嗗竷璇︽儏")
+    private List<InconsistentDistributionDetail> distributionDetailList;
+
+    @Schema(description = "鍗犳瘮瀵硅薄")
+    private InconsistentDistributionProportionDto distributionProportion;
+
+    @Schema(description = "鍒涘缓浜哄悕绉�")
+    private String createUserName;
+
+    @Schema(description = "淇敼浜哄悕绉�")
+    private String updateUserName;
+}
diff --git a/cnas-process/src/main/java/com/ruoyi/process/dto/InconsistentDistributionProportionDto.java b/cnas-process/src/main/java/com/ruoyi/process/dto/InconsistentDistributionProportionDto.java
new file mode 100644
index 0000000..2320836
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/dto/InconsistentDistributionProportionDto.java
@@ -0,0 +1,45 @@
+package com.ruoyi.process.dto;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * 鍗犳瘮瀵硅薄
+ *
+ * @Author zhuo
+ * @Date 2024/11/15
+ */
+
+@Data
+public class InconsistentDistributionProportionDto {
+
+    @Schema(description = "绔犺妭鍙�")
+    private String chapterNumber;
+
+    @Schema(description = "瑕佺礌")
+    private String essentials;
+
+    @Schema(description = "涓讳换")
+    private BigDecimal director;
+
+    @Schema(description = "鎶�鏈礋璐d汉")
+    private BigDecimal technology;
+
+    @Schema(description = "璐ㄩ噺璐熻矗浜�")
+    private BigDecimal quality;
+
+    @Schema(description = "缁煎悎瀹�")
+    private BigDecimal comprehensive;
+
+    @Schema(description = "璇曢獙瀹�")
+    private BigDecimal testing;
+
+    @Schema(description = "鍚堣")
+    private Integer total;
+
+    @Schema(description = "鍗犳瘮")
+    private BigDecimal proportion;
+
+}
diff --git a/cnas-process/src/main/java/com/ruoyi/process/dto/InspectionOrderDto.java b/cnas-process/src/main/java/com/ruoyi/process/dto/InspectionOrderDto.java
new file mode 100644
index 0000000..3a459bc
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/dto/InspectionOrderDto.java
@@ -0,0 +1,19 @@
+package com.ruoyi.process.dto;
+
+import com.ruoyi.process.pojo.InspectionOrder;
+import com.ruoyi.process.pojo.InspectionOrderDetail;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @Author zhuo
+ * @Date 2024/12/9
+ */
+@Data
+public class InspectionOrderDto extends InspectionOrder {
+
+    @Schema(description = "濮旀墭妫�楠屽崟璇︽儏")
+    private List<InspectionOrderDetail> orderDetailList;
+}
diff --git a/cnas-process/src/main/java/com/ruoyi/process/dto/InspectionOrderExportDto.java b/cnas-process/src/main/java/com/ruoyi/process/dto/InspectionOrderExportDto.java
new file mode 100644
index 0000000..90df017
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/dto/InspectionOrderExportDto.java
@@ -0,0 +1,51 @@
+package com.ruoyi.process.dto;
+
+import com.ruoyi.process.pojo.InspectionOrder;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * Author: yuan
+ * Date: 2024-12-10 鏄熸湡浜�
+ * Description:
+ */
+@Data
+public class InspectionOrderExportDto extends InspectionOrder {
+    @Schema(description = "鐣欐牱:1 鏄�")
+    private String isLeave1 = "鈻�";
+
+    @Schema(description = "鐣欐牱:0 鍚�")
+    private String isLeave2 = "鈻�";
+
+    @Schema(description = "鎶ュ憡鍙戦�佹柟寮� 1锛氳嚜鍙�")
+    private String send1 = "鈻�";
+
+    @Schema(description = "鎶ュ憡鍙戦�佹柟寮� 0锛氬叾浠�")
+    private String send0 = "鈻�";
+
+    @Schema(description = "鏍峰搧澶勭悊鏂瑰紡 1锛氬疄楠屽澶勭悊")
+    private String processing1 = "鈻�";
+
+    @Schema(description = "鏍峰搧澶勭悊鏂瑰紡 0锛氬鎵樺崟浣嶅彇鍥�")
+    private String processing0 = "鈻�";
+
+    @Schema(description = "鍒ゆ柇瑙勫垯 1锛氳�冭檻涓嶇‘瀹氬害")
+    private String criterionRule1 = "鈻�";
+
+    @Schema(description = "鍒ゆ柇瑙勫垯 0锛氫笉鑰冭檻涓嶇‘瀹氬害")
+    private String criterionRule0 = "鈻�";
+
+    @Schema(description = "濮旀墭鏃堕棿 瀛楃涓叉牸寮忥細yyyy骞碝M鏈坉d")
+    private String commissionDateString;
+
+    @Schema(description = "鎺ユ敹鏃ユ湡 瀛楃涓叉牸寮忥細yyyy骞碝M鏈坉d")
+    private String receiptDataString;
+
+    @Schema(description = "棰嗘牱鏃ユ湡 瀛楃涓叉牸寮忥細yyyy骞碝M鏈坉d")
+    private String sampleDataString;
+
+    @Schema(description = "绾﹀畾鏃堕棿 瀛楃涓叉牸寮忥細yyyy骞碝M鏈坉d")
+    private String appointedString;
+
+
+}
diff --git a/cnas-process/src/main/java/com/ruoyi/process/dto/ProcessComplainDto.java b/cnas-process/src/main/java/com/ruoyi/process/dto/ProcessComplainDto.java
new file mode 100644
index 0000000..f33a281
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/dto/ProcessComplainDto.java
@@ -0,0 +1,23 @@
+package com.ruoyi.process.dto;
+
+import com.ruoyi.process.pojo.ProcessComplain;
+import lombok.Data;
+
+@Data
+//鎶曡瘔璇︽儏
+public class ProcessComplainDto extends ProcessComplain {
+
+    private String phone;
+
+    private String email;
+
+    private String problemRecordsUserName;
+
+    private String dutyOwnershipUserName;
+
+    private String causeAnalysisUserName;
+
+    private String correctiveActionUserName;
+
+    private String correctiveActionConfirmationUserName;
+}
diff --git a/cnas-process/src/main/java/com/ruoyi/process/dto/ProcessDealDto.java b/cnas-process/src/main/java/com/ruoyi/process/dto/ProcessDealDto.java
new file mode 100644
index 0000000..9e595e1
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/dto/ProcessDealDto.java
@@ -0,0 +1,19 @@
+package com.ruoyi.process.dto;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.ruoyi.process.pojo.ProcessDeal;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * @Author zhuo
+ * @Date 2025/4/23
+ */
+@Data
+public class ProcessDealDto extends ProcessDeal {
+    @Schema(description = "搴忓彿")
+    private String indexs;
+
+    @Schema(description = "鏃堕棿")
+    private String dealTimeStr;
+}
diff --git a/cnas-process/src/main/java/com/ruoyi/process/dto/ProcessMethodSearchNewArchivedDto.java b/cnas-process/src/main/java/com/ruoyi/process/dto/ProcessMethodSearchNewArchivedDto.java
new file mode 100644
index 0000000..8412af2
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/dto/ProcessMethodSearchNewArchivedDto.java
@@ -0,0 +1,19 @@
+package com.ruoyi.process.dto;
+
+import com.ruoyi.process.pojo.ProcessMethodSearchNewArchived;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * @Author zhuo
+ * @Date 2024/12/25
+ */
+@Data
+public class ProcessMethodSearchNewArchivedDto extends ProcessMethodSearchNewArchived {
+
+    @Schema(description = "缂栧埗浜�")
+    private String writeName;
+
+    @Schema(description = "鎵瑰噯浜�")
+    private String ratifyName;
+}
diff --git a/cnas-process/src/main/java/com/ruoyi/process/dto/ProcessMethodSearchNewBackupsDto.java b/cnas-process/src/main/java/com/ruoyi/process/dto/ProcessMethodSearchNewBackupsDto.java
new file mode 100644
index 0000000..ac15b4a
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/dto/ProcessMethodSearchNewBackupsDto.java
@@ -0,0 +1,62 @@
+package com.ruoyi.process.dto;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.ruoyi.process.pojo.ProcessMethodSearchNewBackups;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * @Author zhuo
+ * @Date 2024/11/4
+ */
+@Data
+@ExcelIgnoreUnannotated
+public class ProcessMethodSearchNewBackupsDto extends ProcessMethodSearchNewBackups {
+
+    @Schema(description = "寮�濮嬫椂闂�")
+    private String beginDate;
+
+    @Schema(description = "缁撴潫鏃堕棿")
+    private String endDate;
+
+    @Schema(description = "缂栧埗浜篿d")
+    private Integer writeUserId;
+
+    @Schema(description = "鎵瑰噯浜篿d")
+    private Integer ratifyUserId;
+
+    @Schema(description = "缂栧埗浜烘棩鏈�")
+    private String writeDate;
+
+    @Schema(description = "鎵瑰噯浜烘棩鏈�")
+    private String ratifyDate;
+
+    @ExcelProperty(value = {"鏄惁鏈夋洿鏂版爣鍑�", "鏄惁鏈夋洿鏂版爣鍑�"}, index = 4)
+    @Schema(description = "鏄惁鏈夋洿鏂版爣鍑�")
+    private String isNewStandardString;
+
+    @ExcelProperty(value = {"鏌ユ柊璁板綍", "鏍囧噯缃�"}, index = 7)
+    @Schema(description = "鏍囧噯缃�")
+    private String standardNet;
+
+    @ExcelProperty(value = {"鏌ユ柊璁板綍", "濮旀墭鎯呮姤鎵�"}, index = 8)
+    @Schema(description = "濮旀墭鎯呮姤鎵�")
+    private String informationOffices;
+
+    @ExcelProperty(value = {"鏌ユ柊璁板綍", "鏍囧噯涔﹀簵"}, index = 9)
+    @Schema(description = "鏍囧噯涔﹀簵")
+    private String standardBookstore;
+
+    @ExcelProperty(value = {"鏌ユ柊璁板綍", "鍏朵粬"}, index = 10)
+    @Schema(description = "鍏朵粬")
+    private String other;
+
+    @ExcelProperty(value = {"澶囨敞", "澶囨敞"}, index = 11)
+    @Schema(description = "澶囨敞")
+    private String remarkString;
+
+    @ExcelProperty(value = {"搴忓彿", "搴忓彿"}, index = 0)
+    @Schema(description = "搴忓彿")
+    private Integer index;
+}
diff --git a/cnas-process/src/main/java/com/ruoyi/process/dto/ProcessMethodVerifyCalibrationsFileDto.java b/cnas-process/src/main/java/com/ruoyi/process/dto/ProcessMethodVerifyCalibrationsFileDto.java
new file mode 100644
index 0000000..08b90f6
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/dto/ProcessMethodVerifyCalibrationsFileDto.java
@@ -0,0 +1,19 @@
+package com.ruoyi.process.dto;
+
+import com.ruoyi.process.pojo.ProcessMethodVerifyCalibrationsFile;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * @Author zhuo
+ * @Date 2024/11/12
+ */
+@Data
+public class ProcessMethodVerifyCalibrationsFileDto extends ProcessMethodVerifyCalibrationsFile {
+
+    @Schema(description = "璁惧鍚嶇О")
+    private String deviceName;
+
+    @Schema(description = "璁惧缂栧彿")
+    private String managementNumber;
+}
diff --git a/cnas-process/src/main/java/com/ruoyi/process/dto/ProcessMethodVerifyDto.java b/cnas-process/src/main/java/com/ruoyi/process/dto/ProcessMethodVerifyDto.java
new file mode 100644
index 0000000..3e9dc14
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/dto/ProcessMethodVerifyDto.java
@@ -0,0 +1,30 @@
+package com.ruoyi.process.dto;
+
+import com.ruoyi.process.pojo.ProcessMethodVerify;
+import com.ruoyi.process.pojo.ProcessMethodVerifyMachineAttachment;
+import com.ruoyi.process.pojo.ProcessMethodVerifyMethodFile;
+import com.ruoyi.process.pojo.ProcessMethodVerifyWorkFile;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @Author zhuo
+ * @Date 2024/11/5
+ */
+@Data
+public class ProcessMethodVerifyDto extends ProcessMethodVerify {
+
+    @Schema(description = "璁惧闄勪欢")
+    private List<ProcessMethodVerifyMachineAttachment> machineAttachmentList;
+
+    @Schema(description = "鍘熷璁板綍闄勪欢")
+    private List<ProcessMethodVerifyMethodFile> methodFileList;
+
+    @Schema(description = "涓婂矖璇�")
+    private List<ProcessMethodVerifyWorkFile> workFileList;
+
+    @Schema(description = "鏍″噯璇佷功")
+    private List<ProcessMethodVerifyCalibrationsFileDto> calibrationsFileList;
+}
diff --git a/cnas-process/src/main/java/com/ruoyi/process/dto/ProcessMethodVerifyExportWordDto.java b/cnas-process/src/main/java/com/ruoyi/process/dto/ProcessMethodVerifyExportWordDto.java
new file mode 100644
index 0000000..16a4eeb
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/dto/ProcessMethodVerifyExportWordDto.java
@@ -0,0 +1,40 @@
+package com.ruoyi.process.dto;
+
+import com.ruoyi.process.pojo.ProcessMethodVerify;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * Author: yuan
+ * Date: 2024-12-19 鏄熸湡鍥� 15:55:46
+ * Description:
+ */
+@Data
+public class ProcessMethodVerifyExportWordDto extends ProcessMethodVerify {
+    @Schema(description = "(浜�)鏄惁婊¤冻 1婊¤冻 0涓嶆弧瓒�")
+    private String personIsSatisfiedStr;
+
+    @Schema(description = "(鏈�)鏄惁婊¤冻")
+    private String machineIsSatisfiedStr;
+
+    @Schema(description = "(鏂�)鏄惁婊¤冻")
+    private String materialIsSatisfiedStr;
+
+    @Schema(description = "(娉�)鏄惁婊¤冻")
+    private String methodIsSatisfiedStr;
+
+    @Schema(description = "(鐜�)鏄惁婊¤冻")
+    private String environmentIsSatisfiedStr;
+
+    @Schema(description = "(娴嬮噺婧簮鎬�)鏄惁婊¤冻")
+    private String traceabilityIsSatisfiedStr;
+
+    @Schema(description = "(鏍峰搧绠$悊闇�姹�)鏄惁婊¤冻")
+    private String managementIsSatisfiedStr;
+
+    @Schema(description = "(鍏朵粬)鏄惁婊¤冻")
+    private String otherIsSatisfiedStr;
+
+    @Schema(description = "纭鏃堕棿")
+    private String confirmDateStr;
+}
diff --git a/cnas-process/src/main/java/com/ruoyi/process/dto/ProcessReportDto.java b/cnas-process/src/main/java/com/ruoyi/process/dto/ProcessReportDto.java
new file mode 100644
index 0000000..fac8c1c
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/dto/ProcessReportDto.java
@@ -0,0 +1,30 @@
+package com.ruoyi.process.dto;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.deepoove.poi.data.PictureRenderData;
+import com.ruoyi.process.pojo.ProcessReport;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+//瀵煎嚭
+public class ProcessReportDto extends ProcessReport {
+
+    private List<Integer> ids;
+
+    @Schema(description = "鍙戦�佷汉濮撳悕")
+    private String sendUserName;
+
+    @Schema(description = "鍙戦�佷汉鍦板潃")
+    private String sendUserUrl;
+
+    @Schema(description = "鍙戦�佷汉绛惧悕")
+    private PictureRenderData sendUserRender;
+
+    @Schema(description = "绛炬敹绛惧悕")
+    private PictureRenderData signatoryRender;
+
+
+}
diff --git a/cnas-process/src/main/java/com/ruoyi/process/dto/QualityMonitorDetailsDto.java b/cnas-process/src/main/java/com/ruoyi/process/dto/QualityMonitorDetailsDto.java
new file mode 100644
index 0000000..ccc0a9d
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/dto/QualityMonitorDetailsDto.java
@@ -0,0 +1,23 @@
+package com.ruoyi.process.dto;
+
+import com.ruoyi.process.pojo.QualityMonitorDetails;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * @Author zhuo
+ * @Date 2025/3/24
+ */
+@Data
+public class QualityMonitorDetailsDto extends QualityMonitorDetails {
+
+    @Schema(description = "瀹炴柦鐘舵��, 0: 鏈紑濮�, 1:寰呮壒鍑�, 2:涓嶆壒鍑�, 3:宸叉壒鍑�")
+    private Integer detailsRatifyStatus;
+
+    @Schema(description = "鎶ュ憡鐘舵��, 0: 鏈紑濮�, 1:寰呮彁浜�, 2:琛ユ壒鍑�, 3:宸叉壒鍑�")
+    private Integer reportStatus;
+
+    @Schema(description = "璇勪环鐘舵��, 0: 鏈紑濮�, 1:寰呰瘎浠�, 2:寰呮壒鍑�, 3:宸叉壒鍑�")
+    private Integer evaluateStatus;
+
+}
diff --git a/cnas-process/src/main/java/com/ruoyi/process/dto/QualityMonitorDetailsEvaluateDto.java b/cnas-process/src/main/java/com/ruoyi/process/dto/QualityMonitorDetailsEvaluateDto.java
new file mode 100644
index 0000000..b1a2241
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/dto/QualityMonitorDetailsEvaluateDto.java
@@ -0,0 +1,16 @@
+package com.ruoyi.process.dto;
+
+import com.ruoyi.process.pojo.QualityMonitorDetailsEvaluate;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * Author: yuan
+ * Date: 2024-12-20 鏄熸湡浜� 9:08:38
+ * Description:
+ */
+@Data
+public class QualityMonitorDetailsEvaluateDto extends QualityMonitorDetailsEvaluate {
+    @Schema(description = "鎵瑰噯鏃堕棿")
+    private String ratifyTimeStr;
+}
diff --git a/cnas-process/src/main/java/com/ruoyi/process/dto/QualityMonitorDto.java b/cnas-process/src/main/java/com/ruoyi/process/dto/QualityMonitorDto.java
new file mode 100644
index 0000000..3db11c2
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/dto/QualityMonitorDto.java
@@ -0,0 +1,22 @@
+package com.ruoyi.process.dto;
+
+import com.ruoyi.process.pojo.QualityMonitor;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * @Author zhuo
+ * @Date 2024/11/6
+ */
+@Data
+public class QualityMonitorDto extends QualityMonitor {
+
+    @Schema(description = "缂栧埗浜�")
+    private String writeName;
+
+    @Schema(description = "瀹℃牳浜�")
+    private String examineName;
+
+    @Schema(description = "鎵瑰噯浜�")
+    private String ratifyName;
+}
diff --git a/cnas-process/src/main/java/com/ruoyi/process/dto/QualitySuperviseDetailsAccordingDto.java b/cnas-process/src/main/java/com/ruoyi/process/dto/QualitySuperviseDetailsAccordingDto.java
new file mode 100644
index 0000000..3534d4d
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/dto/QualitySuperviseDetailsAccordingDto.java
@@ -0,0 +1,63 @@
+package com.ruoyi.process.dto;
+
+import com.ruoyi.process.pojo.QualitySuperviseDetailsAccording;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * Author: yuan
+ * Date: 2024-12-11 鏄熸湡涓� 16:26:41
+ * Description:
+ */
+@Data
+public class QualitySuperviseDetailsAccordingDto extends QualitySuperviseDetailsAccording {
+
+    @Schema(description = "1鍙戠幇閮ㄩ棬-鏃ユ湡")
+    private String discovererDateString;
+
+    @Schema(description = "3璐d换閮ㄩ棬 鏃ユ湡")
+    private String responsibleDepartmentDateString;
+
+    @Schema(description = "4绾犳鎺柦 鏃ユ湡")
+    private String correctiveMeasureDateString;
+
+    @Schema(description = "5璐ㄩ噺璐熻矗浜烘棩鏈�")
+    private String qualitySupervisorDateString;
+
+    @Schema(description = "0琚洃鐫f椂闂� 鏃ユ湡")
+    private String supervisedTimeString;
+
+    @Schema(description = "4绾犳鎺柦澶勭悊鍗曡窡韪�(鏄�)")
+    private String correctiveMeasureFollowTracksYes = "鈻�";
+    @Schema(description = "4绾犳鎺柦澶勭悊鍗曡窡韪�(鍚�)")
+    private String correctiveMeasureFollowTracksNo = "鈻�";
+
+
+    @Schema(description = "5鏄惁閫氱煡瀹㈡埛(鏄�)")
+    private String whetherInformCustomerYes = "鈻�";
+    @Schema(description = "5鏄惁閫氱煡瀹㈡埛(鍚�)")
+    private String whetherInformCustomerNo = "鈻�";
+
+
+    @Schema(description = "5鏄惁鎭㈠宸ヤ綔(1锛氭槸锛�2锛氬惁)")
+    private String whetherResumeWorkYes = "鈻�";
+    @Schema(description = "5鏄惁鎭㈠宸ヤ綔(1锛氭槸锛�2锛氬惁)")
+    private String whetherResumeWorkNo = "鈻�";
+
+    @Schema(description = "1涓嶇鍚堝伐浣滃彂鐜伴�斿緞0(绠$悊璇勫)")
+    private String discoveryApproach0 = "鈻�";
+    @Schema(description = "1涓嶇鍚堝伐浣滃彂鐜伴�斿緞1(鍐呴儴瀹℃牳)")
+    private String discoveryApproach1 = "鈻�";
+    @Schema(description = "1涓嶇鍚堝伐浣滃彂鐜伴�斿緞2(妫�娴嬭繃绋嬫帶鍒�)")
+    private String discoveryApproach2 = "鈻�";
+    @Schema(description = "1涓嶇鍚堝伐浣滃彂鐜伴�斿緞3(鍐呴儴璐ㄩ噺鎺у埗)")
+    private String discoveryApproach3 = "鈻�";
+    @Schema(description = "1涓嶇鍚堝伐浣滃彂鐜伴�斿緞4(鍐呴儴鐩戠潱)")
+    private String discoveryApproach4 = "鈻�";
+    @Schema(description = "1涓嶇鍚堝伐浣滃彂鐜伴�斿緞5(澶栭儴璇勫/妫�鏌�)")
+    private String discoveryApproach5 = "鈻�";
+    @Schema(description = "1涓嶇鍚堝伐浣滃彂鐜伴�斿緞6(椤惧鎶曡瘔/鎰忚鍙嶉)")
+    private String discoveryApproach6 = "鈻�";
+    @Schema(description = "1涓嶇鍚堝伐浣滃彂鐜伴�斿緞7(鍏朵粬)")
+    private String discoveryApproach7 = "鈻�";
+}
diff --git a/cnas-process/src/main/java/com/ruoyi/process/dto/QualitySuperviseDetailsCorrectDto.java b/cnas-process/src/main/java/com/ruoyi/process/dto/QualitySuperviseDetailsCorrectDto.java
new file mode 100644
index 0000000..55c9dab
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/dto/QualitySuperviseDetailsCorrectDto.java
@@ -0,0 +1,25 @@
+package com.ruoyi.process.dto;
+
+import com.ruoyi.process.pojo.QualitySuperviseDetailsCorrect;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * @Author zhuo
+ * @Date 2024/12/2
+ */
+@Data
+public class QualitySuperviseDetailsCorrectDto extends QualitySuperviseDetailsCorrect {
+
+    @Schema(description = "鎻愬嚭鏃堕棿")
+    private String raiseTimeString;
+
+    @Schema(description = "鍘熷洜鍒嗘瀽鏃堕棿")
+    private String causeTimeString;
+
+    @Schema(description = "绾犳鏃堕棿")
+    private String correctTimeString;
+
+    @Schema(description = "楠岃瘉鏃堕棿")
+    private String validationTimeString;
+}
diff --git a/cnas-process/src/main/java/com/ruoyi/process/dto/QualitySuperviseDetailsDto.java b/cnas-process/src/main/java/com/ruoyi/process/dto/QualitySuperviseDetailsDto.java
new file mode 100644
index 0000000..ffac447
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/dto/QualitySuperviseDetailsDto.java
@@ -0,0 +1,34 @@
+package com.ruoyi.process.dto;
+
+import com.ruoyi.process.pojo.QualitySuperviseDetails;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * @Author zhuo
+ * @Date 2024/11/7
+ */
+@Data
+public class QualitySuperviseDetailsDto extends QualitySuperviseDetails {
+
+    @Schema(description = "鏄惁绗﹀悎,0 涓嶇鍚�, 1绗﹀悎")
+    private Integer isAccording;
+
+    @Schema(description = "2鏄惁绾犳澶勭悊, 0鍚�, 1鏄�")
+    private Integer isCorrect;
+
+    @Schema(description = "璐ㄩ噺鐩戠潱璇︽儏绾犳澶勭悊id")
+    private Integer superviseDetailsCorrectId;
+
+    @Schema(description = "鐩戠潱鍘熷洜绫诲瀷, 1:瀹氭湡鐩戠潱, 2:鍔ㄦ�佺洃鐫�")
+    private Integer causeType;
+
+    @Schema(description = "璁板綍鐘舵��, 0: 鏈紑濮�, 1:寰呮壒鍑�, 2:涓嶆壒鍑�, 3:宸叉壒鍑�")
+    private Integer recordStatus;
+
+    @Schema(description = "鎺у埗鐘舵��, 0: 鏈紑濮�, 1:寰呮壒鍑�, 2:涓嶆壒鍑�, 3:宸叉壒鍑�")
+    private Integer accordingStatus;
+
+    @Schema(description = "绾犳鐘舵��, 0: 鏈紑濮�, 1:寰呮壒鍑�, 2:涓嶆壒鍑�, 3:宸叉壒鍑�")
+    private Integer correctStatus;
+}
diff --git a/cnas-process/src/main/java/com/ruoyi/process/dto/SampleItemDto.java b/cnas-process/src/main/java/com/ruoyi/process/dto/SampleItemDto.java
new file mode 100644
index 0000000..096641b
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/dto/SampleItemDto.java
@@ -0,0 +1,23 @@
+package com.ruoyi.process.dto;
+
+import lombok.Data;
+
+@Data
+//瑕佹眰銆佹爣涔﹀拰鍚堝悓璇勫鐨勬牱鍝佽鎯�
+public class SampleItemDto {
+
+    //鏍峰搧缂栧彿
+    private String code;
+
+    //鏍峰搧鍨嬪彿
+    private String model;
+
+    //璇曢獙椤圭洰
+    private String product;
+
+    //妫�楠屼緷鎹�
+    private String standardMethodList;
+
+    //澶囨敞
+    private String remark;
+}
diff --git a/cnas-process/src/main/java/com/ruoyi/process/excel/QualityMonitorDetailsUpload.java b/cnas-process/src/main/java/com/ruoyi/process/excel/QualityMonitorDetailsUpload.java
new file mode 100644
index 0000000..d6489af
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/excel/QualityMonitorDetailsUpload.java
@@ -0,0 +1,33 @@
+package com.ruoyi.process.excel;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import lombok.Data;
+
+/**
+ * @Author zhuo
+ * @Date 2024/11/8
+ */
+@Data
+public class QualityMonitorDetailsUpload {
+
+    @ExcelProperty("鐩戞帶鐩殑")
+    private String monitorPurpose;
+
+    @ExcelProperty("璁″垝寮�灞曟椂闂�")
+    private String plannedTime;
+
+    @ExcelProperty("鐩戞帶椤圭洰")
+    private String monitorProject;
+
+    @ExcelProperty("鍙傚姞鍗曚綅锛堜汉鍛橈級")
+    private String participant;
+
+    @ExcelProperty("棰勭畻锛堝厓锛�")
+    private String budget;
+
+    @ExcelProperty("缁勭粐浜哄憳")
+    private String organization;
+
+    @ExcelProperty("鐩戞帶鏂瑰紡")
+    private String monitorWay;
+}
diff --git a/cnas-process/src/main/java/com/ruoyi/process/excel/QualitySuperviseDetailsUpload.java b/cnas-process/src/main/java/com/ruoyi/process/excel/QualitySuperviseDetailsUpload.java
new file mode 100644
index 0000000..4a0aeb5
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/excel/QualitySuperviseDetailsUpload.java
@@ -0,0 +1,30 @@
+package com.ruoyi.process.excel;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import lombok.Data;
+
+/**
+ * @Author zhuo
+ * @Date 2024/11/8
+ */
+@Data
+public class QualitySuperviseDetailsUpload {
+
+    @ExcelProperty("鐩戠潱鏃ユ湡")
+    private String superviseTime;
+
+    @ExcelProperty("鐩戠潱鐩殑")
+    private String supervisePurpose;
+
+    @ExcelProperty("鐩戞帶椤圭洰")
+    private String superviseProject;
+
+    @ExcelProperty("琚洃鐫d汉鍛�")
+    private String supervisee;
+
+    @ExcelProperty("鐩戠潱鍘熷洜")
+    private String superviseReason;
+
+    @ExcelProperty("澶囨敞")
+    private String remark;
+}
diff --git a/cnas-process/src/main/java/com/ruoyi/process/listener/NewJuOrderInspectionListener.java b/cnas-process/src/main/java/com/ruoyi/process/listener/NewJuOrderInspectionListener.java
new file mode 100644
index 0000000..c444fa5
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/listener/NewJuOrderInspectionListener.java
@@ -0,0 +1,70 @@
+package com.ruoyi.process.listener;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.ruoyi.inspect.event.NewJuOrderPlacedEvent;
+import com.ruoyi.inspect.pojo.InsOrder;
+import com.ruoyi.inspect.service.InsOrderService;
+import com.ruoyi.process.mapper.InspectionOrderMapper;
+import com.ruoyi.process.pojo.InspectionOrder;
+import lombok.AllArgsConstructor;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.context.event.EventListener;
+import org.springframework.stereotype.Component;
+
+import java.time.LocalDate;
+
+/**
+ * 鏂拌仛鎴愬搧涓嬪崟鎴愬姛鍚庯紝鑷姩鐢熸垚涓�鏉℃楠屽鎵樺崟銆�
+ */
+@Component
+@AllArgsConstructor
+public class NewJuOrderInspectionListener {
+
+    private final InsOrderService insOrderService;
+    private final InspectionOrderMapper inspectionOrderMapper;
+
+    @EventListener
+    public void onNewJuOrderPlaced(NewJuOrderPlacedEvent event) {
+        InsOrder order = insOrderService.getById(event.getInsOrderId());
+        if (order == null) {
+            return;
+        }
+        // 骞傜瓑锛氬悓涓�鎴愬搧璁㈠崟宸叉湁妫�楠屽鎵樺崟鍒欒烦杩�
+        Long count = inspectionOrderMapper.selectCount(Wrappers.<InspectionOrder>lambdaQuery()
+                .eq(InspectionOrder::getInsOrderId, order.getId()));
+        if (count > 0) {
+            return;
+        }
+        InspectionOrder inspectionOrder = new InspectionOrder();
+        inspectionOrder.setInsOrderId(order.getId());
+        inspectionOrder.setEntrustCode(order.getEntrustCode());
+        // 璇曟牱鍚嶇О浼樺厛鍙栨姤鍛婂睍绀哄瓧娈�
+        inspectionOrder.setSampleName(StringUtils.isNotBlank(order.getSampleView())
+                ? order.getSampleView() : order.getSample());
+        inspectionOrder.setProduction(order.getProduction());
+        inspectionOrder.setQuantity(order.getTestQuantity());
+        inspectionOrder.setCommissionDate(LocalDate.now());
+        inspectionOrder.setCommissionUnit(order.getCompany());
+        inspectionOrder.setCommissionUser(order.getPrepareUser());
+        inspectionOrder.setCommissionPhone(order.getPhone());
+        inspectionOrder.setSampleStatus("瀹屽ソ");
+        // 鏄惁鐣欐牱璇箟杞崲锛歩ns 0鍚�/1鏄� -> cnas 1鏄�/2鍚�
+        inspectionOrder.setIsLeave(Integer.valueOf(1).equals(order.getIsLeave()) ? 1 : 2);
+        // 鏍峰搧澶勭疆锛�1濮旀墭鏂瑰彇鍥�/2妫�娴嬫柟澶勭疆 -> processing 0濮旀墭鍗曚綅鍙栧洖/1瀹為獙瀹ゅ鐞嗭紱鏈�夋椂娌跨敤鏃у瓧娈�
+        if (Integer.valueOf(1).equals(order.getSampleDisposal())) {
+            inspectionOrder.setProcessing(0);
+        } else if (Integer.valueOf(2).equals(order.getSampleDisposal())) {
+            inspectionOrder.setProcessing(1);
+        } else {
+            inspectionOrder.setProcessing(order.getProcessing());
+        }
+        // 鎶ュ憡浜や粯鏂瑰紡锛�1鑷彇 -> send 1锛屽叾浣� 0锛涙湭閫夋椂娌跨敤鏃у瓧娈�
+        if (order.getReportDelivery() != null) {
+            inspectionOrder.setSend(Integer.valueOf(1).equals(order.getReportDelivery()) ? 1 : 0);
+        } else {
+            inspectionOrder.setSend(order.getSend());
+        }
+        // 鎶ュ憡鏂囦欢涓庣害瀹氭椂闂寸敓鎴愭椂涓虹┖锛屽悗缁湪妫�楠屽鎵樺崟椤甸潰缂栬緫/涓婁紶
+        inspectionOrderMapper.insert(inspectionOrder);
+    }
+}
diff --git a/cnas-process/src/main/java/com/ruoyi/process/mapper/InconsistentDistributionDetailMapper.java b/cnas-process/src/main/java/com/ruoyi/process/mapper/InconsistentDistributionDetailMapper.java
new file mode 100644
index 0000000..8156b3a
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/mapper/InconsistentDistributionDetailMapper.java
@@ -0,0 +1,18 @@
+package com.ruoyi.process.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.process.pojo.InconsistentDistributionDetail;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ * 涓嶇鍚堥」鐨勫垎甯冭鎯� Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 
+ * @since 2024-11-15 09:53:33
+ */
+@Mapper
+public interface InconsistentDistributionDetailMapper extends BaseMapper<InconsistentDistributionDetail> {
+
+}
diff --git a/cnas-process/src/main/java/com/ruoyi/process/mapper/InconsistentDistributionMapper.java b/cnas-process/src/main/java/com/ruoyi/process/mapper/InconsistentDistributionMapper.java
new file mode 100644
index 0000000..cfce5b9
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/mapper/InconsistentDistributionMapper.java
@@ -0,0 +1,30 @@
+package com.ruoyi.process.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.process.dto.InconsistentDistributionDto;
+import com.ruoyi.process.pojo.InconsistentDistribution;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * <p>
+ * 涓嶇鍚堥」鐨勫垎甯� Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author
+ * @since 2024-11-15 09:53:20
+ */
+@Mapper
+public interface InconsistentDistributionMapper extends BaseMapper<InconsistentDistribution> {
+
+    /**
+     * 涓嶇鍚堥」鍒嗗竷鏌ヨ
+     * @param page
+     * @param ew
+     * @return
+     */
+    IPage<InconsistentDistributionDto> pageInconsistentDistribution(Page page, @Param("ew") QueryWrapper<InconsistentDistribution> ew);
+}
diff --git a/cnas-process/src/main/java/com/ruoyi/process/mapper/InspectionOrderDetailMapper.java b/cnas-process/src/main/java/com/ruoyi/process/mapper/InspectionOrderDetailMapper.java
new file mode 100644
index 0000000..3163136
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/mapper/InspectionOrderDetailMapper.java
@@ -0,0 +1,16 @@
+package com.ruoyi.process.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.process.pojo.InspectionOrderDetail;
+
+/**
+ * <p>
+ * 妫�楠屽鎵樺崟璇︽儏琛� Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-09
+ */
+public interface InspectionOrderDetailMapper extends BaseMapper<InspectionOrderDetail> {
+
+}
diff --git a/cnas-process/src/main/java/com/ruoyi/process/mapper/InspectionOrderMapper.java b/cnas-process/src/main/java/com/ruoyi/process/mapper/InspectionOrderMapper.java
new file mode 100644
index 0000000..96cee33
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/mapper/InspectionOrderMapper.java
@@ -0,0 +1,41 @@
+package com.ruoyi.process.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.inspect.pojo.InsOrder;
+import com.ruoyi.process.dto.InspectionOrderDto;
+import com.ruoyi.process.pojo.InspectionOrder;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 妫�楠屽鎵樺崟 Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-09
+ */
+public interface InspectionOrderMapper extends BaseMapper<InspectionOrder> {
+
+    /**
+     * 妫�楠屽鎵樺崟鍒嗛〉鏌ヨ
+     * @param page
+     * @param ew
+     * @return
+     */
+    IPage<InspectionOrderDto> pageInspectionOrder(Page page, @Param("ew") QueryWrapper<InspectionOrder> ew);
+
+    /**
+     * 濮旀墭鍗曟煡璇㈡垚鍝佽鍗�
+     * @param page
+     * @param insOrderQueryWrapper
+     * @return
+     */
+    IPage<InsOrder> getInsOrderOnInspection(Page page, @Param("ew") QueryWrapper<InsOrder> insOrderQueryWrapper);
+
+}
diff --git a/cnas-process/src/main/java/com/ruoyi/process/mapper/ProcessComplainMapper.java b/cnas-process/src/main/java/com/ruoyi/process/mapper/ProcessComplainMapper.java
new file mode 100644
index 0000000..7941190
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/mapper/ProcessComplainMapper.java
@@ -0,0 +1,25 @@
+package com.ruoyi.process.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.process.dto.ProcessComplainDto;
+import com.ruoyi.process.pojo.ProcessComplain;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * <p>
+ * 鎶曡瘔 Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author
+ * @since 2024-11-02 09:29:11
+ */
+public interface ProcessComplainMapper extends BaseMapper<ProcessComplain> {
+
+    IPage<ProcessComplain> pageProcessComplain(@Param("page") Page page, @Param("ew") QueryWrapper<ProcessComplain> queryWrappers);
+
+    ProcessComplainDto getProcessComplain(Long id);
+
+}
diff --git a/cnas-process/src/main/java/com/ruoyi/process/mapper/ProcessDealMapper.java b/cnas-process/src/main/java/com/ruoyi/process/mapper/ProcessDealMapper.java
new file mode 100644
index 0000000..82913de
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/mapper/ProcessDealMapper.java
@@ -0,0 +1,27 @@
+package com.ruoyi.process.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.process.dto.ProcessDealDto;
+import com.ruoyi.process.pojo.ProcessDeal;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 妫�娴嬫垨鏍″噯鐗╁搧鐨勫缃� Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author
+ * @since 2024-11-02 02:50:19
+ */
+public interface ProcessDealMapper extends BaseMapper<ProcessDeal> {
+
+    IPage<ProcessDeal> pageProcessDeal(Page page, @Param("ew") QueryWrapper<ProcessDeal> queryWrappers);
+
+    List<ProcessDealDto> selectDeal(@Param("id") Integer id);
+
+}
diff --git a/cnas-process/src/main/java/com/ruoyi/process/mapper/ProcessEvaluateMapper.java b/cnas-process/src/main/java/com/ruoyi/process/mapper/ProcessEvaluateMapper.java
new file mode 100644
index 0000000..85945d1
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/mapper/ProcessEvaluateMapper.java
@@ -0,0 +1,21 @@
+package com.ruoyi.process.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.process.pojo.ProcessEvaluate;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * <p>
+ * 娴嬮噺涓嶇‘瀹氬害鐨勮瘎浠� Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author
+ * @since 2024-11-02 01:10:43
+ */
+public interface ProcessEvaluateMapper extends BaseMapper<ProcessEvaluate> {
+
+    IPage<ProcessEvaluate> pageProcessEvaluate(Page page, @Param("ew") QueryWrapper<ProcessEvaluate> queryWrappers);
+}
diff --git a/cnas-process/src/main/java/com/ruoyi/process/mapper/ProcessMethodSearchNewArchivedMapper.java b/cnas-process/src/main/java/com/ruoyi/process/mapper/ProcessMethodSearchNewArchivedMapper.java
new file mode 100644
index 0000000..5a03a47
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/mapper/ProcessMethodSearchNewArchivedMapper.java
@@ -0,0 +1,28 @@
+package com.ruoyi.process.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.process.dto.ProcessMethodSearchNewArchivedDto;
+import com.ruoyi.process.pojo.ProcessMethodSearchNewArchived;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * <p>
+ * 鏍囧噯鏌ユ柊瀛樻。琛� Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-25 05:28:42
+ */
+public interface ProcessMethodSearchNewArchivedMapper extends BaseMapper<ProcessMethodSearchNewArchived> {
+
+    /**
+     * 鏌ヨ瀛樻。
+     * @param page
+     * @param ew
+     * @return
+     */
+    IPage<ProcessMethodSearchNewArchivedDto> pageSearchNewArchived(Page page, @Param("ew") QueryWrapper<ProcessMethodSearchNewArchivedDto> ew);
+}
diff --git a/cnas-process/src/main/java/com/ruoyi/process/mapper/ProcessMethodSearchNewBackupsMapper.java b/cnas-process/src/main/java/com/ruoyi/process/mapper/ProcessMethodSearchNewBackupsMapper.java
new file mode 100644
index 0000000..9d7b089
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/mapper/ProcessMethodSearchNewBackupsMapper.java
@@ -0,0 +1,27 @@
+package com.ruoyi.process.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.process.pojo.ProcessMethodSearchNewBackups;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * <p>
+ * 鏍囧噯鏌ユ柊澶囦唤琛� Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-25 05:29:02
+ */
+public interface ProcessMethodSearchNewBackupsMapper extends BaseMapper<ProcessMethodSearchNewBackups> {
+
+    /**
+     * 鏌ヨ瀛樻。澶囦唤鍒楄〃
+     * @param page
+     * @param ew
+     * @return
+     */
+    IPage<ProcessMethodSearchNewBackups> pageSearchNewBackups(Page page, @Param("ew") QueryWrapper<ProcessMethodSearchNewBackups> ew);
+}
diff --git a/cnas-process/src/main/java/com/ruoyi/process/mapper/ProcessMethodSearchNewMapper.java b/cnas-process/src/main/java/com/ruoyi/process/mapper/ProcessMethodSearchNewMapper.java
new file mode 100644
index 0000000..e82cfc7
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/mapper/ProcessMethodSearchNewMapper.java
@@ -0,0 +1,32 @@
+package com.ruoyi.process.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.process.dto.ProcessMethodSearchNewBackupsDto;
+import com.ruoyi.process.pojo.ProcessMethodSearchNew;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * 鏍囧噯鏌ユ柊
+ *
+ * @author zhuo
+ * @since 2024-11-04
+ */
+@Mapper
+public interface ProcessMethodSearchNewMapper extends BaseMapper<ProcessMethodSearchNew> {
+
+    /**
+     * 鏍囧噯鏌ユ柊鍒嗛〉鏌ヨ
+     * @param page
+     * @param processMethodSearchNewDtoQueryWrapper
+     * @param beginDate
+     * @param endDate
+     * @return
+     */
+    IPage<ProcessMethodSearchNew> pageMethodSearchNew(@Param("page") Page page, @Param("ew") QueryWrapper<ProcessMethodSearchNewBackupsDto> processMethodSearchNewDtoQueryWrapper, @Param("beginDate") String beginDate, @Param("endDate") String endDate);
+
+}
+
diff --git a/cnas-process/src/main/java/com/ruoyi/process/mapper/ProcessMethodVerifyCalibrationsFileMapper.java b/cnas-process/src/main/java/com/ruoyi/process/mapper/ProcessMethodVerifyCalibrationsFileMapper.java
new file mode 100644
index 0000000..1c495e3
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/mapper/ProcessMethodVerifyCalibrationsFileMapper.java
@@ -0,0 +1,34 @@
+package com.ruoyi.process.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.process.dto.ProcessMethodVerifyCalibrationsFileDto;
+import com.ruoyi.process.pojo.ProcessMethodVerifyCalibrationsFile;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * 鏍囧噯鏂规硶楠岃瘉璁惧鏍″噯闄勪欢琛�
+ *
+ * @author zhuo
+ * @since 2024-11-12
+ */
+@Mapper
+public interface ProcessMethodVerifyCalibrationsFileMapper extends BaseMapper<ProcessMethodVerifyCalibrationsFile> {
+
+    /**
+     * 鏌ヨ鏍″噯璇佷功闄勪欢琛�
+     * @param methodVerifyId
+     * @return
+     */
+    List<ProcessMethodVerifyCalibrationsFileDto> selectCalibrationsFileList(@Param("methodVerifyId") Integer methodVerifyId);
+
+    /**
+     * 璁惧id鏌ヨ鏍″噯璇佷功
+     * @param deviceId
+     * @return
+     */
+    String selectCalibrationsFile(@Param("deviceId") Integer deviceId);
+}
+
diff --git a/cnas-process/src/main/java/com/ruoyi/process/mapper/ProcessMethodVerifyMachineAttachmentMapper.java b/cnas-process/src/main/java/com/ruoyi/process/mapper/ProcessMethodVerifyMachineAttachmentMapper.java
new file mode 100644
index 0000000..5ef9293
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/mapper/ProcessMethodVerifyMachineAttachmentMapper.java
@@ -0,0 +1,17 @@
+package com.ruoyi.process.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.process.pojo.ProcessMethodVerifyMachineAttachment;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 鏍囧噯鏂规硶楠岃瘉璁惧闄勪欢琛�
+ *
+ * @author zhuo
+ * @since 2024-11-05
+ */
+@Mapper
+public interface ProcessMethodVerifyMachineAttachmentMapper extends BaseMapper<ProcessMethodVerifyMachineAttachment> {
+
+}
+
diff --git a/cnas-process/src/main/java/com/ruoyi/process/mapper/ProcessMethodVerifyMapper.java b/cnas-process/src/main/java/com/ruoyi/process/mapper/ProcessMethodVerifyMapper.java
new file mode 100644
index 0000000..1c0131b
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/mapper/ProcessMethodVerifyMapper.java
@@ -0,0 +1,29 @@
+package com.ruoyi.process.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.process.dto.ProcessMethodVerifyDto;
+import com.ruoyi.process.pojo.ProcessMethodVerify;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * 鏍囧噯鏂规硶楠岃瘉
+ *
+ * @author zhuo
+ * @since 2024-11-05
+ */
+@Mapper
+public interface ProcessMethodVerifyMapper extends BaseMapper<ProcessMethodVerify> {
+
+    /**
+     * 鏍囧噯鏂规硶鍙樻洿, 楠岃瘉
+     * @param page
+     * @param processMethodVerifyDtoQueryWrapper
+     * @return
+     */
+    IPage<ProcessMethodVerify> pagesMethodVerify(Page page, @Param("ew") QueryWrapper<ProcessMethodVerifyDto> processMethodVerifyDtoQueryWrapper);
+}
+
diff --git a/cnas-process/src/main/java/com/ruoyi/process/mapper/ProcessMethodVerifyMethodFileMapper.java b/cnas-process/src/main/java/com/ruoyi/process/mapper/ProcessMethodVerifyMethodFileMapper.java
new file mode 100644
index 0000000..b7dd2ee
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/mapper/ProcessMethodVerifyMethodFileMapper.java
@@ -0,0 +1,17 @@
+package com.ruoyi.process.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.process.pojo.ProcessMethodVerifyMethodFile;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 鏍囧噯鏂规硶楠岃瘉
+ *
+ * @author zhuo
+ * @since 2024-11-05
+ */
+@Mapper
+public interface ProcessMethodVerifyMethodFileMapper extends BaseMapper<ProcessMethodVerifyMethodFile> {
+
+}
+
diff --git a/cnas-process/src/main/java/com/ruoyi/process/mapper/ProcessMethodVerifyWorkFileMapper.java b/cnas-process/src/main/java/com/ruoyi/process/mapper/ProcessMethodVerifyWorkFileMapper.java
new file mode 100644
index 0000000..b103cb5
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/mapper/ProcessMethodVerifyWorkFileMapper.java
@@ -0,0 +1,24 @@
+package com.ruoyi.process.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.process.pojo.ProcessMethodVerifyWorkFile;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * 鏍囧噯鏂规硶楠岃瘉涓婂矖璇侀檮浠惰〃
+ *
+ * @author zhuo
+ * @since 2024-11-12
+ */
+@Mapper
+public interface ProcessMethodVerifyWorkFileMapper extends BaseMapper<ProcessMethodVerifyWorkFile> {
+
+    /**
+     * 鏍规嵁鐢ㄦ埛id鏌ヨ涓婂矖璇�
+     * @param userId
+     * @return
+     */
+    String selectWorkFile(@Param("userId") Integer userId);
+}
+
diff --git a/cnas-process/src/main/java/com/ruoyi/process/mapper/ProcessOrderDeviceMapper.java b/cnas-process/src/main/java/com/ruoyi/process/mapper/ProcessOrderDeviceMapper.java
new file mode 100644
index 0000000..03a5302
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/mapper/ProcessOrderDeviceMapper.java
@@ -0,0 +1,27 @@
+package com.ruoyi.process.mapper;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.process.pojo.ProcessOrderDevice;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Set;
+
+/**
+ * <p>
+ * cnas璁惧浣跨敤璁板綍琛�(7.1妫�楠屽鎵樺崟) Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author
+ * @since 2025-04-17 03:51:48
+ */
+public interface ProcessOrderDeviceMapper extends BaseMapper<ProcessOrderDevice> {
+
+    Set<String> selectDeviceNumber(@Param("inspectionOrderId") Integer inspectionOrderId);
+
+    List<Integer> selectDeviceIdsByNumbers(@Param("deviceNumbers") Set<String> deviceNumbers);
+
+    IPage<ProcessOrderDevice> deviceRecordPage(@Param("deviceId") Integer deviceId, @Param("page") Page page, @Param("sampleCode") String sampleCode, @Param("managementNumber") String managementNumber);
+}
diff --git a/cnas-process/src/main/java/com/ruoyi/process/mapper/ProcessReportMapper.java b/cnas-process/src/main/java/com/ruoyi/process/mapper/ProcessReportMapper.java
new file mode 100644
index 0000000..75bd9ac
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/mapper/ProcessReportMapper.java
@@ -0,0 +1,26 @@
+package com.ruoyi.process.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.process.dto.ProcessReportDto;
+import com.ruoyi.process.pojo.ProcessReport;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 妫�楠屾姤鍛婂彂鏀剧櫥璁拌〃 Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author
+ * @since 2024-11-05 08:58:39
+ */
+public interface ProcessReportMapper extends BaseMapper<ProcessReport> {
+
+    IPage<ProcessReportDto> pageProcessReport(Page page, @Param("ew") QueryWrapper<ProcessReportDto> queryWrappers);
+
+    List<ProcessReportDto> exportProcessReport();
+}
diff --git a/cnas-process/src/main/java/com/ruoyi/process/mapper/ProcessSampleMapper.java b/cnas-process/src/main/java/com/ruoyi/process/mapper/ProcessSampleMapper.java
new file mode 100644
index 0000000..14accb4
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/mapper/ProcessSampleMapper.java
@@ -0,0 +1,21 @@
+package com.ruoyi.process.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.process.pojo.ProcessSample;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * <p>
+ * 鏍峰搧鎺ユ敹 Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author
+ * @since 2024-12-12 05:02:49
+ */
+public interface ProcessSampleMapper extends BaseMapper<ProcessSample> {
+
+    IPage<ProcessSample> pageProcessSample(@Param("page") Page page, @Param("ew") QueryWrapper<ProcessSample> ew);
+}
diff --git a/cnas-process/src/main/java/com/ruoyi/process/mapper/ProcessTotaldealMapper.java b/cnas-process/src/main/java/com/ruoyi/process/mapper/ProcessTotaldealMapper.java
new file mode 100644
index 0000000..12a6189
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/mapper/ProcessTotaldealMapper.java
@@ -0,0 +1,21 @@
+package com.ruoyi.process.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.process.pojo.ProcessTotaldeal;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * <p>
+ * 妫�娴嬫垨鏍″噯鐗╁搧鐨勫缃�昏〃(鍘嗗彶) Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 
+ * @since 2024-11-02 03:59:09
+ */
+public interface ProcessTotaldealMapper extends BaseMapper<ProcessTotaldeal> {
+
+    IPage<ProcessTotaldeal> pageProcessTotaldeal(Page page, @Param("ew") QueryWrapper<ProcessTotaldeal> queryWrappers);
+}
diff --git a/cnas-process/src/main/java/com/ruoyi/process/mapper/QualityMonitorDetailsEvaluateFileMapper.java b/cnas-process/src/main/java/com/ruoyi/process/mapper/QualityMonitorDetailsEvaluateFileMapper.java
new file mode 100644
index 0000000..c7c6e98
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/mapper/QualityMonitorDetailsEvaluateFileMapper.java
@@ -0,0 +1,17 @@
+package com.ruoyi.process.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.process.pojo.QualityMonitorDetailsEvaluateFile;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 璐ㄩ噺鐩戞帶璁″垝璇︽儏璇勪环闄勪欢琛�
+ *
+ * @author zhuo
+ * @since 2024-11-07
+ */
+@Mapper
+public interface QualityMonitorDetailsEvaluateFileMapper extends BaseMapper<QualityMonitorDetailsEvaluateFile> {
+
+}
+
diff --git a/cnas-process/src/main/java/com/ruoyi/process/mapper/QualityMonitorDetailsEvaluateMapper.java b/cnas-process/src/main/java/com/ruoyi/process/mapper/QualityMonitorDetailsEvaluateMapper.java
new file mode 100644
index 0000000..92fdd63
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/mapper/QualityMonitorDetailsEvaluateMapper.java
@@ -0,0 +1,23 @@
+package com.ruoyi.process.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.process.pojo.QualityMonitorDetailsEvaluate;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 璐ㄩ噺鐩戞帶璁″垝璇︽儏璇勪环琛�
+ *
+ * @author zhuo
+ * @since 2024-11-06
+ */
+@Mapper
+public interface QualityMonitorDetailsEvaluateMapper extends BaseMapper<QualityMonitorDetailsEvaluate> {
+
+    /**
+     * 鏌ヨ璐ㄩ噺鐩戞帶璇勪环
+     * @param qualityMonitorDetailsId
+     * @return
+     */
+    QualityMonitorDetailsEvaluate getQualityMonitorEvaluate(Integer qualityMonitorDetailsId);
+}
+
diff --git a/cnas-process/src/main/java/com/ruoyi/process/mapper/QualityMonitorDetailsMapper.java b/cnas-process/src/main/java/com/ruoyi/process/mapper/QualityMonitorDetailsMapper.java
new file mode 100644
index 0000000..22bb9a7
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/mapper/QualityMonitorDetailsMapper.java
@@ -0,0 +1,29 @@
+package com.ruoyi.process.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.process.dto.QualityMonitorDetailsDto;
+import com.ruoyi.process.pojo.QualityMonitorDetails;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * 璐ㄩ噺鐩戞帶璁″垝璇︽儏琛�
+ *
+ * @author zhuo
+ * @since 2024-11-06
+ */
+@Mapper
+public interface QualityMonitorDetailsMapper extends BaseMapper<QualityMonitorDetails> {
+
+    /**
+     * 璐ㄩ噺鐩戞帶璁″垝鍒楄〃
+     * @param page
+     * @param qualityMonitorDetailsQueryWrapper
+     * @return
+     */
+    IPage<QualityMonitorDetailsDto> pageQualityMonitorDetail(Page page, @Param("ew") QueryWrapper<QualityMonitorDetails> qualityMonitorDetailsQueryWrapper);
+}
+
diff --git a/cnas-process/src/main/java/com/ruoyi/process/mapper/QualityMonitorDetailsRatifyMapper.java b/cnas-process/src/main/java/com/ruoyi/process/mapper/QualityMonitorDetailsRatifyMapper.java
new file mode 100644
index 0000000..12d27fc
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/mapper/QualityMonitorDetailsRatifyMapper.java
@@ -0,0 +1,17 @@
+package com.ruoyi.process.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.process.pojo.QualityMonitorDetailsRatify;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 璐ㄩ噺鐩戞帶璁″垝璇︽儏鎵瑰噯琛�
+ *
+ * @author zhuo
+ * @since 2024-11-06
+ */
+@Mapper
+public interface QualityMonitorDetailsRatifyMapper extends BaseMapper<QualityMonitorDetailsRatify> {
+
+}
+
diff --git a/cnas-process/src/main/java/com/ruoyi/process/mapper/QualityMonitorMapper.java b/cnas-process/src/main/java/com/ruoyi/process/mapper/QualityMonitorMapper.java
new file mode 100644
index 0000000..bf4f81e
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/mapper/QualityMonitorMapper.java
@@ -0,0 +1,28 @@
+package com.ruoyi.process.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.process.dto.QualityMonitorDto;
+import com.ruoyi.process.pojo.QualityMonitor;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * 璐ㄩ噺鐩戞帶璁″垝涓昏〃
+ *
+ * @author zhuo
+ * @since 2024-11-06
+ */
+@Mapper
+public interface QualityMonitorMapper extends BaseMapper<QualityMonitor> {
+
+    /**
+     * 鐩戞帶璁″垝鍒楄〃
+     * @return
+     */
+    IPage<QualityMonitorDto> pageQualityMonitor(Page page, @Param("ew") QueryWrapper<QualityMonitor> qualityMonitorQueryWrapper);
+
+}
+
diff --git a/cnas-process/src/main/java/com/ruoyi/process/mapper/QualitySuperviseDetailsAccordingMapper.java b/cnas-process/src/main/java/com/ruoyi/process/mapper/QualitySuperviseDetailsAccordingMapper.java
new file mode 100644
index 0000000..4ca9af7
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/mapper/QualitySuperviseDetailsAccordingMapper.java
@@ -0,0 +1,36 @@
+package com.ruoyi.process.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.process.dto.QualitySuperviseDetailsAccordingDto;
+import com.ruoyi.process.pojo.QualitySuperviseDetailsAccording;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * 璐ㄩ噺鐩戠潱璇︽儏涓嶇鍚堥」鎺у埗琛�
+ *
+ * @author zhuo
+ * @since 2024-11-07
+ */
+@Mapper
+public interface QualitySuperviseDetailsAccordingMapper extends BaseMapper<QualitySuperviseDetailsAccording> {
+
+    /**
+     * 鏌ヨ涓嶇鍚堥」鎺у埗鍒楄〃
+     * @param page
+     * @param ew
+     * @return
+     */
+    IPage<QualitySuperviseDetailsAccording> pageSuperviseDetailAccording(Page page, @Param("ew") QueryWrapper<QualitySuperviseDetailsAccording> ew);
+
+    /**
+     * 瀵煎嚭鐩戠潱璁板綍涓嶇鍚堟帶鍒朵俊鎭�
+     * @param superviseDetailId
+     * @return
+     */
+    QualitySuperviseDetailsAccordingDto selectSuperviseDetailsAccording(@Param("superviseDetailId") Integer superviseDetailId);
+}
+
diff --git a/cnas-process/src/main/java/com/ruoyi/process/mapper/QualitySuperviseDetailsCorrectFileMapper.java b/cnas-process/src/main/java/com/ruoyi/process/mapper/QualitySuperviseDetailsCorrectFileMapper.java
new file mode 100644
index 0000000..5d62de4
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/mapper/QualitySuperviseDetailsCorrectFileMapper.java
@@ -0,0 +1,17 @@
+package com.ruoyi.process.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.process.pojo.QualitySuperviseDetailsCorrectFile;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 璐ㄩ噺鐩戠潱璇︽儏绾犳鎺柦闄勪欢琛�
+ *
+ * @author zhuo
+ * @since 2024-11-09
+ */
+@Mapper
+public interface QualitySuperviseDetailsCorrectFileMapper extends BaseMapper<QualitySuperviseDetailsCorrectFile> {
+
+}
+
diff --git a/cnas-process/src/main/java/com/ruoyi/process/mapper/QualitySuperviseDetailsCorrectMapper.java b/cnas-process/src/main/java/com/ruoyi/process/mapper/QualitySuperviseDetailsCorrectMapper.java
new file mode 100644
index 0000000..f2576c0
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/mapper/QualitySuperviseDetailsCorrectMapper.java
@@ -0,0 +1,28 @@
+package com.ruoyi.process.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.process.pojo.QualitySuperviseDetailsCorrect;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * 璐ㄩ噺鐩戠潱璇︽儏绾犳澶勭悊琛�
+ *
+ * @author zhuo
+ * @since 2024-11-07
+ */
+@Mapper
+public interface QualitySuperviseDetailsCorrectMapper extends BaseMapper<QualitySuperviseDetailsCorrect> {
+
+    /**
+     * 鏌ヨ鐩戠潱绾犳鎺柦鍒楄〃
+     * @param page
+     * @param ew
+     * @return
+     */
+    IPage<QualitySuperviseDetailsCorrect> pageSuperviseDetailAccording(Page page, @Param("ew") QueryWrapper<QualitySuperviseDetailsCorrect> ew);
+}
+
diff --git a/cnas-process/src/main/java/com/ruoyi/process/mapper/QualitySuperviseDetailsMapper.java b/cnas-process/src/main/java/com/ruoyi/process/mapper/QualitySuperviseDetailsMapper.java
new file mode 100644
index 0000000..f21bbeb
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/mapper/QualitySuperviseDetailsMapper.java
@@ -0,0 +1,29 @@
+package com.ruoyi.process.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.process.dto.QualitySuperviseDetailsDto;
+import com.ruoyi.process.pojo.QualitySuperviseDetails;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * 璐ㄩ噺鐩戠潱璇︽儏琛�
+ *
+ * @author zhuo
+ * @since 2024-11-07
+ */
+@Mapper
+public interface QualitySuperviseDetailsMapper extends BaseMapper<QualitySuperviseDetails> {
+
+    /**
+     * 鐩戠潱璁″垝璇︽儏鍒楄〃
+     * @param page
+     * @param qualitySuperviseDetailsQueryWrapper
+     * @return
+     */
+    IPage<QualitySuperviseDetailsDto> pageQualitySuperviseDetail(Page page, @Param("ew") QueryWrapper<QualitySuperviseDetailsDto> qualitySuperviseDetailsQueryWrapper, @Param("causeType") Integer causeType);
+}
+
diff --git a/cnas-process/src/main/java/com/ruoyi/process/mapper/QualitySuperviseDetailsRecordMapper.java b/cnas-process/src/main/java/com/ruoyi/process/mapper/QualitySuperviseDetailsRecordMapper.java
new file mode 100644
index 0000000..e234345
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/mapper/QualitySuperviseDetailsRecordMapper.java
@@ -0,0 +1,24 @@
+package com.ruoyi.process.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.process.pojo.QualitySuperviseDetailsRecord;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * 璐ㄩ噺鐩戠潱璇︽儏璁板綍琛�
+ *
+ * @author makejava
+ * @since 2024-11-07
+ */
+@Mapper
+public interface QualitySuperviseDetailsRecordMapper extends BaseMapper<QualitySuperviseDetailsRecord> {
+
+    /**
+     * 瀵煎嚭鐩戠潱璁板綍琛�
+     * @param superviseDetailsId
+     * @return
+     */
+    QualitySuperviseDetailsRecord selectSuperviseDetailRecord(@Param("superviseDetailsId") Integer superviseDetailsId);
+}
+
diff --git a/cnas-process/src/main/java/com/ruoyi/process/mapper/QualitySuperviseManagementReviewMapper.java b/cnas-process/src/main/java/com/ruoyi/process/mapper/QualitySuperviseManagementReviewMapper.java
new file mode 100644
index 0000000..7a0ae0c
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/mapper/QualitySuperviseManagementReviewMapper.java
@@ -0,0 +1,26 @@
+package com.ruoyi.process.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.process.pojo.QualitySuperviseManagementReview;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * <p>
+ * 璐ㄩ噺鐩戠潱绠$悊璇勫杈撳叆鏉愭枡 Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author
+ * @since 2025-05-07 10:46:11
+ */
+public interface QualitySuperviseManagementReviewMapper extends BaseMapper<QualitySuperviseManagementReview> {
+
+    /**
+     * 鍒嗛〉鏌ヨ
+     * @param page
+     * @return
+     */
+    IPage<QualitySuperviseManagementReview> pageManagementReview(@Param("page") Page page, @Param("ew") QueryWrapper<QualitySuperviseManagementReview> ew);
+}
diff --git a/cnas-process/src/main/java/com/ruoyi/process/mapper/QualitySuperviseMapper.java b/cnas-process/src/main/java/com/ruoyi/process/mapper/QualitySuperviseMapper.java
new file mode 100644
index 0000000..0d88566
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/mapper/QualitySuperviseMapper.java
@@ -0,0 +1,38 @@
+package com.ruoyi.process.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.process.pojo.QualitySupervise;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 璐ㄩ噺鐩戠潱涓昏〃
+ *
+ * @author zhuo
+ * @since 2024-11-07
+ */
+@Mapper
+public interface QualitySuperviseMapper extends BaseMapper<QualitySupervise> {
+
+    /**
+     * 鐩戠潱璁″垝鍒楄〃
+     * @param page
+     * @param qualitySuperviseQueryWrapper
+     * @return
+     */
+    IPage<QualitySupervise> pageQualitySupervise(@Param("page") Page page, @Param("ew") QueryWrapper<QualitySupervise> qualitySuperviseQueryWrapper);
+
+    /**
+     * 鏌ヨ璇ヨ鍒掔洃鐫e憳
+     * @param superviseDetailsId
+     * @return
+     */
+    List<Map<String, String>> getRecordUser(Integer superviseDetailsId);
+}
+
diff --git a/cnas-process/src/main/java/com/ruoyi/process/pojo/InconsistentDistribution.java b/cnas-process/src/main/java/com/ruoyi/process/pojo/InconsistentDistribution.java
new file mode 100644
index 0000000..2f90322
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/pojo/InconsistentDistribution.java
@@ -0,0 +1,44 @@
+package com.ruoyi.process.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 涓嶇鍚堥」鐨勫垎甯�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-15 09:53:20
+ */
+
+@Data
+@TableName("cnas_inconsistent_distribution")
+@Schema(description = "涓嶇鍚堥」鐨勫垎甯�")
+public class InconsistentDistribution {
+
+    @TableId(value = "distribution_id", type = IdType.AUTO)
+    private Integer distributionId;
+
+    @Schema(description = "骞翠唤")
+    private String distributionYear;
+
+    @Schema(description = "鍒涘缓浜�")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @Schema(description = "鍒涘缓鏃堕棿")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @Schema(description = "淇敼浜�")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    @Schema(description = "淇敼鏃堕棿")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+}
diff --git a/cnas-process/src/main/java/com/ruoyi/process/pojo/InconsistentDistributionDetail.java b/cnas-process/src/main/java/com/ruoyi/process/pojo/InconsistentDistributionDetail.java
new file mode 100644
index 0000000..f637872
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/pojo/InconsistentDistributionDetail.java
@@ -0,0 +1,73 @@
+package com.ruoyi.process.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 涓嶇鍚堥」鐨勫垎甯冭鎯�
+ * </p>
+ *
+ * @author 
+ * @since 2024-11-15 09:53:33
+ */
+@Data
+@TableName("cnas_inconsistent_distribution_detail")
+@Schema(description = "涓嶇鍚堥」鐨勫垎甯冭鎯�")
+public class InconsistentDistributionDetail {
+
+    @TableId(value = "distribution_detail_id", type = IdType.AUTO)
+    private Integer distributionDetailId;
+
+    @Schema(description = "涓昏〃id")
+    private Integer distributionId;
+
+    @Schema(description = "绔犺妭鍙�")
+    private String chapterNumber;
+
+    @Schema(description = "瑕佺礌")
+    private String essentials;
+
+    @Schema(description = "涓讳换")
+    private Integer director;
+
+    @Schema(description = "鎶�鏈礋璐d汉")
+    private Integer technology;
+
+    @Schema(description = "璐ㄩ噺璐熻矗浜�")
+    private Integer quality;
+
+    @Schema(description = "缁煎悎瀹�")
+    private Integer comprehensive;
+
+    @Schema(description = "璇曢獙瀹�")
+    private Integer testing;
+
+    @Schema(description = "鍒涘缓浜�")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @Schema(description = "鍒涘缓鏃堕棿")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @Schema(description = "淇敼浜�")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    @Schema(description = "淇敼鏃堕棿")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+
+    @Schema(description = "鍚堣")
+    @TableField(select = false,exist = false)
+    private Integer total;
+
+    @Schema(description = "鍗犳瘮")
+    @TableField(select = false,exist = false)
+    private BigDecimal proportion;
+}
diff --git a/cnas-process/src/main/java/com/ruoyi/process/pojo/InspectionOrder.java b/cnas-process/src/main/java/com/ruoyi/process/pojo/InspectionOrder.java
new file mode 100644
index 0000000..3a0a6f3
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/pojo/InspectionOrder.java
@@ -0,0 +1,109 @@
+package com.ruoyi.process.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 妫�楠屽鎵樺崟
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-09
+ */
+@Getter
+@Setter
+@TableName("cnas_inspection_order")
+@Schema(description = "妫�楠屽鎵樺崟")
+public class InspectionOrder {
+
+    @TableId(value = "inspection_order_id", type = IdType.AUTO)
+    private Integer inspectionOrderId;
+
+    @Schema(description = "鎴愬搧璁㈠崟id")
+    private Integer insOrderId;
+
+    @Schema(description = "濮旀墭缂栧彿")
+    private String entrustCode;
+
+    @Schema(description = "璇曟牱鍚嶇О")
+    private String sampleName;
+
+    @Schema(description = "鍨嬪彿")
+    private String modelNo;
+
+    @Schema(description = "鐢熶骇鍗曚綅")
+    private String production;
+
+    @Schema(description = "鏍峰搧鏁伴噺")
+    private String quantity;
+
+    @Schema(description = "濮旀墭鏃堕棿")
+    private LocalDate commissionDate;
+
+    @Schema(description = "濮旀墭鍗曚綅")
+    private String commissionUnit;
+
+    @Schema(description = "濮旀墭浜�")
+    private String commissionUser;
+
+    @Schema(description = "濮旀墭浜鸿仈绯绘柟寮�")
+    private String commissionPhone;
+
+    @Schema(description = "鏍峰搧鐘舵��")
+    private String sampleStatus;
+
+    @Schema(description = "鏄惁鐣欐牱1: 鏄�, 2:鍚�")
+    private Integer isLeave;
+
+    @Schema(description = "鏍峰搧澶勭悊鏂瑰紡 1锛氬疄楠屽澶勭悊 0锛氬鎵樺崟浣嶅彇鍥�")
+    private Integer processing;
+
+    @Schema(description = "绾﹀畾鏃堕棿")
+    private LocalDate appointed;
+
+    @Schema(description = "鎶ュ憡鍙戦�佹柟寮� 1锛氳嚜鍙� 0锛氬叾浠�")
+    private Integer send;
+
+    @Schema(description = "鍒ゆ柇瑙勫垯 1锛氳�冭檻涓嶇‘瀹氬害 0锛氫笉鑰冭檻涓嶇‘瀹氬害")
+    private Integer criterionRule;
+
+    @Schema(description = "鍒ゆ柇瑙勫垯鑰冭檻涓嶇‘瀹氬害澶囨敞")
+    private String criterionRuleRemark;
+
+    @Schema(description = "缁煎悎瀹や汉鍛�")
+    private String generalOfficeUser;
+
+    @Schema(description = "鎺ユ敹鏃ユ湡")
+    private LocalDate receiptData;
+
+    @Schema(description = "棰嗘牱浜哄憳")
+    private String sampleTakerUser;
+
+    @Schema(description = "棰嗘牱鏃ユ湡")
+    private LocalDate sampleData;
+
+    @Schema(description = "鎶ュ憡鏂囦欢鍦板潃")
+    private String fileUrl;
+
+    @Schema(description = "鍒涘缓浜�")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @Schema(description = "鍒涘缓鏃堕棿")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @Schema(description = "淇敼浜�")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    @Schema(description = "淇敼鏃堕棿")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+}
diff --git a/cnas-process/src/main/java/com/ruoyi/process/pojo/InspectionOrderDetail.java b/cnas-process/src/main/java/com/ruoyi/process/pojo/InspectionOrderDetail.java
new file mode 100644
index 0000000..44c7542
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/pojo/InspectionOrderDetail.java
@@ -0,0 +1,61 @@
+package com.ruoyi.process.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 妫�楠屽鎵樺崟璇︽儏琛�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-09
+ */
+@Getter
+@Setter
+@TableName("cnas_inspection_order_detail")
+@Schema(description = "妫�楠屽鎵樺崟璇︽儏琛�")
+public class InspectionOrderDetail {
+
+    @TableId(value = "inspection_order_detail_id", type = IdType.AUTO)
+    private Integer inspectionOrderDetailId;
+
+    @Schema(description = "濮旀墭鍗昳d")
+    private Integer inspectionOrderId;
+
+    @Schema(description = "鏍峰搧缂栧彿")
+    private String sampleNumber;
+
+    @Schema(description = "璇曢獙椤圭洰")
+    private String testItem;
+
+    @Schema(description = "璇曢獙渚濇嵁")
+    private String testStandard;
+
+    @Schema(description = "澶囨敞")
+    private String remark;
+
+    @Schema(description = "鍒涘缓浜�")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @Schema(description = "鍒涘缓鏃堕棿")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @Schema(description = "淇敼浜�")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    @Schema(description = "淇敼鏃堕棿")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+
+    // 瀵煎嚭浣跨敤
+    @TableField(select = false, exist = false)
+    private Integer index;
+}
diff --git a/cnas-process/src/main/java/com/ruoyi/process/pojo/ProcessComplain.java b/cnas-process/src/main/java/com/ruoyi/process/pojo/ProcessComplain.java
new file mode 100644
index 0000000..1e890ff
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/pojo/ProcessComplain.java
@@ -0,0 +1,141 @@
+package com.ruoyi.process.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 io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 鎶曡瘔
+ * </p>
+ *
+ * @author
+ * @since 2024-11-02 09:29:11
+ */
+@Getter
+@Setter
+@TableName("cnas_process_complain")
+@Schema(description = "鎶曡瘔")
+public class ProcessComplain  implements Serializable {
+
+
+    @TableId(value = "id", type = IdType.AUTO)
+    @ExcelIgnore
+    private Integer id;
+
+    @Schema(description = "鎶曡瘔缂栧彿")
+    @ExcelIgnore
+    private String complainNo;
+
+    @Schema(description = "鎶曡瘔鍚嶇О")
+    @ExcelProperty(value = "鎶曡瘔鍚嶇О")
+    private String complainName;
+
+    @Schema(description = "澶栭敭鍏宠仈(妫�娴嬫姤鍛奿d)")
+    @ExcelIgnore
+    private Integer insReportId;
+
+    @ExcelIgnore
+    @TableField(select = false,exist = false)
+    //鐢ㄦ潵鏂板浼犲弬鐨勬姤鍛婄紪鍙�
+    private String code;
+
+    @Schema(description = "鏍峰搧缂栧彿")
+    @ExcelIgnore
+    private String sampleCode;
+
+    @Schema(description = "鎶曡瘔浜�")
+    @TableField(fill = FieldFill.INSERT)
+    @ExcelIgnore
+    private Integer createUser;
+
+    @ExcelProperty(value = "鎶曡瘔浜�")
+    @TableField(select = false,exist = false)
+    private String complainant;
+
+    @Schema(description = "鎶曡瘔鏃ユ湡")
+    @ExcelProperty(value = "鎶曡瘔鏃ユ湡")
+    @TableField(fill = FieldFill.INSERT)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime createTime;
+
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    @ExcelIgnore
+    private Integer updateUser;
+
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    @ExcelIgnore
+    private LocalDateTime updateTime;
+
+    @Schema(description = "鎶曡瘔鏂瑰紡")
+    @ExcelIgnore
+    private String complainMethod;
+
+    @Schema(description = "闂璁板綍")
+    @ExcelIgnore
+    private String problemRecords;
+
+    @Schema(description = "闂璁板綍-璐ㄩ噺璐熻矗浜�")
+    @ExcelIgnore
+    private Integer problemRecordsUser;
+
+    @Schema(description = "闂璁板綍-鏃ユ湡")
+    @ExcelIgnore
+    private LocalDate problemRecordsTime;
+
+    @Schema(description = "璐d换褰掑睘鍙婃姇璇夋槸鍚︽垚绔�")
+    @ExcelIgnore
+    private String dutyOwnership;
+
+    @Schema(description = "璐d换褰掑睘鍙婃姇璇夋槸鍚︽垚绔媉璐ㄩ噺璐熻矗浜�")
+    @ExcelIgnore
+    private Integer dutyOwnershipUser;
+
+    @Schema(description = "璐d换褰掑睘鍙婃姇璇夋槸鍚︽垚绔媉鏃ユ湡")
+    @ExcelIgnore
+    private LocalDate dutyOwnershipTime;
+
+    @Schema(description = "鍘熷洜鍒嗘瀽")
+    @ExcelIgnore
+    private String causeAnalysis;
+
+    @Schema(description = "鍘熷洜鍒嗘瀽_璐d换閮ㄩ棬璐熻矗浜�")
+    @ExcelIgnore
+    private Integer causeAnalysisUser;
+
+    @Schema(description = "鍘熷洜鍒嗘瀽_鏃ユ湡")
+    @ExcelIgnore
+    private LocalDate causeAnalysisTime;
+
+    @Schema(description = "绾犳鎺柦")
+    @ExcelIgnore
+    private String correctiveAction;
+
+    @Schema(description = "绾犳鎺柦_璐d换閮ㄩ棬璐熻矗浜�")
+    @ExcelIgnore
+    private Integer correctiveActionUser;
+
+    @Schema(description = "绾犳鎺柦_鏃ユ湡")
+    @ExcelIgnore
+    private LocalDate correctiveActionTime;
+
+    @Schema(description = "绾犳鎺柦纭")
+    @ExcelIgnore
+    private String correctiveActionConfirmation;
+
+    @Schema(description = "绾犳鎺柦纭_璐ㄩ噺璐熻矗浜�")
+    @ExcelIgnore
+    private Integer correctiveActionConfirmationUser;
+
+    @Schema(description = "绾犳鎺柦纭_鏃ユ湡")
+    @ExcelIgnore
+    private LocalDate correctiveActionConfirmationTime;
+}
diff --git a/cnas-process/src/main/java/com/ruoyi/process/pojo/ProcessDeal.java b/cnas-process/src/main/java/com/ruoyi/process/pojo/ProcessDeal.java
new file mode 100644
index 0000000..5d05b6e
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/pojo/ProcessDeal.java
@@ -0,0 +1,75 @@
+package com.ruoyi.process.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 妫�娴嬫垨鏍″噯鐗╁搧鐨勫缃�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-02 02:50:19
+ */
+@Getter
+@Setter
+@TableName("cnas_process_deal")
+@Schema(description = "妫�娴嬫垨鏍″噯鐗╁搧鐨勫缃�")
+public class ProcessDeal implements Serializable {
+
+
+    @Schema(description = "涓婚敭")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @Schema(description = "鏍峰搧鍚嶇О")
+    private String sampleName;
+
+    @Schema(description = "鏍峰搧缂栧彿")
+    private String sampleCode;
+
+    @Schema(description = "渚涙牱鍗曚綅")
+    private String sampleSupplier;
+
+    @Schema(description = "鏁伴噺")
+    private Integer num;
+
+    @Schema(description = "澶勭悊鏂瑰紡")
+    private String dealMethod;
+
+    @Schema(description = "鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private LocalDate dealTime;
+
+    @Schema(description = "鍒涘缓浜�")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @Schema(description = "鏇存柊浜�")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    @Schema(description = "鍒涘缓鏃堕棿")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @Schema(description = "鏇存柊鏃堕棿")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+
+    @Schema(description = "鍏宠仈鐨勫巻鍙叉�昏〃id")
+    private Integer totaldealId;
+
+    @Schema(description = "鍏宠仈鐨勫巻鍙插缃牱鍝乮d")
+    private Integer processSampleId;
+
+    @Schema(description = "鍏宠仈鐨勬楠屾牱鍝乮d(ins_sample)")
+    private Integer insSampleId;
+}
diff --git a/cnas-process/src/main/java/com/ruoyi/process/pojo/ProcessEvaluate.java b/cnas-process/src/main/java/com/ruoyi/process/pojo/ProcessEvaluate.java
new file mode 100644
index 0000000..417d67c
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/pojo/ProcessEvaluate.java
@@ -0,0 +1,73 @@
+package com.ruoyi.process.pojo;
+
+import com.alibaba.excel.annotation.ExcelIgnore;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.baomidou.mybatisplus.annotation.*;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 娴嬮噺涓嶇‘瀹氬害鐨勮瘎浠�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-02 01:10:43
+ */
+@Getter
+@Setter
+@TableName("cnas_process_evaluate")
+@Schema(description = "娴嬮噺涓嶇‘瀹氬害鐨勮瘎浠�")
+public class ProcessEvaluate  implements Serializable {
+
+
+    @TableId(value = "id", type = IdType.AUTO)
+    @ExcelIgnore
+    private Integer id;
+
+    @Schema(description = "鎶ュ憡鍚嶇О")
+    @ExcelProperty(value = "鎶ュ憡鍚嶇О")
+    private String reportName;
+
+    @Schema(description = "鎶ュ憡璺緞")
+    @ExcelIgnore
+    private String reportUrl;
+
+    @Schema(description = "璇勪环浜�")
+    @ExcelIgnore
+    private Integer evaluateUser;
+
+    @TableField(select = false,exist = false)
+    @ExcelProperty(value = "璇勪环浜�")
+    private String evaluateUserName;
+
+    @Schema(description = "璇勪环鏃ユ湡")
+    @ExcelProperty(value = "璇勪环鏃ユ湡")
+    private LocalDate evaluateTime;
+
+    @Schema(description = "澶囨敞")
+    @ExcelProperty(value = "澶囨敞")
+    private String note;
+
+    @TableField(fill = FieldFill.INSERT)
+    @ExcelIgnore
+    private Integer createUser;
+
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    @ExcelIgnore
+    private Integer updateUser;
+
+    @TableField(fill = FieldFill.INSERT)
+    @ExcelIgnore
+    private LocalDateTime createTime;
+
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    @ExcelIgnore
+    private LocalDateTime updateTime;
+}
diff --git a/cnas-process/src/main/java/com/ruoyi/process/pojo/ProcessMethodSearchNew.java b/cnas-process/src/main/java/com/ruoyi/process/pojo/ProcessMethodSearchNew.java
new file mode 100644
index 0000000..a5aaec6
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/pojo/ProcessMethodSearchNew.java
@@ -0,0 +1,69 @@
+package com.ruoyi.process.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+/**
+ * 鏍囧噯鏌ユ柊
+ *
+ * @author zhuo
+ * @since 2024-11-04
+ */
+@Data
+@TableName("cnas_process_method_search_new")
+@Schema(description = "鏍囧噯鏌ユ柊琛�")
+public class ProcessMethodSearchNew {
+
+    @TableId(type = IdType.AUTO)
+    private Integer methodSearchNewId;
+
+    @Schema(description = "鏍囧噯鏂规硶楠岃瘉id")
+    private Integer verifyId;
+
+    @Schema(description = "鏍囧噯鍚嶇О")
+    private String methodName;
+
+    @Schema(description = "鏍囧噯鍙�")
+    private String standardNo;
+
+    @Schema(description = "鏂囦欢缂栧彿")
+    private String fileNo;
+
+    @Schema(description = "鏄惁鏄柊鏍囧噯, 0鍚�,1鏄�")
+    private Integer isNewStandard;
+
+    @Schema(description = "鏂版爣鍑嗗悕绉�")
+    private String newMethodName;
+
+    @Schema(description = "鏂版爣鍑嗗彿")
+    private String newStandardNo;
+
+    @Schema(description = "鏌ユ柊璁板綍鏉ユ簮, 0,鏍囧噯缃�, 1濮旀墭鎯呮姤, 2鏍囧噯鏁�, 3鍏朵粬")
+    private Integer searchNewSource;
+
+    @Schema(description = "澶囨敞,0浣滃簾, 1鏇挎崲")
+    private Integer remark;
+
+    @Schema(description = "鍒涘缓浜�")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @Schema(description = "鍒涘缓鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @Schema(description = "淇敼浜�")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    @Schema(description = "淇敼鏃堕棿")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+
+}
+
diff --git a/cnas-process/src/main/java/com/ruoyi/process/pojo/ProcessMethodSearchNewArchived.java b/cnas-process/src/main/java/com/ruoyi/process/pojo/ProcessMethodSearchNewArchived.java
new file mode 100644
index 0000000..3093fed
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/pojo/ProcessMethodSearchNewArchived.java
@@ -0,0 +1,62 @@
+package com.ruoyi.process.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 鏍囧噯鏌ユ柊瀛樻。琛�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-25 05:28:42
+ */
+@Getter
+@Setter
+@TableName("cnas_process_method_search_new_archived")
+@Schema(description = "鏍囧噯鏌ユ柊瀛樻。琛�")
+public class ProcessMethodSearchNewArchived implements Serializable {
+
+    @TableId(value = "archived_id", type = IdType.AUTO)
+    private Integer archivedId;
+
+    @Schema(description = "瀛樻。鍚嶇О")
+    private String archivedName;
+
+    @Schema(description = "缂栧埗浜�")
+    private Integer writeUserId;
+
+    @Schema(description = "缂栧埗鏃堕棿")
+    private LocalDateTime writeTime;
+
+    @Schema(description = "鎵瑰噯浜�")
+    private Integer ratifyUserId;
+
+    @Schema(description = "鎵瑰噯鏃堕棿")
+    private LocalDateTime ratifyTime;
+
+    @Schema(description = "鎵瑰噯鐘舵��,0 涓嶉�氳繃, 1 閫氳繃")
+    private Integer ratifyStatus;
+
+    @Schema(description = "鎵瑰噯淇℃伅")
+    private String ratifyRemark;
+
+    @Schema(description = "鍒涘缓浜�")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @Schema(description = "鍒涘缓鏃堕棿")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+}
diff --git a/cnas-process/src/main/java/com/ruoyi/process/pojo/ProcessMethodSearchNewBackups.java b/cnas-process/src/main/java/com/ruoyi/process/pojo/ProcessMethodSearchNewBackups.java
new file mode 100644
index 0000000..a503d88
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/pojo/ProcessMethodSearchNewBackups.java
@@ -0,0 +1,83 @@
+package com.ruoyi.process.pojo;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 鏍囧噯鏌ユ柊澶囦唤琛�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-25 05:29:02
+ */
+@Getter
+@Setter
+@ExcelIgnoreUnannotated
+@TableName("cnas_process_method_search_new_backups")
+@Schema(description = "鏍囧噯鏌ユ柊澶囦唤琛�")
+public class ProcessMethodSearchNewBackups{
+
+    @TableId(value = "backups_id", type = IdType.AUTO)
+    private Integer backupsId;
+
+    @Schema(description = "瀛樻。id")
+    private Integer archivedId;
+
+    @Schema(description = "鏍囧噯鏂规硶楠岃瘉id")
+    private Integer verifyId;
+
+    @ExcelProperty(value = {"鏍囧噯鍚嶇О", "鏍囧噯鍚嶇О"}, index = 1)
+    @Schema(description = "鏍囧噯鍚嶇О")
+    private String methodName;
+
+    @ExcelProperty(value = {"鏍囧噯鍙�", "鏍囧噯鍙�"}, index = 2)
+    @Schema(description = "鏍囧噯鍙�")
+    private String standardNo;
+
+    @ExcelProperty(value = {"鏂囦欢缂栧彿", "鏂囦欢缂栧彿"}, index = 3)
+    @Schema(description = "鏂囦欢缂栧彿")
+    private String fileNo;
+
+    @Schema(description = "鏄惁鏄柊鏍囧噯, 0鍚�,1鏄�")
+    private Integer isNewStandard;
+
+    @ExcelProperty(value = {"鏂版爣鍑嗗悕绉�", "鏂版爣鍑嗗悕绉�"}, index = 5)
+    @Schema(description = "鏂版爣鍑嗗悕绉�")
+    private String newMethodName;
+
+    @ExcelProperty(value = {"鏂版爣鍑嗗彿", "鏂版爣鍑嗗彿"}, index =6)
+    @Schema(description = "鏂版爣鍑嗗彿")
+    private String newStandardNo;
+
+    @Schema(description = "鏌ユ柊璁板綍鏉ユ簮, 0,鏍囧噯缃�, 1濮旀墭鎯呮姤, 2鏍囧噯鏁�, 3鍏朵粬")
+    private Integer searchNewSource;
+
+    @Schema(description = "澶囨敞,0浣滃簾, 1鏇挎崲")
+    private Integer remark;
+
+    @Schema(description = "鍒涘缓浜�")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @Schema(description = "鍒涘缓鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @Schema(description = "淇敼浜�")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    @Schema(description = "淇敼鏃堕棿")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+
+}
diff --git a/cnas-process/src/main/java/com/ruoyi/process/pojo/ProcessMethodVerify.java b/cnas-process/src/main/java/com/ruoyi/process/pojo/ProcessMethodVerify.java
new file mode 100644
index 0000000..693471b
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/pojo/ProcessMethodVerify.java
@@ -0,0 +1,133 @@
+package com.ruoyi.process.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+/**
+ * 鏍囧噯鏂规硶楠岃瘉
+ *
+ * @author zhuo
+ * @since 2024-11-05
+ */
+@Data
+@TableName("cnas_process_method_verify")
+public class ProcessMethodVerify {
+
+    @TableId(type = IdType.AUTO)
+    private Integer methodVerifyId;
+
+    @Schema(description = "0鍙樻洿,1楠岃瘉")
+    private Integer operationType;
+
+    @Schema(description = "鏍囧噯鏂规硶")
+    private String methodName;
+
+    @Schema(description = "楠岃瘉鍘熷洜")
+    private String verifyReason;
+
+    @Schema(description = "涓昏鎶�鏈彉鍖�")
+    private String technologyChange;
+
+    @Schema(description = "(浜�)鏍囧噯瑕佹眰")
+    private String personRequirements;
+    @Schema(description = "(浜�)鍑嗗鎯呭喌")
+    private String personReadiness;
+    @Schema(description = "(浜�)鏄惁婊¤冻")
+    private Integer personIsSatisfied;
+    @Schema(description = "(浜�)澶囨敞")
+    private String personRemark;
+
+    @Schema(description = "(鏈�)鏍囧噯瑕佹眰")
+    private String machineRequirements;
+    @Schema(description = "(鏈�)鍑嗗鎯呭喌")
+    private String machineReadiness;
+    @Schema(description = "(鏈�)鏄惁婊¤冻")
+    private Integer machineIsSatisfied;
+    @Schema(description = "(鏈�)澶囨敞")
+    private String machineRemark;
+
+    @Schema(description = "(鏂�)鏍囧噯瑕佹眰")
+    private String materialRequirements;
+    @Schema(description = "(鏂�)鍑嗗鎯呭喌")
+    private String materialReadiness;
+    @Schema(description = "(鏂�)鏄惁婊¤冻")
+    private Integer materialIsSatisfied;
+    @Schema(description = "(鏂�)澶囨敞")
+    private String materialRemark;
+
+    @Schema(description = "(娉�)鏍囧噯瑕佹眰")
+    private String methodRequirements;
+    @Schema(description = "(娉�)鍑嗗鎯呭喌")
+    private String methodReadiness;
+    @Schema(description = "(娉�)鏄惁婊¤冻")
+    private Integer methodIsSatisfied;
+    @Schema(description = "(娉�)澶囨敞")
+    private String methodRemark;
+
+    @Schema(description = "(鐜�)鏍囧噯瑕佹眰")
+    private String environmentRequirements;
+    @Schema(description = "(鐜�)鍑嗗鎯呭喌")
+    private String environmentReadiness;
+    @Schema(description = "(鐜�)鏄惁婊¤冻")
+    private Integer environmentIsSatisfied;
+    @Schema(description = "(鐜�)澶囨敞")
+    private String environmentRemark;
+
+    @Schema(description = "(娴嬮噺婧簮鎬�)鏍囧噯瑕佹眰")
+    private String traceabilityRequirements;
+    @Schema(description = "(娴嬮噺婧簮鎬�)鍑嗗鎯呭喌")
+    private String traceabilityReadiness;
+    @Schema(description = "(娴嬮噺婧簮鎬�)鏄惁婊¤冻")
+    private Integer traceabilityIsSatisfied;
+    @Schema(description = "(娴嬮噺婧簮鎬�)澶囨敞")
+    private String traceabilityRemark;
+
+    @Schema(description = "(鏍峰搧绠$悊闇�姹�)鏍囧噯瑕佹眰")
+    private String managementRequirements;
+    @Schema(description = "(鏍峰搧绠$悊闇�姹�)鍑嗗鎯呭喌")
+    private String managementReadiness;
+    @Schema(description = "(鏍峰搧绠$悊闇�姹�)鏄惁婊¤冻")
+    private Integer managementIsSatisfied;
+    @Schema(description = "(鏍峰搧绠$悊闇�姹�)澶囨敞")
+    private String managementRemark;
+
+    @Schema(description = "(鍏朵粬)鏍囧噯瑕佹眰")
+    private String otherRequirements;
+    @Schema(description = "(鍏朵粬)鍑嗗鎯呭喌")
+    private String otherReadiness;
+    @Schema(description = "(鍏朵粬)鏄惁婊¤冻")
+    private Integer otherIsSatisfied;
+    @Schema(description = "(鍏朵粬)澶囨敞")
+    private String otherRemark;
+
+    @Schema(description = "纭鏃堕棿")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime confirmDate;
+
+    @Schema(description = "纭浜哄憳")
+    private String confirmUser;
+
+    @Schema(description = "鍒涘缓浜�")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @Schema(description = "鍒涘缓鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @Schema(description = "淇敼浜�")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    @Schema(description = "淇敼鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+
+}
+
diff --git a/cnas-process/src/main/java/com/ruoyi/process/pojo/ProcessMethodVerifyCalibrationsFile.java b/cnas-process/src/main/java/com/ruoyi/process/pojo/ProcessMethodVerifyCalibrationsFile.java
new file mode 100644
index 0000000..1fb4d91
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/pojo/ProcessMethodVerifyCalibrationsFile.java
@@ -0,0 +1,56 @@
+package com.ruoyi.process.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+/**
+ * 鏍囧噯鏂规硶楠岃瘉璁惧鏍″噯闄勪欢琛�
+ *
+ * @author zhuo
+ * @since 2024-11-12
+ */
+@Data
+@TableName("cnas_process_method_verify_calibrations_file")
+public class ProcessMethodVerifyCalibrationsFile {
+
+    @TableId(type = IdType.AUTO)
+    private Integer calibrationsFileId;
+    @Schema(description = "鏂规硶楠岃瘉id")
+    private Integer methodVerifyId;
+
+    @Schema(description = "绫诲瀷:1鍥剧墖/2鏂囦欢")
+    private Integer type;
+
+    @Schema(description = "闄勪欢璺緞")
+    private String fileUrl;
+
+    @Schema(description = "闄勪欢鍚嶇О")
+    private String fileName;
+
+    @Schema(description = "璁惧id")
+    private Integer deviceId;
+
+    @Schema(description = "鍒涘缓浜�")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @Schema(description = "鍒涘缓鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @Schema(description = "淇敼浜�")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    @Schema(description = "淇敼鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+
+}
+
diff --git a/cnas-process/src/main/java/com/ruoyi/process/pojo/ProcessMethodVerifyMachineAttachment.java b/cnas-process/src/main/java/com/ruoyi/process/pojo/ProcessMethodVerifyMachineAttachment.java
new file mode 100644
index 0000000..8a05805
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/pojo/ProcessMethodVerifyMachineAttachment.java
@@ -0,0 +1,60 @@
+package com.ruoyi.process.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+/**
+ * 鏍囧噯鏂规硶楠岃瘉璁惧闄勪欢琛�
+ *
+ * @author zhuo
+ * @since 2024-11-05
+ */
+@Data
+@TableName("cnas_process_method_verify_machine_attachment")
+public class ProcessMethodVerifyMachineAttachment {
+
+    @TableId(type = IdType.AUTO)
+    private Integer machineAttachmentId;
+
+    @Schema(description = "鏂规硶楠岃瘉id")
+    private Integer methodVerifyId;
+
+    @Schema(description = "璁惧id")
+    private Integer deviceId;
+
+    @Schema(description = "璁惧鍚嶇О")
+    private String machineName;
+
+    @Schema(description = "瑙勬牸鍨嬪彿")
+    private String machineSpecification;
+
+    @Schema(description = "绛栫暐鑼冨洿")
+    private String machineMeasuringRange;
+
+    @Schema(description = "鎵╁睍淇℃伅")
+    private String other;
+
+    @Schema(description = "鍒涘缓浜�")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @Schema(description = "鍒涘缓鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @Schema(description = "淇敼浜�")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    @Schema(description = "淇敼鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+
+}
+
diff --git a/cnas-process/src/main/java/com/ruoyi/process/pojo/ProcessMethodVerifyMethodFile.java b/cnas-process/src/main/java/com/ruoyi/process/pojo/ProcessMethodVerifyMethodFile.java
new file mode 100644
index 0000000..46b8dbe
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/pojo/ProcessMethodVerifyMethodFile.java
@@ -0,0 +1,54 @@
+package com.ruoyi.process.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+/**
+ * 鏍囧噯鏂规硶楠岃瘉(娉�)闄勪欢琛�
+ *
+ * @author zhuo
+ * @since 2024-11-05
+ */
+@Data
+@TableName("cnas_process_method_verify_method_file")
+public class ProcessMethodVerifyMethodFile {
+
+    @TableId(type = IdType.AUTO)
+    private Integer methodFileId;
+
+    @Schema(description = "鏂规硶楠岃瘉id")
+    private Integer methodVerifyId;
+
+    @Schema(description = "绫诲瀷:1鍥剧墖/2鏂囦欢")
+    private Integer type;
+
+    @Schema(description = "闄勪欢璺緞")
+    private String fileUrl;
+
+    @Schema(description = "闄勪欢鍚嶇О")
+    private String fileName;
+
+    @Schema(description = "鍒涘缓浜�")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @Schema(description = "鍒涘缓鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @Schema(description = "淇敼浜�")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    @Schema(description = "淇敼鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+
+}
+
diff --git a/cnas-process/src/main/java/com/ruoyi/process/pojo/ProcessMethodVerifyWorkFile.java b/cnas-process/src/main/java/com/ruoyi/process/pojo/ProcessMethodVerifyWorkFile.java
new file mode 100644
index 0000000..522c3df
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/pojo/ProcessMethodVerifyWorkFile.java
@@ -0,0 +1,59 @@
+package com.ruoyi.process.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+/**
+ * 鏍囧噯鏂规硶楠岃瘉涓婂矖璇侀檮浠惰〃
+ *
+ * @author zhuo
+ * @since 2024-11-12
+ */
+@Data
+@TableName("cnas_process_method_verify_work_file")
+public class ProcessMethodVerifyWorkFile {
+
+    @TableId(type = IdType.AUTO)
+    private Integer workFileId;
+    @Schema(description = "鏂规硶楠岃瘉id")
+    private Integer methodVerifyId;
+
+    @Schema(description = "绫诲瀷:1鍥剧墖/2鏂囦欢")
+    private Integer type;
+
+    @Schema(description = "闄勪欢璺緞")
+    private String fileUrl;
+
+    @Schema(description = "闄勪欢鍚嶇О")
+    private String fileName;
+
+    @Schema(description = "鎸佹湁浜篿d")
+    private Integer userId;
+
+    @Schema(description = "鎸佹湁浜�")
+    private String userName;
+
+    @Schema(description = "鍒涘缓浜�")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @Schema(description = "鍒涘缓鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @Schema(description = "淇敼浜�")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    @Schema(description = "淇敼鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+
+}
+
diff --git a/cnas-process/src/main/java/com/ruoyi/process/pojo/ProcessOrderDevice.java b/cnas-process/src/main/java/com/ruoyi/process/pojo/ProcessOrderDevice.java
new file mode 100644
index 0000000..3823fa7
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/pojo/ProcessOrderDevice.java
@@ -0,0 +1,68 @@
+package com.ruoyi.process.pojo;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * cnas璁惧浣跨敤璁板綍琛�(7.1妫�楠屽鎵樺崟)
+ * </p>
+ *
+ * @author
+ * @since 2025-04-17 03:51:48
+ */
+@Getter
+@Setter
+@TableName("cnas_process_order_device")
+@Schema(description = "cnas璁惧浣跨敤璁板綍琛�(7.1妫�楠屽鎵樺崟)")
+public class ProcessOrderDevice implements Serializable {
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    private Integer deviceId;
+
+    @Schema(description = "濮旀墭鍗昳d")
+    private Integer inspectionOrderId;
+
+    @Schema(description = "鏍峰搧缂栧彿")
+    private String sampleCode;
+
+    @Schema(description = "浣跨敤鍓�0浠h〃涓嶆甯�1浠h〃姝e父")
+    private Integer useBefore;
+
+    @Schema(description = "浣跨敤鍚�0浠h〃涓嶆甯�1浠h〃姝e父")
+    private Integer useAfter;
+
+    @Schema(description = "寮傚父鎯呭喌")
+    private String abnormal;
+
+    @Schema(description = "浣跨敤寮�濮嬫棩鏈�")
+    private LocalDateTime useStartDate;
+
+    @Schema(description = "浣跨敤浜篿d")
+    private Integer usePersonId;
+
+    @Schema(description = "浣跨敤浜�")
+    private String usePerson;
+
+    @Schema(description = "澶囨敞")
+    private String remark;
+
+    @Schema(description = "浣跨敤缁撴潫鏃堕棿")
+    private LocalDateTime useEndDate;
+
+    @Schema(description = "璁惧鍚嶇О")
+    @TableField(select = false,exist = false)
+    private String deviceName;
+    @Schema(description = "璁惧缂栧彿")
+    @TableField(select = false,exist = false)
+    private String managementNumber;
+}
diff --git a/cnas-process/src/main/java/com/ruoyi/process/pojo/ProcessReport.java b/cnas-process/src/main/java/com/ruoyi/process/pojo/ProcessReport.java
new file mode 100644
index 0000000..2996a4c
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/pojo/ProcessReport.java
@@ -0,0 +1,76 @@
+package com.ruoyi.process.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 妫�楠屾姤鍛婂彂鏀剧櫥璁拌〃
+ * </p>
+ *
+ * @author
+ * @since 2024-11-05 08:58:39
+ */
+@Getter
+@Setter
+@TableName("cnas_process_report")
+@Schema(description = "妫�楠屾姤鍛婂彂鏀剧櫥璁拌〃")
+public class ProcessReport  implements Serializable {
+
+    @TableField(select = false,exist = false)
+    //瀵煎嚭搴忓彿
+    private Integer indexs;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @Schema(description = "妫�楠屾姤鍛婄紪鍙�")
+    private String insReportCode;
+
+    @Schema(description = "椤垫暟")
+    private String pages;
+
+    @Schema(description = "鍙戦�佷唤鏁�")
+    private String number;
+
+    @Schema(description = "鍙戝線浣曞")
+    private String send;
+
+    @Schema(description = "鍙戦�佹柟寮�")
+    private String method;
+
+    @Schema(description = "鍙戦�佹棩鏈�")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private LocalDate sendTime;
+
+    @Schema(description = "鍙戦�佷汉")
+    private Integer sendUser;
+    @Schema(description = "绛炬敹浜�")
+    private String signatory;
+
+    @Schema(description = "澶囨敞")
+    private String remark;
+
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+
+    @Schema(description = "濮旀墭鍗昳d")
+    private Integer inspectionOrderId;
+}
diff --git a/cnas-process/src/main/java/com/ruoyi/process/pojo/ProcessSample.java b/cnas-process/src/main/java/com/ruoyi/process/pojo/ProcessSample.java
new file mode 100644
index 0000000..5c4f54c
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/pojo/ProcessSample.java
@@ -0,0 +1,78 @@
+package com.ruoyi.process.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serializable;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 鏍峰搧鎺ユ敹
+ * </p>
+ *
+ * @author
+ * @since 2024-12-12 05:02:49
+ */
+@Getter
+@Setter
+@TableName("cnas_process_sample")
+@Schema(description = "鏍峰搧鎺ユ敹")
+public class ProcessSample  implements Serializable {
+
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @Schema(description = "鏍峰搧鍚嶇О")
+    private String sampleName;
+
+    @Schema(description = "鏍峰搧缂栧彿")
+    private String sampleCode;
+
+    @Schema(description = "鏉ユ牱鍗曚綅")
+    private String sampleSupplier;
+
+    @Schema(description = "鏍峰搧鏁伴噺")
+    private Integer num;
+
+    @Schema(description = "鏍峰搧鐘舵��")
+    private String sampleState;
+
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+
+    @Schema(description = "濮旀墭鍗昳d")
+    private Integer inspectionOrderId;
+
+    @Schema(description = "鏀舵牱鏃ユ湡")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    private LocalDate receiveDate;
+
+    @Schema(description = "鐣欐牱鏃ユ湡")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    private LocalDate leaveDate;
+
+    @Schema(description = "閫�鏍风鏀�/澶勭悊鏃ユ湡")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    private LocalDate dealTime;
+}
diff --git a/cnas-process/src/main/java/com/ruoyi/process/pojo/ProcessTotaldeal.java b/cnas-process/src/main/java/com/ruoyi/process/pojo/ProcessTotaldeal.java
new file mode 100644
index 0000000..9bea483
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/pojo/ProcessTotaldeal.java
@@ -0,0 +1,62 @@
+package com.ruoyi.process.pojo;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 妫�娴嬫垨鏍″噯鐗╁搧鐨勫缃�昏〃(鍘嗗彶)
+ * </p>
+ *
+ * @author
+ * @since 2024-11-02 03:59:09
+ */
+@Getter
+@Setter
+@TableName("cnas_process_totaldeal")
+@Schema(description = "妫�娴嬫垨鏍″噯鐗╁搧鐨勫缃�昏〃(鍘嗗彶)")
+public class ProcessTotaldeal  implements Serializable {
+
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @Schema(description = "瀹℃牳浜�")
+    private Integer examineUser;
+
+    @Schema(description = "瀹℃牳缁撴灉")
+    private String examineState;
+
+    @TableField(select = false, exist = false)
+    private String examineUserName;
+
+    @Schema(description = "鎵瑰噯浜�")
+    private Integer ratifyUser;
+
+    @Schema(description = "鎵瑰噯缁撴灉")
+    private String ratifyState;
+
+    @TableField(select = false, exist = false)
+    private String ratifyUserName;
+
+    @Schema(description = "鎻愪氦浜�")
+    private Integer submitUser;
+    @TableField(select = false, exist = false)
+    private String submitUserName;
+
+    @Schema(description = "鎻愪氦缁撴灉")
+    private String submitState;
+
+    @Schema(description = "鏈堜唤")
+    private String month;
+
+}
diff --git a/cnas-process/src/main/java/com/ruoyi/process/pojo/QualityMonitor.java b/cnas-process/src/main/java/com/ruoyi/process/pojo/QualityMonitor.java
new file mode 100644
index 0000000..a56d3f8
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/pojo/QualityMonitor.java
@@ -0,0 +1,82 @@
+package com.ruoyi.process.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+/**
+ * 璐ㄩ噺鐩戞帶璁″垝涓昏〃
+ *
+ * @author zhuo
+ * @since 2024-11-06
+ */
+@Data
+@TableName("cnas_quality_monitor")
+@Schema(description = "璐ㄩ噺鐩戞帶璁″垝涓昏〃")
+public class QualityMonitor {
+
+    @TableId(type = IdType.AUTO)
+    private Integer qualityMonitorId;
+
+    @Schema(description = "璁″垝鍚嶇О")
+    private String monitorName;
+
+    @Schema(description = "璁″垝骞翠唤")
+    private String monitorYear;
+
+    @Schema(description = "澶栭敭锛氱敤鎴穒d锛堢紪鍒朵汉锛�")
+    private Integer writeUserId;
+
+    @Schema(description = "缂栧埗鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime writeTime;
+
+    @Schema(description = "澶栭敭锛氱敤鎴穒d锛堝鏍镐汉锛�")
+    private Integer examineUserId;
+
+    @Schema(description = "瀹℃牳鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime examineTime;
+
+    @Schema(description = "瀹℃牳鐘舵�� , 0 涓嶉�氳繃, 1閫氳繃")
+    private Integer examineStatus;
+
+    @Schema(description = "瀹℃牳鍐呭")
+    private String examineRemark;
+
+    @Schema(description = "澶栭敭锛氱敤鎴穒d锛堟壒鍑嗕汉锛�")
+    private Integer ratifyUserId;
+
+    @Schema(description = "鎵瑰噯鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime ratifyTime;
+
+    @Schema(description = "鎵瑰噯鐘舵��, 0 涓嶉�氳繃, 1閫氳繃")
+    private Integer ratifyStatus;
+
+    @Schema(description = "鎵瑰噯鍐呭")
+    private String ratifyRemark;
+
+    @Schema(description = "鍒涘缓浜�")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @Schema(description = "鍒涘缓鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @Schema(description = "淇敼浜�")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    @Schema(description = "淇敼鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+
+}
+
diff --git a/cnas-process/src/main/java/com/ruoyi/process/pojo/QualityMonitorDetails.java b/cnas-process/src/main/java/com/ruoyi/process/pojo/QualityMonitorDetails.java
new file mode 100644
index 0000000..667aabe
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/pojo/QualityMonitorDetails.java
@@ -0,0 +1,92 @@
+package com.ruoyi.process.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+/**
+ * 璐ㄩ噺鐩戞帶璁″垝璇︽儏琛�
+ *
+ * @author zhuo
+ * @since 2024-11-06
+ */
+@Data
+@TableName("cnas_quality_monitor_details")
+@Schema(description = "璐ㄩ噺鐩戞帶璁″垝璇︽儏琛�")
+public class QualityMonitorDetails {
+
+    @TableId(type = IdType.AUTO)
+    private Integer qualityMonitorDetailsId;
+
+    @Schema(description = "鐩戞帶璁″垝id")
+    private Integer qualityMonitorId;
+
+    @Schema(description = "鐩戞帶鐩殑")
+    private String monitorPurpose;
+
+    @Schema(description = "璁″垝寮�灞曟椂闂�")
+    private String plannedTime;
+
+    @Schema(description = "鐩戞帶椤圭洰")
+    private String monitorProject;
+
+    @Schema(description = "鍙傚姞浜哄憳")
+    private String participant;
+
+    @Schema(description = "棰勭畻")
+    private String budget;
+
+    @Schema(description = "缁勭粐浜哄憳")
+    private String organization;
+
+    @Schema(description = "鐩戞帶鏂瑰紡")
+    private String monitorWay;
+
+    @Schema(description = "瀹屾垚鎶ュ憡鍦板潃")
+    private String finishReportUrl;
+
+    @Schema(description = "瀹屾垚鎶ュ憡缂栧啓鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime writeTime;
+
+
+    @Schema(description = "瀹屾垚鎶ュ憡鎵瑰噯浜�")
+    private Integer ratifyUserId;
+
+    @Schema(description = "瀹屾垚鎶ュ憡鎵瑰噯鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime ratifyTime;
+
+    @Schema(description = "瀹屾垚鎶ュ憡鎵瑰噯鐘舵��, 0 涓嶉�氳繃, 1閫氳繃")
+    private Integer ratifyStatus;
+
+    @Schema(description = "瀹屾垚鎶ュ憡鎵瑰噯鍐呭")
+    private String ratifyRemark;
+
+    @Schema(description = "鍒涘缓浜�")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @Schema(description = "鍒涘缓鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @Schema(description = "淇敼浜�")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    @Schema(description = "淇敼鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+
+    // 瀵煎嚭浣跨敤
+    @TableField(select = false, exist = false)
+    private Integer index;
+
+}
+
diff --git a/cnas-process/src/main/java/com/ruoyi/process/pojo/QualityMonitorDetailsEvaluate.java b/cnas-process/src/main/java/com/ruoyi/process/pojo/QualityMonitorDetailsEvaluate.java
new file mode 100644
index 0000000..47a0666
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/pojo/QualityMonitorDetailsEvaluate.java
@@ -0,0 +1,87 @@
+package com.ruoyi.process.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+/**
+ * 璐ㄩ噺鐩戞帶璁″垝璇︽儏璇勪环琛�
+ *
+ * @author zhuo
+ * @since 2024-11-06
+ */
+@Data
+@TableName("cnas_quality_monitor_details_evaluate")
+@Schema(description = "璐ㄩ噺鐩戞帶璁″垝璇︽儏璇勪环琛�")
+public class QualityMonitorDetailsEvaluate {
+
+    @TableId(type = IdType.AUTO)
+    private Integer detailsEvaluateId;
+
+    @Schema(description = "鐩戞帶璁″垝璇︽儏id")
+    private Integer qualityMonitorDetailsId;
+
+    @Schema(description = "璇勫鐩殑")
+    private String reviewPurpose;
+
+    @Schema(description = "璇勫浜哄憳")
+    private String reviewUser;
+
+    @Schema(description = "璇勫鏃ユ湡")
+    private String reviewTime;
+
+    @Schema(description = "瀹炴柦鎯呭喌")
+    private String implementCondition;
+
+    @Schema(description = "瀹炴柦閮ㄩ棬")
+    private String implementDepartment;
+
+    @Schema(description = "瀹炴柦缁撴灉")
+    private String implementResult;
+
+    @Schema(description = "瀹炴柦鎶�鏈礋璐d汉")
+    private Integer implementUserId;
+
+    @Schema(description = "鎵瑰噯缁撹")
+    private String ratifyOpinion;
+
+    @Schema(description = "鎵瑰噯鎶�鏈礋璐d汉")
+    private Integer ratifyUserId;
+
+    @Schema(description = "鎵瑰噯鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private LocalDateTime ratifyTime;
+
+    @Schema(description = "鍒涘缓浜�")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @Schema(description = "鍒涘缓鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @Schema(description = "淇敼浜�")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    @Schema(description = "淇敼鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+
+    @Schema(description = "鏄惁缁撴潫0:鏈粨鏉�, 1:宸茬粨鏉�")
+    private Integer isFinish;
+
+    @Schema(description = "瀹炴柦鎶�鏈礋璐d汉鍚嶇О")
+    @TableField(exist = false,select = false)
+    private String implementName;
+
+    @Schema(description = "鎵瑰噯鎶�鏈礋璐d汉鍚嶇О")
+    @TableField(exist = false,select = false)
+    private String ratifyUserName;
+}
+
diff --git a/cnas-process/src/main/java/com/ruoyi/process/pojo/QualityMonitorDetailsEvaluateFile.java b/cnas-process/src/main/java/com/ruoyi/process/pojo/QualityMonitorDetailsEvaluateFile.java
new file mode 100644
index 0000000..d2ef6cf
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/pojo/QualityMonitorDetailsEvaluateFile.java
@@ -0,0 +1,55 @@
+package com.ruoyi.process.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+/**
+ * 璐ㄩ噺鐩戞帶璁″垝璇︽儏璇勪环闄勪欢琛�
+ *
+ * @author zhuo
+ * @since 2024-11-07
+ */
+@Data
+@TableName("cnas_quality_monitor_details_evaluate_file")
+@Schema(description = "璐ㄩ噺鐩戞帶璁″垝璇︽儏璇勪环闄勪欢琛�")
+public class QualityMonitorDetailsEvaluateFile {
+
+    @TableId(type = IdType.AUTO)
+    private Integer evaluateFileId;
+
+    @Schema(description = "璇勪环id")
+    private Integer detailsEvaluateId;
+
+    @Schema(description = "绫诲瀷:1鍥剧墖/2鏂囦欢")
+    private Integer type;
+
+    @Schema(description = "闄勪欢璺緞")
+    private String fileUrl;
+
+    @Schema(description = "闄勪欢鍚嶇О")
+    private String fileName;
+
+    @Schema(description = "鍒涘缓浜�")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @Schema(description = "鍒涘缓鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @Schema(description = "淇敼浜�")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    @Schema(description = "淇敼鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+
+}
+
diff --git a/cnas-process/src/main/java/com/ruoyi/process/pojo/QualityMonitorDetailsRatify.java b/cnas-process/src/main/java/com/ruoyi/process/pojo/QualityMonitorDetailsRatify.java
new file mode 100644
index 0000000..a29da16
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/pojo/QualityMonitorDetailsRatify.java
@@ -0,0 +1,86 @@
+package com.ruoyi.process.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+/**
+ * 璐ㄩ噺鐩戞帶璁″垝璇︽儏鎵瑰噯琛�
+ *
+ * @author zhuo
+ * @since 2024-11-06
+ */
+@Data
+@TableName("cnas_quality_monitor_details_ratify")
+@Schema(description = "璐ㄩ噺鐩戞帶璁″垝璇︽儏鎵瑰噯琛�")
+public class QualityMonitorDetailsRatify {
+
+    @TableId(type = IdType.AUTO)
+    private Integer detailsRatifyId;
+
+    @Schema(description = "鐩戞帶璁″垝璇︽儏id")
+    private Integer qualityMonitorDetailsId;
+
+    @Schema(description = "鐩戞帶椤圭洰")
+    private String monitorProject;
+
+    @Schema(description = "鐩戞帶鐩殑")
+    private String monitorPurpose;
+
+    @Schema(description = "鐩戞帶鏃堕棿")
+    private String monitorData;
+
+    @Schema(description = "鐩戞帶鏂规硶")
+    private String monitorMethod;
+
+    @Schema(description = "鍙傚姞浜哄憳")
+    private String participant;
+
+    @Schema(description = "杩囩▼鎺у埗")
+    private String processControl;
+
+    @Schema(description = "濡備綍璇勪环")
+    private String howEvaluate;
+
+    @Schema(description = "棰勭畻")
+    private String budget;
+
+    @Schema(description = "妫�娴嬮儴闂�")
+    private String inspectionDepartment;
+
+    @Schema(description = "鎵瑰噯鎰忚")
+    private String ratifyOpinion;
+
+    @Schema(description = "鎶�鏈礋璐d汉")
+    private Integer ratifyUserId;
+
+    @Schema(description = "鍒涘缓浜�")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @Schema(description = "鍒涘缓鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @Schema(description = "淇敼浜�")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    @Schema(description = "淇敼鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+
+    @Schema(description = "鏄惁缁撴潫0:鏈粨鏉�, 1:宸茬粨鏉�")
+    private Integer isFinish;
+
+    @Schema(description = "鎶�鏈礋璐d汉")
+    @TableField(exist = false,select = false)
+    private String ratifyName;
+
+}
+
diff --git a/cnas-process/src/main/java/com/ruoyi/process/pojo/QualitySupervise.java b/cnas-process/src/main/java/com/ruoyi/process/pojo/QualitySupervise.java
new file mode 100644
index 0000000..78fd1d6
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/pojo/QualitySupervise.java
@@ -0,0 +1,79 @@
+package com.ruoyi.process.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+/**
+ * 璐ㄩ噺鐩戠潱涓昏〃
+ *
+ * @author zhuo
+ * @since 2024-11-07
+ */
+@Data
+@TableName("cnas_quality_supervise")
+@Schema(description = "璐ㄩ噺鐩戠潱涓昏〃")
+public class QualitySupervise {
+
+    @TableId(type = IdType.AUTO)
+    private Integer superviseId;
+
+    @Schema(description = "鐩戠潱鍚嶇О")
+    private String superviseName;
+
+    @Schema(description = "骞翠唤")
+    private String superviseYear;
+
+    @Schema(description = "鐩戠潱浜篿d(澶氫釜)")
+    private String recordUserIds;
+
+    @Schema(description = "澶栭敭锛氱敤鎴穒d锛堢紪鍒朵汉锛�")
+    private Integer writeUserId;
+
+    @Schema(description = "缂栧埗浜�")
+    private String writeUserName;
+
+    @Schema(description = "缂栧埗鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime writeTime;
+
+    @Schema(description = "澶栭敭锛氱敤鎴穒d锛堟壒鍑嗕汉锛�")
+    private Integer ratifyUserId;
+
+
+    @Schema(description = "鎵瑰噯浜�")
+    private String ratifyUserName;
+
+    @Schema(description = "鎵瑰噯鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime ratifyTime;
+
+    @Schema(description = "鎵瑰噯鐘舵��, 0 涓嶉�氳繃, 1閫氳繃")
+    private Integer ratifyStatus;
+
+    @Schema(description = "鎵瑰噯鍐呭")
+    private String ratifyRemark;
+
+    @Schema(description = "鍒涘缓浜�")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @Schema(description = "鍒涘缓鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @Schema(description = "淇敼浜�")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    @Schema(description = "淇敼鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+
+}
+
diff --git a/cnas-process/src/main/java/com/ruoyi/process/pojo/QualitySuperviseDetails.java b/cnas-process/src/main/java/com/ruoyi/process/pojo/QualitySuperviseDetails.java
new file mode 100644
index 0000000..3968983
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/pojo/QualitySuperviseDetails.java
@@ -0,0 +1,77 @@
+package com.ruoyi.process.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+/**
+ * 璐ㄩ噺鐩戠潱璇︽儏琛�
+ *
+ * @author zhuo
+ * @since 2024-11-07
+ */
+@Data
+@TableName("cnas_quality_supervise_details")
+@Schema(description = "璐ㄩ噺鐩戠潱璇︽儏琛�")
+public class QualitySuperviseDetails {
+
+    @TableId(type = IdType.AUTO)
+    private Integer superviseDetailsId;
+
+    @Schema(description = "鐩戠潱璁″垝id")
+    private Integer superviseId;
+
+    @Schema(description = "鐩戠潱鏃ユ湡")
+    private String superviseTime;
+
+    @Schema(description = "鐩戠潱鐩殑")
+    private String supervisePurpose;
+
+    @Schema(description = "鐩戠潱椤圭洰")
+    private String superviseProject;
+
+    @Schema(description = "琚洃鐫d汉id")
+    private Integer supervisedUserId;
+
+    @Schema(description = "琚洃鐫d汉")
+    private String supervisee;
+
+    @Schema(description = "鐩戠潱鍘熷洜")
+    private String superviseReason;
+
+    @Schema(description = "澶囨敞")
+    private String remark;
+
+    @Schema(description = "鐩戠潱鍛榠d")
+    private Integer recordUserId;
+
+    @Schema(description = "鐩戠潱鍛樺悕绉�")
+    private Integer recordUserName;
+
+    @Schema(description = "鍒涘缓浜�")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @Schema(description = "鍒涘缓鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @Schema(description = "淇敼浜�")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    @Schema(description = "淇敼鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+
+    // 瀵煎嚭浣跨敤
+    @TableField(select = false, exist = false)
+    private Integer index;
+
+}
+
diff --git a/cnas-process/src/main/java/com/ruoyi/process/pojo/QualitySuperviseDetailsAccording.java b/cnas-process/src/main/java/com/ruoyi/process/pojo/QualitySuperviseDetailsAccording.java
new file mode 100644
index 0000000..2ecf175
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/pojo/QualitySuperviseDetailsAccording.java
@@ -0,0 +1,143 @@
+package com.ruoyi.process.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+/**
+ * 璐ㄩ噺鐩戠潱璇︽儏涓嶇鍚堥」鎺у埗琛�
+ *
+ * @author zhuo
+ * @since 2024-11-07
+ */
+@Data
+@TableName("cnas_quality_supervise_details_according")
+@Schema(description = "璐ㄩ噺鐩戠潱璇︽儏涓嶇鍚堥」鎺у埗琛�")
+public class QualitySuperviseDetailsAccording {
+
+    @TableId(type = IdType.AUTO)
+    private Integer superviseDetailsAccordingId;
+
+    @Schema(description = "鐩戠潱璇︽儏id")
+    private Integer superviseDetailsId;
+
+    @Schema(description = "0鍙戠敓閮ㄩ棬")
+    private String occurrenceDepartment;
+
+    @Schema(description = "0閮ㄩ棬璐熻矗浜�")
+    private String headDepartment;
+
+    @Schema(description = "0鍙戠幇閫斿緞,0:绠$悊璇勫,1:鍐呴儴瀹℃牳,2:妫�娴嬭繃绋嬫帶鍒�,3:鍐呴儴璐ㄩ噺鎺у埗,4:鍐呴儴鐩戠潱,5:澶栭儴璇勫,6:澶栭儴鎶曡瘔,7:鍏朵粬")
+    private Integer findWay;
+
+    @Schema(description = "0涓嶇鍚堣褰曡鎯�")
+    private String recordDetail;
+
+    @Schema(description = "0涓嶅悎鏍艰褰曚緷鎹�")
+    private String recordAccording;
+
+    @Schema(description = "0鍙戠幇閮ㄩ棬")
+    private String foundDepartment;
+
+    @Schema(description = "0璁板綍浜篿d")
+    private Integer recordUserId;
+
+    @Schema(description = "0璁板綍浜�")
+    private String recordUserName;
+
+    @Schema(description = "0璁板綍鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private LocalDate recordTime;
+
+    @Schema(description = "0琚洃鐫d汉id")
+    private Integer supervisedUserId;
+
+    @Schema(description = "0琚洃鐫d汉")
+    private String supervisedUserName;
+
+    @Schema(description = "0琚洃鐫f椂闂�")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private LocalDate supervisedTime;
+
+    @Schema(description = "1娓呴櫎涓嶇鍚堟帾鏂�")
+    private String eliminateMeasure;
+
+    @Schema(description = "1璐d换閮ㄩ棬")
+    private String responsibleDepartment;
+
+    @Schema(description = "1澶勭悊浜篿d")
+    private Integer actionsUserId;
+
+    @Schema(description = "1澶勭悊浜�")
+    private String actionsUserName;
+
+    @Schema(description = "1澶勭悊鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private LocalDate actionsTime;
+
+    @Schema(description = "2绾犳鎺柦鍐呭")
+    private String correctContent;
+
+    @Schema(description = "2鏄惁绾犳澶勭悊, 0鍚�, 1鏄�")
+    private Integer isCorrect;
+
+    @Schema(description = "2绾犳鎶�鏈礋璐d汉id")
+    private Integer correctUserId;
+
+    @Schema(description = "2绾犳鎶�鏈礋璐d汉")
+    private String correctUserName;
+
+    @Schema(description = "2绾犳濉啓鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private LocalDate correctTime;
+
+    @Schema(description = "3鏄惁閫氱煡瀹㈡埛, 0鍚�, 1鏄�")
+    private Integer notifyCustomer;
+
+    @Schema(description = "3鏄惁鎭㈠宸ヤ綔, 0鍚�, 1鏄�")
+    private Integer backToWork;
+
+    @Schema(description = "3璐ㄩ噺璐熻矗浜篿d")
+    private Integer qualityManagerUserId;
+
+    @Schema(description = "3璐ㄩ噺璐熻矗浜�")
+    private String qualityManagerUserName;
+
+    @Schema(description = "3璐ㄩ噺璐熻矗浜哄~鍐欐椂闂�")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private LocalDate qualityManagerTime;
+
+    @Schema(description = "鏄惁缁撴潫,0: 鏈粨鏉�, 1:缁撴潫")
+    private Integer isFinish;
+
+    @Schema(description = "鎵瑰噯浜�")
+    private Integer approverUserId;
+
+    @Schema(description = "鍒涘缓浜�")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @Schema(description = "鍒涘缓鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @Schema(description = "淇敼浜�")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    @Schema(description = "淇敼鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+
+    @TableField(exist = false,select = false)
+    @Schema(description = "娴佺▼, 0:涓嶇鍚堝伐浣滄儏鍐佃褰�, 1澶勭悊鎺柦, 2:绾犳鎺柦, 3:鏄惁閫氱煡瀹㈡埛鍙仮澶嶅伐浣�")
+    private Integer flowType;
+
+}
+
diff --git a/cnas-process/src/main/java/com/ruoyi/process/pojo/QualitySuperviseDetailsCorrect.java b/cnas-process/src/main/java/com/ruoyi/process/pojo/QualitySuperviseDetailsCorrect.java
new file mode 100644
index 0000000..d8cf576
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/pojo/QualitySuperviseDetailsCorrect.java
@@ -0,0 +1,130 @@
+package com.ruoyi.process.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+/**
+ * 璐ㄩ噺鐩戠潱璇︽儏绾犳澶勭悊琛�
+ *
+ * @author zhuo
+ * @since 2024-11-07
+ */
+@Data
+@TableName("cnas_quality_supervise_details_correct")
+@Schema(description = "璐ㄩ噺鐩戠潱璇︽儏绾犳澶勭悊琛�")
+public class QualitySuperviseDetailsCorrect {
+
+    @TableId(type = IdType.AUTO)
+    private Integer superviseDetailsCorrectId;
+
+    @Schema(description = "鐩戠潱璇︽儏id")
+    private Integer superviseDetailsId;
+
+    @Schema(description = "浜哄憳鍩硅璇︽儏Id")
+    private Integer personTrainingDetailedId;
+
+    @Schema(description = "0涓嶅悎鏍兼弿杩�")
+    private String raiseResult;
+
+    @Schema(description = "0vde涓撳鍙戠幇")
+    private String vdeRaiseResult;
+
+    @Schema(description = "0鎻愬嚭閮ㄩ棬")
+    private String raiseDepartment;
+
+    @Schema(description = "0鎻愬嚭浜篿d")
+    private Integer raiseUserId;
+
+    @Schema(description = "0鎻愬嚭浜�")
+    private String raiseUserName;
+
+    @Schema(description = "0鎻愬嚭鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private LocalDate raiseTime;
+
+    @Schema(description = "1鍘熷洜鍒嗘瀽")
+    private String causeResult;
+
+    @Schema(description = "1鍘熷洜鍒嗘瀽璐d换閮ㄩ棬")
+    private String causeDepartment;
+
+    @Schema(description = "1鍘熷洜鍒嗘瀽浜篿d")
+    private Integer causeUserId;
+
+    @Schema(description = "1鍘熷洜鍒嗘瀽浜�")
+    private String causeUserName;
+
+    @Schema(description = "1鍘熷洜鍒嗘瀽鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private LocalDate causeTime;
+
+    @Schema(description = "2绾犳鎺柦")
+    private String correctResult;
+
+    @Schema(description = "2鎻愬嚭閮ㄩ棬纭")
+    private String raiseDepartmentAffirm;
+
+    @Schema(description = "2绾犳璐d换閮ㄩ棬")
+    private String correctDepartment;
+
+    @Schema(description = "2绾犳浜篿d")
+    private Integer correctUserId;
+
+    @Schema(description = "2绾犳浜�")
+    private String correctUserName;
+
+    @Schema(description = "2绾犳鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private LocalDate correctTime;
+
+    @Schema(description = "3楠岃瘉缁撴灉")
+    private String validationResult;
+
+    @Schema(description = "3楠岃瘉閮ㄩ棬")
+    private String validationDepartment;
+
+    @Schema(description = "3楠岃瘉浜篿d")
+    private Integer validationUserId;
+
+    @Schema(description = "3楠岃瘉浜�")
+    private String validationUserName;
+
+    @Schema(description = "3楠岃瘉鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private LocalDate validationTime;
+
+    @Schema(description = "鏄惁缁撴潫, 0: 鏈粨鏉�, 1:宸茬粨鏉�")
+    private Integer isFinish;
+
+    @Schema(description = "鎵瑰噯浜�")
+    private Integer approverUserId;
+
+    @Schema(description = "鍒涘缓浜�")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @Schema(description = "鍒涘缓鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @Schema(description = "淇敼浜�")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    @Schema(description = "淇敼鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+
+    @TableField(exist = false,select = false)
+    @Schema(description = "娴佺▼, 0:涓嶅悎鏍兼彁鍑�, 1:鍘熷洜鍒嗘瀽, 2:绾犳鎺柦, 3:楠岃瘉缁撴灉")
+    private Integer flowType;
+
+}
+
diff --git a/cnas-process/src/main/java/com/ruoyi/process/pojo/QualitySuperviseDetailsCorrectFile.java b/cnas-process/src/main/java/com/ruoyi/process/pojo/QualitySuperviseDetailsCorrectFile.java
new file mode 100644
index 0000000..57ef54f
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/pojo/QualitySuperviseDetailsCorrectFile.java
@@ -0,0 +1,55 @@
+package com.ruoyi.process.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+/**
+ * 璐ㄩ噺鐩戠潱璇︽儏绾犳鎺柦闄勪欢琛�
+ *
+ * @author zhuo
+ * @since 2024-11-09
+ */
+@Data
+@TableName("cnas_quality_supervise_details_correct_file")
+@Schema(description = "璐ㄩ噺鐩戠潱璇︽儏绾犳鎺柦闄勪欢琛�")
+public class QualitySuperviseDetailsCorrectFile {
+
+    @TableId(type = IdType.AUTO)
+    private Integer superviseDetailsCorrectFileId;
+
+    @Schema(description = "鐩戠潱璇︽儏绾犳鎺柦id")
+    private Integer superviseDetailsCorrectId;
+
+    @Schema(description = "绫诲瀷:1鍥剧墖/2鏂囦欢")
+    private Integer type;
+
+    @Schema(description = "闄勪欢璺緞")
+    private String fileUrl;
+
+    @Schema(description = "闄勪欢鍚嶇О")
+    private String fileName;
+
+    @Schema(description = "鍒涘缓浜�")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @Schema(description = "鍒涘缓鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @Schema(description = "淇敼浜�")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    @Schema(description = "淇敼鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+
+}
+
diff --git a/cnas-process/src/main/java/com/ruoyi/process/pojo/QualitySuperviseDetailsRecord.java b/cnas-process/src/main/java/com/ruoyi/process/pojo/QualitySuperviseDetailsRecord.java
new file mode 100644
index 0000000..40c9a13
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/pojo/QualitySuperviseDetailsRecord.java
@@ -0,0 +1,117 @@
+package com.ruoyi.process.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+/**
+ * 璐ㄩ噺鐩戠潱璇︽儏璁板綍琛�
+ *
+ * @author zhuo
+ * @since 2024-11-07
+ */
+@Data
+@TableName("cnas_quality_supervise_details_record")
+@Schema(description = "璐ㄩ噺鐩戠潱璇︽儏璁板綍琛�")
+public class QualitySuperviseDetailsRecord {
+
+    @TableId(type = IdType.AUTO)
+    private Integer superviseDetailsRecordId;
+
+    @Schema(description = "鐩戠潱璇︽儏id")
+    private Integer superviseDetailsId;
+
+    @Schema(description = "妫�娴嬩汉鍛�")
+    private String testMember;
+
+    @Schema(description = "鐩戠潱鍛�")
+    private String supervisor;
+
+    @Schema(description = "妫�娴嬮」鐩�")
+    private String testItem;
+
+    @Schema(description = "鏍峰搧缂栧彿")
+    private String sampleNumber;
+
+    @Schema(description = "妫�娴嬫棩鏈�")
+    private String testDate;
+
+    @Schema(description = "妫�娴嬭繃绋�")
+    private String testingProcess;
+
+    @Schema(description = "鎯呭喌璁板綍")
+    private String caseReload;
+
+    @Schema(description = "浜哄憳")
+    private String personnel;
+
+    @Schema(description = "浠櫒璁惧")
+    private String device;
+
+    @Schema(description = "鐜")
+    private String environment;
+
+    @Schema(description = "鏍峰搧閲囬泦")
+    private String sampleCollection;
+
+    @Schema(description = "鏍峰搧鍑嗗")
+    private String samplePreparation;
+
+    @Schema(description = "妫�娴嬫柟娉�")
+    private String detectionMethod;
+
+    @Schema(description = "妫�娴嬭褰�")
+    private String inspectionRecord;
+
+    @Schema(description = "妫�娴嬫姤鍛�")
+    private String examiningReport;
+
+    @Schema(description = "鐩戠潱鎯呭喌璇勪环")
+    private String supervisionEvaluation;
+
+    @Schema(description = "涓嶅悎鏍煎鐞嗘剰瑙�")
+    private String handlingAdvice;
+
+    @Schema(description = "鎵瑰噯缁撹")
+    private String ratifyOpinion;
+
+    @Schema(description = "鎵瑰噯鎶�鏈礋璐d汉")
+    private Integer ratifyUserId;
+
+    @Schema(description = "鎵瑰噯鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private LocalDateTime ratifyTime;
+
+    @Schema(description = "鏄惁绗﹀悎,0 涓嶇鍚�, 1绗﹀悎")
+    private Integer isAccording;
+
+    @Schema(description = "鏄惁缁撴潫0:鏈粨鏉�, 1:宸茬粨鏉�")
+    private Integer isFinish;
+
+    @Schema(description = "鍒涘缓浜�")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @Schema(description = "鍒涘缓鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @Schema(description = "淇敼浜�")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    @Schema(description = "淇敼鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+
+    @Schema(description = "鎵瑰噯鎶�鏈礋璐d汉")
+    @TableField(exist = false,select = false)
+    private String ratifyUserName;
+
+}
+
diff --git a/cnas-process/src/main/java/com/ruoyi/process/pojo/QualitySuperviseManagementReview.java b/cnas-process/src/main/java/com/ruoyi/process/pojo/QualitySuperviseManagementReview.java
new file mode 100644
index 0000000..fda7af3
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/pojo/QualitySuperviseManagementReview.java
@@ -0,0 +1,62 @@
+package com.ruoyi.process.pojo;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 璐ㄩ噺鐩戠潱绠$悊璇勫杈撳叆鏉愭枡
+ * </p>
+ *
+ * @author
+ * @since 2025-05-07 10:46:11
+ */
+@Getter
+@Setter
+@TableName("cnas_quality_supervise_management_review")
+@Schema(description = "璐ㄩ噺鐩戠潱绠$悊璇勫杈撳叆鏉愭枡")
+public class QualitySuperviseManagementReview implements Serializable {
+
+    @TableId(value = "management_review_id", type = IdType.AUTO)
+    private Integer managementReviewId;
+
+    @Schema(description = "鏂囦欢鍚嶇О")
+    private String fileName;
+
+    @Schema(description = "璁″垝鍐呭")
+    private String implementationContent;
+
+    @Schema(description = "鍔ㄦ�佸唴瀹�")
+    private String dynamicContent;
+
+    @Schema(description = "鐩戠潱浜�")
+    private String supervisor;
+
+    @Schema(description = "璐ㄩ噺璇勫鏃ユ湡")
+    private LocalDate superviseDate;
+
+    @Schema(description = "鍒涘缓浜�")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @Schema(description = "鍒涘缓鏃堕棿")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @Schema(description = "淇敼浜�")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    @Schema(description = "淇敼鏃堕棿")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+}
diff --git a/cnas-process/src/main/java/com/ruoyi/process/service/InconsistentDistributionDetailService.java b/cnas-process/src/main/java/com/ruoyi/process/service/InconsistentDistributionDetailService.java
new file mode 100644
index 0000000..e48493f
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/service/InconsistentDistributionDetailService.java
@@ -0,0 +1,16 @@
+package com.ruoyi.process.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.process.pojo.InconsistentDistributionDetail;
+
+/**
+ * <p>
+ * 涓嶇鍚堥」鐨勫垎甯冭鎯� 鏈嶅姟绫�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-15 09:53:33
+ */
+public interface InconsistentDistributionDetailService extends IService<InconsistentDistributionDetail> {
+
+}
diff --git a/cnas-process/src/main/java/com/ruoyi/process/service/InconsistentDistributionService.java b/cnas-process/src/main/java/com/ruoyi/process/service/InconsistentDistributionService.java
new file mode 100644
index 0000000..618417a
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/service/InconsistentDistributionService.java
@@ -0,0 +1,64 @@
+package com.ruoyi.process.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.process.dto.InconsistentDistributionDto;
+import com.ruoyi.process.pojo.InconsistentDistribution;
+
+
+import jakarta.servlet.http.HttpServletResponse;
+
+/**
+ * <p>
+ * 涓嶇鍚堥」鐨勫垎甯� 鏈嶅姟绫�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-15 09:53:20
+ */
+public interface InconsistentDistributionService extends IService<InconsistentDistribution> {
+
+    /**
+     * 涓嶇鍚堥」鐨勫垎甯冨垎椤垫煡璇�
+     * @param page
+     * @param inconsistentDistribution
+     * @return
+     */
+    IPage<InconsistentDistributionDto> pageInconsistentDistribution(Page page, InconsistentDistribution inconsistentDistribution);
+
+    /**
+     * 涓嶇鍚堥」鐨勫垎甯冩柊澧�
+     * @param inconsistentDistribution
+     * @return
+     */
+    boolean addInconsistentDistribution(InconsistentDistributionDto inconsistentDistribution);
+
+    /**
+     * 涓嶇鍚堥」鐨勫垎甯冧慨鏀�
+     * @param inconsistentDistribution
+     * @return
+     */
+    boolean updateInconsistentDistribution(InconsistentDistributionDto inconsistentDistribution);
+
+    /**
+     * 涓嶇鍚堥」鐨勫垎甯冨垹闄�
+     * @param distributionId
+     * @return
+     */
+    boolean delInconsistentDistribution(Integer distributionId);
+
+    /**
+     * 涓嶇鍚堥」鐨勫垎甯冩煡鐪嬭鎯�
+     * @param distributionId
+     * @return
+     */
+    InconsistentDistributionDto getInconsistentDistributionOne(Integer distributionId);
+
+    /**
+     * 瀵煎嚭涓嶇鍚堥」鐨勫垎甯�
+     * @param distributionId
+     * @param response
+     */
+    void exportInconsistentDistribution(Integer distributionId, HttpServletResponse response);
+}
diff --git a/cnas-process/src/main/java/com/ruoyi/process/service/InspectionOrderDetailService.java b/cnas-process/src/main/java/com/ruoyi/process/service/InspectionOrderDetailService.java
new file mode 100644
index 0000000..784a5e5
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/service/InspectionOrderDetailService.java
@@ -0,0 +1,16 @@
+package com.ruoyi.process.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.process.pojo.InspectionOrderDetail;
+
+/**
+ * <p>
+ * 妫�楠屽鎵樺崟璇︽儏琛� 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-09
+ */
+public interface InspectionOrderDetailService extends IService<InspectionOrderDetail> {
+
+}
diff --git a/cnas-process/src/main/java/com/ruoyi/process/service/InspectionOrderService.java b/cnas-process/src/main/java/com/ruoyi/process/service/InspectionOrderService.java
new file mode 100644
index 0000000..92b6593
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/service/InspectionOrderService.java
@@ -0,0 +1,86 @@
+package com.ruoyi.process.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.inspect.pojo.InsOrder;
+import com.ruoyi.process.dto.InspectionOrderDto;
+import com.ruoyi.process.pojo.InspectionOrder;
+import org.springframework.web.multipart.MultipartFile;
+
+import jakarta.servlet.http.HttpServletResponse;
+
+/**
+ * <p>
+ * 妫�楠屽鎵樺崟 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-09
+ */
+public interface InspectionOrderService extends IService<InspectionOrder> {
+
+    /**
+     * 妫�楠屽鎵樺崟鍒嗛〉鏌ヨ
+     * @param page
+     * @param inspectionOrder
+     * @return
+     */
+    IPage<InspectionOrderDto> pageInspectionOrder(Page page, InspectionOrder inspectionOrder);
+
+    /**
+     * 妫�楠屽鎵樺崟鏂板
+     * @param InspectionOrder
+     * @return
+     */
+    boolean addInspectionOrder(InspectionOrderDto InspectionOrder);
+
+    /**
+     * 妫�楠屽鎵樺崟淇敼
+     * @param InspectionOrder
+     * @return
+     */
+    boolean updateInspectionOrder(InspectionOrderDto InspectionOrder);
+
+    /**
+     * 妫�楠屽鎵樺崟鍒犻櫎
+     * @param inspectionOrderId
+     * @return
+     */
+    boolean delInspectionOrder(Integer inspectionOrderId);
+
+    /**
+     * 妫�楠屽鎵樺崟鏌ョ湅璇︽儏
+     * @param inspectionOrderId
+     * @return
+     */
+    InspectionOrderDto getInspectionOrderOne(Integer inspectionOrderId);
+
+    /**
+     * 鏍规嵁鎴愬搧璁㈠崟id鏌ヨ濮旀墭鍗曚俊鎭�
+     * @param insOrderId
+     * @return
+     */
+    InspectionOrderDto getInspectionOrderByInsOderId(Integer insOrderId);
+
+    /**
+     * 濮旀墭鍗曟煡璇㈡垚鍝佽鍗�
+     * @return
+     */
+    IPage<InsOrder> getInsOrderOnInspection(Page page, InsOrder insOrder);
+
+    /**
+     * 濮旀墭鍗曟垚鍝佹姤鍛婁笂浼�
+     * @param file
+     * @param inspectionOrderId
+     * @return
+     */
+    boolean uploadInspectionOrderFile(MultipartFile file, Integer inspectionOrderId);
+
+    /**
+     * 瀵煎嚭妫�楠屽鎵樺崟
+     * @param inspectionOrderId
+     * @param response
+     */
+    void exportInspectionOrder(Integer inspectionOrderId, HttpServletResponse response);
+}
diff --git a/cnas-process/src/main/java/com/ruoyi/process/service/ProcessComplainService.java b/cnas-process/src/main/java/com/ruoyi/process/service/ProcessComplainService.java
new file mode 100644
index 0000000..d40fef9
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/service/ProcessComplainService.java
@@ -0,0 +1,31 @@
+package com.ruoyi.process.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.process.dto.ProcessComplainDto;
+import com.ruoyi.process.pojo.ProcessComplain;
+
+import jakarta.servlet.http.HttpServletResponse;
+import java.util.Map;
+
+/**
+ * <p>
+ * 鎶曡瘔 鏈嶅姟绫�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-02 09:29:11
+ */
+public interface ProcessComplainService extends IService<ProcessComplain> {
+
+    IPage<ProcessComplain> pageProcessComplain(Page page, ProcessComplain processComplain);
+
+    int addProcessComplain(ProcessComplain processComplain);
+
+    ProcessComplainDto getProcessComplain(Long id);
+
+    int doProcessComplain(ProcessComplain processComplain);
+
+    void exportProcessComplain(ProcessComplain processComplain, HttpServletResponse response) throws Exception;
+}
diff --git a/cnas-process/src/main/java/com/ruoyi/process/service/ProcessDealService.java b/cnas-process/src/main/java/com/ruoyi/process/service/ProcessDealService.java
new file mode 100644
index 0000000..18f18c9
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/service/ProcessDealService.java
@@ -0,0 +1,19 @@
+package com.ruoyi.process.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.process.pojo.ProcessDeal;
+
+import java.util.Map;
+
+/**
+ * <p>
+ * 妫�娴嬫垨鏍″噯鐗╁搧鐨勫缃� 鏈嶅姟绫�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-02 02:50:19
+ */
+public interface ProcessDealService extends IService<ProcessDeal> {
+}
diff --git a/cnas-process/src/main/java/com/ruoyi/process/service/ProcessEvaluateService.java b/cnas-process/src/main/java/com/ruoyi/process/service/ProcessEvaluateService.java
new file mode 100644
index 0000000..7b5ef04
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/service/ProcessEvaluateService.java
@@ -0,0 +1,29 @@
+package com.ruoyi.process.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.process.pojo.ProcessEvaluate;
+import org.springframework.web.multipart.MultipartFile;
+
+import jakarta.servlet.http.HttpServletResponse;
+import java.util.Map;
+
+/**
+ * <p>
+ * 娴嬮噺涓嶇‘瀹氬害鐨勮瘎浠� 鏈嶅姟绫�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-02 01:10:43
+ */
+public interface ProcessEvaluateService extends IService<ProcessEvaluate> {
+
+    IPage<ProcessEvaluate> pageProcessEvaluate(Page page, ProcessEvaluate processEvaluate);
+
+    int addProcessEvaluate(MultipartFile file);
+
+    int doProcessEvaluate(ProcessEvaluate processEvaluate);
+
+    void exportProcessEvaluate(ProcessEvaluate processEvaluate, HttpServletResponse response) throws Exception;
+}
diff --git a/cnas-process/src/main/java/com/ruoyi/process/service/ProcessMethodSearchNewArchivedService.java b/cnas-process/src/main/java/com/ruoyi/process/service/ProcessMethodSearchNewArchivedService.java
new file mode 100644
index 0000000..3c7391b
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/service/ProcessMethodSearchNewArchivedService.java
@@ -0,0 +1,16 @@
+package com.ruoyi.process.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.process.pojo.ProcessMethodSearchNewArchived;
+
+/**
+ * <p>
+ * 鏍囧噯鏌ユ柊瀛樻。琛� 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-25 05:28:42
+ */
+public interface ProcessMethodSearchNewArchivedService extends IService<ProcessMethodSearchNewArchived> {
+
+}
diff --git a/cnas-process/src/main/java/com/ruoyi/process/service/ProcessMethodSearchNewBackupsService.java b/cnas-process/src/main/java/com/ruoyi/process/service/ProcessMethodSearchNewBackupsService.java
new file mode 100644
index 0000000..0fdb93e
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/service/ProcessMethodSearchNewBackupsService.java
@@ -0,0 +1,16 @@
+package com.ruoyi.process.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.process.pojo.ProcessMethodSearchNewBackups;
+
+/**
+ * <p>
+ * 鏍囧噯鏌ユ柊澶囦唤琛� 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-25 05:29:02
+ */
+public interface ProcessMethodSearchNewBackupsService extends IService<ProcessMethodSearchNewBackups> {
+
+}
diff --git a/cnas-process/src/main/java/com/ruoyi/process/service/ProcessMethodSearchNewService.java b/cnas-process/src/main/java/com/ruoyi/process/service/ProcessMethodSearchNewService.java
new file mode 100644
index 0000000..3aa46ce
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/service/ProcessMethodSearchNewService.java
@@ -0,0 +1,82 @@
+package com.ruoyi.process.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.process.dto.ProcessMethodSearchNewArchivedDto;
+import com.ruoyi.process.dto.ProcessMethodSearchNewBackupsDto;
+import com.ruoyi.process.pojo.ProcessMethodSearchNew;
+import com.ruoyi.process.pojo.ProcessMethodSearchNewArchived;
+import com.ruoyi.process.pojo.ProcessMethodSearchNewBackups;
+import org.springframework.web.multipart.MultipartFile;
+
+import jakarta.servlet.http.HttpServletResponse;
+import java.util.List;
+
+/**
+ * 鏍囧噯鏌ユ柊
+ *
+ * @author zhuo
+ * @since 2024-11-04
+ */
+public interface ProcessMethodSearchNewService extends IService<ProcessMethodSearchNew> {
+
+    /**
+     * 鏂板鏍囧噯鏌ユ柊
+     * @param processMethodSearchNewList
+     * @return
+     */
+    boolean addMethodSearchNew(List<ProcessMethodSearchNew> processMethodSearchNewList);
+
+    /**
+     * 鏍囧噯鏌ユ柊鍒楄〃
+     * @param processMethodSearchNew
+     * @return
+     */
+    IPage<ProcessMethodSearchNew> pageMethodSearchNew(Page page, ProcessMethodSearchNewBackupsDto processMethodSearchNew);
+
+    /**
+     * 鏍囧噯鏌ユ柊瀵煎嚭
+     * @param archivedId
+     * @param response
+     */
+    void exportMethodSearchNew(Integer archivedId, HttpServletResponse response);
+
+    /**
+     * 瀵煎叆鏍囧噯鏌ユ柊
+     * @param file
+     * @return
+     */
+    boolean importMethodSearchNew(MultipartFile file);
+
+    /**
+     * 鏂板鏍囧噯鏌ユ柊瀹℃壒娴佺▼
+     * @param archived
+     * @return
+     */
+    boolean addSearchNewArchived(ProcessMethodSearchNewArchived archived);
+
+    /**
+     * 鏌ヨ瀛樻。
+     * @param page
+     * @param archived
+     * @return
+     */
+    IPage<ProcessMethodSearchNewArchivedDto> pageSearchNewArchived(Page page, ProcessMethodSearchNewArchivedDto archived);
+
+    /**
+     * 鏌ヨ瀛樻。澶囦唤鍒楄〃
+     * @param page
+     * @param backups
+     * @return
+     */
+    IPage<ProcessMethodSearchNewBackups> pageSearchNewBackups(Page page, ProcessMethodSearchNewBackups backups);
+
+    /**
+     * 瀛樻。鎵瑰噯
+     * @param archived
+     * @return
+     */
+    boolean ratifySearchNewArchivedr(ProcessMethodSearchNewArchived archived);
+}
+
diff --git a/cnas-process/src/main/java/com/ruoyi/process/service/ProcessMethodVerifyCalibrationsFileService.java b/cnas-process/src/main/java/com/ruoyi/process/service/ProcessMethodVerifyCalibrationsFileService.java
new file mode 100644
index 0000000..76e60e0
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/service/ProcessMethodVerifyCalibrationsFileService.java
@@ -0,0 +1,15 @@
+package com.ruoyi.process.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.process.pojo.ProcessMethodVerifyCalibrationsFile;
+
+/**
+ * 鏍囧噯鏂规硶楠岃瘉璁惧鏍″噯闄勪欢琛�
+ *
+ * @author zhuo
+ * @since 2024-11-12
+ */
+public interface ProcessMethodVerifyCalibrationsFileService extends IService<ProcessMethodVerifyCalibrationsFile> {
+
+}
+
diff --git a/cnas-process/src/main/java/com/ruoyi/process/service/ProcessMethodVerifyMachineAttachmentService.java b/cnas-process/src/main/java/com/ruoyi/process/service/ProcessMethodVerifyMachineAttachmentService.java
new file mode 100644
index 0000000..dfc9c5e
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/service/ProcessMethodVerifyMachineAttachmentService.java
@@ -0,0 +1,15 @@
+package com.ruoyi.process.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.process.pojo.ProcessMethodVerifyMachineAttachment;
+
+/**
+ * 鏍囧噯鏂规硶楠岃瘉璁惧闄勪欢琛�
+ *
+ * @author zhuo
+ * @since 2024-11-05
+ */
+public interface ProcessMethodVerifyMachineAttachmentService extends IService<ProcessMethodVerifyMachineAttachment> {
+
+}
+
diff --git a/cnas-process/src/main/java/com/ruoyi/process/service/ProcessMethodVerifyMethodFileService.java b/cnas-process/src/main/java/com/ruoyi/process/service/ProcessMethodVerifyMethodFileService.java
new file mode 100644
index 0000000..5d0bbab
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/service/ProcessMethodVerifyMethodFileService.java
@@ -0,0 +1,15 @@
+package com.ruoyi.process.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.process.pojo.ProcessMethodVerifyMethodFile;
+
+/**
+ * 鏍囧噯鏂规硶楠岃瘉(娉�)闄勪欢琛�(CnasProcessMethodVerifyMethodFile)$desc
+ *
+ * @author makejava
+ * @since 2024-11-05 10:52:44
+ */
+public interface ProcessMethodVerifyMethodFileService extends IService<ProcessMethodVerifyMethodFile> {
+
+}
+
diff --git a/cnas-process/src/main/java/com/ruoyi/process/service/ProcessMethodVerifyService.java b/cnas-process/src/main/java/com/ruoyi/process/service/ProcessMethodVerifyService.java
new file mode 100644
index 0000000..3433a14
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/service/ProcessMethodVerifyService.java
@@ -0,0 +1,87 @@
+package com.ruoyi.process.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.process.dto.ProcessMethodVerifyDto;
+import com.ruoyi.process.pojo.ProcessMethodVerify;
+import com.ruoyi.process.pojo.ProcessMethodVerifyMethodFile;
+import org.springframework.web.multipart.MultipartFile;
+
+import jakarta.servlet.http.HttpServletResponse;
+import java.util.List;
+
+/**
+ * 鏍囧噯鏂规硶楠岃瘉
+ *
+ * @author zhuo
+ * @since 2024-11-05
+ */
+public interface ProcessMethodVerifyService extends IService<ProcessMethodVerify> {
+
+    /**
+     * 鏍囧噯鏂规硶璺熸柊楠岃瘉鍒楄〃
+     * @param page
+     * @param methodVerifyDto
+     * @return
+     */
+    IPage<ProcessMethodVerify> pagesMethodVerify(Page page, ProcessMethodVerifyDto methodVerifyDto);
+
+    /**
+     * 鏂板鏍囧噯鏂规硶楠岃瘉
+     * @param methodVerifyDto
+     * @return
+     */
+    boolean addMethodSearchNew(ProcessMethodVerifyDto methodVerifyDto);
+
+    /**
+     * 鏌ヨ鏍囧噯鏂规硶楠岃瘉璇︽儏
+     * @param methodVerifyId
+     * @return
+     */
+    ProcessMethodVerifyDto getMethodVerifyOne(Integer methodVerifyId);
+
+    /**
+     * 淇敼鏍囧噯鏂规硶楠岃瘉
+     * @param methodVerifyDto
+     * @return
+     */
+    boolean updateMethodVerify(ProcessMethodVerifyDto methodVerifyDto);
+
+    /**
+     * 鍒犻櫎鏍囧噯鏂规硶楠岃瘉
+     * @param methodVerifyId
+     * @return
+     */
+    boolean delMethodVerify(Integer methodVerifyId);
+
+    /**
+     * 鏍囧噯鏂规硶楠岃瘉纭
+     * @param methodVerifyId
+     * @return
+     */
+    boolean methodVerifyAffirm(Integer methodVerifyId);
+
+    /**
+     * 鏍囧噯鏂规硶楠岃瘉鏂板鍘熷璁板綍
+     * @param methodVerifyId
+     * @param file
+     * @return
+     */
+    boolean uploadVerifyMethodFile(Integer methodVerifyId, MultipartFile file);
+
+    /**
+     * 鏍囧噯鏂规硶鏇存柊楠岃瘉鍘熷璁板綍鍒楄〃
+     * @return
+     */
+    List<ProcessMethodVerifyMethodFile> getVerifyMethodFileList(Integer methodVerifyId);
+
+    /**
+     * 瀵煎嚭鏍囧噯鏂规硶鏇存柊楠岃瘉
+     *
+     * @param methodVerifyId 鏍囧噯鏂规硶楠岃瘉id
+     * @param response
+     */
+    void exportMethodVerify(Integer methodVerifyId, HttpServletResponse response);
+}
+
diff --git a/cnas-process/src/main/java/com/ruoyi/process/service/ProcessMethodVerifyWorkFileService.java b/cnas-process/src/main/java/com/ruoyi/process/service/ProcessMethodVerifyWorkFileService.java
new file mode 100644
index 0000000..6d6b04f
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/service/ProcessMethodVerifyWorkFileService.java
@@ -0,0 +1,15 @@
+package com.ruoyi.process.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.process.pojo.ProcessMethodVerifyWorkFile;
+
+/**
+ * 鏍囧噯鏂规硶楠岃瘉涓婂矖璇侀檮浠惰〃
+ *
+ * @author zhuo
+ * @since 2024-11-12
+ */
+public interface ProcessMethodVerifyWorkFileService extends IService<ProcessMethodVerifyWorkFile> {
+
+}
+
diff --git a/cnas-process/src/main/java/com/ruoyi/process/service/ProcessOrderDeviceService.java b/cnas-process/src/main/java/com/ruoyi/process/service/ProcessOrderDeviceService.java
new file mode 100644
index 0000000..949f455
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/service/ProcessOrderDeviceService.java
@@ -0,0 +1,19 @@
+package com.ruoyi.process.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.process.pojo.ProcessOrderDevice;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * cnas璁惧浣跨敤璁板綍琛�(7.1妫�楠屽鎵樺崟) 鏈嶅姟绫�
+ * </p>
+ *
+ * @author
+ * @since 2025-04-17 03:51:48
+ */
+public interface ProcessOrderDeviceService extends IService<ProcessOrderDevice> {
+
+    IPage<ProcessOrderDevice> deviceRecordPage(Integer deviceId, Page page, String sampleCode, String managementNumber);
+}
diff --git a/cnas-process/src/main/java/com/ruoyi/process/service/ProcessReportService.java b/cnas-process/src/main/java/com/ruoyi/process/service/ProcessReportService.java
new file mode 100644
index 0000000..731f955
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/service/ProcessReportService.java
@@ -0,0 +1,26 @@
+package com.ruoyi.process.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.process.dto.ProcessReportDto;
+import com.ruoyi.process.pojo.ProcessReport;
+
+import jakarta.servlet.http.HttpServletResponse;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 妫�楠屾姤鍛婂彂鏀剧櫥璁拌〃 鏈嶅姟绫�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-05 08:58:39
+ */
+public interface ProcessReportService extends IService<ProcessReport> {
+
+    IPage<ProcessReportDto> pageProcessReport(Page page, ProcessReportDto processReport);
+
+    void exportProcessReport(ProcessReportDto dto, HttpServletResponse response);
+}
diff --git a/cnas-process/src/main/java/com/ruoyi/process/service/ProcessSampleService.java b/cnas-process/src/main/java/com/ruoyi/process/service/ProcessSampleService.java
new file mode 100644
index 0000000..ad64577
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/service/ProcessSampleService.java
@@ -0,0 +1,24 @@
+package com.ruoyi.process.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.process.pojo.ProcessSample;
+
+import jakarta.servlet.http.HttpServletResponse;
+import java.util.Map;
+
+/**
+ * <p>
+ * 鏍峰搧鎺ユ敹 鏈嶅姟绫�
+ * </p>
+ *
+ * @author
+ * @since 2024-12-12 05:02:49
+ */
+public interface ProcessSampleService extends IService<ProcessSample> {
+
+    IPage<ProcessSample> pageProcessSample(Page page, ProcessSample processSample);
+
+    void exportProcessSample(ProcessSample processSample, HttpServletResponse response);
+}
diff --git a/cnas-process/src/main/java/com/ruoyi/process/service/ProcessTotaldealService.java b/cnas-process/src/main/java/com/ruoyi/process/service/ProcessTotaldealService.java
new file mode 100644
index 0000000..e792768
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/service/ProcessTotaldealService.java
@@ -0,0 +1,32 @@
+package com.ruoyi.process.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.process.pojo.ProcessTotaldeal;
+
+import jakarta.servlet.http.HttpServletResponse;
+import java.util.Map;
+
+/**
+ * <p>
+ * 妫�娴嬫垨鏍″噯鐗╁搧鐨勫缃�昏〃(鍘嗗彶) 鏈嶅姟绫�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-02 03:59:09
+ */
+public interface ProcessTotaldealService extends IService<ProcessTotaldeal> {
+
+    IPage<ProcessTotaldeal> pageProcessTotaldeal(Page page, ProcessTotaldeal processTotaldeal);
+
+    int checkProcessTotaldeal(Integer id, String state);
+
+    int submitProcessTotaldeal(Integer id);
+
+    int ratifyProcessTotaldeal(Integer id, String state);
+
+    int addProcessTotaldeal(String month);
+
+    void exportProcessTotaldeal(Integer id, HttpServletResponse response);
+}
diff --git a/cnas-process/src/main/java/com/ruoyi/process/service/QualityMonitorDetailsEvaluateService.java b/cnas-process/src/main/java/com/ruoyi/process/service/QualityMonitorDetailsEvaluateService.java
new file mode 100644
index 0000000..6f6b47d
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/service/QualityMonitorDetailsEvaluateService.java
@@ -0,0 +1,15 @@
+package com.ruoyi.process.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.process.pojo.QualityMonitorDetailsEvaluate;
+
+/**
+ * 璐ㄩ噺鐩戞帶璁″垝璇︽儏璇勪环琛�
+ *
+ * @author zhuo
+ * @since 2024-11-06
+ */
+public interface QualityMonitorDetailsEvaluateService extends IService<QualityMonitorDetailsEvaluate> {
+
+}
+
diff --git a/cnas-process/src/main/java/com/ruoyi/process/service/QualityMonitorDetailsRatifyService.java b/cnas-process/src/main/java/com/ruoyi/process/service/QualityMonitorDetailsRatifyService.java
new file mode 100644
index 0000000..8596cf2
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/service/QualityMonitorDetailsRatifyService.java
@@ -0,0 +1,15 @@
+package com.ruoyi.process.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.process.pojo.QualityMonitorDetailsRatify;
+
+/**
+ * 璐ㄩ噺鐩戞帶璁″垝璇︽儏鎵瑰噯琛�
+ *
+ * @author zhuo
+ * @since 2024-11-06
+ */
+public interface QualityMonitorDetailsRatifyService extends IService<QualityMonitorDetailsRatify> {
+
+}
+
diff --git a/cnas-process/src/main/java/com/ruoyi/process/service/QualityMonitorDetailsService.java b/cnas-process/src/main/java/com/ruoyi/process/service/QualityMonitorDetailsService.java
new file mode 100644
index 0000000..f3968e8
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/service/QualityMonitorDetailsService.java
@@ -0,0 +1,15 @@
+package com.ruoyi.process.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.process.pojo.QualityMonitorDetails;
+
+/**
+ * 璐ㄩ噺鐩戞帶璁″垝璇︽儏琛�
+ *
+ * @author zhuo
+ * @since 2024-11-06
+ */
+public interface QualityMonitorDetailsService extends IService<QualityMonitorDetails> {
+
+}
+
diff --git a/cnas-process/src/main/java/com/ruoyi/process/service/QualityMonitorService.java b/cnas-process/src/main/java/com/ruoyi/process/service/QualityMonitorService.java
new file mode 100644
index 0000000..29662c5
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/service/QualityMonitorService.java
@@ -0,0 +1,161 @@
+package com.ruoyi.process.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.process.dto.QualityMonitorDetailsDto;
+import com.ruoyi.process.dto.QualityMonitorDto;
+import com.ruoyi.process.pojo.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import jakarta.servlet.http.HttpServletResponse;
+import java.util.List;
+
+/**
+ * 璐ㄩ噺鐩戞帶璁″垝涓昏〃
+ *
+ * @author zhuo
+ * @since 2024-11-06
+ */
+public interface QualityMonitorService extends IService<QualityMonitor> {
+
+    /**
+     * 瀵煎叆鐩戞帶璁″垝
+     * @param file
+     * @return
+     */
+    boolean importQualityMonitor(MultipartFile file, QualityMonitor qualityMonitor);
+
+
+    /**
+     * 鐩戞帶璁″垝瀹℃牳
+     * @param qualityMonitor
+     * @return
+     */
+    boolean examineQualityMonitor(QualityMonitor qualityMonitor);
+
+    /**
+     * 鐩戞帶璁″垝鎵瑰噯
+     * @param qualityMonitor
+     * @return
+     */
+    boolean ratifyQualityMonitor(QualityMonitor qualityMonitor);
+
+    /**
+     * 鐩戞帶璁″垝鍒楄〃
+     * @param page
+     * @param qualityMonitor
+     * @return
+     */
+    IPage<QualityMonitorDto> pageQualityMonitor(Page page, QualityMonitor qualityMonitor);
+
+    /**
+     * 鐩戞帶璁″垝璇︽儏鍒楄〃
+     * @param page
+     * @param qualityMonitorDetails
+     * @return
+     */
+    IPage<QualityMonitorDetailsDto> pageQualityMonitorDetail(Page page, QualityMonitorDetails qualityMonitorDetails);
+
+
+    /**
+     * 瀵煎嚭鐩戞帶璁″垝
+     *
+     * @param qualityMonitorId
+     * @param response
+     */
+    void exportQualityMonitorDetail(Integer qualityMonitorId, HttpServletResponse response);
+
+
+    /************************************************************  瀹炴柦  *******************************************************************/
+
+    /**
+     * 鏌ヨ鐩戞帶璁″垝璇︽儏瀹炴柦淇℃伅
+     * @param qualityMonitorDetailsId
+     * @return
+     */
+    QualityMonitorDetailsRatify getQualityMonitorRatify(Integer qualityMonitorDetailsId);
+
+    /**
+     * 鏂板鐩戞帶璇︽儏瀹炴柦
+     * @param qualityMonitorDetailsRatify
+     * @return
+     */
+    boolean addQualityMonitorRatify(QualityMonitorDetailsRatify qualityMonitorDetailsRatify);
+
+    /**
+     * 鐩戞帶璁″垝璇︽儏瀹炴柦鎰忚
+     * @param qualityMonitorDetailsRatify
+     * @return
+     */
+    boolean addQualityMonitorRatifyOpinion(QualityMonitorDetailsRatify qualityMonitorDetailsRatify);
+
+    /**
+     * 瀵煎嚭鐩戞帶璁″垝璇︽儏瀹炴柦淇℃伅
+     *
+     * @param detailsRatifyId 鐩戞帶璁″垝璇︽儏瀹炴柦id
+     * @param response
+     */
+    void exportQualityMonitorRatify(Integer detailsRatifyId, HttpServletResponse response);
+
+
+    /************************************************************  璇勪环  *******************************************************************/
+
+    /**
+     *
+     * @param qualityMonitorDetailsId
+     * @return
+     */
+    QualityMonitorDetailsEvaluate getQualityMonitorEvaluate(Integer qualityMonitorDetailsId);
+
+    /**
+     * 鏂板鐩戞帶璇勪环
+     * @param qualityMonitorDetailsEvaluate
+     * @return
+     */
+    boolean addQualityMonitorEvaluate(QualityMonitorDetailsEvaluate qualityMonitorDetailsEvaluate);
+
+    /**
+     * 鐩戞帶璇勪环瀹℃壒鎰忚
+     * @param qualityMonitorDetailsEvaluate
+     * @return
+     */
+    boolean addMonitorEvaluateOpinion(QualityMonitorDetailsEvaluate qualityMonitorDetailsEvaluate);
+
+    /**
+     * 鏂板鐩戞帶璇勪环闄勪欢琛�
+     * @param qualityMonitorDetailsId
+     * @param file
+     * @return
+     */
+    boolean uploadEvaluateFile(Integer qualityMonitorDetailsId, MultipartFile file);
+
+    /**
+     * 鏌ヨ鐩戞帶璇勪环闄勪欢鍒楄〃
+     * @return
+     */
+    List<QualityMonitorDetailsEvaluateFile> getEvaluateFileList(Integer qualityMonitorDetailsId);
+
+
+    /**
+     * 瀵煎嚭鐩戞帶璇勪环
+     * @param detailsEvaluateId 鐩戞帶璇勪环id
+     */
+    void exportQualityMonitorEvaluate(Integer detailsEvaluateId, HttpServletResponse response);
+
+    /**
+     * 涓婁紶鐩戞帶瀹屾垚鎶ュ憡
+     * @param file
+     * @param qualityMonitorDetailsId
+     * @return
+     */
+    boolean uploadFinishReport(MultipartFile file, Integer qualityMonitorDetailsId);
+
+    /**
+     * 鎵瑰噯瀹屾垚鎶ュ憡
+     * @param qualityMonitorDetails
+     * @return
+     */
+    boolean ratifyFinishReport(QualityMonitorDetails qualityMonitorDetails);
+}
+
diff --git a/cnas-process/src/main/java/com/ruoyi/process/service/QualitySuperviseDetailsService.java b/cnas-process/src/main/java/com/ruoyi/process/service/QualitySuperviseDetailsService.java
new file mode 100644
index 0000000..3bf040a
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/service/QualitySuperviseDetailsService.java
@@ -0,0 +1,15 @@
+package com.ruoyi.process.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.process.pojo.QualitySuperviseDetails;
+
+/**
+ * 璐ㄩ噺鐩戠潱璇︽儏琛�
+ *
+ * @author zhuo
+ * @since 2024-11-07
+ */
+public interface QualitySuperviseDetailsService extends IService<QualitySuperviseDetails> {
+
+}
+
diff --git a/cnas-process/src/main/java/com/ruoyi/process/service/QualitySuperviseManagementReviewService.java b/cnas-process/src/main/java/com/ruoyi/process/service/QualitySuperviseManagementReviewService.java
new file mode 100644
index 0000000..dd9e1fb
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/service/QualitySuperviseManagementReviewService.java
@@ -0,0 +1,34 @@
+package com.ruoyi.process.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.process.pojo.QualitySuperviseManagementReview;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+import jakarta.servlet.http.HttpServletResponse;
+
+/**
+ * <p>
+ * 璐ㄩ噺鐩戠潱绠$悊璇勫杈撳叆鏉愭枡 鏈嶅姟绫�
+ * </p>
+ *
+ * @author
+ * @since 2025-05-07 10:46:11
+ */
+public interface QualitySuperviseManagementReviewService extends IService<QualitySuperviseManagementReview> {
+
+    /**
+     * 鍒嗛〉鏌ヨ
+     * @param page
+     * @param managementReview
+     * @return
+     */
+    IPage<QualitySuperviseManagementReview> pageManagementReview(Page page, QualitySuperviseManagementReview managementReview);
+
+    /**
+     * 瀵煎嚭
+     * @param managementReviewId
+     * @param response
+     */
+    void exportManagementReview(Integer managementReviewId, HttpServletResponse response);
+}
diff --git a/cnas-process/src/main/java/com/ruoyi/process/service/QualitySuperviseService.java b/cnas-process/src/main/java/com/ruoyi/process/service/QualitySuperviseService.java
new file mode 100644
index 0000000..9f67987
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/service/QualitySuperviseService.java
@@ -0,0 +1,201 @@
+package com.ruoyi.process.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.process.dto.QualitySuperviseDetailsDto;
+import com.ruoyi.process.pojo.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import jakarta.servlet.http.HttpServletResponse;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 璐ㄩ噺鐩戠潱涓昏〃
+ *
+ * @author zhuo
+ * @since 2024-11-07
+ */
+public interface QualitySuperviseService extends IService<QualitySupervise> {
+
+    /**
+     * 瀵煎叆鐩戠潱璁″垝
+     * @param file
+     * @return
+     */
+    boolean importQualitySupervise(MultipartFile file, QualitySupervise qualitySupervise);
+
+    /**
+     * 鐩戠潱璁″垝鎵瑰噯
+     * @param qualitySupervise
+     * @return
+     */
+    boolean ratifyQualitySupervise(QualitySupervise qualitySupervise);
+
+    /**
+     * 鐩戠潱璁″垝鍒楄〃
+     * @return
+     */
+    IPage<QualitySupervise> pageQualitySupervise(Page page, QualitySupervise qualitySupervise);
+
+    /**
+     * 鐩戠潱璁″垝璇︽儏鍒楄〃
+     * @return
+     */
+    IPage<QualitySuperviseDetailsDto> pageQualitySuperviseDetail(Page page, QualitySuperviseDetailsDto qualitySuperviseDetails);
+
+    /**
+     * 鏌ヨ璇ヨ鍒掔洃鐫e憳
+     * @param superviseDetailsId
+     * @return
+     */
+    List<Map<String, String>> getRecordUser(Integer superviseDetailsId);
+
+    /**
+     * 瀵煎嚭鐩戠潱璁″垝
+     * @param superviseId
+     * @param response
+     */
+    void exportQualitySupervise(Integer superviseId, HttpServletResponse response);
+
+    /************************************************ 璁板綍 ******************************************************/
+
+    /**
+     * 鏌ヨ鐩戠潱璁板綍淇℃伅
+     * @param superviseDetailsId
+     * @return
+     */
+    QualitySuperviseDetailsRecord getSuperviseDetailRecord(Integer superviseDetailsId);
+
+    /**
+     * 鏂板鐩戠潱璁板綍淇℃伅
+     * @param qualitySuperviseDetailsRecord
+     * @return
+     */
+    boolean addSuperviseDetailRecord(QualitySuperviseDetailsRecord qualitySuperviseDetailsRecord);
+
+    /**
+     * 鐩戠潱璁板綍鎵瑰噯
+     * @param qualitySuperviseDetailsRecord
+     * @return
+     */
+    boolean addSuperviseRecordOpinion(QualitySuperviseDetailsRecord qualitySuperviseDetailsRecord);
+
+    /**
+     * 瀵煎嚭鐩戠潱璁板綍琛�
+     * @param superviseDetailsId
+     * @param response
+     */
+    void exportSuperviseDetailRecord(Integer superviseDetailsId, HttpServletResponse response);
+
+    /*************************************************  涓嶅悎鏍煎伐浣滄帶鍒跺崟 ********************************************************/
+
+    /**
+     * 鏂板鐩戠潱璁板綍涓嶇鍚堟帶鍒朵俊鎭�
+     * @param qualitySuperviseDetailsAccording
+     * @return
+     */
+    boolean addSuperviseDetailAccording(QualitySuperviseDetailsAccording qualitySuperviseDetailsAccording);
+
+    /**
+     * (瑁呭娴佺▼)鏂板鐩戠潱璁板綍涓嶇鍚堟帶鍒朵俊鎭�
+     * @param qualitySuperviseDetailsAccording
+     * @return
+     */
+    boolean addEquipSuperviseDetailAccording(QualitySuperviseDetailsAccording qualitySuperviseDetailsAccording);
+
+    /**
+     * (瑁呭娴佺▼)鎵瑰噯鐩戠潱璁板綍涓嶇鍚堟帶鍒朵俊鎭�
+     * @param qualitySuperviseDetailsAccording
+     * @return
+     */
+    boolean approverEquipSuperviseDetailAccording(QualitySuperviseDetailsAccording qualitySuperviseDetailsAccording);
+
+    /**
+     * 鏌ヨ鐩戠潱璁板綍涓嶇鍚堟帶鍒朵俊鎭�
+     * @param superviseDetailsId
+     * @return
+     */
+    QualitySuperviseDetailsAccording getSuperviseDetailAccording(Integer superviseDetailsId);
+
+    /**
+     * 鏌ヨ鐩戠潱璁板綍涓嶇鍚堟帶鍒朵俊鎭垪琛�
+     * @param detailsAccording
+     * @return
+     */
+    IPage<QualitySuperviseDetailsAccording> pageSuperviseDetailAccording(Page page, QualitySuperviseDetailsAccording detailsAccording);
+
+    /**
+     * 瀵煎嚭鐩戠潱璁板綍涓嶇鍚堟帶鍒朵俊鎭�
+     * @param superviseDetailAccordingId
+     * @param response
+     */
+    void superviseDetailAccordingExport(Integer superviseDetailAccordingId, HttpServletResponse response);
+
+    /*************************************************  绾犳鎺柦澶勭悊鍗� ********************************************************/
+
+    /**
+     * 鏂板鐩戠潱绾犳澶勭悊淇℃伅
+     * @param qualitySuperviseDetailsAccording
+     * @return
+     */
+    boolean addSuperviseDetailCorrect(QualitySuperviseDetailsCorrect qualitySuperviseDetailsAccording);
+
+    /**
+     * (瑁呭娴佺▼)鏂板鐩戠潱绾犳澶勭悊
+     * @param qualitySuperviseDetailsCorrect
+     * @return
+     */
+    boolean addEquipSuperviseDetailCorrect(QualitySuperviseDetailsCorrect qualitySuperviseDetailsCorrect);
+
+    /**
+     * (瑁呭娴佺▼)鎵瑰噯鐩戠潱绾犳澶勭悊
+     * @param qualitySuperviseDetailsCorrect
+     * @return
+     */
+    boolean approveEquipSuperviseDetailCorrect(QualitySuperviseDetailsCorrect qualitySuperviseDetailsCorrect);
+
+    /**
+     * 鏌ヨ鐩戠潱绾犳澶勭悊
+     * @param superviseDetailsId
+     * @return
+     */
+    QualitySuperviseDetailsCorrect getSuperviseDetailCorrect(Integer superviseDetailsId);
+
+    /**
+     * 鏌ヨ鐩戠潱绾犳鎺柦鍒楄〃
+     * @param page
+     * @param detailsCorrect
+     * @return
+     */
+    IPage<QualitySuperviseDetailsCorrect> pageSuperviseDetailCorrect(Page page, QualitySuperviseDetailsCorrect detailsCorrect);
+
+    /**
+     * 鏂板鐩戠潱绾犳鎺柦闄勪欢
+     * @param superviseDetailsCorrectId
+     * @param file
+     * @return
+     */
+    boolean uploadSuperviseDetailCorrectFile(Integer superviseDetailsCorrectId, MultipartFile file);
+
+    /**
+     * 鏌ヨ鐩戠潱绾犳鎺柦闄勪欢
+     * @param superviseDetailsCorrectId
+     * @return
+     */
+    List<QualitySuperviseDetailsCorrectFile> getSuperviseDetailCorrectFileList(Integer superviseDetailsCorrectId);
+
+    /**
+     * 瀵煎嚭鐩戠潱绾犳鎺柦
+     * @param superviseDetailsCorrectId
+     * @param response
+     */
+    void exportSuperviseDetaillCorrect(Integer superviseDetailsCorrectId, HttpServletResponse response);
+
+
+
+    /*************************************************  璐ㄩ噺鐩戠潱璁板綍 ********************************************************/
+
+}
+
diff --git a/cnas-process/src/main/java/com/ruoyi/process/service/impl/CnasProcessMethodVerifyCalibrationsFileServiceImpl.java b/cnas-process/src/main/java/com/ruoyi/process/service/impl/CnasProcessMethodVerifyCalibrationsFileServiceImpl.java
new file mode 100644
index 0000000..96d3f41
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/service/impl/CnasProcessMethodVerifyCalibrationsFileServiceImpl.java
@@ -0,0 +1,19 @@
+package com.ruoyi.process.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.process.mapper.ProcessMethodVerifyCalibrationsFileMapper;
+import com.ruoyi.process.pojo.ProcessMethodVerifyCalibrationsFile;
+import com.ruoyi.process.service.ProcessMethodVerifyCalibrationsFileService;
+import org.springframework.stereotype.Service;
+
+/**
+ * 鏍囧噯鏂规硶楠岃瘉涓婂矖璇侀檮浠惰〃(CnasProcessMethodVerifyCalibrationsFile)$desc
+ *
+ * @author makejava
+ * @since 2024-11-12 09:55:06
+ */
+@Service
+public class CnasProcessMethodVerifyCalibrationsFileServiceImpl extends ServiceImpl<ProcessMethodVerifyCalibrationsFileMapper, ProcessMethodVerifyCalibrationsFile> implements ProcessMethodVerifyCalibrationsFileService {
+
+}
+
diff --git a/cnas-process/src/main/java/com/ruoyi/process/service/impl/CnasProcessMethodVerifyWorkFileServiceImpl.java b/cnas-process/src/main/java/com/ruoyi/process/service/impl/CnasProcessMethodVerifyWorkFileServiceImpl.java
new file mode 100644
index 0000000..5400190
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/service/impl/CnasProcessMethodVerifyWorkFileServiceImpl.java
@@ -0,0 +1,19 @@
+package com.ruoyi.process.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.process.mapper.ProcessMethodVerifyWorkFileMapper;
+import com.ruoyi.process.pojo.ProcessMethodVerifyWorkFile;
+import com.ruoyi.process.service.ProcessMethodVerifyWorkFileService;
+import org.springframework.stereotype.Service;
+
+/**
+ * 鏍囧噯鏂规硶楠岃瘉涓婂矖璇侀檮浠惰〃(CnasProcessMethodVerifyWorkFile)$desc
+ *
+ * @author makejava
+ * @since 2024-11-12 09:55:06
+ */
+@Service
+public class CnasProcessMethodVerifyWorkFileServiceImpl extends ServiceImpl<ProcessMethodVerifyWorkFileMapper, ProcessMethodVerifyWorkFile> implements ProcessMethodVerifyWorkFileService {
+
+}
+
diff --git a/cnas-process/src/main/java/com/ruoyi/process/service/impl/InconsistentDistributionDetailServiceImpl.java b/cnas-process/src/main/java/com/ruoyi/process/service/impl/InconsistentDistributionDetailServiceImpl.java
new file mode 100644
index 0000000..5ec8689
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/service/impl/InconsistentDistributionDetailServiceImpl.java
@@ -0,0 +1,20 @@
+package com.ruoyi.process.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.process.mapper.InconsistentDistributionDetailMapper;
+import com.ruoyi.process.pojo.InconsistentDistributionDetail;
+import com.ruoyi.process.service.InconsistentDistributionDetailService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 涓嶇鍚堥」鐨勫垎甯冭鎯� 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-15 09:53:33
+ */
+@Service
+public class InconsistentDistributionDetailServiceImpl extends ServiceImpl<InconsistentDistributionDetailMapper, InconsistentDistributionDetail> implements InconsistentDistributionDetailService {
+
+}
diff --git a/cnas-process/src/main/java/com/ruoyi/process/service/impl/InconsistentDistributionServiceImpl.java b/cnas-process/src/main/java/com/ruoyi/process/service/impl/InconsistentDistributionServiceImpl.java
new file mode 100644
index 0000000..0da882b
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/service/impl/InconsistentDistributionServiceImpl.java
@@ -0,0 +1,232 @@
+package com.ruoyi.process.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.ruoyi.common.utils.QueryWrappers;
+import com.ruoyi.inspect.util.HackLoopTableRenderPolicy;
+import com.ruoyi.process.dto.InconsistentDistributionDto;
+import com.ruoyi.process.dto.InconsistentDistributionProportionDto;
+import com.ruoyi.process.mapper.InconsistentDistributionMapper;
+import com.ruoyi.process.pojo.InconsistentDistribution;
+import com.ruoyi.process.pojo.InconsistentDistributionDetail;
+import com.ruoyi.process.service.InconsistentDistributionDetailService;
+import com.ruoyi.process.service.InconsistentDistributionService;
+import lombok.AllArgsConstructor;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import jakarta.servlet.http.HttpServletResponse;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.net.URLEncoder;
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * <p>
+ * 涓嶇鍚堥」鐨勫垎甯� 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-15 09:53:20
+ */
+@Service
+@AllArgsConstructor
+@Transactional(rollbackFor = Exception.class)
+public class InconsistentDistributionServiceImpl extends ServiceImpl<InconsistentDistributionMapper, InconsistentDistribution> implements InconsistentDistributionService {
+
+    private InconsistentDistributionDetailService inconsistentDistributionDetailService;
+
+
+    /**
+     * 涓嶇鍚堥」鍒嗗竷鏌ヨ
+     * @param page
+     * @param inconsistentDistributionDto
+     * @return
+     */
+    @Override
+    public IPage<InconsistentDistributionDto> pageInconsistentDistribution(Page page, InconsistentDistribution inconsistentDistributionDto) {
+        return baseMapper.pageInconsistentDistribution(page, QueryWrappers.queryWrappers(inconsistentDistributionDto));
+    }
+
+    /**
+     * 涓嶇鍚堥」鍒嗗竷鏂板
+     * @param inconsistentDistributionDto
+     * @return
+     */
+    @Override
+    public boolean addInconsistentDistribution(InconsistentDistributionDto inconsistentDistributionDto) {
+        baseMapper.insert(inconsistentDistributionDto);
+        // 鏂板璇︽儏
+        for (InconsistentDistributionDetail distributionDetail : inconsistentDistributionDto.getDistributionDetailList()) {
+            distributionDetail.setDistributionId(inconsistentDistributionDto.getDistributionId());
+        }
+        inconsistentDistributionDetailService.saveBatch(inconsistentDistributionDto.getDistributionDetailList());
+        return true;
+    }
+
+    /**
+     * 涓嶇鍚堥」鍒嗗竷淇敼
+     * @param inconsistentDistributionDto
+     * @return
+     */
+    @Override
+    public boolean updateInconsistentDistribution(InconsistentDistributionDto inconsistentDistributionDto) {
+        inconsistentDistributionDetailService.updateBatchById(inconsistentDistributionDto.getDistributionDetailList());
+        return true;
+    }
+
+    /**
+     * 涓嶇鍚堥」鍒嗗竷鍒犻櫎
+     * @param distributionId
+     * @return
+     */
+    @Override
+    public boolean delInconsistentDistribution(Integer distributionId) {
+        inconsistentDistributionDetailService.remove(Wrappers.<InconsistentDistributionDetail>lambdaQuery()
+                .eq(InconsistentDistributionDetail::getDistributionId, distributionId));
+        baseMapper.deleteById(distributionId);
+        return true;
+    }
+
+    /**
+     * 涓嶇鍚堥」鍒嗗竷鏌ョ湅璇︽儏
+     * @param distributionId
+     * @return
+     */
+    @Override
+    public InconsistentDistributionDto getInconsistentDistributionOne(Integer distributionId) {
+        InconsistentDistributionDto distributionDto = new InconsistentDistributionDto();
+        InconsistentDistribution inconsistentDistribution = baseMapper.selectById(distributionId);
+        BeanUtils.copyProperties(distributionDto, inconsistentDistribution);
+        // 鏌ヨ璇︾粏
+        List<InconsistentDistributionDetail> distributionDetailList = inconsistentDistributionDetailService.list(Wrappers.<InconsistentDistributionDetail>lambdaQuery()
+                .eq(InconsistentDistributionDetail::getDistributionId, distributionId));
+
+        // 涓讳换姹囨��
+        int directorSum = distributionDetailList.stream()
+                .filter(detail -> detail.getDirector() != null)
+                .mapToInt(InconsistentDistributionDetail::getDirector)
+                .sum();
+
+        // 鎶�鏈礋璐d汉姹囨��
+        int technologySum = distributionDetailList.stream()
+                .filter(detail -> detail.getTechnology() != null)
+                .mapToInt(InconsistentDistributionDetail::getTechnology)
+                .sum();
+
+        // 璐ㄩ噺璐熻矗浜烘眹鎬�
+        int qualitySum = distributionDetailList.stream()
+                .filter(detail -> detail.getQuality() != null)
+                .mapToInt(InconsistentDistributionDetail::getQuality)
+                .sum();
+
+        // 缁煎悎瀹ゆ眹鎬�
+        int comprehensiveSum = distributionDetailList.stream()
+                .filter(detail -> detail.getComprehensive() != null)
+                .mapToInt(InconsistentDistributionDetail::getComprehensive)
+                .sum();
+
+        // 璇曢獙瀹ゆ眹鎬�
+        int testingSum = distributionDetailList.stream()
+                .filter(detail -> detail.getTesting() != null)
+                .mapToInt(InconsistentDistributionDetail::getTesting)
+                .sum();
+
+        // 鎬绘暟姹囨��
+        int sum = directorSum + technologySum + qualitySum + comprehensiveSum + testingSum;
+
+        //璁$畻鍚堣
+        for (InconsistentDistributionDetail distributionDetail : distributionDetailList) {
+            // 鎬绘暟
+            Integer total = (distributionDetail.getDirector() != null ? distributionDetail.getDirector() : 0)
+                    + (distributionDetail.getTechnology() != null ? distributionDetail.getTechnology() : 0)
+                    + (distributionDetail.getQuality() != null ? distributionDetail.getQuality() : 0)
+                    + (distributionDetail.getComprehensive() != null ? distributionDetail.getComprehensive() : 0)
+                    + (distributionDetail.getTesting() != null ? distributionDetail.getTesting() : 0);
+            distributionDetail.setTotal(total);
+            // 鍗犳瘮
+            distributionDetail.setProportion(calculatePercentage(total, sum));
+        }
+        // 娣诲姞鏈�鍚庝竴琛屽崰姣斿璞�
+        InconsistentDistributionProportionDto proportionDto = new InconsistentDistributionProportionDto();
+        proportionDto.setEssentials("鍗犳瘮 %");
+        proportionDto.setDirector(calculatePercentage(directorSum, sum));
+        proportionDto.setTechnology(calculatePercentage(technologySum, sum));
+        proportionDto.setQuality(calculatePercentage(qualitySum, sum));
+        proportionDto.setComprehensive(calculatePercentage(comprehensiveSum, sum));
+        proportionDto.setTesting(calculatePercentage(testingSum, sum));
+        proportionDto.setTotal(sum);
+
+        distributionDto.setDistributionDetailList(distributionDetailList);
+        distributionDto.setDistributionProportion(proportionDto);
+
+        return distributionDto;
+    }
+
+    /**
+     * 璁$畻鍗犳瘮
+     * @return
+     */
+    public BigDecimal calculatePercentage(Integer numeratorNum, Integer denominatorNum) {
+        BigDecimal numerator = new BigDecimal(numeratorNum);
+        BigDecimal denominator = new BigDecimal(denominatorNum);
+
+        // 妫�鏌ラ櫎鏁版槸鍚︿负0
+        if (denominator.compareTo(BigDecimal.ZERO) == 0) {
+            return BigDecimal.ZERO;
+        }
+        BigDecimal ratio = numerator.divide(denominator, 4, RoundingMode.HALF_UP); // 淇濈暀4浣嶅皬鏁�
+        BigDecimal percentage = ratio.multiply(new BigDecimal("100"));
+        BigDecimal percentageRounded = percentage.setScale(2, RoundingMode.HALF_UP);
+        return percentageRounded;
+    }
+
+
+    /**
+     * 瀵煎嚭涓嶇鍚堢殑鍒嗗竷
+     * @param distributionId
+     * @param response
+     */
+    @Override
+    public void exportInconsistentDistribution(Integer distributionId, HttpServletResponse response) {
+        InconsistentDistributionDto inconsistentDistributionOne = getInconsistentDistributionOne(distributionId);
+
+        // 鑾峰彇璺緞
+        InputStream inputStream = this.getClass().getResourceAsStream("/static/inconsistent-distribution.docx");
+        Configure configure = Configure.builder()
+                .bind("distributionDetailList", new HackLoopTableRenderPolicy())
+                .build();
+        XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
+                new HashMap<String, Object>() {{
+                    put("distributionDetailList", inconsistentDistributionOne.getDistributionDetailList());
+                    put("proport", inconsistentDistributionOne.getDistributionProportion());
+                }});
+
+        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();
+            inputStream.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException("瀵煎嚭澶辫触");
+        }
+
+    }
+
+}
diff --git a/cnas-process/src/main/java/com/ruoyi/process/service/impl/InspectionOrderDetailServiceImpl.java b/cnas-process/src/main/java/com/ruoyi/process/service/impl/InspectionOrderDetailServiceImpl.java
new file mode 100644
index 0000000..fff7d16
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/service/impl/InspectionOrderDetailServiceImpl.java
@@ -0,0 +1,20 @@
+package com.ruoyi.process.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.process.mapper.InspectionOrderDetailMapper;
+import com.ruoyi.process.pojo.InspectionOrderDetail;
+import com.ruoyi.process.service.InspectionOrderDetailService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 妫�楠屽鎵樺崟璇︽儏琛� 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-09
+ */
+@Service
+public class InspectionOrderDetailServiceImpl extends ServiceImpl<InspectionOrderDetailMapper, InspectionOrderDetail> implements InspectionOrderDetailService {
+
+}
diff --git a/cnas-process/src/main/java/com/ruoyi/process/service/impl/InspectionOrderServiceImpl.java b/cnas-process/src/main/java/com/ruoyi/process/service/impl/InspectionOrderServiceImpl.java
new file mode 100644
index 0000000..3bf8cd5
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/service/impl/InspectionOrderServiceImpl.java
@@ -0,0 +1,439 @@
+package com.ruoyi.process.service.impl;
+
+import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+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.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.deepoove.poi.XWPFTemplate;
+import com.deepoove.poi.config.Configure;
+import com.ruoyi.common.core.domain.entity.User;
+import com.ruoyi.common.utils.QueryWrappers;
+import com.ruoyi.framework.exception.ErrorException;
+import com.ruoyi.inspect.dto.InsOrderDeviceRecordDto;
+import com.ruoyi.inspect.mapper.InsProductResultMapper;
+import com.ruoyi.inspect.mapper.InsSampleMapper;
+import com.ruoyi.inspect.pojo.*;
+import com.ruoyi.inspect.service.InsOrderService;
+import com.ruoyi.inspect.service.InsReportService;
+import com.ruoyi.inspect.util.HackLoopTableRenderPolicy;
+import com.ruoyi.process.dto.InspectionOrderDto;
+import com.ruoyi.process.dto.InspectionOrderExportDto;
+import com.ruoyi.process.mapper.InspectionOrderMapper;
+import com.ruoyi.process.mapper.ProcessOrderDeviceMapper;
+import com.ruoyi.process.mapper.ProcessSampleMapper;
+import com.ruoyi.process.pojo.*;
+import com.ruoyi.process.service.*;
+import com.ruoyi.system.mapper.UserMapper;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.multipart.MultipartFile;
+
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletResponse;
+import java.io.File;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URLEncoder;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.nio.file.StandardCopyOption;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ * 妫�楠屽鎵樺崟 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-09
+ */
+@Service
+@Transactional(rollbackFor = Exception.class)
+public class InspectionOrderServiceImpl extends ServiceImpl<InspectionOrderMapper, InspectionOrder> implements InspectionOrderService {
+    @Resource
+    private InspectionOrderDetailService inspectionOrderDetailService;
+    @Resource
+    private InsOrderService insOrderService;
+    @Resource
+    private InsSampleMapper insSampleMapper;
+    @Resource
+    private InsReportService insReportService;
+    @Value("${wordUrl}")
+    private String wordUrl;
+    @Resource
+    private ProcessReportService processReportService;
+    @Resource
+    private ProcessOrderDeviceMapper processOrderDeviceMapper;
+    @Resource
+    private InsProductResultMapper insProductResultMapper;
+    @Resource
+    private ProcessOrderDeviceService processOrderDeviceService;
+    @Resource
+    private UserMapper userMapper;
+    @Resource
+    private ProcessSampleService processSampleService;
+    @Resource
+    private ProcessSampleMapper processSampleMapper;
+    @Resource
+    private ProcessDealService processDealService;
+
+
+    /**
+     * 妫�楠屽鎵樺崟鍒嗛〉鏌ヨ
+     * @param page
+     * @param InspectionOrder
+     * @return
+     */
+    @Override
+    public IPage<InspectionOrderDto> pageInspectionOrder(Page page, InspectionOrder InspectionOrder) {
+        return baseMapper.pageInspectionOrder(page, QueryWrappers.queryWrappers(InspectionOrder));
+    }
+
+    /**
+     * 妫�楠屽鎵樺崟鏂板
+     * @param inspectionOrder
+     * @return
+     */
+    @Override
+    public boolean addInspectionOrder(InspectionOrderDto inspectionOrder) {
+        if (inspectionOrder.getInsOrderId() == null) {
+            throw new ErrorException("缂哄皯璁㈠崟id");
+        }
+
+        // 澶嶅埗鎶ュ憡
+        // 鏌ヨ璁㈠崟鎶ュ憡
+        InsReport insReport = insReportService.getOne(Wrappers.<InsReport>lambdaQuery()
+                .eq(InsReport::getInsOrderId, inspectionOrder.getInsOrderId()));
+
+        String path = wordUrl + insReport.getUrl().replaceFirst("/word", "");
+
+        String fileName =LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyMMddHHmmss")) + "_" + "濮旀墭鍗曟姤鍛�.docx";
+
+        // 婧愭枃浠惰矾寰�
+        Path sourcePath = Paths.get(path);
+        // 鐩爣鏂囦欢璺緞
+        Path targetPath = Paths.get(wordUrl + "/" + fileName);
+
+        try {
+            // 澶嶅埗鏂囦欢锛屽鏋滅洰鏍囨枃浠跺凡瀛樺湪锛屽垯瑕嗙洊
+            Files.copy(sourcePath, targetPath, StandardCopyOption.REPLACE_EXISTING);
+            // 娣诲姞鏂囦欢鍦板潃
+            inspectionOrder.setFileUrl("/word/" + fileName);
+
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        baseMapper.insert(inspectionOrder);
+        // 鏂板璇︽儏
+        if (CollectionUtils.isNotEmpty(inspectionOrder.getOrderDetailList())) {
+            for (InspectionOrderDetail InspectionOrderDetail : inspectionOrder.getOrderDetailList()) {
+                InspectionOrderDetail.setInspectionOrderId(inspectionOrder.getInspectionOrderId());
+            }
+            inspectionOrderDetailService.saveBatch(inspectionOrder.getOrderDetailList());
+        }
+        /*鏂板7.8鎶ュ憡缁撴灉*/
+        ProcessReport processReport = new ProcessReport();
+        processReport.setInspectionOrderId(inspectionOrder.getInsOrderId());
+        processReport.setInsReportCode(inspectionOrder.getEntrustCode());//鎶ュ憡缂栧彿=濮旀墭缂栧彿
+        //椤垫暟
+        try {
+            com.aspose.words.Document doc = new com.aspose.words.Document(path);
+            processReport.setPages(doc.getPageCount()+"");
+        } catch (Exception e) {
+        }
+        processReport.setNumber("1");//鍙戦�佷唤鏁伴粯璁�1
+        processReport.setSend(inspectionOrder.getCommissionUnit());//鍙戝線浣曞=濮旀墭鍗曚綅
+        processReport.setMethod(inspectionOrder.getSend()==1?"鑷彇":"鍏朵粬");//鍙戦�佹柟寮�
+        processReport.setSendTime(insReport.getRatifyTime().toLocalDate());//鍙戦�佹棩鏈�
+        processReport.setSendUser(64);//鍙戦�佷汉鍥哄畾
+        processReport.setSignatory(inspectionOrder.getCommissionUser());//绛炬敹浜�=濮旀墭浜�
+        processReportService.save(processReport);
+        /*鏂板7.1濮旀墭鍗曞搴旂殑璁惧浣跨敤璁板綍*/
+        addDeviceRecord(inspectionOrder,insReport.getWriteUserId());
+        /*鏂板7.4鏍峰搧鎺ユ敹*/
+        List<InsSample> insSamples = insSampleMapper.selectList(Wrappers.<InsSample>lambdaQuery()
+                .eq(InsSample::getInsOrderId, inspectionOrder.getInsOrderId()));
+        if (insSamples.size()>0){
+            List<ProcessSample> processSamples = new ArrayList<>();
+            for (InsSample insSample : insSamples) {
+                ProcessSample processSample = new ProcessSample();
+                processSample.setReceiveDate(inspectionOrder.getSampleData());//鏀舵牱鏃ユ湡=棰嗘牱鏃ユ湡
+                processSample.setSampleCode(insSample.getSampleCode());//鏍峰搧缂栧彿
+                processSample.setSampleName(insSample.getSample());//鏍峰搧鍚嶇О
+                processSample.setNum(1);//鏍峰搧鏁伴噺=1
+                processSample.setSampleSupplier(inspectionOrder.getCommissionUnit());//鏉ユ牱鍗曚綅
+                LocalDate plusMonths = inspectionOrder.getSampleData() == null ? null : inspectionOrder.getSampleData().plusMonths(1);
+                processSample.setLeaveDate(plusMonths);//鐣欐牱鏃ユ湡=鏀舵牱鏃ユ湡寰�鍚庡欢涓�涓湀
+                processSample.setSampleState(inspectionOrder.getSampleStatus());//鏍峰搧鐘舵��
+                processSample.setDealTime(plusMonths);//閫�鏍锋棩鏈�=鐣欐牱鏃ユ湡
+                processSample.setInspectionOrderId(inspectionOrder.getInspectionOrderId());//濮旀墭鍗昳d
+                processSamples.add(processSample);
+            }
+            processSampleService.saveBatch(processSamples);
+        }
+        return true;
+    }
+
+    private synchronized void addDeviceRecord(InspectionOrder inspectionOrder,Integer userId) {
+        // 鏌ヨ璁惧浣跨敤璁板綍鏌ヨ璇ヨ鍗曠殑浣跨敤璁板綍
+        Set<String> recordCodeset = processOrderDeviceMapper.selectDeviceNumber(inspectionOrder.getInspectionOrderId());
+        // 鑾峰彇璁㈠崟璁惧缂栧彿
+        List<InsProductResult> resultList = insProductResultMapper.selectResultByOrderId(inspectionOrder.getInsOrderId());
+        Set<String> deviceCodeSet = new HashSet<>();
+        for (InsProductResult result : resultList) {
+            // 娣诲姞璁惧缂栧彿
+            List<JSONObject> jsonObjects = JSON.parseArray(result.getEquipValue(), JSONObject.class);
+            for (JSONObject jsonObject : jsonObjects) {
+                if (!"".equals(jsonObject.get("v") + "")) {
+                    List<String> v = StrUtil.split(jsonObject.get("v") + "", "锛�");
+                    deviceCodeSet.addAll(v);
+                }
+            }
+        }
+        // 1.鍒ゆ柇鏄惁鏈夋病鏈夋坊鍔犵殑浣跨敤璁板綍
+        Set<String> orderDeviceNumbers = getDeviceDifference(deviceCodeSet, recordCodeset);
+        // 娣诲姞浣跨敤璁板綍, 鏍规嵁缂栧彿鏌ヨ璁惧id
+        if (CollectionUtils.isNotEmpty(orderDeviceNumbers)) {
+            List<Integer> orderDeviceIds = processOrderDeviceMapper.selectDeviceIdsByNumbers(orderDeviceNumbers);
+            List<ProcessOrderDevice> collect = orderDeviceIds.stream().map(deviceId -> {
+                ProcessOrderDevice processOrderDevice = new ProcessOrderDevice();
+                processOrderDevice.setInspectionOrderId(inspectionOrder.getInspectionOrderId());
+                processOrderDevice.setDeviceId(deviceId);
+                processOrderDevice.setSampleCode(inspectionOrder.getEntrustCode());
+                processOrderDevice.setUseBefore(1);
+                processOrderDevice.setUseAfter(1);
+                processOrderDevice.setUsePerson(userMapper.selectById(userId).getName());//浣跨敤浜�
+                processOrderDevice.setUsePersonId(userId);//浣跨敤浜篿d
+                return processOrderDevice;
+            }).collect(Collectors.toList());
+            processOrderDeviceService.saveBatch(collect);
+        }
+    }
+
+    private static Set<String> getDeviceDifference(Set<String> number1, Set<String> number2) {
+        return number1.stream().filter(s1 -> number2.stream().noneMatch(s2 -> s1.equals(s2)))
+                .collect(Collectors.toSet());
+    }
+
+    /**
+     * 妫�楠屽鎵樺崟淇敼
+     * @param InspectionOrder
+     * @return
+     */
+    @Override
+    public boolean updateInspectionOrder(InspectionOrderDto InspectionOrder) {
+        baseMapper.updateById(InspectionOrder);
+
+        // 鍒犻櫎涔嬪墠鐨勮鎯�
+        inspectionOrderDetailService.remove(Wrappers.<InspectionOrderDetail>lambdaQuery()
+                .eq(InspectionOrderDetail::getInspectionOrderId, InspectionOrder.getInspectionOrderId()));
+
+        // 鏂板璇︽儏
+        for (InspectionOrderDetail InspectionOrderDetail : InspectionOrder.getOrderDetailList()) {
+            InspectionOrderDetail.setInspectionOrderId(InspectionOrder.getInspectionOrderId());
+        }
+        inspectionOrderDetailService.saveBatch(InspectionOrder.getOrderDetailList());
+
+        //淇敼7.9鎶ュ憡缁撴灉
+        ProcessReport processReport = processReportService.getOne(Wrappers.<ProcessReport>lambdaQuery().eq(ProcessReport::getInspectionOrderId, InspectionOrder.getInspectionOrderId()));
+        processReport.setInsReportCode(InspectionOrder.getEntrustCode());//鎶ュ憡缂栧彿=濮旀墭缂栧彿
+        processReportService.updateById(processReport);
+
+        return true;
+    }
+
+    /**
+     * 妫�楠屽鎵樺崟鍒犻櫎
+     * @param inspectionOrderId
+     * @return
+     */
+    @Override
+    public boolean delInspectionOrder(Integer inspectionOrderId) {
+        inspectionOrderDetailService.remove(Wrappers.<InspectionOrderDetail>lambdaQuery()
+                .eq(InspectionOrderDetail::getInspectionOrderId, inspectionOrderId));
+        baseMapper.deleteById(inspectionOrderId);
+        //鍒犻櫎7.8鎶ュ憡
+        processReportService.remove(Wrappers.<ProcessReport>lambdaQuery()
+                .eq(ProcessReport::getInspectionOrderId, inspectionOrderId));
+        //鍒犻櫎瀵瑰簲鐨勮澶囦娇鐢ㄨ褰�
+        processOrderDeviceService.remove(Wrappers.<ProcessOrderDevice>lambdaQuery()
+                .eq(ProcessOrderDevice::getInspectionOrderId, inspectionOrderId));
+        //鍒犻櫎瀵瑰簲鐨�7.4鐨勬牱鍝佺敵璇�
+        List<ProcessSample> processSamples = processSampleMapper.selectList(Wrappers.<ProcessSample>lambdaQuery()
+                .eq(ProcessSample::getInspectionOrderId, inspectionOrderId));
+        if (processSamples.size()>0){
+            List<Integer> list = processSamples.stream().map(ProcessSample::getId).collect(Collectors.toList());
+            processDealService.remove(Wrappers.<ProcessDeal>lambdaQuery()
+                    .in(ProcessDeal::getProcessSampleId,list));
+        }
+        //鍒犻櫎瀵瑰簲7.4鐨勬牱鍝佹帴鏀�
+        processSampleService.remove(Wrappers.<ProcessSample>lambdaQuery()
+                .eq(ProcessSample::getInspectionOrderId,inspectionOrderId));
+        return true;
+    }
+
+    /**
+     * 妫�楠屽鎵樺崟鏌ョ湅璇︽儏
+     * @param inspectionOrderId
+     * @return
+     */
+    @Override
+    public InspectionOrderDto getInspectionOrderOne(Integer inspectionOrderId) {
+        InspectionOrder inspectionOrder = baseMapper.selectById(inspectionOrderId);
+        InspectionOrderDto inspectionOrderDto = new InspectionOrderDto();
+        BeanUtils.copyProperties(inspectionOrder, inspectionOrderDto);
+
+        // 鏌ヨ璇︾粏淇℃伅
+        inspectionOrderDto.setOrderDetailList(inspectionOrderDetailService.list(Wrappers.<InspectionOrderDetail>lambdaQuery()
+                .eq(InspectionOrderDetail::getInspectionOrderId, inspectionOrderId)));
+        return inspectionOrderDto;
+    }
+
+    /**
+     * 鏍规嵁鎴愬搧璁㈠崟id鏌ヨ濮旀墭鍗曡鎯�
+     * @param insOrderId
+     * @return
+     */
+    @Override
+    public InspectionOrderDto getInspectionOrderByInsOderId(Integer insOrderId) {
+        InsOrder order = insOrderService.getById(insOrderId);
+        InspectionOrderDto inspectionOrderDto = new InspectionOrderDto();
+        inspectionOrderDto.setInsOrderId(order.getId());//鎴愬搧璁㈠崟id
+        inspectionOrderDto.setEntrustCode(order.getEntrustCode());//濮旀墭缂栧彿
+        inspectionOrderDto.setSampleName(order.getSample());//璇曟牱鍚嶇О
+        inspectionOrderDto.setProduction(order.getProduction());//鐢熶骇鍗曚綅
+        inspectionOrderDto.setCommissionUnit(order.getCompany());//濮旀墭鍗曚綅
+        inspectionOrderDto.setCommissionUser(order.getPrepareUser());//濮旀墭浜�
+        inspectionOrderDto.setSampleStatus("瀹屽ソ");//鏍峰搧鐘舵��
+        inspectionOrderDto.setIsLeave(order.getIsLeave());//鏄惁鐣欐牱
+        inspectionOrderDto.setProcessing(order.getProcessing());//鏍峰搧澶勭悊鏂瑰紡
+        inspectionOrderDto.setAppointed(order.getAppointed());//绾﹀畾鏃堕棿
+        inspectionOrderDto.setSend(order.getSend());//鎶ュ憡鍙戦�佹柟寮�
+        inspectionOrderDto.setCommissionPhone(order.getPhone());//鎶ュ憡鍙戦�佹柟寮�
+
+        return inspectionOrderDto;
+    }
+
+
+    /**
+     * 濮旀墭鍗曟煡璇㈡垚鍝佽鍗�
+     * @return
+     */
+    @Override
+    public IPage<InsOrder> getInsOrderOnInspection(Page page, InsOrder insOrder) {
+        return baseMapper.getInsOrderOnInspection(page, QueryWrappers.queryWrappers(insOrder));
+    }
+
+    /**
+     * 濮旀墭鍗曟垚鍝佹姤鍛婁笂浼�
+     * @param file
+     * @param inspectionOrderId
+     * @return
+     */
+    @Override
+    public boolean uploadInspectionOrderFile(MultipartFile file, Integer inspectionOrderId) {
+        String urlString;
+        String pathName;
+        try {
+            String path = wordUrl;
+            File realpath = new File(path);
+            if (!realpath.exists()) {
+                realpath.mkdirs();
+            }
+            pathName = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyMMddHHmmss")) + "_" + file.getOriginalFilename();
+            urlString = realpath + "/" + pathName;
+            file.transferTo(new File(urlString));
+
+            baseMapper.update(null, Wrappers.<InspectionOrder>lambdaUpdate()
+                    .eq(InspectionOrder::getInspectionOrderId, inspectionOrderId)
+                    .set(InspectionOrder::getFileUrl, "/word/" + pathName));
+
+
+
+        } catch (Exception e) {
+            throw new ErrorException("鏂囦欢涓婁紶澶辫触");
+        }
+        return true;
+    }
+
+    @Override
+    public void exportInspectionOrder(Integer inspectionOrderId, HttpServletResponse response) {
+        InspectionOrder inspectionOrder = baseMapper.selectById(inspectionOrderId);
+        InspectionOrderExportDto inspectionOrderExportDto = extracted(inspectionOrder);
+        List<InspectionOrderDetail> list = inspectionOrderDetailService.list(Wrappers.<InspectionOrderDetail>lambdaQuery()
+                .eq(InspectionOrderDetail::getInspectionOrderId, inspectionOrderId));
+        int index = 1;
+        for (InspectionOrderDetail inspectionOrderDetail : list) {
+            inspectionOrderDetail.setIndex(index);
+            index++;
+        }
+
+        // 鑾峰彇璺緞
+        InputStream inputStream = this.getClass().getResourceAsStream("/static/inspection-order.docx");
+        Configure configure = Configure.builder()
+                .bind("inspectionOrderDetailList", new HackLoopTableRenderPolicy())
+                .build();
+        XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
+                new HashMap<String, Object>() {{
+                    put("inspectionOrder", inspectionOrderExportDto);
+                    put("inspectionOrderDetailList", list);
+                }});
+
+        try {
+            response.setContentType("application/msword");
+            String fileName = URLEncoder.encode(
+                    inspectionOrderExportDto.getSampleName(), "UTF-8");
+            response.setHeader("Content-disposition",
+                    "attachment;filename=" + fileName + ".docx");
+            OutputStream os = response.getOutputStream();
+            template.write(os);
+            os.flush();
+            os.close();
+            inputStream.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException("瀵煎嚭澶辫触");
+        }
+    }
+
+    private InspectionOrderExportDto extracted(InspectionOrder inspectionOrder) {
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy骞碝M鏈坉d鏃�");
+        InspectionOrderExportDto inspectionOrderExportDto = new InspectionOrderExportDto();
+        BeanUtils.copyProperties(inspectionOrder, inspectionOrderExportDto);
+
+        if (inspectionOrder.getCommissionDate() != null) {
+            inspectionOrderExportDto.setCommissionDateString(inspectionOrder.getCommissionDate().format(formatter));
+        }
+        if (inspectionOrder.getReceiptData() != null) {
+            inspectionOrderExportDto.setReceiptDataString(inspectionOrder.getReceiptData().format(formatter));
+        }
+        if (inspectionOrder.getSampleData() != null) {
+            inspectionOrderExportDto.setSampleDataString(inspectionOrder.getSampleData().format(formatter));
+        }
+        if (inspectionOrder.getAppointed() != null) {
+            inspectionOrderExportDto.setAppointedString(inspectionOrder.getAppointed().format(formatter));
+        }
+
+        inspectionOrderExportDto.setIsLeave1(inspectionOrder.getIsLeave() != null && inspectionOrder.getIsLeave() == 1? "鈽�" : "鈻�");
+        inspectionOrderExportDto.setIsLeave2(inspectionOrder.getIsLeave() != null && inspectionOrder.getIsLeave() == 0? "鈽�" : "鈻�");
+        inspectionOrderExportDto.setSend0(inspectionOrder.getSend() != null && inspectionOrder.getSend() == 1? "鈽�" : "鈻�");
+        inspectionOrderExportDto.setSend1(inspectionOrder.getSend() != null && inspectionOrder.getSend() == 0? "鈽�" : "鈻�");
+        inspectionOrderExportDto.setProcessing0(inspectionOrder.getProcessing() != null && inspectionOrder.getProcessing() == 0? "鈽�" : "鈻�");
+        inspectionOrderExportDto.setProcessing1(inspectionOrder.getProcessing() != null && inspectionOrder.getProcessing() == 1? "鈽�" : "鈻�");
+        inspectionOrderExportDto.setCriterionRule0(inspectionOrder.getCriterionRule() != null && inspectionOrder.getCriterionRule() == 0? "鈽�" : "鈻�");
+        inspectionOrderExportDto.setCriterionRule1(inspectionOrder.getCriterionRule() != null && inspectionOrder.getCriterionRule() == 1? "鈽�" : "鈻�");
+        return inspectionOrderExportDto;
+    }
+}
diff --git a/cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessComplainServiceImpl.java b/cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessComplainServiceImpl.java
new file mode 100644
index 0000000..6047c2a
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessComplainServiceImpl.java
@@ -0,0 +1,113 @@
+package com.ruoyi.process.service.impl;
+
+import cn.hutool.core.date.DateUtil;
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.ExcelWriter;
+import com.alibaba.excel.write.metadata.WriteSheet;
+import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
+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.ruoyi.basic.pojo.StandardTemplate;
+import com.ruoyi.common.numgen.NumberGenerator;
+import com.ruoyi.common.utils.QueryWrappers;
+import com.ruoyi.framework.exception.ErrorException;
+import com.ruoyi.inspect.mapper.InsReportMapper;
+import com.ruoyi.inspect.mapper.InsSampleMapper;
+import com.ruoyi.inspect.pojo.InsReport;
+import com.ruoyi.inspect.pojo.InsSample;
+import com.ruoyi.process.dto.ProcessComplainDto;
+import com.ruoyi.process.mapper.ProcessComplainMapper;
+import com.ruoyi.process.pojo.ProcessComplain;
+import com.ruoyi.process.service.ProcessComplainService;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.net.URLEncoder;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * <p>
+ * 鎶曡瘔 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-02 09:29:11
+ */
+@Service
+@Transactional(rollbackFor = Exception.class)
+public class ProcessComplainServiceImpl extends ServiceImpl<ProcessComplainMapper, ProcessComplain> implements ProcessComplainService {
+
+    @Resource
+    private ProcessComplainMapper processComplainMapper;
+
+    @Resource
+    private InsReportMapper insReportMapper;
+
+    @Resource
+    private InsSampleMapper insSampleMapper;
+
+    @Resource
+    private NumberGenerator<ProcessComplain> numberGenerator;
+
+
+    @Override
+    public IPage<ProcessComplain> pageProcessComplain(Page page, ProcessComplain processComplain) {
+        return processComplainMapper.pageProcessComplain(page, QueryWrappers.queryWrappers(processComplain));
+    }
+
+    @Override
+    public int addProcessComplain(ProcessComplain processComplain) {
+        //鍒ゆ柇鎶ュ憡缂栧彿鍜屾牱鍝佺紪鍙锋槸鍚﹀瓨鍦�
+        InsReport insReport = insReportMapper.selectOne(Wrappers.<InsReport>lambdaQuery().eq(InsReport::getCode, processComplain.getCode()));
+        if (ObjectUtils.isEmpty(insReport)) {
+            throw new ErrorException("鎶ュ憡缂栧彿杈撳叆鏈夎");
+        }
+        processComplain.setInsReportId(insReport.getId());
+        InsSample insSample = insSampleMapper.selectOne(Wrappers.<InsSample>lambdaQuery().eq(InsSample::getSampleCode, processComplain.getSampleCode()));
+        if (ObjectUtils.isEmpty(insSample)) {
+            throw new ErrorException("鏍峰搧缂栧彿杈撳叆鏈夎");
+        }
+        //鎶曡瘔缂栧彿鐢熸垚
+        String giveCode = numberGenerator.generateNumberWithPrefix(3,
+                "JCZX-" + DateUtil.format(new Date(), "yyMMdd"),
+                ProcessComplain::getComplainNo);
+        processComplain.setComplainNo(giveCode);
+        return processComplainMapper.insert(processComplain);
+    }
+
+    @Override
+    public ProcessComplainDto getProcessComplain(Long id) {
+        return processComplainMapper.getProcessComplain(id);
+    }
+
+    @Override
+    public int doProcessComplain(ProcessComplain processComplain) {
+        return processComplainMapper.updateById(processComplain);
+    }
+
+    @Override
+    public void exportProcessComplain(ProcessComplain processComplain, HttpServletResponse response) throws Exception {
+        List<ProcessComplain> data = processComplainMapper.pageProcessComplain(new Page(-1, -1), QueryWrappers.queryWrappers(processComplain)).getRecords();
+        response.setContentType("application/vnd.ms-excel");
+        response.setCharacterEncoding("UTF-8");
+        String fileName = URLEncoder.encode("鎶曡瘔鍒楄〃瀵煎嚭", "UTF-8");
+        response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
+        try {
+            // 鏂板缓ExcelWriter
+            ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()).build();
+            WriteSheet mainSheet = EasyExcel.writerSheet(0, "鎶曡瘔鍒楄〃瀵煎嚭").head(ProcessComplain.class).build();
+            excelWriter.write(data, mainSheet);
+            // 鍏抽棴娴�
+            excelWriter.finish();
+        } catch (IOException e) {
+            throw new RuntimeException("瀵煎嚭澶辫触");
+        }
+    }
+}
diff --git a/cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessDealServiceImpl.java b/cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessDealServiceImpl.java
new file mode 100644
index 0000000..b884c65
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessDealServiceImpl.java
@@ -0,0 +1,36 @@
+package com.ruoyi.process.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.ruoyi.common.utils.QueryWrappers;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.process.mapper.ProcessDealMapper;
+import com.ruoyi.process.mapper.ProcessTotaldealMapper;
+import com.ruoyi.process.pojo.ProcessDeal;
+import com.ruoyi.process.pojo.ProcessTotaldeal;
+import com.ruoyi.process.service.ProcessDealService;
+import com.ruoyi.system.mapper.UserMapper;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import jakarta.annotation.Resource;
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
+
+/**
+ * <p>
+ * 妫�娴嬫垨鏍″噯鐗╁搧鐨勫缃� 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-02 02:50:19
+ */
+@Service
+@Transactional(rollbackFor = Exception.class)
+public class ProcessDealServiceImpl extends ServiceImpl<ProcessDealMapper, ProcessDeal> implements ProcessDealService {
+
+}
diff --git a/cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessEvaluateServiceImpl.java b/cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessEvaluateServiceImpl.java
new file mode 100644
index 0000000..a05ae6d
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessEvaluateServiceImpl.java
@@ -0,0 +1,99 @@
+package com.ruoyi.process.service.impl;
+
+import cn.hutool.core.lang.UUID;
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.ExcelWriter;
+import com.alibaba.excel.write.metadata.WriteSheet;
+import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
+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.ruoyi.common.utils.QueryWrappers;
+import com.ruoyi.process.mapper.ProcessEvaluateMapper;
+import com.ruoyi.process.pojo.ProcessEvaluate;
+import com.ruoyi.process.service.ProcessEvaluateService;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.multipart.MultipartFile;
+
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletResponse;
+import java.io.File;
+import java.io.IOException;
+import java.net.URLEncoder;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 娴嬮噺涓嶇‘瀹氬害鐨勮瘎浠� 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-02 01:10:43
+ */
+@Service
+@Transactional(rollbackFor = Exception.class)
+public class ProcessEvaluateServiceImpl extends ServiceImpl<ProcessEvaluateMapper, ProcessEvaluate> implements ProcessEvaluateService {
+
+    @Resource
+    private ProcessEvaluateMapper processEvaluateMapper;
+
+    @Value("${wordUrl}")
+    private String wordUrl;
+
+    @Override
+    public IPage<ProcessEvaluate> pageProcessEvaluate(Page page, ProcessEvaluate processEvaluate) {
+        return processEvaluateMapper.pageProcessEvaluate(page, QueryWrappers.queryWrappers(processEvaluate));
+    }
+
+    @Override
+    public int addProcessEvaluate(MultipartFile file) {
+        String urlString;
+        String pathName;
+        String path=wordUrl;
+        ProcessEvaluate processEvaluate = new ProcessEvaluate();
+        processEvaluate.setReportName(file.getOriginalFilename());
+        try {
+            File realpath = new File(path);
+            if (!realpath.exists()) {
+                realpath.mkdirs();
+            }
+            pathName = UUID.randomUUID() + "_" + file.getOriginalFilename();
+            urlString = realpath + "/" + pathName;
+            file.transferTo(new File(urlString));
+            processEvaluate.setReportUrl(pathName);
+            return processEvaluateMapper.insert(processEvaluate);
+        } catch (Exception e) {
+            e.printStackTrace();
+            System.err.println("闄勪欢涓婁紶閿欒");
+            return 0;
+        }
+    }
+
+    @Override
+    public int doProcessEvaluate(ProcessEvaluate processEvaluate) {
+        return processEvaluateMapper.updateById(processEvaluate);
+    }
+
+    @Override
+    public void exportProcessEvaluate(ProcessEvaluate processEvaluate, HttpServletResponse response) throws Exception{
+        List<ProcessEvaluate> data = processEvaluateMapper.pageProcessEvaluate(new Page(-1, -1), QueryWrappers.queryWrappers(processEvaluate)).getRecords();
+        response.setContentType("application/vnd.ms-excel");
+        response.setCharacterEncoding("UTF-8");
+        String fileName = URLEncoder.encode("娴嬮噺涓嶇‘瀹氬害鐨勮瘎瀹氬鍑�", "UTF-8");
+        response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
+        try {
+            // 鏂板缓ExcelWriter
+            ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()).build();
+            WriteSheet mainSheet = EasyExcel.writerSheet(0, "娴嬮噺涓嶇‘瀹氬害鐨勮瘎瀹氬鍑�").head(ProcessEvaluate.class).build();
+            excelWriter.write(data, mainSheet);
+            // 鍏抽棴娴�
+            excelWriter.finish();
+        } catch (IOException e) {
+            throw new RuntimeException("瀵煎嚭澶辫触");
+        }
+    }
+}
diff --git a/cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessMethodSearchNewArchivedServiceImpl.java b/cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessMethodSearchNewArchivedServiceImpl.java
new file mode 100644
index 0000000..a2903e8
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessMethodSearchNewArchivedServiceImpl.java
@@ -0,0 +1,20 @@
+package com.ruoyi.process.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.process.mapper.ProcessMethodSearchNewArchivedMapper;
+import com.ruoyi.process.pojo.ProcessMethodSearchNewArchived;
+import com.ruoyi.process.service.ProcessMethodSearchNewArchivedService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 鏍囧噯鏌ユ柊瀛樻。琛� 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-25 05:28:42
+ */
+@Service
+public class ProcessMethodSearchNewArchivedServiceImpl extends ServiceImpl<ProcessMethodSearchNewArchivedMapper, ProcessMethodSearchNewArchived> implements ProcessMethodSearchNewArchivedService {
+
+}
diff --git a/cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessMethodSearchNewBackupsServiceImpl.java b/cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessMethodSearchNewBackupsServiceImpl.java
new file mode 100644
index 0000000..c5355d3
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessMethodSearchNewBackupsServiceImpl.java
@@ -0,0 +1,20 @@
+package com.ruoyi.process.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.process.mapper.ProcessMethodSearchNewBackupsMapper;
+import com.ruoyi.process.pojo.ProcessMethodSearchNewBackups;
+import com.ruoyi.process.service.ProcessMethodSearchNewBackupsService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 鏍囧噯鏌ユ柊澶囦唤琛� 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-25 05:29:02
+ */
+@Service
+public class ProcessMethodSearchNewBackupsServiceImpl extends ServiceImpl<ProcessMethodSearchNewBackupsMapper, ProcessMethodSearchNewBackups> implements ProcessMethodSearchNewBackupsService {
+
+}
diff --git a/cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessMethodSearchNewServiceImpl.java b/cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessMethodSearchNewServiceImpl.java
new file mode 100644
index 0000000..b257cff
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessMethodSearchNewServiceImpl.java
@@ -0,0 +1,370 @@
+package com.ruoyi.process.service.impl;
+
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.ExcelWriter;
+import com.alibaba.excel.context.AnalysisContext;
+import com.alibaba.excel.event.AnalysisEventListener;
+import com.alibaba.excel.util.FileUtils;
+import com.alibaba.excel.util.ListUtils;
+import com.alibaba.excel.write.metadata.WriteSheet;
+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.ruoyi.common.utils.QueryWrappers;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.framework.exception.ErrorException;
+import com.ruoyi.inspect.util.UserUtils;
+import com.ruoyi.process.dto.ProcessMethodSearchNewArchivedDto;
+import com.ruoyi.process.dto.ProcessMethodSearchNewBackupsDto;
+import com.ruoyi.process.mapper.ProcessMethodSearchNewArchivedMapper;
+import com.ruoyi.process.mapper.ProcessMethodSearchNewBackupsMapper;
+import com.ruoyi.process.mapper.ProcessMethodSearchNewMapper;
+import com.ruoyi.process.pojo.ProcessMethodSearchNew;
+import com.ruoyi.process.pojo.ProcessMethodSearchNewArchived;
+import com.ruoyi.process.pojo.ProcessMethodSearchNewBackups;
+import com.ruoyi.process.service.ProcessMethodSearchNewBackupsService;
+import com.ruoyi.process.service.ProcessMethodSearchNewService;
+import org.springframework.beans.BeanUtils;
+import org.springframework.core.io.ClassPathResource;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.multipart.MultipartFile;
+
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletResponse;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URLEncoder;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * 鏍囧噯鏌ユ柊
+ *
+ * @author zhuo
+ * @since 2024-11-04
+ */
+@Service
+@Transactional(rollbackFor = Exception.class)
+public class ProcessMethodSearchNewServiceImpl extends ServiceImpl<ProcessMethodSearchNewMapper, ProcessMethodSearchNew> implements ProcessMethodSearchNewService {
+
+    @Resource
+    private ProcessMethodSearchNewArchivedMapper processMethodSearchNewArchivedMapper;
+    @Resource
+    private ProcessMethodSearchNewBackupsService processMethodSearchNewBackupsService;
+    @Resource
+    private ProcessMethodSearchNewBackupsMapper processMethodSearchNewBackupsMapper;
+
+    /**
+     * 鏂板鏍囧噯鏌ユ柊
+     *
+     * @param processMethodSearchNewList
+     * @return
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean addMethodSearchNew(List<ProcessMethodSearchNew> processMethodSearchNewList) {
+        for (ProcessMethodSearchNew processMethodSearchNew : processMethodSearchNewList) {
+            processMethodSearchNew.setIsNewStandard(1);
+        }
+        // 鏂板
+        this.saveBatch(processMethodSearchNewList);
+        return true;
+    }
+
+    /**
+     * 鏍囧噯鏌ユ柊鍒楄〃
+     *
+     * @param processMethodSearchNew
+     * @return
+     */
+    @Override
+    public IPage<ProcessMethodSearchNew> pageMethodSearchNew(Page page, ProcessMethodSearchNewBackupsDto processMethodSearchNew) {
+        String beginDate = processMethodSearchNew.getBeginDate();
+        String endDate = processMethodSearchNew.getEndDate();
+        processMethodSearchNew.setBeginDate(null);
+        processMethodSearchNew.setEndDate(null);
+        return baseMapper.pageMethodSearchNew(page, QueryWrappers.queryWrappers(processMethodSearchNew), beginDate, endDate);
+    }
+
+    /**
+     * 鏍囧噯鏌ユ柊瀵煎嚭
+     *
+     * @param archivedId
+     * @param response
+     */
+    @Override
+    public void exportMethodSearchNew(Integer archivedId, HttpServletResponse response) {
+        // 鏌ヨ鏍囧噯鏌ユ柊瀛樻。淇℃伅
+        DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+        ProcessMethodSearchNewArchived methodSearchNewArchived = processMethodSearchNewArchivedMapper.selectById(archivedId);
+        Integer writeUserId = methodSearchNewArchived.getWriteUserId();
+        Integer ratifyUserId = methodSearchNewArchived.getRatifyUserId();
+        String writeDate = methodSearchNewArchived.getWriteTime() == null ?
+                null : methodSearchNewArchived.getWriteTime().format(timeFormatter);
+        String ratifyDate =methodSearchNewArchived.getRatifyTime() == null ?
+                null :  methodSearchNewArchived.getRatifyTime().format(timeFormatter);
+        // 鏌ヨ瀛樻。澶囦唤
+        List<ProcessMethodSearchNewBackups> methodSearchNewBackups = processMethodSearchNewBackupsMapper.selectList(Wrappers.<ProcessMethodSearchNewBackups>lambdaQuery()
+                .eq(ProcessMethodSearchNewBackups::getArchivedId, archivedId));
+
+        int index = 1;
+        // 鏍煎紡鍖栧弬鏁�
+        List<ProcessMethodSearchNewBackupsDto> methodSearchNews = new ArrayList<>();
+        for (ProcessMethodSearchNewBackups methodSearchNew : methodSearchNewBackups) {
+            ProcessMethodSearchNewBackupsDto searchNewBackupsDto = new ProcessMethodSearchNewBackupsDto();
+            BeanUtils.copyProperties(methodSearchNew, searchNewBackupsDto);
+            // 鏄惁鏄窡鏂版爣鍑�
+            if (methodSearchNew.getIsNewStandard().equals(1)) {
+                searchNewBackupsDto.setIsNewStandardString("鏄�");
+            } else {
+                searchNewBackupsDto.setIsNewStandardString("鍚�");
+            }
+
+            // 澶囨敞
+            if (methodSearchNew.getRemark() != null) {
+                if (methodSearchNew.getRemark().equals(1)) {
+                    searchNewBackupsDto.setRemarkString("鏇挎崲");
+                } else {
+                    searchNewBackupsDto.setRemarkString("浣滃簾");
+                }
+            }
+            switch (methodSearchNew.getSearchNewSource()) {
+                case 0:
+                    searchNewBackupsDto.setStandardNet("鈭�");
+                    break;
+                case 1:
+                    searchNewBackupsDto.setInformationOffices("鈭�");
+                    break;
+                case 2:
+                    searchNewBackupsDto.setStandardBookstore("鈭�");
+                    break;
+                case 3:
+                    searchNewBackupsDto.setOther("鈭�");
+                    break;
+            }
+            searchNewBackupsDto.setIndex(index);
+            methodSearchNews.add(searchNewBackupsDto);
+            index++;
+
+        }
+        // 鏌ヨ绛惧悕鍦板潃
+        String writeUserUrl = UserUtils.getUserSignatureUrl(writeUserId);
+        String ratifyUserUrl = UserUtils.getUserSignatureUrl(ratifyUserId);
+
+        //鍒涘缓ExcelWriter 鍙互鑷姩鍏虫祦浣嗚繕鏄墜鍔ㄥ叧涓�娆�
+        ExcelWriter excelWriter = null;
+
+        try {
+            // outputStream锛氳瀵煎嚭鐨勬枃浠剁殑杈撳嚭娴�
+            OutputStream outputStream = response.getOutputStream();
+            // 鑾峰彇妯$増鏂囦欢
+            ClassPathResource classPathResource = new ClassPathResource("/static/excel/check-records.xlsx");
+            // 浣跨敤妯$増鏂囦欢鐨勪袱绉嶆柟寮忥細
+            // 	1銆佹枃浠惰矾寰勶細.withTemplate(templateFileName)
+            // 	2銆佽緭鍏ユ祦锛�.withTemplate(inputStream)
+            // String templateFileName = classPathResource.getFile().getPath();
+            InputStream inputStream = classPathResource.getInputStream();
+            // 鍒涘缓ExcelWriter
+            excelWriter = EasyExcel.write(outputStream).withTemplate(inputStream).build();
+            // 鑾峰彇绗竴涓猻heet椤�
+            WriteSheet writeSheet = EasyExcel.writerSheet(0, "鏍囧噯鏌ユ柊瀵煎嚭").build();
+            //excelWriter.fill() 杩欏湴鏂瑰氨鏄~鍏呭睘鎬с��
+//            excelWriter.fill(methodSearchNews, fillConfig, writeSheet); // 杩欓噷fillConfig鏄厤缃枃浠�
+            excelWriter.fill(methodSearchNews, writeSheet);
+
+            // 杩欓噷easy excel妯℃澘瀵煎嚭闂 浼氬垹闄ゅ悗闈㈠唴瀹瑰啀杩涜杩涜濉厖
+            // 鎵�浠ist 鍚庨潰杩樻湁鏁版嵁 鎯冲姙娉曟墜鍔ㄥ啓鍏�
+            // 鎵嬪姩鍒涘缓涓�涓猯ist 瀛樻斁鏁版嵁 鐒跺悗鍐嶈繘琛屽~鍏�
+            // 杩欓噷List<Object>鍙互鐢ㄥ璞′唬鏇� 鍋锋噿鐢╨ist
+            List<List<Object>> totalListList = ListUtils.newArrayList();
+            List<Object> totalList = ListUtils.newArrayList();
+            totalListList.add(totalList);
+            // 绗竴鍒�
+            totalList.add("缂栧埗浜猴細");
+            // 绗簩鍒� 璁剧疆绛惧悕
+            if (StringUtils.isNotBlank(writeUserUrl)) {
+                totalList.add(FileUtils.readFileToByteArray(new File(writeUserUrl)));
+            }
+            // 绗笁鍒�
+            totalList.add("鏃ユ湡锛�");
+            // 绗簲鍒�
+            totalList.add(writeDate);
+            // 绗叚鍒�
+            totalList.add("瀹℃牳锛�");
+            // 绗竷鍒�
+            if (StringUtils.isNotBlank(ratifyUserUrl)) {
+                totalList.add(FileUtils.readFileToByteArray(new File(ratifyUserUrl)));
+            }
+            // 绗叓鍒�
+            totalList.add("鏃ユ湡锛�");
+            // 绗節鍒�
+            totalList.add(ratifyDate);
+            // 杩欓噷杩藉姞鏄痺rite 鍒拰fill 鎼為敊浜�
+            excelWriter.write(totalListList, writeSheet);
+
+            // 璁剧疆杈撳嚭娴佹牸寮忎互鍙婃枃浠跺悕锛�
+            response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
+            response.setCharacterEncoding("utf-8");
+            String fileName = URLEncoder.encode(
+                    "鍘熸潗鏂欐娴嬩俊鎭鍑�", "UTF-8");
+            response.setHeader("Content-disposition",
+                    "attachment;filename=" + fileName + ".xlsx");
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        } finally {
+            // 鍗冧竾鍒繕璁癱lose鍏抽棴娴�
+            if (excelWriter != null) {
+                excelWriter.close();
+
+            }
+        }
+    }
+
+
+    /**
+     * 瀵煎叆鏍囧噯鏌ユ柊
+     *
+     * @param file
+     * @return
+     */
+    @Override
+    public boolean importMethodSearchNew(MultipartFile file) {
+
+        List<ProcessMethodSearchNewBackupsDto> searchNewDtoList = new ArrayList<>();
+
+        try {
+            // excel瑙f瀽
+            EasyExcel.read(file.getInputStream(), ProcessMethodSearchNewBackupsDto.class, new AnalysisEventListener<ProcessMethodSearchNewBackupsDto>() {
+                @Override
+                public void invoke(ProcessMethodSearchNewBackupsDto searchNewDto, AnalysisContext analysisContext) {
+                    searchNewDtoList.add(searchNewDto);
+                }
+
+                @Override
+                public void doAfterAllAnalysed(AnalysisContext analysisContext) {
+
+                }
+            }).sheet().doRead();
+            // 鏍煎紡鍖栨煡鏂板璞�
+            List<ProcessMethodSearchNew> collect = searchNewDtoList.stream().map(searchNewDto -> {
+                ProcessMethodSearchNew searchNew = new ProcessMethodSearchNew();
+                BeanUtils.copyProperties(searchNewDto, searchNew);
+                // 鏄惁鏄洿鏂�
+                if (StringUtils.isNotBlank(searchNewDto.getIsNewStandardString())) {
+                    if (searchNewDto.getIsNewStandardString().equals("鏄�")) {
+                        searchNew.setIsNewStandard(1);
+                    } else {
+                        searchNew.setIsNewStandard(0);
+                    }
+                }
+                // 鏌ユ柊璁板綍
+                if (StringUtils.isNotBlank(searchNewDto.getStandardNet())) {
+                    searchNew.setSearchNewSource(0);
+                } else if (StringUtils.isNotBlank(searchNewDto.getInformationOffices())) {
+                    searchNew.setSearchNewSource(1);
+                } else if (StringUtils.isNotBlank(searchNewDto.getIsNewStandardString())) {
+                    searchNew.setSearchNewSource(2);
+                } else if (StringUtils.isNotBlank(searchNewDto.getOther())) {
+                    searchNew.setSearchNewSource(3);
+                }
+
+                // 澶囨敞
+                if (StringUtils.isNotBlank(searchNewDto.getRemarkString())) {
+                    if (searchNewDto.getRemarkString().equals("鏇挎崲")) {
+                        searchNew.setRemark(1);
+                    } else if (searchNewDto.getRemarkString().equals("浣滃簾")) {
+                        searchNew.setRemark(0);
+                    }
+                }
+
+                return searchNew;
+            }).collect(Collectors.toList());
+            this.saveBatch(collect);
+
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+        return true;
+    }
+
+    /**
+     * 鏂板鏍囧噯鏌ユ柊瀹℃壒娴佺▼
+     * @param archived
+     * @return
+     */
+    @Override
+    public boolean addSearchNewArchived(ProcessMethodSearchNewArchived archived) {
+        // 鏂板瀛樻。
+        Integer userId = SecurityUtils.getUserId().intValue();
+        archived.setWriteUserId(userId);
+        archived.setWriteTime(LocalDateTime.now());
+        processMethodSearchNewArchivedMapper.insert(archived);
+
+        // 鏌ヨ鎵�鏈夌殑鏍囧噯鏌ユ柊
+        List<ProcessMethodSearchNew> searchNewList = this.list();
+
+        // 鏂板澶嶅埗
+        List<ProcessMethodSearchNewBackups> methodSearchNewBackups = searchNewList.stream().map(processMethodSearchNew -> {
+            ProcessMethodSearchNewBackups backups = new ProcessMethodSearchNewBackups();
+            BeanUtils.copyProperties(processMethodSearchNew, backups);
+            backups.setArchivedId(archived.getArchivedId());
+            return backups;
+        }).collect(Collectors.toList());
+        processMethodSearchNewBackupsService.saveBatch(methodSearchNewBackups);
+
+        return true;
+    }
+
+    /**
+     * 鏌ヨ瀛樻。
+     * @param page
+     * @param archived
+     * @return
+     */
+    @Override
+    public IPage<ProcessMethodSearchNewArchivedDto> pageSearchNewArchived(Page page, ProcessMethodSearchNewArchivedDto archived) {
+        return processMethodSearchNewArchivedMapper.pageSearchNewArchived(page, QueryWrappers.queryWrappers(archived));
+    }
+
+    /**
+     * 鏌ヨ瀛樻。澶囦唤鍒楄〃
+     * @param page
+     * @param backups
+     * @return
+     */
+    @Override
+    public IPage<ProcessMethodSearchNewBackups> pageSearchNewBackups(Page page, ProcessMethodSearchNewBackups backups) {
+        if (backups.getArchivedId() == null) {
+            throw new ErrorException("缂哄皯瀛樻。id");
+        }
+        return processMethodSearchNewBackupsMapper.pageSearchNewBackups(page, QueryWrappers.queryWrappers(backups));
+    }
+
+    /**
+     * 瀛樻。鎵瑰噯
+     * @param archived
+     * @return
+     */
+    @Override
+    public boolean ratifySearchNewArchivedr(ProcessMethodSearchNewArchived archived) {
+        // 褰撳墠鐧诲綍鐢ㄦ埛
+        Integer userId = SecurityUtils.getUserId().intValue();
+        processMethodSearchNewArchivedMapper.update(null, Wrappers.<ProcessMethodSearchNewArchived>lambdaUpdate()
+                .eq(ProcessMethodSearchNewArchived::getArchivedId, archived.getArchivedId())
+                .set(ProcessMethodSearchNewArchived::getRatifyUserId, userId)
+                .set(ProcessMethodSearchNewArchived::getRatifyRemark, archived.getRatifyRemark())
+                .set(ProcessMethodSearchNewArchived::getRatifyStatus, archived.getRatifyStatus())
+                .set(ProcessMethodSearchNewArchived::getRatifyTime, LocalDateTime.now())
+        );
+        return true;
+    }
+}
+
diff --git a/cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessMethodVerifyMachineAttachmentServiceImpl.java b/cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessMethodVerifyMachineAttachmentServiceImpl.java
new file mode 100644
index 0000000..67ff06c
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessMethodVerifyMachineAttachmentServiceImpl.java
@@ -0,0 +1,19 @@
+package com.ruoyi.process.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.process.mapper.ProcessMethodVerifyMachineAttachmentMapper;
+import com.ruoyi.process.pojo.ProcessMethodVerifyMachineAttachment;
+import com.ruoyi.process.service.ProcessMethodVerifyMachineAttachmentService;
+import org.springframework.stereotype.Service;
+
+/**
+ * 鏍囧噯鏂规硶楠岃瘉璁惧闄勪欢琛�
+ *
+ * @author zhuo
+ * @since 2024-11-05
+ */
+@Service
+public class ProcessMethodVerifyMachineAttachmentServiceImpl extends ServiceImpl<ProcessMethodVerifyMachineAttachmentMapper, ProcessMethodVerifyMachineAttachment> implements ProcessMethodVerifyMachineAttachmentService {
+
+}
+
diff --git a/cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessMethodVerifyMethodFileServiceImpl.java b/cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessMethodVerifyMethodFileServiceImpl.java
new file mode 100644
index 0000000..9a68506
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessMethodVerifyMethodFileServiceImpl.java
@@ -0,0 +1,19 @@
+package com.ruoyi.process.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.process.mapper.ProcessMethodVerifyMethodFileMapper;
+import com.ruoyi.process.pojo.ProcessMethodVerifyMethodFile;
+import com.ruoyi.process.service.ProcessMethodVerifyMethodFileService;
+import org.springframework.stereotype.Service;
+
+/**
+ * 鏍囧噯鏂规硶楠岃瘉(娉�)闄勪欢琛�
+ *
+ * @author makejava
+ * @since 2024-11-05
+ */
+@Service
+public class ProcessMethodVerifyMethodFileServiceImpl extends ServiceImpl<ProcessMethodVerifyMethodFileMapper, ProcessMethodVerifyMethodFile> implements ProcessMethodVerifyMethodFileService {
+
+}
+
diff --git a/cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessMethodVerifyServiceImpl.java b/cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessMethodVerifyServiceImpl.java
new file mode 100644
index 0000000..b0438c0
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessMethodVerifyServiceImpl.java
@@ -0,0 +1,455 @@
+package com.ruoyi.process.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.StrUtil;
+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.deepoove.poi.data.PictureRenderData;
+import com.ruoyi.common.core.domain.entity.User;
+import com.ruoyi.common.utils.QueryWrappers;
+import com.ruoyi.device.mapper.DeviceMapper;
+import com.ruoyi.framework.exception.ErrorException;
+import com.ruoyi.inspect.util.HackLoopTableRenderPolicy;
+import com.ruoyi.inspect.util.UserUtils;
+import com.ruoyi.process.dto.ProcessMethodVerifyDto;
+import com.ruoyi.process.dto.ProcessMethodVerifyExportWordDto;
+import com.ruoyi.process.mapper.ProcessMethodVerifyCalibrationsFileMapper;
+import com.ruoyi.process.mapper.ProcessMethodVerifyMapper;
+import com.ruoyi.process.mapper.ProcessMethodVerifyWorkFileMapper;
+import com.ruoyi.process.pojo.*;
+import com.ruoyi.process.service.*;
+import com.ruoyi.system.mapper.UserMapper;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.multipart.MultipartFile;
+
+import jakarta.annotation.Resource;
+import jakarta.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.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * 鏍囧噯鏂规硶楠岃瘉
+ *
+ * @author zhuo
+ * @since 2024-11-05
+ */
+@Service
+@Transactional(rollbackFor = Exception.class)
+public class ProcessMethodVerifyServiceImpl extends ServiceImpl<ProcessMethodVerifyMapper, ProcessMethodVerify> implements ProcessMethodVerifyService {
+
+    @Resource
+    private ProcessMethodVerifyCalibrationsFileService processMethodVerifyCalibrationsFileService;
+    @Resource
+    private ProcessMethodVerifyMethodFileService processMethodVerifyMethodFileService;
+    @Resource
+    private ProcessMethodVerifyWorkFileService processMethodVerifyWorkFileService;
+    @Resource
+    private ProcessMethodVerifyMachineAttachmentService processMethodVerifyMachineAttachmentService;
+    @Resource
+    private ProcessMethodVerifyCalibrationsFileMapper processMethodVerifyCalibrationsFileMapper;
+    @Resource
+    private ProcessMethodVerifyWorkFileMapper processMethodVerifyWorkFileMapper;
+    @Resource
+    private DeviceMapper deviceMapper;
+
+    @Resource
+    private UserMapper userMapper;
+
+    @Value("${file.path}")
+    private String imgUrl;
+
+    @Value("${wordUrl}")
+    private String wordUrl;
+
+
+    /**
+     * 鏍囧噯鏂规硶璺熸柊楠岃瘉淇敼
+     *
+     * @param page
+     * @param methodVerifyDto
+     * @return
+     */
+    @Override
+    public IPage<ProcessMethodVerify> pagesMethodVerify(Page page, ProcessMethodVerifyDto methodVerifyDto) {
+        if (methodVerifyDto.getOperationType() == null) {
+            throw new ErrorException("璇烽�夋嫨鏄彉鏇磋繕鏄獙璇�");
+        }
+        return baseMapper.pagesMethodVerify(page, QueryWrappers.queryWrappers(methodVerifyDto));
+    }
+
+    /**
+     * 鏂板鏍囧噯鏂规硶楠岃瘉
+     *
+     * @param methodVerifyDto
+     * @return
+     */
+    @Override
+    public boolean addMethodSearchNew(ProcessMethodVerifyDto methodVerifyDto) {
+        if (methodVerifyDto.getOperationType() == null) {
+            throw new ErrorException("璇烽�夋嫨鏄彉鏇磋繕鏄獙璇�");
+        }
+        // 鏂板
+        baseMapper.insert(methodVerifyDto);
+
+        // 鍒ゆ柇纭浜烘槸鍚︿负绌�
+        if (StringUtils.isNotBlank(methodVerifyDto.getConfirmUser())) {
+            // 娣诲姞涓婂矖璇�
+            this.addWorkFile(methodVerifyDto);
+        }
+
+        // 鏂板璁惧淇℃伅
+        if (CollectionUtils.isNotEmpty(methodVerifyDto.getMachineAttachmentList())) {
+            this.addDevice(methodVerifyDto);
+        }
+
+        return true;
+    }
+
+    /**
+     * 鏌ヨ鏍囧噯鏂规硶楠岃瘉璇︽儏
+     *
+     * @param methodVerifyId
+     * @return
+     */
+    @Override
+    public ProcessMethodVerifyDto getMethodVerifyOne(Integer methodVerifyId) {
+        ProcessMethodVerify processMethodVerify = baseMapper.selectById(methodVerifyId);
+        ProcessMethodVerifyDto processMethodVerifyDto = new ProcessMethodVerifyDto();
+        BeanUtil.copyProperties(processMethodVerify, processMethodVerifyDto);
+
+        // 鏌ヨ璁惧璇︽儏
+        processMethodVerifyDto.setMachineAttachmentList(processMethodVerifyMachineAttachmentService.list(Wrappers.<ProcessMethodVerifyMachineAttachment>lambdaQuery()
+                .eq(ProcessMethodVerifyMachineAttachment::getMethodVerifyId, methodVerifyId)));
+        // 鏌ヨ鍘熷璁板綍
+        processMethodVerifyDto.setMethodFileList(processMethodVerifyMethodFileService.list(Wrappers.<ProcessMethodVerifyMethodFile>lambdaQuery()
+                .eq(ProcessMethodVerifyMethodFile::getMethodVerifyId, methodVerifyId)));
+        // 鏌ヨ涓婂矖璇�
+        processMethodVerifyDto.setWorkFileList(processMethodVerifyWorkFileService.list(Wrappers.<ProcessMethodVerifyWorkFile>lambdaQuery()
+                .eq(ProcessMethodVerifyWorkFile::getMethodVerifyId, methodVerifyId)));
+        // 鏌ヨ鏍″噯璇佷功
+        processMethodVerifyDto.setCalibrationsFileList(processMethodVerifyCalibrationsFileMapper.selectCalibrationsFileList(methodVerifyId));
+
+
+        return processMethodVerifyDto;
+    }
+
+    /**
+     * 淇敼鏍囧噯鏂规硶楠岃瘉
+     *
+     * @param methodVerifyDto
+     * @return
+     */
+    @Override
+    public boolean updateMethodVerify(ProcessMethodVerifyDto methodVerifyDto) {
+        baseMapper.updateById(methodVerifyDto);
+
+        // 鍒犻櫎涓婂矖璇�
+        processMethodVerifyWorkFileService.remove(Wrappers.<ProcessMethodVerifyWorkFile>lambdaQuery()
+                .eq(ProcessMethodVerifyWorkFile::getMethodVerifyId, methodVerifyDto.getMethodVerifyId()));
+
+        // 鍒犻櫎鍘熸湰璁惧璇︽儏
+        processMethodVerifyMachineAttachmentService.remove(Wrappers.<ProcessMethodVerifyMachineAttachment>lambdaQuery()
+                .eq(ProcessMethodVerifyMachineAttachment::getMethodVerifyId, methodVerifyDto.getMethodVerifyId()));
+
+        // 鍒犻櫎鍏冩牎鍑嗚瘉涔�
+        processMethodVerifyCalibrationsFileService.remove(Wrappers.<ProcessMethodVerifyCalibrationsFile>lambdaQuery()
+                .eq(ProcessMethodVerifyCalibrationsFile::getMethodVerifyId, methodVerifyDto.getMethodVerifyId()));
+
+        // 鍒ゆ柇纭浜烘槸鍚︿负绌�
+        if (StringUtils.isNotBlank(methodVerifyDto.getConfirmUser())) {
+            // 娣诲姞涓婂矖璇�
+            this.addWorkFile(methodVerifyDto);
+        }
+
+        // 鏂板璁惧淇℃伅
+        if (CollectionUtils.isNotEmpty(methodVerifyDto.getMachineAttachmentList())) {
+            this.addDevice(methodVerifyDto);
+        }
+        return true;
+    }
+
+    /**
+     * 鍒犻櫎鏍囧噯鏂规硶楠岃瘉
+     *
+     * @param methodVerifyId
+     * @return
+     */
+    @Override
+    public boolean delMethodVerify(Integer methodVerifyId) {
+        // 鍒犻櫎鎵�鏈夎澶�
+        processMethodVerifyMachineAttachmentService.remove(Wrappers.<ProcessMethodVerifyMachineAttachment>lambdaQuery()
+                .eq(ProcessMethodVerifyMachineAttachment::getMethodVerifyId, methodVerifyId));
+
+        // 鍒犻櫎鎵�鏈夊師濮嬭褰�
+        processMethodVerifyMethodFileService.remove(Wrappers.<ProcessMethodVerifyMethodFile>lambdaQuery()
+                .eq(ProcessMethodVerifyMethodFile::getMethodVerifyId, methodVerifyId));
+
+
+        baseMapper.deleteById(methodVerifyId);
+
+        return true;
+    }
+
+    /**
+     * 鏂规硶楠岃瘉纭
+     *
+     * @param methodVerifyId
+     * @return
+     */
+    @Override
+    public boolean methodVerifyAffirm(Integer methodVerifyId) {
+        baseMapper.update(null, Wrappers.<ProcessMethodVerify>lambdaUpdate()
+                .set(ProcessMethodVerify::getConfirmDate, LocalDateTime.now())
+                .eq(ProcessMethodVerify::getMethodVerifyId, methodVerifyId));
+        return true;
+    }
+
+    /**
+     * 鏂规硶楠岃瘉鏂板鍘熷璁板綍
+     *
+     * @param methodVerifyId
+     * @param file
+     * @return
+     */
+    @Override
+    public boolean uploadVerifyMethodFile(Integer methodVerifyId, MultipartFile file) {
+        if (methodVerifyId == null) {
+            throw new ErrorException("缂哄皯鍘熷璁板綍id");
+        }
+
+        String urlString;
+        String pathName;
+        String path;
+        String filename = file.getOriginalFilename();
+        String contentType = file.getContentType();
+        ProcessMethodVerifyMethodFile methodFile = new ProcessMethodVerifyMethodFile();
+        methodFile.setMethodVerifyId(methodVerifyId);
+        methodFile.setFileName(filename);
+        if (contentType != null && contentType.startsWith("image/")) {
+            // 鏄浘鐗�
+            path = imgUrl;
+            methodFile.setType(1);
+        } else {
+            // 鏄枃浠�
+            path = wordUrl;
+            methodFile.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));
+            methodFile.setFileUrl(pathName);
+            return processMethodVerifyMethodFileService.save(methodFile);
+        } catch (Exception e) {
+            e.printStackTrace();
+            System.err.println("闄勪欢涓婁紶閿欒");
+            return false;
+        }
+    }
+
+    /**
+     * 鏍囧噯鏂规硶楠岃瘉鍘熷璁板綍鍒楄〃
+     *
+     * @param methodVerifyId
+     * @return
+     */
+    @Override
+    public List<ProcessMethodVerifyMethodFile> getVerifyMethodFileList(Integer methodVerifyId) {
+        return processMethodVerifyMethodFileService.list(Wrappers.<ProcessMethodVerifyMethodFile>lambdaQuery()
+                .eq(ProcessMethodVerifyMethodFile::getMethodVerifyId, methodVerifyId));
+    }
+
+    /**
+     * 瀵煎嚭鏍囧噯鏂规硶鏇存柊楠岃瘉
+     *
+     * @param methodVerifyId 鏍囧噯鏂规硶楠岃瘉id
+     * @param response
+     */
+    @Override
+    public void exportMethodVerify(Integer methodVerifyId, HttpServletResponse response) {
+        // 鑾峰彇鏍囧噯鏂规硶鏇存柊楠岃瘉鏁版嵁
+        ProcessMethodVerify processMethodVerify = baseMapper.selectById(methodVerifyId);
+
+        // 灏嗗唴閮ㄥ瓧娈佃浆鎹㈡垚灞曠ず鍒皐ord涓殑瀵硅薄
+        ProcessMethodVerifyExportWordDto exportWordTemplate = getExportWordTemplate(processMethodVerify);
+
+        // 瀹氫箟涓�涓泦鍚堝瓨鏀句汉鍛樼鍚�
+        ArrayList<PictureRenderData> pictureRenderDataList = new ArrayList<>();
+        // TODO:纭鏈�澶氫細鏈�5涓汉
+        String confirmUser = processMethodVerify.getConfirmUser();
+        if (StringUtils.isNotBlank(confirmUser)) {
+            // 瀵逛汉鍛榠d瀛楃涓茶繘琛屽垎鍓叉垚鏁扮粍
+            String[] userIds = confirmUser.split(",");
+            // 寰幆鑾峰彇浜哄憳绛惧悕
+            for (String userIdStr : userIds) {
+                // 杞崲涓篿nt绫诲瀷
+                Integer userId = Integer.valueOf(userIdStr);
+                // 鑾峰彇浜哄憳绛惧悕瀵硅薄
+                PictureRenderData finalUserSignatureUrl = UserUtils.getFinalUserSignatureUrl(userId);
+                // 灏嗕汉鍛樼鍚嶅璞℃坊鍔犲埌闆嗗悎涓�
+                pictureRenderDataList.add(finalUserSignatureUrl);
+            }
+        }
+
+        // 鍒ゆ柇闆嗗悎闀垮害锛屽苟琛ull鍒�5涓�
+        while (pictureRenderDataList.size() < 5) {
+            pictureRenderDataList.add(null);
+        }
+
+        // 鑾峰彇璁惧淇℃伅
+        List<ProcessMethodVerifyMachineAttachment> processMethodVerifyMachineAttachmentList = processMethodVerifyMachineAttachmentService.list(Wrappers.<ProcessMethodVerifyMachineAttachment>lambdaQuery()
+                .eq(ProcessMethodVerifyMachineAttachment::getMethodVerifyId, methodVerifyId));
+
+        // 鑾峰彇璺緞
+        InputStream inputStream = this.getClass().getResourceAsStream("/static/method-verify.docx");
+        Configure configure = Configure.builder()
+                .bind("processMethodVerifyMachineAttachmentList", new HackLoopTableRenderPolicy())
+                .build();
+        XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
+                new HashMap<String, Object>() {{
+                    put("processMethodVerify", exportWordTemplate);
+                    put("processMethodVerifyMachineAttachmentList", processMethodVerifyMachineAttachmentList);
+                    put("affirmUserUrl1", pictureRenderDataList.get(0));
+                    put("affirmUserUrl2", pictureRenderDataList.get(1));
+                    put("affirmUserUrl3", pictureRenderDataList.get(2));
+                    put("affirmUserUrl4", pictureRenderDataList.get(3));
+                    put("affirmUserUrl5", pictureRenderDataList.get(4));
+                }});
+
+        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();
+            inputStream.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException("瀵煎嚭澶辫触");
+        }
+    }
+
+    private ProcessMethodVerifyExportWordDto getExportWordTemplate(ProcessMethodVerify processMethodVerify) {
+        ProcessMethodVerifyExportWordDto processMethodVerifyExportWordDto = new ProcessMethodVerifyExportWordDto();
+        BeanUtil.copyProperties(processMethodVerify, processMethodVerifyExportWordDto);
+        // 锛堜汉锛夋槸鍚︽弧瓒�
+        if (processMethodVerify.getPersonIsSatisfied() != null) {
+            processMethodVerifyExportWordDto.setPersonIsSatisfiedStr(processMethodVerify.getPersonIsSatisfied() == 1 ? "鈭�" : "脳");
+        }
+        // 锛堟満锛夋槸鍚︽弧瓒�
+        if (processMethodVerify.getMachineIsSatisfied() != null) {
+            processMethodVerifyExportWordDto.setMachineIsSatisfiedStr(processMethodVerify.getMachineIsSatisfied() == 1 ? "鈭�" : "脳");
+        }
+        // 锛堟枡锛夋槸鍚︽弧瓒�
+        if (processMethodVerify.getMaterialIsSatisfied() != null) {
+            processMethodVerifyExportWordDto.setMaterialIsSatisfiedStr(processMethodVerify.getMaterialIsSatisfied() == 1 ? "鈭�" : "脳");
+        }
+        // 锛堟硶锛夋槸鍚︽弧瓒�
+        if (processMethodVerify.getMethodIsSatisfied() != null) {
+            processMethodVerifyExportWordDto.setMethodIsSatisfiedStr(processMethodVerify.getMethodIsSatisfied() == 1? "鈭�" : "脳");
+        }
+        // 锛堢幆锛夋槸鍚︽弧瓒�
+        if (processMethodVerify.getEnvironmentIsSatisfied() != null) {
+            processMethodVerifyExportWordDto.setEnvironmentIsSatisfiedStr(processMethodVerify.getEnvironmentIsSatisfied() == 1 ? "鈭�" : "脳");
+        }
+        // 锛堟祴閲忔函婧愭�э級鏄惁婊¤冻
+        if (processMethodVerify.getTraceabilityIsSatisfied() != null) {
+            processMethodVerifyExportWordDto.setTraceabilityIsSatisfiedStr(processMethodVerify.getTraceabilityIsSatisfied() == 1 ? "鈭�" : "脳");
+        }
+        // 锛堟牱鍝佺鐞嗛渶姹傦級鏄惁婊¤冻
+        if (processMethodVerify.getManagementIsSatisfied() != null) {
+            processMethodVerifyExportWordDto.setManagementIsSatisfiedStr(processMethodVerify.getManagementIsSatisfied() == 1 ? "鈭�" : "脳");
+        }
+        // 锛堝叾浠栵級鏄惁婊¤冻
+        if (processMethodVerify.getOtherIsSatisfied() != null) {
+            processMethodVerifyExportWordDto.setOtherIsSatisfiedStr(processMethodVerify.getOtherIsSatisfied() == 1 ? "鈭�" : "脳");
+        }
+        // 纭鏃ユ湡
+        processMethodVerifyExportWordDto.setConfirmDateStr(processMethodVerify.getConfirmDate() != null ? processMethodVerify.getConfirmDate().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")): null);
+        return processMethodVerifyExportWordDto;
+    }
+
+
+    /**
+     * 娣诲姞涓婂矖璇�
+     *
+     * @param methodVerifyDto
+     */
+    private void addWorkFile(ProcessMethodVerifyDto methodVerifyDto) {
+        List<String> confirmUserIds = StrUtil.split(methodVerifyDto.getConfirmUser(), ",");
+        List<ProcessMethodVerifyWorkFile> workFileList = new ArrayList<>();
+        for (String confirmUserId : confirmUserIds) {
+            Integer userId = Integer.valueOf(confirmUserId);
+            String workName = processMethodVerifyWorkFileMapper.selectWorkFile(userId);
+            // 鍒ゆ柇鏄惁鏈夎瘉涔�
+            if (StringUtils.isNotBlank(workName)) {
+                User user = userMapper.selectById(userId);
+                ProcessMethodVerifyWorkFile workFile = new ProcessMethodVerifyWorkFile();
+                workFile.setMethodVerifyId(methodVerifyDto.getMethodVerifyId());
+                workFile.setType(1);
+                workFile.setFileUrl(workName);
+                workFile.setFileName(workName);
+                workFile.setUserId(user.getId());
+                workFile.setUserName(user.getName());
+                workFileList.add(workFile);
+            }
+        }
+        if (CollectionUtils.isNotEmpty(workFileList)) {
+            processMethodVerifyWorkFileService.saveBatch(workFileList);
+        }
+    }
+
+    /**
+     * 娣诲姞璁惧淇℃伅
+     *
+     * @param methodVerifyDto
+     */
+    private void addDevice(ProcessMethodVerifyDto methodVerifyDto) {
+        List<ProcessMethodVerifyCalibrationsFile> calibrationsFiles = new ArrayList<>();
+        for (ProcessMethodVerifyMachineAttachment machineAttachment : methodVerifyDto.getMachineAttachmentList()) {
+            machineAttachment.setMethodVerifyId(methodVerifyDto.getMethodVerifyId());
+            // 鏌ヨ鏍″噯璇佷功
+            String calibrationsName = processMethodVerifyCalibrationsFileMapper.selectCalibrationsFile(machineAttachment.getDeviceId());
+            // 鍒ゆ柇鏄惁鏈夎瘉涔�
+            if (StringUtils.isNotBlank(calibrationsName)) {
+                ProcessMethodVerifyCalibrationsFile calibrationsFile = new ProcessMethodVerifyCalibrationsFile();
+                calibrationsFile.setMethodVerifyId(methodVerifyDto.getMethodVerifyId());
+                calibrationsFile.setType(1);
+                calibrationsFile.setFileUrl(calibrationsName);
+                calibrationsFile.setFileName(calibrationsName);
+                calibrationsFile.setDeviceId((machineAttachment.getDeviceId()));
+                calibrationsFiles.add(calibrationsFile);
+            }
+        }
+        // 娣诲姞鏍″噯璇佷功
+        processMethodVerifyCalibrationsFileService.saveBatch(calibrationsFiles);
+
+        // 娣诲姞璁惧
+        processMethodVerifyMachineAttachmentService.saveBatch(methodVerifyDto.getMachineAttachmentList());
+    }
+
+}
+
diff --git a/cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessOrderDeviceServiceImpl.java b/cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessOrderDeviceServiceImpl.java
new file mode 100644
index 0000000..c92c389
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessOrderDeviceServiceImpl.java
@@ -0,0 +1,26 @@
+package com.ruoyi.process.service.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.process.pojo.ProcessOrderDevice;
+import com.ruoyi.process.mapper.ProcessOrderDeviceMapper;
+import com.ruoyi.process.service.ProcessOrderDeviceService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * cnas璁惧浣跨敤璁板綍琛�(7.1妫�楠屽鎵樺崟) 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author
+ * @since 2025-04-17 03:51:48
+ */
+@Service
+public class ProcessOrderDeviceServiceImpl extends ServiceImpl<ProcessOrderDeviceMapper, ProcessOrderDevice> implements ProcessOrderDeviceService {
+
+    @Override
+    public IPage<ProcessOrderDevice> deviceRecordPage(Integer deviceId, Page page, String sampleCode, String managementNumber) {
+        return baseMapper.deviceRecordPage(deviceId, page, sampleCode, managementNumber);
+    }
+}
diff --git a/cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessReportServiceImpl.java b/cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessReportServiceImpl.java
new file mode 100644
index 0000000..e863d8f
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessReportServiceImpl.java
@@ -0,0 +1,109 @@
+package com.ruoyi.process.service.impl;
+
+import cn.hutool.core.lang.UUID;
+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.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.config.ConfigureBuilder;
+import com.deepoove.poi.data.*;
+import com.deepoove.poi.data.style.*;
+import com.ruoyi.common.core.domain.entity.User;
+import com.ruoyi.common.utils.QueryWrappers;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.common.utils.SignatureImageUtil;
+import com.ruoyi.framework.exception.ErrorException;
+import com.ruoyi.inspect.util.HackLoopTableRenderPolicy;
+import com.ruoyi.process.dto.ProcessReportDto;
+import com.ruoyi.process.mapper.ProcessReportMapper;
+import com.ruoyi.process.pojo.ProcessReport;
+import com.ruoyi.process.service.ProcessReportService;
+import com.ruoyi.system.mapper.UserMapper;
+import org.apache.commons.io.IOUtils;
+import org.apache.poi.xwpf.usermodel.*;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletResponse;
+import java.io.*;
+import java.net.URLEncoder;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ * 妫�楠屾姤鍛婂彂鏀剧櫥璁拌〃 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-05 08:58:39
+ */
+@Service
+@Transactional(rollbackFor = Exception.class)
+public class ProcessReportServiceImpl extends ServiceImpl<ProcessReportMapper, ProcessReport> implements ProcessReportService {
+
+    @Resource
+    private ProcessReportMapper processReportMapper;
+    @Value("${file.path}")
+    private String imgUrl;
+
+    @Resource
+    private UserMapper userMapper;
+
+    @Override
+    public IPage<ProcessReportDto> pageProcessReport(Page page, ProcessReportDto processReport) {
+        IPage<ProcessReportDto> processReportIPage = processReportMapper.pageProcessReport(page, QueryWrappers.queryWrappers(processReport));
+
+        return processReportIPage;
+    }
+
+    @Override
+    public void exportProcessReport(ProcessReportDto dto, HttpServletResponse response) {
+        List<ProcessReportDto> processReports = processReportMapper.exportProcessReport();
+        for (ProcessReportDto processReport : processReports) {
+            // 鍙戦�佷汉鐢熸垚绛惧悕鍥剧墖
+            processReport.setSendUserRender(StringUtils.isNotBlank(processReport.getSendUserUrl())
+                    ? Pictures.ofLocal(imgUrl + "/" + processReport.getSendUserUrl()).create() : null);
+
+            // 绛炬敹浜虹敓鎴愬浘鐗�
+            processReport.setSignatoryRender(StringUtils.isNotBlank(processReport.getSignatory())
+                    ? Pictures.ofStream(SignatureImageUtil.saveImageToFile(processReport.getSignatory())).create() : null);
+        }
+
+        // 鑾峰彇璺緞
+        InputStream inputStream = this.getClass().getResourceAsStream("/static/report-deal.docx");
+        Configure configure = Configure.builder()
+                .bind("reportList", new HackLoopTableRenderPolicy())
+                .build();
+        XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
+                new HashMap<String, Object>() {{
+                    put("reportList", processReports);
+                }});
+        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();
+            inputStream.close();
+            inputStream.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException("瀵煎嚭澶辫触");
+        }
+    }
+}
diff --git a/cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessSampleServiceImpl.java b/cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessSampleServiceImpl.java
new file mode 100644
index 0000000..be55184
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessSampleServiceImpl.java
@@ -0,0 +1,70 @@
+package com.ruoyi.process.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.deepoove.poi.data.FilePictureRenderData;
+import com.ruoyi.common.utils.QueryWrappers;
+import com.ruoyi.inspect.util.HackLoopTableRenderPolicy;
+import com.ruoyi.process.mapper.ProcessSampleMapper;
+import com.ruoyi.process.pojo.ProcessSample;
+import com.ruoyi.process.service.ProcessSampleService;
+import org.springframework.stereotype.Service;
+
+import jakarta.annotation.Resource;
+import jakarta.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-12 05:02:49
+ */
+@Service
+public class ProcessSampleServiceImpl extends ServiceImpl<ProcessSampleMapper, ProcessSample> implements ProcessSampleService {
+
+    @Resource
+    private ProcessSampleMapper processSampleMapper;
+
+    @Override
+    public IPage<ProcessSample> pageProcessSample(Page page, ProcessSample processSample) {
+        return processSampleMapper.pageProcessSample(page, QueryWrappers.queryWrappers(processSample));
+    }
+
+    @Override
+    public void exportProcessSample(ProcessSample processSample, HttpServletResponse response) {
+        List<ProcessSample> processSampleList = pageProcessSample(new Page(-1, -1), processSample).getRecords();
+        InputStream inputStream = this.getClass().getResourceAsStream("/static/sample-receive.docx");
+        Configure configure = Configure.builder()
+                .bind("sampleList", new HackLoopTableRenderPolicy())
+                .build();
+        XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
+                new HashMap<String, Object>() {{
+                    put("sampleList", processSampleList);
+                }});
+        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();
+            inputStream.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException("瀵煎嚭澶辫触");
+        }
+    }
+}
diff --git a/cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessTotaldealServiceImpl.java b/cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessTotaldealServiceImpl.java
new file mode 100644
index 0000000..edd9efa
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessTotaldealServiceImpl.java
@@ -0,0 +1,274 @@
+package com.ruoyi.process.service.impl;
+
+import cn.hutool.core.lang.UUID;
+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.deepoove.poi.XWPFTemplate;
+import com.deepoove.poi.config.Configure;
+import com.deepoove.poi.config.ConfigureBuilder;
+import com.deepoove.poi.data.*;
+import com.deepoove.poi.data.style.*;
+import com.ruoyi.common.core.domain.entity.User;
+import com.ruoyi.common.utils.QueryWrappers;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.framework.exception.ErrorException;
+import com.ruoyi.inspect.mapper.InsOrderMapper;
+import com.ruoyi.inspect.mapper.InsSampleMapper;
+import com.ruoyi.inspect.mapper.InsSampleReceiptMapper;
+import com.ruoyi.inspect.pojo.InsOrder;
+import com.ruoyi.inspect.pojo.InsSample;
+import com.ruoyi.inspect.pojo.InsSampleReceipt;
+import com.ruoyi.inspect.util.HackLoopTableRenderPolicy;
+import com.ruoyi.inspect.util.UserUtils;
+import org.apache.commons.lang3.StringUtils;
+import com.ruoyi.process.dto.ProcessDealDto;
+import com.ruoyi.process.mapper.ProcessDealMapper;
+import com.ruoyi.process.mapper.ProcessTotaldealMapper;
+import com.ruoyi.process.pojo.ProcessDeal;
+import com.ruoyi.process.pojo.ProcessTotaldeal;
+import com.ruoyi.process.service.ProcessDealService;
+import com.ruoyi.process.service.ProcessTotaldealService;
+import com.ruoyi.system.mapper.UserMapper;
+import org.apache.commons.io.IOUtils;
+import org.apache.poi.xwpf.usermodel.*;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.security.core.parameters.P;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletResponse;
+import java.io.*;
+import java.net.URLEncoder;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
+import java.time.YearMonth;
+import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ * 妫�娴嬫垨鏍″噯鐗╁搧鐨勫缃�昏〃(鍘嗗彶) 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-02 03:59:09
+ */
+@Service
+@Transactional(rollbackFor = Exception.class)
+public class ProcessTotaldealServiceImpl extends ServiceImpl<ProcessTotaldealMapper, ProcessTotaldeal> implements ProcessTotaldealService {
+
+    @Resource
+    private ProcessTotaldealMapper processTotaldealMapper;
+
+    @Resource
+    private ProcessDealService processDealService;
+
+   @Resource
+   private ProcessDealMapper processDealMapper;
+
+    @Value("${file.path}")
+    private String imgUrl;
+
+
+    @Resource
+    private UserMapper userMapper;
+
+    @Resource
+    private InsOrderMapper insOrderMapper;
+
+    @Resource
+    private InsSampleMapper insSampleMapper;
+
+    @Resource
+    private InsSampleReceiptMapper insSampleReceiptMapper;
+
+    @Override
+    public IPage<ProcessTotaldeal> pageProcessTotaldeal(Page page, ProcessTotaldeal processTotaldeal) {
+        return processTotaldealMapper.pageProcessTotaldeal(page, QueryWrappers.queryWrappers(processTotaldeal));
+
+    }
+
+    @Override
+    public int submitProcessTotaldeal(Integer id) {
+        Integer userId = SecurityUtils.getUserId().intValue();
+        User user = userMapper.selectById(userId);
+        if (ObjectUtils.isEmpty(user.getSignatureUrl())) {
+            throw new ErrorException("鏈壘鍒板~琛ㄤ汉鐨勭數瀛愮鍚�,璇蜂笂浼犺嚜宸辩殑鐢靛瓙绛惧悕!");
+        }
+        ProcessTotaldeal processTotaldeal = processTotaldealMapper.selectById(id);
+        processTotaldeal.setSubmitUser(userId);
+        processTotaldeal.setSubmitState("宸叉彁浜�");
+        return processTotaldealMapper.updateById(processTotaldeal);
+    }
+
+    @Override
+    public int checkProcessTotaldeal(Integer id, String state) {
+        Integer userId = SecurityUtils.getUserId().intValue();
+        User user = userMapper.selectById(userId);
+        if (ObjectUtils.isEmpty(user.getSignatureUrl())) {
+            throw new ErrorException("鏈壘鍒板鏍镐汉鐨勭數瀛愮鍚�,璇蜂笂浼犺嚜宸辩殑鐢靛瓙绛惧悕!");
+        }
+        ProcessTotaldeal processTotaldeal = processTotaldealMapper.selectById(id);
+        processTotaldeal.setExamineUser(userId);
+        processTotaldeal.setExamineState(state);
+        if (state.equals("涓嶉�氳繃")) {
+            processTotaldeal.setSubmitState("寰呮彁浜�");
+        }
+        return processTotaldealMapper.updateById(processTotaldeal);
+    }
+
+    @Override
+    public int ratifyProcessTotaldeal(Integer id, String state) {
+        Integer userId = SecurityUtils.getUserId().intValue();
+        User user = userMapper.selectById(userId);
+        if (ObjectUtils.isEmpty(user.getSignatureUrl())) {
+            throw new ErrorException("鏈壘鍒版壒鍑嗕汉鐨勭數瀛愮鍚�,璇蜂笂浼犺嚜宸辩殑鐢靛瓙绛惧悕!");
+        }
+        ProcessTotaldeal processTotaldeal = processTotaldealMapper.selectById(id);
+        processTotaldeal.setRatifyUser(userId);
+        processTotaldeal.setRatifyState(state);
+        if (state.equals("涓嶉�氳繃")) {
+            processTotaldeal.setExamineState(state);
+            processTotaldeal.setSubmitState("寰呮彁浜�");
+        }
+        return processTotaldealMapper.updateById(processTotaldeal);
+    }
+
+    @Override
+    public int addProcessTotaldeal(String month) {
+        //鏂板鎬昏〃锛堝悓涓�鏈堜唤澶嶇敤宸叉湁鎬昏〃锛�
+        ProcessTotaldeal processTotaldeal;
+        List<ProcessTotaldeal> processTotaldeals = processTotaldealMapper.selectList(Wrappers.<ProcessTotaldeal>lambdaQuery()
+                .eq(ProcessTotaldeal::getMonth, month));
+        if (processTotaldeals.size() <= 0) {
+            processTotaldeal = new ProcessTotaldeal();
+            processTotaldeal.setMonth(month);//鏈堜唤
+            processTotaldeal.setSubmitState("寰呮彁浜�");
+            processTotaldealMapper.insert(processTotaldeal);
+        } else {
+            processTotaldeal = processTotaldeals.get(0);
+        }
+        //1.鑾峰彇璇ユ湀浠界殑绗竴澶╁拰鏈�鍚庝竴澶�
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM");
+        YearMonth yearMonth = YearMonth.parse(month, formatter);
+        LocalDateTime startTime = yearMonth.atDay(1).atStartOfDay();
+        LocalDateTime endTime = yearMonth.atEndOfMonth().atTime(LocalTime.MAX);
+        //2.璇ユ湀涓嬪崟鐨勫鎵樺崟锛堟帓闄ゅ師鏉愭枡锛宼ypeSource 涓虹┖瑙嗕负鎴愬搧锛�
+        List<InsOrder> orders = insOrderMapper.selectList(Wrappers.<InsOrder>lambdaQuery()
+                .ge(InsOrder::getCreateTime, startTime)
+                .le(InsOrder::getCreateTime, endTime));
+        if (orders.isEmpty()) {
+            return 0;
+        }
+        //3.鍙繚鐣欏凡鐢熸垚鏍峰搧鎺ユ敹璁板綍鐨勫鎵橈紙宸插鏍稿彈鐞嗭級
+        List<Integer> orderIds = orders.stream().map(InsOrder::getId).collect(Collectors.toList());
+        List<InsSampleReceipt> receipts = insSampleReceiptMapper.selectList(Wrappers.<InsSampleReceipt>lambdaQuery()
+                .in(InsSampleReceipt::getInsOrderId, orderIds));
+        Set<Integer> receiptOrderIds = receipts.stream().map(InsSampleReceipt::getInsOrderId).collect(Collectors.toSet());
+        Map<Integer, InsOrder> orderMap = orders.stream()
+                .filter(order -> !Integer.valueOf(1).equals(order.getTypeSource()))
+                .filter(order -> receiptOrderIds.contains(order.getId()))
+                .collect(Collectors.toMap(InsOrder::getId, order -> order, (a, b) -> a));
+        if (orderMap.isEmpty()) {
+            return 0;
+        }
+        //4.濮旀墭瀵瑰簲鐨勬牱鍝�
+        List<InsSample> samples = insSampleMapper.selectList(Wrappers.<InsSample>lambdaQuery()
+                .in(InsSample::getInsOrderId, orderMap.keySet()));
+        if (samples.isEmpty()) {
+            return 0;
+        }
+        //5.宸茶繘鍏ヤ换浣曞缃壒娆$殑鏍峰搧璺宠繃锛堣法鏈堜篃涓嶄細閲嶅甯﹀叆锛�
+        List<Integer> sampleIds = samples.stream().map(InsSample::getId).collect(Collectors.toList());
+        Set<Integer> dealtSampleIds = processDealService.list(Wrappers.<ProcessDeal>lambdaQuery()
+                .select(ProcessDeal::getInsSampleId)
+                .in(ProcessDeal::getInsSampleId, sampleIds))
+                .stream().map(ProcessDeal::getInsSampleId).filter(Objects::nonNull).collect(Collectors.toSet());
+        List<ProcessDeal> processDeals = new ArrayList<>();
+        for (InsSample insSample : samples) {
+            if (dealtSampleIds.contains(insSample.getId())) {
+                continue;
+            }
+            InsOrder order = orderMap.get(insSample.getInsOrderId());
+            ProcessDeal processDeal = new ProcessDeal();
+            //鏍峰搧鍚嶇О浼樺厛鍙栨姤鍛婂睍绀哄瓧娈�
+            processDeal.setSampleName(order != null && StringUtils.isNotBlank(order.getSampleView())
+                    ? order.getSampleView() : insSample.getSample());
+            processDeal.setSampleCode(insSample.getSampleCode());//鏍峰搧缂栧彿
+            processDeal.setSampleSupplier(order == null ? null : order.getCompany());//渚涙牱鍗曚綅=濮旀墭鍗曚綅
+            processDeal.setNum(insSample.getQuantity() == null ? 1 : insSample.getQuantity());//鏍峰搧鏁伴噺
+            processDeal.setDealMethod(resolveDealMethod(order));//澶勭悊鏂瑰紡=涓嬪崟鏃堕�夋嫨鐨勬牱鍝佸缃�
+            processDeal.setDealTime(LocalDate.now());//鏃堕棿=褰撳墠鏃堕棿
+            processDeal.setTotaldealId(processTotaldeal.getId());//鎬昏〃id
+            processDeal.setInsSampleId(insSample.getId());//妫�楠屾牱鍝乮d
+            processDeals.add(processDeal);
+        }
+        if (!processDeals.isEmpty()) {
+            processDealService.saveBatch(processDeals);
+        }
+        return processDeals.size();
+    }
+
+    /**
+     * 澶勭悊鏂瑰紡锛氫笅鍗曟椂鐨勬牱鍝佸缃� 1濮旀墭鏂瑰彇鍥� 2妫�娴嬫柟澶勭疆锛涘巻鍙插崟鏃犺瀛楁鏃跺洖閫�鏃х殑澶勭悊鏂瑰紡瀛楁
+     */
+    private String resolveDealMethod(InsOrder order) {
+        if (order == null) {
+            return StringUtils.EMPTY;
+        }
+        if (Integer.valueOf(1).equals(order.getSampleDisposal())) {
+            return "濮旀墭鍗曚綅鍙栧洖";
+        }
+        if (Integer.valueOf(2).equals(order.getSampleDisposal())) {
+            return "瀹為獙瀹ゅ鐞�";
+        }
+        return Integer.valueOf(1).equals(order.getProcessing()) ? "瀹為獙瀹ゅ鐞�" : "濮旀墭鍗曚綅鍙栧洖";
+    }
+
+    @Override
+    public void exportProcessTotaldeal(Integer id, HttpServletResponse response) {
+        List<ProcessDealDto> sampleDealDtos = processDealMapper.selectDeal(id);
+        ProcessTotaldeal processTotaldeal = processTotaldealMapper.selectById(id);
+
+        // 鑾峰彇璺緞
+        InputStream inputStream = this.getClass().getResourceAsStream("/static/sample-deal.docx");
+        Configure configure = Configure.builder()
+                .bind("sampleList", new HackLoopTableRenderPolicy())
+                .build();
+        XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
+                new HashMap<String, Object>() {{
+                    put("sampleList", sampleDealDtos);
+                    put("writeUrl",UserUtils.getFinalUserSignatureUrl(processTotaldeal.getSubmitUser()));//鎻愪氦浜�
+                    put("examineUrl", UserUtils.getFinalUserSignatureUrl(processTotaldeal.getExamineUser()));//瀹℃牳浜�
+                    put("ratifyUrl", UserUtils.getFinalUserSignatureUrl(processTotaldeal.getRatifyUser()));//鎵瑰噯浜�
+                }});
+        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();
+            inputStream.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException("瀵煎嚭澶辫触");
+        }
+    }
+}
diff --git a/cnas-process/src/main/java/com/ruoyi/process/service/impl/QualityMonitorDetailsEvaluateServiceImpl.java b/cnas-process/src/main/java/com/ruoyi/process/service/impl/QualityMonitorDetailsEvaluateServiceImpl.java
new file mode 100644
index 0000000..e71a39a
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/service/impl/QualityMonitorDetailsEvaluateServiceImpl.java
@@ -0,0 +1,19 @@
+package com.ruoyi.process.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.process.mapper.QualityMonitorDetailsEvaluateMapper;
+import com.ruoyi.process.pojo.QualityMonitorDetailsEvaluate;
+import com.ruoyi.process.service.QualityMonitorDetailsEvaluateService;
+import org.springframework.stereotype.Service;
+
+/**
+ * 璐ㄩ噺鐩戞帶璁″垝璇︽儏璇勪环琛�
+ *
+ * @author zhuo
+ * @since 2024-11-06
+ */
+@Service
+public class QualityMonitorDetailsEvaluateServiceImpl extends ServiceImpl<QualityMonitorDetailsEvaluateMapper, QualityMonitorDetailsEvaluate> implements QualityMonitorDetailsEvaluateService {
+
+}
+
diff --git a/cnas-process/src/main/java/com/ruoyi/process/service/impl/QualityMonitorDetailsRatifyServiceImpl.java b/cnas-process/src/main/java/com/ruoyi/process/service/impl/QualityMonitorDetailsRatifyServiceImpl.java
new file mode 100644
index 0000000..22785fe
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/service/impl/QualityMonitorDetailsRatifyServiceImpl.java
@@ -0,0 +1,19 @@
+package com.ruoyi.process.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.process.mapper.QualityMonitorDetailsRatifyMapper;
+import com.ruoyi.process.pojo.QualityMonitorDetailsRatify;
+import com.ruoyi.process.service.QualityMonitorDetailsRatifyService;
+import org.springframework.stereotype.Service;
+
+/**
+ * 璐ㄩ噺鐩戞帶璁″垝璇︽儏鎵瑰噯琛�
+ *
+ * @author zhuo
+ * @since 2024-11-06
+ */
+@Service
+public class QualityMonitorDetailsRatifyServiceImpl extends ServiceImpl<QualityMonitorDetailsRatifyMapper, QualityMonitorDetailsRatify> implements QualityMonitorDetailsRatifyService {
+
+}
+
diff --git a/cnas-process/src/main/java/com/ruoyi/process/service/impl/QualityMonitorDetailsServiceImpl.java b/cnas-process/src/main/java/com/ruoyi/process/service/impl/QualityMonitorDetailsServiceImpl.java
new file mode 100644
index 0000000..97b1377
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/service/impl/QualityMonitorDetailsServiceImpl.java
@@ -0,0 +1,19 @@
+package com.ruoyi.process.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.process.mapper.QualityMonitorDetailsMapper;
+import com.ruoyi.process.pojo.QualityMonitorDetails;
+import com.ruoyi.process.service.QualityMonitorDetailsService;
+import org.springframework.stereotype.Service;
+
+/**
+ * 璐ㄩ噺鐩戞帶璁″垝璇︽儏琛�
+ *
+ * @author makejava
+ * @since 2024-11-06
+ */
+@Service
+public class QualityMonitorDetailsServiceImpl extends ServiceImpl<QualityMonitorDetailsMapper, QualityMonitorDetails> implements QualityMonitorDetailsService {
+
+}
+
diff --git a/cnas-process/src/main/java/com/ruoyi/process/service/impl/QualityMonitorServiceImpl.java b/cnas-process/src/main/java/com/ruoyi/process/service/impl/QualityMonitorServiceImpl.java
new file mode 100644
index 0000000..a559f4b
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/service/impl/QualityMonitorServiceImpl.java
@@ -0,0 +1,835 @@
+package com.ruoyi.process.service.impl;
+
+import cn.hutool.core.date.DateUtil;
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.context.AnalysisContext;
+import com.alibaba.excel.event.AnalysisEventListener;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+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.ruoyi.common.constant.MenuJumpPathConstants;
+import com.ruoyi.common.core.domain.entity.InformationNotification;
+import com.ruoyi.common.core.domain.entity.User;
+import com.ruoyi.common.utils.DateImageUtil;
+import com.ruoyi.common.utils.QueryWrappers;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.common.utils.WxCpUtils;
+import com.ruoyi.device.pojo.DeviceExamineRecord;
+import com.ruoyi.framework.exception.ErrorException;
+import com.ruoyi.inspect.util.HackLoopTableRenderPolicy;
+import com.ruoyi.inspect.util.UserUtils;
+import com.ruoyi.inspect.util.XWPFDocumentUtils;
+import com.ruoyi.process.dto.QualityMonitorDetailsDto;
+import com.ruoyi.process.dto.QualityMonitorDetailsEvaluateDto;
+import com.ruoyi.process.dto.QualityMonitorDto;
+import com.ruoyi.process.excel.QualityMonitorDetailsUpload;
+import com.ruoyi.process.mapper.*;
+import com.ruoyi.process.pojo.*;
+import com.ruoyi.process.service.QualityMonitorDetailsEvaluateService;
+import com.ruoyi.process.service.QualityMonitorDetailsRatifyService;
+import com.ruoyi.process.service.QualityMonitorDetailsService;
+import com.ruoyi.process.service.QualityMonitorService;
+import com.ruoyi.system.mapper.UserMapper;
+import com.ruoyi.system.service.InformationNotificationService;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.multipart.MultipartFile;
+
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletResponse;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URLEncoder;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.*;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.stream.Collectors;
+
+/**
+ * 璐ㄩ噺鐩戞帶璁″垝涓昏〃
+ *
+ * @author zhuo
+ * @since 2024-11-06
+ */
+@Service
+@Transactional(rollbackFor = Exception.class)
+public class QualityMonitorServiceImpl extends ServiceImpl<QualityMonitorMapper, QualityMonitor> implements QualityMonitorService {
+
+    @Resource
+    private QualityMonitorDetailsService qualityMonitorDetailsService;
+    @Resource
+    private QualityMonitorDetailsMapper qualityMonitorDetailsMapper;
+    @Resource
+    private UserMapper userMapper;
+    @Resource
+    private QualityMonitorDetailsRatifyMapper qualityMonitorDetailsRatifyMapper;
+    @Resource
+    private QualityMonitorDetailsRatifyService qualityMonitorDetailsRatifyService;
+    @Resource
+    private QualityMonitorDetailsEvaluateMapper qualityMonitorDetailsEvaluateMapper;
+    @Resource
+    private QualityMonitorDetailsEvaluateService qualityMonitorDetailsEvaluateService;
+    @Resource
+    private QualityMonitorDetailsEvaluateFileMapper qualityMonitorDetailsEvaluateFileMapper;
+    @Resource
+    private InformationNotificationService informationNotificationService;
+    @Resource
+    private ThreadPoolTaskExecutor threadPoolTaskExecutor;
+    @Value("${file.path}")
+    private String imgUrl;
+
+    @Value("${wordUrl}")
+    private String wordUrl;
+
+
+    /**
+     * 瀵煎叆鐩戞帶璁″垝
+     * @param file
+     * @return
+     */
+    @Override
+    public boolean importQualityMonitor(MultipartFile file, QualityMonitor monitor) {
+        // 褰撳墠鐧诲綍鐢ㄦ埛
+        Integer userId = SecurityUtils.getUserId().intValue();
+        // 鏂囦欢鍚嶇О
+        String fileName = file.getOriginalFilename().substring(0, file.getOriginalFilename().lastIndexOf("."));
+        QualityMonitor qualityMonitor = new QualityMonitor();
+        qualityMonitor.setMonitorName(fileName);
+        qualityMonitor.setMonitorYear(monitor.getMonitorYear());
+        qualityMonitor.setWriteUserId(userId);
+        qualityMonitor.setExamineUserId(monitor.getExamineUserId());
+        qualityMonitor.setWriteTime(LocalDateTime.now());
+        baseMapper.insert(qualityMonitor);
+
+        if (monitor.getExamineUserId() == null) {
+            throw new ErrorException("缂哄皯瀹℃牳浜�");
+        }
+
+        User user = userMapper.selectById(userId);
+        // 娑堟伅鍙戦��
+        InformationNotification info = new InformationNotification();
+        // 鍙戦�佷汉
+        info.setCreateUser(user.getName());
+        info.setMessageType("6");
+        info.setTheme("CNAS璐ㄩ噺鐩戞帶璁″垝瀹℃牳閫氱煡");
+        info.setContent(fileName + "璐ㄩ噺鐩戞帶璁″垝寰呭鏍�");
+        info.setSenderId(userId);
+        // 鎺ユ敹浜�
+        info.setConsigneeId(monitor.getExamineUserId());
+        info.setJumpPath(MenuJumpPathConstants.QUALITY_MONITOR);
+        informationNotificationService.addInformationNotification(info);
+
+        // 鍙戦�佷紒涓氬井淇¢�氱煡
+        threadPoolTaskExecutor.execute(() -> {
+            // 鏌ヨ鍙戦�佷汉
+            User people = userMapper.selectById(monitor.getExamineUserId());
+            String message = "";
+            message += "CNAS璐ㄩ噺鐩戞帶璁″垝瀹℃牳閫氱煡";
+            message += "\n璇峰幓杩囩▼瑕佹眰-璐ㄩ噺鐩戞帶璁″垝";
+            message += "\n" + fileName + "璐ㄩ噺鐩戞帶璁″垝寰呭鏍�";
+            //鍙戦�佷紒涓氬井淇℃秷鎭�氱煡
+            try {
+                WxCpUtils.inform(people.getAccount(), message, null);
+            } catch (Exception e) {
+                throw new RuntimeException(e);
+            }
+        });
+
+
+        List<QualityMonitorDetails> detailsUploadList = new ArrayList<>();
+
+        // 瀵煎叆闄勪欢鍐呭
+        try {
+            // excel瑙f瀽
+            EasyExcel.read(file.getInputStream(), QualityMonitorDetailsUpload.class, new AnalysisEventListener<QualityMonitorDetailsUpload>() {
+                @Override
+                public void invoke(QualityMonitorDetailsUpload detailsUpload, AnalysisContext analysisContext) {
+                    // 鍒ゆ柇鏄惁涓虹┖
+                    if (StringUtils.isBlank(detailsUpload.getPlannedTime())) {
+                        throw new ErrorException("璁″垝寮�灞曟椂闂翠笉鑳戒负绌�");
+                    }
+                        // 瀵硅薄澶嶅埗
+                    QualityMonitorDetails monitorDetails = new QualityMonitorDetails();
+                    BeanUtils.copyProperties(detailsUpload, monitorDetails);
+                    monitorDetails.setQualityMonitorId(qualityMonitor.getQualityMonitorId());
+
+                    detailsUploadList.add(monitorDetails);
+                }
+
+                @Override
+                public void doAfterAllAnalysed(AnalysisContext analysisContext) {
+
+                }
+            }).sheet().doRead();
+            qualityMonitorDetailsService.saveBatch(detailsUploadList);
+
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+        return true;
+    }
+
+    /**
+     * 鐩戞帶璁″垝瀹℃牳
+     * @param qualityMonitor
+     * @return
+     */
+    @Override
+    public boolean examineQualityMonitor(QualityMonitor qualityMonitor) {
+        if (qualityMonitor.getRatifyUserId() == null) {
+            throw new ErrorException("缂哄皯鎵瑰噯浜�");
+        }
+
+        // 褰撳墠鐧诲綍鐢ㄦ埛
+        baseMapper.update(null, Wrappers.<QualityMonitor>lambdaUpdate()
+                .eq(QualityMonitor::getQualityMonitorId, qualityMonitor.getQualityMonitorId())
+                .set(QualityMonitor::getRatifyUserId, qualityMonitor.getRatifyUserId())
+                .set(QualityMonitor::getExamineRemark, qualityMonitor.getExamineRemark())
+                .set(QualityMonitor::getExamineStatus, qualityMonitor.getExamineStatus())
+                .set(QualityMonitor::getExamineTime, LocalDateTime.now())
+        );
+
+        QualityMonitor monitor = baseMapper.selectById(qualityMonitor.getQualityMonitorId());
+
+        Integer userId = SecurityUtils.getUserId().intValue();
+        User user = userMapper.selectById(userId);
+        // 娑堟伅鍙戦��
+        InformationNotification info = new InformationNotification();
+        // 鍙戦�佷汉
+        info.setCreateUser(user.getName());
+        info.setMessageType("6");
+        info.setTheme("CNAS璐ㄩ噺鐩戞帶璁″垝鎵瑰噯閫氱煡");
+        info.setContent(monitor.getMonitorName() + "璐ㄩ噺鐩戞帶璁″垝寰呮壒鍑�");
+        info.setSenderId(userId);
+        // 鎺ユ敹浜�
+        info.setConsigneeId(qualityMonitor.getRatifyUserId());
+        info.setJumpPath(MenuJumpPathConstants.QUALITY_MONITOR);
+        informationNotificationService.addInformationNotification(info);
+
+        // 鍙戦�佷紒涓氬井淇¢�氱煡
+        threadPoolTaskExecutor.execute(() -> {
+            // 鏌ヨ鍙戦�佷汉
+            User people = userMapper.selectById(qualityMonitor.getRatifyUserId());
+            String message = "";
+            message += "CNAS璐ㄩ噺鐩戞帶璁″垝鎵瑰噯閫氱煡";
+            message += "\n璇峰幓杩囩▼瑕佹眰-璐ㄩ噺鐩戞帶璁″垝";
+            message += "\n" + monitor.getMonitorName() + "璐ㄩ噺鐩戞帶璁″垝寰呮壒鍑�";
+            //鍙戦�佷紒涓氬井淇℃秷鎭�氱煡
+            try {
+                WxCpUtils.inform(people.getAccount(), message, null);
+            } catch (Exception e) {
+                throw new RuntimeException(e);
+            }
+        });
+
+        return true;
+    }
+
+    /**
+     * 鐩戞帶璁″垝鎵瑰噯
+     * @param qualityMonitor
+     * @return
+     */
+    @Override
+    public boolean ratifyQualityMonitor(QualityMonitor qualityMonitor) {
+        // 褰撳墠鐧诲綍鐢ㄦ埛
+        baseMapper.update(null, Wrappers.<QualityMonitor>lambdaUpdate()
+                .eq(QualityMonitor::getQualityMonitorId, qualityMonitor.getQualityMonitorId())
+                .set(QualityMonitor::getRatifyRemark, qualityMonitor.getRatifyRemark())
+                .set(QualityMonitor::getRatifyStatus, qualityMonitor.getRatifyStatus())
+                .set(QualityMonitor::getRatifyTime, LocalDateTime.now())
+        );
+        return true;
+    }
+
+    /**
+     * 鐩戞帶璁″垝鍒楄〃
+     * @param page
+     * @param qualityMonitor
+     * @return
+     */
+    @Override
+    public IPage<QualityMonitorDto> pageQualityMonitor(Page page, QualityMonitor qualityMonitor) {
+        return baseMapper.pageQualityMonitor(page, QueryWrappers.queryWrappers(qualityMonitor));
+    }
+
+    /**
+     * 鐩戞帶璁″垝璇︽儏鍒楄〃
+     * @param page
+     * @param qualityMonitorDetails
+     * @return
+     */
+    @Override
+    public IPage<QualityMonitorDetailsDto> pageQualityMonitorDetail(Page page, QualityMonitorDetails qualityMonitorDetails) {
+        if (qualityMonitorDetails.getQualityMonitorId() == null) {
+            return new Page();
+        }
+        return qualityMonitorDetailsMapper.pageQualityMonitorDetail(page, QueryWrappers.queryWrappers(qualityMonitorDetails));
+    }
+
+    /**
+     * 瀵煎嚭鐩戞帶璁″垝
+     * @param qualityMonitorId
+     * @param response
+     */
+    @Override
+    public void exportQualityMonitorDetail(Integer qualityMonitorId, HttpServletResponse response) {
+        // 鏌ヨ璇︽儏
+        QualityMonitor qualityMonitor = baseMapper.selectById(qualityMonitorId);
+
+        //鑾峰彇鎻愪氦浜虹殑绛惧悕鍦板潃
+        String writeUrl = userMapper.selectById(qualityMonitor.getWriteUserId()).getSignatureUrl();
+        if (ObjectUtils.isEmpty(writeUrl) || writeUrl.equals("")) {
+            throw new ErrorException("鎵句笉鍒版楠屼汉鐨勭鍚�");
+        }
+
+        //鑾峰彇澶嶆牳浜虹殑绛惧悕鍦板潃
+        String examineUrl = null;
+        if (qualityMonitor.getExamineUserId() != null) {
+            examineUrl = userMapper.selectById(qualityMonitor.getExamineUserId()).getSignatureUrl();
+            if (StringUtils.isBlank(examineUrl)) {
+                throw new ErrorException("鎵句笉鍒板鏍镐汉鐨勭鍚�");
+            }
+        }
+
+        //鑾峰彇鎵瑰噯浜虹殑绛惧悕鍦板潃
+        String ratifyUrl = null;
+        if (qualityMonitor.getRatifyUserId() != null) {
+            ratifyUrl = userMapper.selectById(qualityMonitor.getRatifyUserId()).getSignatureUrl();
+            if (StringUtils.isBlank(ratifyUrl)) {
+                throw new ErrorException("鎵句笉鍒板鏍镐汉鐨勭鍚�");
+            }
+        }
+
+        // 鏌ヨ璇︽儏
+        List<QualityMonitorDetails> qualityMonitorDetails = qualityMonitorDetailsMapper.selectList(Wrappers.<QualityMonitorDetails>lambdaQuery()
+                .eq(QualityMonitorDetails::getQualityMonitorId, qualityMonitorId));
+
+        // 鍒ゆ柇鐩戞帶鐩殑涓�鏍风殑鍊�
+        AtomicInteger count = new AtomicInteger(1);
+        Map<String, List<QualityMonitorDetails>> listMap = qualityMonitorDetails.stream().collect(Collectors.groupingBy(QualityMonitorDetails::getMonitorPurpose));
+        listMap.forEach((s, details) -> {
+            // 鏌ヨ鏁伴噺瓒呰繃1鐨�
+            if (details.size() > 1) {
+                for (QualityMonitorDetails detail : details) {
+                    detail.setMonitorPurpose(detail.getMonitorPurpose() + "鈭�" + count);
+                }
+                count.getAndIncrement();
+            }
+        });
+
+        int index = 1;
+        for (QualityMonitorDetails qualityMonitorDetail : qualityMonitorDetails) {
+            qualityMonitorDetail.setIndex(index);
+            index++;
+        }
+
+        // 鑾峰彇璺緞
+        InputStream inputStream = this.getClass().getResourceAsStream("/static/quality-monitor.docx");
+        String finalExamineUrl = examineUrl;
+        String finalRatifyUrl = ratifyUrl;
+        Configure configure = Configure.builder()
+                .bind("monitorDetailList", new HackLoopTableRenderPolicy())
+                .build();
+        XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
+                new HashMap<String, Object>() {{
+                    put("year", qualityMonitor.getMonitorYear());
+                    put("monitorDetailList", qualityMonitorDetails);
+                    put("writeUrl", StringUtils.isNotBlank(writeUrl) ? Pictures.ofLocal(imgUrl + "/" + writeUrl).create() : null);
+                    put("examineUrl", StringUtils.isNotBlank(finalExamineUrl) ? Pictures.ofLocal(imgUrl + "/" + finalExamineUrl).create() : null);
+                    put("ratifyUrl", StringUtils.isNotBlank(finalRatifyUrl) ? Pictures.ofLocal(imgUrl + "/" + finalRatifyUrl).create() : null);
+                    put("writeDateUrl", qualityMonitor.getWriteTime() != null ?
+                            Pictures.ofStream(DateImageUtil.createDateImage(qualityMonitor.getWriteTime())).create() : null);
+                    put("examineDateUrl", qualityMonitor.getExamineTime() != null ?
+                            Pictures.ofStream(DateImageUtil.createDateImage(qualityMonitor.getExamineTime())).create() : null);
+                    put("ratifyDateUrl", qualityMonitor.getRatifyTime() != null ?
+                            Pictures.ofStream(DateImageUtil.createDateImage(qualityMonitor.getRatifyTime())).create() : null);
+                }});
+
+        // 澶勭悊鎹㈣闂
+        XWPFDocumentUtils.updateMergeByDocument(template.getXWPFDocument());
+        try {
+            response.setContentType("application/msword");
+            String fileName = URLEncoder.encode(
+                    qualityMonitor.getMonitorName(), "UTF-8");
+            response.setHeader("Content-disposition",
+                    "attachment;filename=" + fileName + ".docx");
+            OutputStream os = response.getOutputStream();
+            template.write(os);
+            os.flush();
+            os.close();
+            inputStream.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException("瀵煎嚭澶辫触");
+        }
+    }
+
+
+    /************************************************************  鎵瑰噯  *******************************************************************/
+
+    /**
+     * 鏌ヨ鐩戞帶璁″垝璇︽儏瀹炴柦淇℃伅
+     * @param qualityMonitorDetailsId
+     * @return
+     */
+    @Override
+    public QualityMonitorDetailsRatify getQualityMonitorRatify(Integer qualityMonitorDetailsId) {
+        QualityMonitorDetailsRatify qualityMonitorDetailsRatify;
+        // 鏌ヨ鐩戞帶閮ㄩ棬id
+        qualityMonitorDetailsRatify = qualityMonitorDetailsRatifyMapper.selectOne(Wrappers.<QualityMonitorDetailsRatify>lambdaQuery()
+                .eq(QualityMonitorDetailsRatify::getQualityMonitorDetailsId, qualityMonitorDetailsId));
+
+        if (qualityMonitorDetailsRatify == null) {
+            // 鏌ヨ璇︽儏璁″垝
+            QualityMonitorDetails qualityMonitorDetails = qualityMonitorDetailsMapper.selectById(qualityMonitorDetailsId);
+            qualityMonitorDetailsRatify = new QualityMonitorDetailsRatify();
+            qualityMonitorDetailsRatify.setQualityMonitorDetailsId(qualityMonitorDetailsId); // 璇︽儏id
+            qualityMonitorDetailsRatify.setMonitorProject(qualityMonitorDetails.getMonitorProject()); // 鐩戞帶椤圭洰
+            qualityMonitorDetailsRatify.setMonitorData(DateUtil.format(new Date(), "yyyy-MM")); // 鐩戞帶鏃堕棿
+            qualityMonitorDetailsRatify.setMonitorPurpose(qualityMonitorDetails.getMonitorPurpose()); // 鐩戞帶鐩殑
+            qualityMonitorDetailsRatify.setParticipant(qualityMonitorDetails.getParticipant()); // 鍙傚姞浜哄憳
+            qualityMonitorDetailsRatify.setBudget(qualityMonitorDetails.getBudget()); // 棰勭畻
+            qualityMonitorDetailsRatify.setInspectionDepartment(userMapper.selectUserDepartmentLimsName( SecurityUtils.getUserId().intValue()));
+        }
+
+        if (qualityMonitorDetailsRatify.getRatifyUserId() != null) {
+            qualityMonitorDetailsRatify.setRatifyName(userMapper.selectById(qualityMonitorDetailsRatify.getRatifyUserId()).getName());
+        }
+
+        return qualityMonitorDetailsRatify;
+    }
+
+    /**
+     * 鏂板鐩戞帶鎵瑰噯瀹炴柦
+     * @param qualityMonitorDetailsRatify
+     * @return
+     */
+    @Override
+    public boolean addQualityMonitorRatify(QualityMonitorDetailsRatify qualityMonitorDetailsRatify) {
+        if (qualityMonitorDetailsRatify.getQualityMonitorDetailsId() == null) {
+            throw new ErrorException("缂哄皯鐩戞帶璇︾粏淇℃伅id");
+        }
+        qualityMonitorDetailsRatifyService.saveOrUpdate(qualityMonitorDetailsRatify);
+        if (qualityMonitorDetailsRatify.getRatifyUserId() != null) {
+
+            // 鏌ヨ璇︽儏淇℃伅
+            QualityMonitorDetails monitorDetails = qualityMonitorDetailsMapper.selectById(qualityMonitorDetailsRatify.getQualityMonitorDetailsId());
+
+            Integer userId =SecurityUtils.getUserId().intValue();
+            User user = userMapper.selectById(userId);
+            // 娑堟伅鍙戦��
+            InformationNotification info = new InformationNotification();
+            // 鍙戦�佷汉
+            info.setCreateUser(user.getName());
+            info.setMessageType("6");
+            info.setTheme("CNAS璐ㄩ噺鐩戞帶瀹炴柦鎵瑰噯閫氱煡");
+            info.setContent("鐩戞帶椤圭洰涓�: " + monitorDetails.getMonitorProject() + " 璐ㄩ噺鐩戞帶瀹炴柦寰呮壒鍑�");
+            info.setSenderId(userId);
+            // 鎺ユ敹浜�
+            info.setConsigneeId(qualityMonitorDetailsRatify.getRatifyUserId());
+            info.setJumpPath(MenuJumpPathConstants.QUALITY_MONITOR);
+            informationNotificationService.addInformationNotification(info);
+
+            // 鍙戦�佷紒涓氬井淇¢�氱煡
+            threadPoolTaskExecutor.execute(() -> {
+                // 鏌ヨ鍙戦�佷汉
+                User people = userMapper.selectById(qualityMonitorDetailsRatify.getRatifyUserId());
+                String message = "";
+                message += "CNAS璐ㄩ噺鐩戞帶瀹炴柦鎵瑰噯閫氱煡";
+                message += "\n璇峰幓杩囩▼瑕佹眰-璐ㄩ噺鐩戞帶璁″垝";
+                message += "\n" + "鐩戞帶椤圭洰涓�: " + monitorDetails.getMonitorProject() + " 璐ㄩ噺鐩戞帶瀹炴柦寰呮壒鍑�";
+                //鍙戦�佷紒涓氬井淇℃秷鎭�氱煡
+                try {
+                    WxCpUtils.inform(people.getAccount(), message, null);
+                } catch (Exception e) {
+                    throw new RuntimeException(e);
+                }
+            });
+        }
+        // 娓呯┖鐘舵��
+        qualityMonitorDetailsRatifyService.update(Wrappers.<QualityMonitorDetailsRatify>lambdaUpdate()
+                .eq(QualityMonitorDetailsRatify::getDetailsRatifyId, qualityMonitorDetailsRatify.getDetailsRatifyId())
+                .set(QualityMonitorDetailsRatify::getIsFinish, null));
+        return true;
+    }
+
+    /**
+     * 鐩戞帶璁″垝璇︽儏鎵瑰噯鎰忚
+     * @param qualityMonitorDetailsRatify
+     * @return
+     */
+    @Override
+    public boolean addQualityMonitorRatifyOpinion(QualityMonitorDetailsRatify qualityMonitorDetailsRatify) {
+        LambdaUpdateWrapper<QualityMonitorDetailsRatify> wrapper = Wrappers.<QualityMonitorDetailsRatify>lambdaUpdate()
+                .eq(QualityMonitorDetailsRatify::getDetailsRatifyId, qualityMonitorDetailsRatify.getDetailsRatifyId())
+                .set(QualityMonitorDetailsRatify::getRatifyOpinion, qualityMonitorDetailsRatify.getRatifyOpinion())
+                .set(QualityMonitorDetailsRatify::getIsFinish, qualityMonitorDetailsRatify.getIsFinish());
+        // 涓�0娓呴櫎瀹℃牳浜�
+        if (qualityMonitorDetailsRatify.getIsFinish().equals(0)) {
+            wrapper.set(QualityMonitorDetailsRatify::getRatifyUserId, null);
+        }
+
+        qualityMonitorDetailsRatifyService.update(wrapper);
+        return true;
+    }
+
+    /**
+     * 瀵煎嚭鐩戞帶璁″垝璇︽儏瀹炴柦淇℃伅
+     *
+     * @param detailsRatifyId 鐩戞帶璁″垝璇︽儏瀹炴柦id
+     * @param response  鍝嶅簲
+     */
+    @Override
+    public void exportQualityMonitorRatify(Integer detailsRatifyId, HttpServletResponse response) {
+        QualityMonitorDetailsRatify qualityMonitorDetailsRatify = qualityMonitorDetailsRatifyMapper.selectOne(Wrappers.<QualityMonitorDetailsRatify>lambdaQuery().eq(QualityMonitorDetailsRatify::getQualityMonitorDetailsId, detailsRatifyId));
+
+        // 鑾峰彇璺緞
+        InputStream inputStream = this.getClass().getResourceAsStream("/static/quality-monitor-details-ratify.docx");
+        Configure configure = Configure.builder()
+                .bind("processMethodVerifyMachineAttachmentList", new HackLoopTableRenderPolicy())
+                .build();
+        XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
+                new HashMap<String, Object>() {{
+                    put("qualityMonitorDetailsRatify", qualityMonitorDetailsRatify);
+                    put("ratifyUserUrl", UserUtils.getFinalUserSignatureUrl(qualityMonitorDetailsRatify.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();
+            inputStream.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException("瀵煎嚭澶辫触");
+        }
+    }
+
+    /************************************************************  璇勪环  *******************************************************************/
+
+    /**
+     * 鏌ヨ璐ㄩ噺鐩戞帶璇勪环
+     * @param qualityMonitorDetailsId
+     * @return
+     */
+    @Override
+    public QualityMonitorDetailsEvaluate getQualityMonitorEvaluate(Integer qualityMonitorDetailsId) {
+        return qualityMonitorDetailsEvaluateMapper.getQualityMonitorEvaluate(qualityMonitorDetailsId);
+    }
+
+    /**
+     * 鏂板鐩戞帶璇勪环
+     * @param qualityMonitorDetailsEvaluate
+     * @return
+     */
+    @Override
+    public boolean addQualityMonitorEvaluate(QualityMonitorDetailsEvaluate qualityMonitorDetailsEvaluate) {
+        if (qualityMonitorDetailsEvaluate.getQualityMonitorDetailsId() == null) {
+            throw new ErrorException("缂哄皯鐩戞帶璇︾粏淇℃伅id");
+        }
+        // 鏌ヨ璇︽儏淇℃伅
+        QualityMonitorDetails monitorDetails = qualityMonitorDetailsMapper.selectById(qualityMonitorDetailsEvaluate.getQualityMonitorDetailsId());
+        // 鍙戦�佹秷鎭�氱煡
+        // 鍒ゆ柇璇勫缁撹浜烘槸鍚︿负绌�
+        if (qualityMonitorDetailsEvaluate.getRatifyUserId() != null) {
+
+            Integer userId =SecurityUtils.getUserId().intValue();
+            User user = userMapper.selectById(userId);
+            // 娑堟伅鍙戦��
+            InformationNotification info = new InformationNotification();
+            // 鍙戦�佷汉
+            info.setCreateUser(user.getName());
+            info.setMessageType("6");
+            info.setTheme("CNAS璐ㄩ噺鐩戞帶璇勪环缁撹閫氱煡");
+            info.setContent("鐩戞帶椤圭洰涓�: " + monitorDetails.getMonitorProject() + " 璐ㄩ噺鐩戞帶寰呰瘎浠风粨璁�");
+            info.setSenderId(userId);
+            // 鎺ユ敹浜�
+            info.setConsigneeId(qualityMonitorDetailsEvaluate.getRatifyUserId());
+            info.setJumpPath(MenuJumpPathConstants.QUALITY_MONITOR);
+            informationNotificationService.addInformationNotification(info);
+
+            // 鍙戦�佷紒涓氬井淇¢�氱煡
+            threadPoolTaskExecutor.execute(() -> {
+                // 鏌ヨ鍙戦�佷汉
+                User people = userMapper.selectById(qualityMonitorDetailsEvaluate.getRatifyUserId());
+                String message = "";
+                message += "CNAS璐ㄩ噺鐩戞帶璇勪环缁撹閫氱煡";
+                message += "\n璇峰幓杩囩▼瑕佹眰-璐ㄩ噺鐩戞帶璁″垝";
+                message += "\n" + "鐩戞帶椤圭洰涓�: " + monitorDetails.getMonitorProject() + " 璐ㄩ噺鐩戞帶寰呰瘎浠风粨璁�";
+                //鍙戦�佷紒涓氬井淇℃秷鎭�氱煡
+                try {
+                    WxCpUtils.inform(people.getAccount(), message, null);
+                } catch (Exception e) {
+                    throw new RuntimeException(e);
+                }
+            });
+
+        } else {
+            // 鐩戞帶缁撴灉璇勪环
+            if (qualityMonitorDetailsEvaluate.getImplementUserId() != null) {
+                Integer userId =SecurityUtils.getUserId().intValue();
+                User user = userMapper.selectById(userId);
+                // 娑堟伅鍙戦��
+                InformationNotification info = new InformationNotification();
+                // 鍙戦�佷汉
+                info.setCreateUser(user.getName());
+                info.setMessageType("6");
+                info.setTheme("CNAS璐ㄩ噺鐩戞帶缁撴灉璇勪环");
+                info.setContent("鐩戞帶椤圭洰涓�: " + monitorDetails.getMonitorProject() + " 璐ㄩ噺鐩戞帶寰呰瘎浠风粨璁�");
+                info.setSenderId(userId);
+                // 鎺ユ敹浜�
+                info.setConsigneeId(qualityMonitorDetailsEvaluate.getImplementUserId());
+                info.setJumpPath(MenuJumpPathConstants.QUALITY_MONITOR);
+                informationNotificationService.addInformationNotification(info);
+
+                // 鍙戦�佷紒涓氬井淇¢�氱煡
+                threadPoolTaskExecutor.execute(() -> {
+                    // 鏌ヨ鍙戦�佷汉
+                    User people = userMapper.selectById(qualityMonitorDetailsEvaluate.getImplementUserId());
+                    String message = "";
+                    message += "CNAS璐ㄩ噺鐩戞帶缁撴灉璇勪环";
+                    message += "\n璇峰幓杩囩▼瑕佹眰-璐ㄩ噺鐩戞帶璁″垝";
+                    message += "\n" + "鐩戞帶椤圭洰涓�: " + monitorDetails.getMonitorProject() + " 璐ㄩ噺鐩戞帶寰呰瘎浠风粨璁�";
+                    //鍙戦�佷紒涓氬井淇℃秷鎭�氱煡
+                    try {
+                        WxCpUtils.inform(people.getAccount(), message, null);
+                    } catch (Exception e) {
+                        throw new RuntimeException(e);
+                    }
+                });
+            }
+        }
+
+
+        return qualityMonitorDetailsEvaluateService.saveOrUpdate(qualityMonitorDetailsEvaluate);
+    }
+
+    /**
+     * 鐩戞帶璇勪环瀹℃壒鎰忚
+     * @param qualityMonitorDetailsEvaluate
+     * @return
+     */
+    @Override
+    public boolean addMonitorEvaluateOpinion(QualityMonitorDetailsEvaluate qualityMonitorDetailsEvaluate) {
+        qualityMonitorDetailsEvaluateService.update(Wrappers.<QualityMonitorDetailsEvaluate>lambdaUpdate()
+                .eq(QualityMonitorDetailsEvaluate::getDetailsEvaluateId, qualityMonitorDetailsEvaluate.getDetailsEvaluateId())
+                .set(QualityMonitorDetailsEvaluate::getRatifyOpinion, qualityMonitorDetailsEvaluate.getRatifyOpinion())
+                .set(QualityMonitorDetailsEvaluate::getRatifyTime, LocalDateTime.now())
+                .set(QualityMonitorDetailsEvaluate::getIsFinish, 1));
+        return true;
+    }
+
+    /**
+     * 鏂板鐩戞帶璇勪环闄勪欢琛�
+     * @param qualityMonitorDetailsId
+     * @param file
+     * @return
+     */
+    @Override
+    public boolean uploadEvaluateFile(Integer qualityMonitorDetailsId, MultipartFile file) {
+        if (qualityMonitorDetailsId == null) {
+            throw new ErrorException("缂哄皯鐩戞帶璇︽儏id");
+        }
+
+        String urlString;
+        String pathName;
+        String path;
+        String filename = file.getOriginalFilename();
+        String contentType = file.getContentType();
+        QualityMonitorDetailsEvaluateFile evaluateFile = new QualityMonitorDetailsEvaluateFile();
+        evaluateFile.setDetailsEvaluateId(qualityMonitorDetailsId);
+        evaluateFile.setFileName(filename);
+        if (contentType != null && contentType.startsWith("image/")) {
+            // 鏄浘鐗�
+            path = imgUrl;
+            evaluateFile.setType(1);
+        } else {
+            // 鏄枃浠�
+            path = wordUrl;
+            evaluateFile.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));
+            evaluateFile.setFileUrl(pathName);
+            qualityMonitorDetailsEvaluateFileMapper.insert(evaluateFile);
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            System.err.println("闄勪欢涓婁紶閿欒");
+            return false;
+        }
+    }
+
+    /**
+     * 鏌ヨ鐩戞帶璇勪环闄勪欢鍒楄〃
+     * @return
+     */
+    @Override
+    public List<QualityMonitorDetailsEvaluateFile> getEvaluateFileList(Integer qualityMonitorDetailsId) {
+        return qualityMonitorDetailsEvaluateFileMapper.selectList(Wrappers.<QualityMonitorDetailsEvaluateFile>lambdaQuery()
+                .eq(QualityMonitorDetailsEvaluateFile::getDetailsEvaluateId, qualityMonitorDetailsId));
+    }
+
+
+    /**
+     * 瀵煎嚭鐩戞帶璇勪环
+     * @param detailsEvaluateId 鐩戞帶璇勪环id
+     */
+    @Override
+    public void exportQualityMonitorEvaluate(Integer detailsEvaluateId, HttpServletResponse response) {
+        // 鏌ヨ鐩戞帶璇勪环淇℃伅
+        QualityMonitorDetailsEvaluate qualityMonitorDetailsEvaluate = qualityMonitorDetailsEvaluateMapper.selectOne(Wrappers.<QualityMonitorDetailsEvaluate>lambdaQuery().eq(QualityMonitorDetailsEvaluate::getQualityMonitorDetailsId,detailsEvaluateId));
+        // 娓叉煋word妯℃澘瀵硅薄
+        QualityMonitorDetailsEvaluateDto qualityMonitorDetailsEvaluateDto = new QualityMonitorDetailsEvaluateDto();
+        BeanUtils.copyProperties(qualityMonitorDetailsEvaluate, qualityMonitorDetailsEvaluateDto);
+        // 鏍煎紡鍖栨椂闂�
+        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+        qualityMonitorDetailsEvaluateDto.setRatifyTimeStr(qualityMonitorDetailsEvaluate.getRatifyTime() == null ? null : qualityMonitorDetailsEvaluate.getRatifyTime().format(dateTimeFormatter));
+        // 鑾峰彇璺緞
+        InputStream inputStream = this.getClass().getResourceAsStream("/static/quality-monitor-evaluate.docx");
+        Configure configure = Configure.builder()
+                .build();
+        XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
+                new HashMap<String, Object>() {{
+                    put("qualityMonitorDetailsEvaluate", qualityMonitorDetailsEvaluateDto);
+                    put("implementUserUrl", UserUtils.getFinalUserSignatureUrl(Integer.valueOf(qualityMonitorDetailsEvaluate.getImplementUserId())));
+                    put("ratifyUserUrl", UserUtils.getFinalUserSignatureUrl(qualityMonitorDetailsEvaluate.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();
+            inputStream.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException("瀵煎嚭澶辫触");
+        }
+    }
+
+    /************************************************** 鐩戞帶瀹屾垚鎶ュ憡 ****************************************************************/
+
+    /**
+     * 涓婁紶鐩戞帶瀹屾垚鎶ュ憡
+     * @param file
+     * @param qualityMonitorDetailsId
+     * @return
+     */
+    @Override
+    public boolean uploadFinishReport(MultipartFile file, Integer qualityMonitorDetailsId) {
+        if (qualityMonitorDetailsId == null) {
+            throw new ErrorException("缂哄皯鐩戞帶璇︽儏id");
+        }
+        LocalDateTime now = LocalDateTime.now();
+        Integer userId =SecurityUtils.getUserId().intValue();
+        String contentType = file.getContentType();
+        String urlString;
+        String pathName;
+        try {
+            String path = wordUrl;
+            File realpath = new File(path);
+            if (!realpath.exists()) {
+                realpath.mkdirs();
+            }
+            pathName = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyMMddHHmmss")) + "_" + file.getOriginalFilename();
+            urlString = realpath + "/" + pathName;
+            file.transferTo(new File(urlString));
+
+            // 鍒ゆ柇鏄惁鏄痯df
+            if (!contentType.contains("pdf")) {
+                wordInsertUrl(new HashMap<String, Object>() {{
+                    put("writeUrl", UserUtils.getFinalUserSignatureUrl(userId));
+                    put("writeDateUrl", Pictures.ofStream(DateImageUtil.createDateImage(now)).create());
+                }}, wordUrl + "/" + pathName.replace("/word", wordUrl));
+            }
+
+            qualityMonitorDetailsService.update(Wrappers.<QualityMonitorDetails>lambdaUpdate()
+                    .eq(QualityMonitorDetails::getQualityMonitorDetailsId, qualityMonitorDetailsId)
+                    .set(QualityMonitorDetails::getFinishReportUrl, pathName)
+                    .set(QualityMonitorDetails::getWriteTime, now));
+
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new ErrorException("鏂囦欢涓婁紶澶辫触");
+        }
+    }
+
+    /**
+     * 鎵瑰噯瀹屾垚鎶ュ憡
+     * @param qualityMonitorDetails
+     * @return
+     */
+    @Override
+    public boolean ratifyFinishReport(QualityMonitorDetails qualityMonitorDetails) {
+        LocalDateTime now = LocalDateTime.now();
+        Integer userId =SecurityUtils.getUserId().intValue();
+        LambdaUpdateWrapper<QualityMonitorDetails> wrapper = Wrappers.<QualityMonitorDetails>lambdaUpdate()
+                .eq(QualityMonitorDetails::getQualityMonitorDetailsId, qualityMonitorDetails.getQualityMonitorDetailsId())
+                .set(QualityMonitorDetails::getRatifyUserId, userId)
+                .set(QualityMonitorDetails::getRatifyRemark, qualityMonitorDetails.getRatifyRemark())
+                .set(QualityMonitorDetails::getRatifyStatus, qualityMonitorDetails.getRatifyStatus())
+                .set(QualityMonitorDetails::getRatifyTime, now);
+        if (qualityMonitorDetails.getRatifyStatus().equals(0)) {
+            wrapper.set(QualityMonitorDetails::getFinishReportUrl, null);
+        }
+        qualityMonitorDetailsMapper.update(null, wrapper);
+
+        // 娣诲姞鎵瑰噯浜�
+        QualityMonitorDetails details = qualityMonitorDetailsMapper.selectById(qualityMonitorDetails.getQualityMonitorDetailsId());
+        if (StringUtils.isNotBlank(details.getFinishReportUrl()) && !details.getFinishReportUrl().contains(".pdf")) {
+            wordInsertUrl(new HashMap<String, Object>() {{
+                put("ratifyUrl", UserUtils.getFinalUserSignatureUrl(userId));
+                put("ratifyDateUrl", Pictures.ofStream(DateImageUtil.createDateImage(now)).create());
+            }}, wordUrl + "/" + details.getFinishReportUrl().replace("/word", wordUrl));
+        }
+        return true;
+    }
+
+    public int wordInsertUrl(Map<String, Object> map, String url) {
+        XWPFTemplate template = XWPFTemplate.compile(url).render(map);
+        try {
+            template.writeAndClose(Files.newOutputStream(Paths.get(url)));
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+        return 1;
+    }
+
+
+}
+
diff --git a/cnas-process/src/main/java/com/ruoyi/process/service/impl/QualitySuperviseDetailsServiceImpl.java b/cnas-process/src/main/java/com/ruoyi/process/service/impl/QualitySuperviseDetailsServiceImpl.java
new file mode 100644
index 0000000..79be6f9
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/service/impl/QualitySuperviseDetailsServiceImpl.java
@@ -0,0 +1,19 @@
+package com.ruoyi.process.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.process.mapper.QualitySuperviseDetailsMapper;
+import com.ruoyi.process.pojo.QualitySuperviseDetails;
+import com.ruoyi.process.service.QualitySuperviseDetailsService;
+import org.springframework.stereotype.Service;
+
+/**
+ * 璐ㄩ噺鐩戠潱璇︽儏琛�
+ *
+ * @author makejava
+ * @since 2024-11-07
+ */
+@Service
+public class QualitySuperviseDetailsServiceImpl extends ServiceImpl<QualitySuperviseDetailsMapper, QualitySuperviseDetails> implements QualitySuperviseDetailsService {
+
+}
+
diff --git a/cnas-process/src/main/java/com/ruoyi/process/service/impl/QualitySuperviseManagementReviewServiceImpl.java b/cnas-process/src/main/java/com/ruoyi/process/service/impl/QualitySuperviseManagementReviewServiceImpl.java
new file mode 100644
index 0000000..5b9a3f5
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/service/impl/QualitySuperviseManagementReviewServiceImpl.java
@@ -0,0 +1,86 @@
+package com.ruoyi.process.service.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.deepoove.poi.XWPFTemplate;
+import com.deepoove.poi.config.Configure;
+import com.deepoove.poi.config.ConfigureBuilder;
+import com.deepoove.poi.data.Pictures;
+import com.ruoyi.common.utils.QueryWrappers;
+import com.ruoyi.framework.exception.ErrorException;
+import com.ruoyi.process.dto.QualitySuperviseDetailsCorrectDto;
+import com.ruoyi.process.pojo.QualitySuperviseDetailsCorrect;
+import com.ruoyi.process.pojo.QualitySuperviseManagementReview;
+import com.ruoyi.process.mapper.QualitySuperviseManagementReviewMapper;
+import com.ruoyi.process.service.QualitySuperviseManagementReviewService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+
+import jakarta.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 2025-05-07 10:46:11
+ */
+@Service
+public class QualitySuperviseManagementReviewServiceImpl extends ServiceImpl<QualitySuperviseManagementReviewMapper, QualitySuperviseManagementReview> implements QualitySuperviseManagementReviewService {
+
+    /**
+     * 鍒嗛〉鏌ヨ
+     * @param page
+     * @param managementReview
+     * @return
+     */
+    @Override
+    public IPage<QualitySuperviseManagementReview> pageManagementReview(Page page, QualitySuperviseManagementReview managementReview) {
+        return baseMapper.pageManagementReview(page, QueryWrappers.queryWrappers(managementReview));
+    }
+
+    /**
+     * 瀵煎嚭
+     * @param managementReviewId
+     * @param response
+     */
+    @Override
+    public void exportManagementReview(Integer managementReviewId, HttpServletResponse response) {
+        QualitySuperviseManagementReview managementReview = baseMapper.selectById(managementReviewId);
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy骞碝M鏈坉d鏃�");
+
+        // 鑾峰彇璺緞
+        InputStream inputStream = this.getClass().getResourceAsStream("/static/supervise-management-eview.docx");
+        ConfigureBuilder builder = Configure.builder();
+        builder.useSpringEL(true);
+        XWPFTemplate template = XWPFTemplate.compile(inputStream, builder.build()).render(
+                new HashMap<String, Object>() {{
+                    put("managementReview", managementReview);
+                    put("superviseDateStr", managementReview.getSuperviseDate() == null ? null : managementReview.getSuperviseDate().format(formatter));
+                }});
+
+        try {
+            response.setContentType("application/msword");
+            String fileName = URLEncoder.encode(
+                    managementReview.getFileName(), "UTF-8");
+            response.setHeader("Content-disposition",
+                    "attachment;filename=" + fileName + ".docx");
+            OutputStream os = response.getOutputStream();
+            template.write(os);
+            os.flush();
+            os.close();
+            inputStream.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException("瀵煎嚭澶辫触");
+        }
+    }
+}
diff --git a/cnas-process/src/main/java/com/ruoyi/process/service/impl/QualitySuperviseServiceImpl.java b/cnas-process/src/main/java/com/ruoyi/process/service/impl/QualitySuperviseServiceImpl.java
new file mode 100644
index 0000000..e4d082e
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/service/impl/QualitySuperviseServiceImpl.java
@@ -0,0 +1,1267 @@
+package com.ruoyi.process.service.impl;
+
+import cn.hutool.core.util.StrUtil;
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.context.AnalysisContext;
+import com.alibaba.excel.event.AnalysisEventListener;
+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.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.config.ConfigureBuilder;
+import com.deepoove.poi.data.PictureRenderData;
+import com.deepoove.poi.data.Pictures;
+import com.ruoyi.common.constant.MenuJumpPathConstants;
+import com.ruoyi.common.core.domain.entity.InformationNotification;
+import com.ruoyi.common.core.domain.entity.User;
+import com.ruoyi.common.utils.DateImageUtil;
+import com.ruoyi.common.utils.QueryWrappers;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.common.utils.WxCpUtils;
+import com.ruoyi.device.pojo.DeviceExamineRecord;
+import com.ruoyi.framework.exception.ErrorException;
+import com.ruoyi.inspect.util.HackLoopTableRenderPolicy;
+import com.ruoyi.inspect.util.UserUtils;
+import com.ruoyi.process.dto.QualitySuperviseDetailsAccordingDto;
+import com.ruoyi.process.dto.QualitySuperviseDetailsCorrectDto;
+import com.ruoyi.process.dto.QualitySuperviseDetailsDto;
+import com.ruoyi.process.excel.QualitySuperviseDetailsUpload;
+import com.ruoyi.process.mapper.*;
+import com.ruoyi.process.pojo.*;
+import com.ruoyi.process.service.QualitySuperviseDetailsService;
+import com.ruoyi.process.service.QualitySuperviseService;
+import com.ruoyi.system.mapper.UserMapper;
+import com.ruoyi.system.service.InformationNotificationService;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.multipart.MultipartFile;
+
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletResponse;
+import java.io.File;
+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.YearMonth;
+import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 璐ㄩ噺鐩戠潱涓昏〃
+ *
+ * @author zhuo
+ * @since 2024-11-07
+ */
+@Service
+@Transactional(rollbackFor = Exception.class)
+public class QualitySuperviseServiceImpl extends ServiceImpl<QualitySuperviseMapper, QualitySupervise> implements QualitySuperviseService {
+
+    @Resource
+    private QualitySuperviseDetailsService qualitySuperviseDetailsService;
+    @Resource
+    private QualitySuperviseDetailsMapper qualitySuperviseDetailsMapper;
+    @Resource
+    private QualitySuperviseDetailsRecordMapper qualitySuperviseDetailsRecordMapper;
+    @Resource
+    private QualitySuperviseDetailsAccordingMapper qualitySuperviseDetailsAccordingMapper;
+    @Resource
+    private QualitySuperviseDetailsCorrectMapper qualitySuperviseDetailsCorrectMapper;
+    @Resource
+    private QualitySuperviseDetailsCorrectFileMapper qualitySuperviseDetailsCorrectFileMapper;
+    @Resource
+    private InformationNotificationService informationNotificationService;
+    @Resource
+    private ThreadPoolTaskExecutor threadPoolTaskExecutor;
+    @Resource
+    private UserMapper userMapper;
+    @Value("${file.path}")
+    private String imgUrl;
+
+    @Value("${wordUrl}")
+    private String wordUrl;
+
+    /**
+     * 瀵煎叆鐩戠潱璁″垝
+     * @param file
+     * @return
+     */
+    @Override
+    public boolean importQualitySupervise(MultipartFile file, QualitySupervise supervise) {
+        if (supervise.getRatifyUserId() == null) {
+            throw new ErrorException("缂哄皯鎵瑰噯浜�");
+        }
+        User ratifyUser = userMapper.selectById(supervise.getRatifyUserId());
+
+        // 褰撳墠鐧诲綍鐢ㄦ埛
+        Integer userId = SecurityUtils.getUserId().intValue();
+        User user = userMapper.selectById(userId);
+
+        // 鏂囦欢鍚嶇О
+        String fileName = file.getOriginalFilename().substring(0, file.getOriginalFilename().lastIndexOf("."));
+        QualitySupervise qualitySupervise = new QualitySupervise();
+        qualitySupervise.setSuperviseName(fileName);
+        qualitySupervise.setSuperviseYear(supervise.getSuperviseYear());
+        qualitySupervise.setRecordUserIds(supervise.getRecordUserIds());
+        qualitySupervise.setWriteUserId(userId);
+        qualitySupervise.setWriteUserName(user.getName());
+        qualitySupervise.setWriteTime(LocalDateTime.now());
+        qualitySupervise.setRatifyUserId(supervise.getRatifyUserId());
+        qualitySupervise.setRatifyUserName(ratifyUser.getName());
+        baseMapper.insert(qualitySupervise);
+
+        // 娑堟伅鍙戦��
+        InformationNotification info = new InformationNotification();
+        // 鍙戦�佷汉
+        info.setCreateUser(user.getName());
+        info.setMessageType("6");
+        info.setTheme("CNAS璐ㄩ噺鐩戠潱璁″垝瀹℃牳閫氱煡");
+        info.setContent("鎮ㄦ湁涓�鏉¤川閲忕洃鐫h鍒掑緟鎵瑰噯");
+        info.setSenderId(userId);
+        // 鎺ユ敹浜�
+        info.setConsigneeId(supervise.getRatifyUserId());
+        info.setJumpPath(MenuJumpPathConstants.QUALITY_SUPERVISE);
+        informationNotificationService.addInformationNotification(info);
+
+        // 鍙戦�佷紒涓氬井淇¢�氱煡
+        threadPoolTaskExecutor.execute(() -> {
+            // 鏌ヨ鍙戦�佷汉
+            User people = userMapper.selectById(supervise.getRatifyUserId());
+            String message = "";
+            message += "CNAS璐ㄩ噺鐩戠潱璁″垝鎵瑰噯閫氱煡";
+            message += "\n璇峰幓杩囩▼瑕佹眰-璐ㄩ噺鐩戠潱璁″垝";
+            message += "\n" + fileName + "璐ㄩ噺鐩戠潱璁″垝寰呮壒鍑�";
+            //鍙戦�佷紒涓氬井淇℃秷鎭�氱煡
+            try {
+                WxCpUtils.inform(people.getAccount(), message, null);
+            } catch (Exception e) {
+                throw new RuntimeException(e);
+            }
+        });
+
+
+        List<QualitySuperviseDetails> detailsUploadList = new ArrayList<>();
+
+        // 瀵煎叆闄勪欢鍐呭
+        try {
+            // excel瑙f瀽
+            EasyExcel.read(file.getInputStream(), QualitySuperviseDetailsUpload.class, new AnalysisEventListener<QualitySuperviseDetailsUpload>() {
+                @Override
+                public void invoke(QualitySuperviseDetailsUpload detailsUpload, AnalysisContext analysisContext) {
+                    // 鍒ゆ柇鏄惁涓虹┖
+                    if (StringUtils.isBlank(detailsUpload.getSuperviseTime())) {
+                        throw new ErrorException("鐩戠潱鏃ユ湡涓嶈兘涓虹┖");
+                    }
+                    // 瀵硅薄澶嶅埗
+                    QualitySuperviseDetails superviseDetails = new QualitySuperviseDetails();
+                    BeanUtils.copyProperties(detailsUpload, superviseDetails);
+                    superviseDetails.setSuperviseId(qualitySupervise.getSuperviseId());
+
+                    User user = userMapper.selectOne(Wrappers.<User>lambdaQuery()
+                            .eq(User::getName, superviseDetails.getSupervisee()));
+                    if (ObjectUtils.isEmpty(user)) {
+                        throw new ErrorException("鏈壘鍒拌鐩戠潱鍛橈細" + superviseDetails.getSupervisee());
+                    }
+                    superviseDetails.setSupervisedUserId(user.getId());
+                    // 鏍煎紡鍖栨椂闂�
+                    superviseDetails.setSuperviseTime(detailsUpload.getSuperviseTime());
+
+                    detailsUploadList.add(superviseDetails);
+                }
+
+                @Override
+                public void doAfterAllAnalysed(AnalysisContext analysisContext) {
+
+                }
+            }).sheet().doRead();
+            qualitySuperviseDetailsService.saveBatch(detailsUploadList);
+
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+        return true;
+    }
+
+    /**
+     * 鐩戠潱璁″垝鎵瑰噯
+     * @param qualitySupervise
+     * @return
+     */
+    @Override
+    public boolean ratifyQualitySupervise(QualitySupervise qualitySupervise) {
+        // 褰撳墠鐧诲綍鐢ㄦ埛
+        baseMapper.update(null, Wrappers.<QualitySupervise>lambdaUpdate()
+                .eq(QualitySupervise::getSuperviseId, qualitySupervise.getSuperviseId())
+                .set(QualitySupervise::getRatifyRemark, qualitySupervise.getRatifyRemark())
+                .set(QualitySupervise::getRatifyStatus, qualitySupervise.getRatifyStatus())
+                .set(QualitySupervise::getRatifyTime, LocalDateTime.now())
+        );
+        return true;
+    }
+
+    /**
+     * 鐩戠潱璁″垝鍒楄〃
+     * @param page
+     * @param qualitySupervise
+     * @return
+     */
+    @Override
+    public IPage<QualitySupervise> pageQualitySupervise(Page page, QualitySupervise qualitySupervise) {
+        return baseMapper.pageQualitySupervise(page, QueryWrappers.queryWrappers(qualitySupervise));
+    }
+
+    /**
+     * 鐩戠潱璁″垝璇︽儏鍒楄〃
+     * @return
+     */
+    @Override
+    public IPage<QualitySuperviseDetailsDto> pageQualitySuperviseDetail(Page page, QualitySuperviseDetailsDto qualitySuperviseDetails) {
+        if (qualitySuperviseDetails.getSuperviseId() == null) {
+            return new Page();
+        }
+        Integer causeType = qualitySuperviseDetails.getCauseType();
+        qualitySuperviseDetails.setCauseType(null);
+        return qualitySuperviseDetailsMapper.pageQualitySuperviseDetail(page, QueryWrappers.queryWrappers(qualitySuperviseDetails), causeType);
+    }
+
+    /**
+     * 鏌ヨ璇ヨ鍒掔洃鐫e憳
+     * @param superviseDetailsId
+     * @return
+     */
+    @Override
+    public List<Map<String, String>> getRecordUser(Integer superviseDetailsId) {
+        List<Map<String, String>> recordUser = baseMapper.getRecordUser(superviseDetailsId);
+        return baseMapper.getRecordUser(superviseDetailsId);
+    }
+
+    /**
+     * 瀵煎嚭鐩戠潱璁″垝
+     * @param superviseId
+     * @param response
+     */
+    @Override
+    public void exportQualitySupervise(Integer superviseId, HttpServletResponse response) {
+        QualitySupervise qualitySupervise = baseMapper.selectById(superviseId);
+        //鑾峰彇鎻愪氦浜虹殑绛惧悕鍦板潃
+        String writeUrl = userMapper.selectById(qualitySupervise.getWriteUserId()).getSignatureUrl();
+        if (ObjectUtils.isEmpty(writeUrl) || writeUrl.equals("")) {
+            throw new ErrorException("鎵句笉鍒版楠屼汉鐨勭鍚�");
+        }
+
+        //鑾峰彇鎵瑰噯浜虹殑绛惧悕鍦板潃
+        String ratifyUrl = null;
+        if (qualitySupervise.getRatifyUserId() != null) {
+            ratifyUrl = userMapper.selectById(qualitySupervise.getRatifyUserId()).getSignatureUrl();
+            if (StringUtils.isBlank(ratifyUrl)) {
+                throw new ErrorException("鎵句笉鍒板鏍镐汉鐨勭鍚�");
+            }
+        }
+
+        // 瀹氫箟涓�涓泦鍚堝瓨鏀句汉鍛樼鍚�
+        ArrayList<PictureRenderData> recordUserDataList = new ArrayList<>();
+        // TODO:纭鏈�澶氫細鏈�5涓汉
+        String recordUserIds = qualitySupervise.getRecordUserIds();
+        if (StringUtils.isNotBlank(recordUserIds)) {
+            // 瀵逛汉鍛榠d瀛楃涓茶繘琛屽垎鍓叉垚鏁扮粍
+            String[] userIds = recordUserIds.split(",");
+            // 寰幆鑾峰彇浜哄憳绛惧悕
+            for (String userIdStr : userIds) {
+                // 杞崲涓篿nt绫诲瀷
+                Integer userId = Integer.valueOf(userIdStr);
+                // 鑾峰彇浜哄憳绛惧悕瀵硅薄
+                PictureRenderData finalUserSignatureUrl = UserUtils.getFinalUserSignatureUrl(userId);
+                // 灏嗕汉鍛樼鍚嶅璞℃坊鍔犲埌闆嗗悎涓�
+                recordUserDataList.add(finalUserSignatureUrl);
+            }
+        }
+
+        // 鍒ゆ柇闆嗗悎闀垮害锛屽苟琛ull鍒�2涓�
+        while (recordUserDataList.size() < 2) {
+            recordUserDataList.add(null);
+        }
+
+        // 鏌ヨ璇︽儏
+        List<QualitySuperviseDetails> qualitySuperviseDetails = qualitySuperviseDetailsMapper.selectList(Wrappers.<QualitySuperviseDetails>lambdaQuery()
+                .eq(QualitySuperviseDetails::getSuperviseId, superviseId));
+
+        int index = 1;
+        for (QualitySuperviseDetails qualitySuperviseDetail : qualitySuperviseDetails) {
+            qualitySuperviseDetail.setIndex(index);
+            index++;
+        }
+
+        // 鑾峰彇璺緞
+        InputStream inputStream = this.getClass().getResourceAsStream("/static/quality-supervise.docx");
+        String finalRatifyUrl = ratifyUrl;
+        Configure configure = Configure.builder()
+                .bind("superviseDetailList", new HackLoopTableRenderPolicy())
+                .build();
+        XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
+                new HashMap<String, Object>() {{
+                    put("year", qualitySupervise.getSuperviseYear());
+                    put("superviseDetailList", qualitySuperviseDetails);
+                    put("writeUrl", StringUtils.isNotBlank(writeUrl) ? Pictures.ofLocal(imgUrl + "/" + writeUrl).create() : null);
+                    put("ratifyUrl", StringUtils.isNotBlank(finalRatifyUrl) ? Pictures.ofLocal(imgUrl + "/" + finalRatifyUrl).create() : null);
+                    put("writeDateUrl", qualitySupervise.getWriteTime() != null ?
+                            Pictures.ofStream(DateImageUtil.createDateImage(qualitySupervise.getWriteTime())).create() : null);
+                    put("ratifyDateUrl", qualitySupervise.getRatifyTime() != null ?
+                            Pictures.ofStream(DateImageUtil.createDateImage(qualitySupervise.getRatifyTime())).create() : null);
+                    put("recordUserUrl1", recordUserDataList.get(0));
+                    put("recordUserUrl2", recordUserDataList.get(1));
+                }});
+
+        try {
+            response.setContentType("application/msword");
+            String fileName = URLEncoder.encode(
+                    qualitySupervise.getSuperviseName(), "UTF-8");
+            response.setHeader("Content-disposition",
+                    "attachment;filename=" + fileName + ".docx");
+            OutputStream os = response.getOutputStream();
+            template.write(os);
+            os.flush();
+            os.close();
+            inputStream.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException("瀵煎嚭澶辫触");
+        }
+
+
+    }
+
+    /************************************************ 璁板綍 ******************************************************/
+
+    /**
+     * 鏌ヨ鐩戠潱璁板綍淇℃伅
+     * @param superviseDetailsId
+     * @return
+     */
+    @Override
+    public QualitySuperviseDetailsRecord getSuperviseDetailRecord(Integer superviseDetailsId) {
+        QualitySuperviseDetailsRecord detailsRecord;
+        detailsRecord = qualitySuperviseDetailsRecordMapper.selectOne(Wrappers.<QualitySuperviseDetailsRecord>lambdaQuery()
+                .eq(QualitySuperviseDetailsRecord::getSuperviseDetailsId, superviseDetailsId));
+
+        // 鏌ヨ涓婁竴涓湀绗竴鏉$殑璁板綍淇℃伅, 鍒ゆ柇琚洃鐫d汉鍘诲彟澶栦竴涓�
+        if (detailsRecord == null) {
+            // 鏌ヨ璇︽儏淇℃伅
+            QualitySuperviseDetails qualitySuperviseDetails = qualitySuperviseDetailsMapper.selectById(superviseDetailsId);
+            // 鏌ヨ涓婁竴涓湀绗竴鏉$殑璁板綍淇℃伅, 鍒ゆ柇琚洃鐫d汉鍘诲彟澶栦竴涓�
+            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy.M");
+            YearMonth yearMonth = YearMonth.parse(qualitySuperviseDetails.getSuperviseTime(), formatter);
+            YearMonth previousYearMonth = yearMonth.minusMonths(1);
+
+            LocalDate startDate = previousYearMonth.atDay(1);
+            LocalDate endDate = previousYearMonth.atEndOfMonth();
+
+            LocalDateTime startDateTime = startDate.atStartOfDay();
+            LocalDateTime endDateTime = endDate.atTime(23, 59, 59);
+
+            DateTimeFormatter outputFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+
+            // 鑾峰彇寮�濮嬫椂闂村拰缁撴潫鏃堕棿
+            String startDateTimeStr = startDateTime.format(outputFormatter);
+            String endDateTimeStr = endDateTime.format(outputFormatter);
+
+            QualitySuperviseDetailsRecord laseRecord = qualitySuperviseDetailsRecordMapper.selectOne(Wrappers.<QualitySuperviseDetailsRecord>lambdaQuery()
+                    .between(QualitySuperviseDetailsRecord::getCreateTime, startDateTimeStr, endDateTimeStr)
+                    .isNotNull(QualitySuperviseDetailsRecord::getSupervisor)
+                    .last("limit 1"));
+
+            String supervisor = null;
+
+            if (laseRecord != null) {
+                // 鏌ヨ璁″垝鑾峰彇鍙︿竴涓洃鐫e憳
+                QualitySupervise qualitySupervise = baseMapper.selectById(qualitySuperviseDetails.getSuperviseId());
+                if (StringUtils.isNotBlank(qualitySupervise.getRecordUserIds())) {
+                    List<String> recordUserIds = StrUtil.split(qualitySupervise.getRecordUserIds(), ',');
+                    List<User> users = userMapper.selectList(Wrappers.<User>lambdaQuery()
+                            .in(User::getId, recordUserIds));
+                    if (CollectionUtils.isNotEmpty(users) && users.size() == 2) {
+                        // 鍒ゆ柇鏄惁涓�鏍�, 涓�鏍疯幏鍙栧彟澶栦竴涓�
+                        if (users.get(0).getName().equals(laseRecord.getSupervisor())) {
+                            supervisor = users.get(1).getName();
+                        } else {
+                            supervisor = users.get(0).getName();
+                        }
+
+                    }
+                }
+            }
+
+            detailsRecord = new QualitySuperviseDetailsRecord();
+            detailsRecord.setSuperviseDetailsId(superviseDetailsId);
+            detailsRecord.setTestMember(qualitySuperviseDetails.getSupervisee());
+            detailsRecord.setSupervisor(supervisor);
+
+            detailsRecord.setPersonnel(SecurityUtils.getLoginUser().getUser().getNickName() + "鏈夌浉搴旀娴嬪憳鐨勪笂宀楄瘉");
+            detailsRecord.setEnvironment("娓╁害锛�()鈩� 婀垮害锛�()%");
+            detailsRecord.setInspectionRecord("妫�娴嬩汉鍛�" + SecurityUtils.getLoginUser().getUser().getNickName() + "杩涜妫�娴嬭褰曪紝璁板綍鍐呭鐪熷疄鏈夋晥");
+            detailsRecord.setExaminingReport("鐢�" + SecurityUtils.getLoginUser().getUser().getNickName() + "鍑虹ず鐨勬娴嬫姤鍛婄鍚堣鑼冭姹�");
+            detailsRecord.setSupervisionEvaluation("妫�娴嬫寜鐓ц姹傝繘琛岋紝鍒ゅ畾涓烘弧鎰�");
+            detailsRecord.setHandlingAdvice("/");
+
+        }
+        // 娣诲姞鎵瑰噯浜哄悕绉�
+        if (detailsRecord.getRatifyUserId() != null) {
+            User user = userMapper.selectById(detailsRecord.getRatifyUserId());
+            detailsRecord.setRatifyUserName(user.getName());
+        }
+        return detailsRecord;
+    }
+
+    /**
+     * 鏂板鐩戠潱璁板綍淇℃伅
+     * @param qualitySuperviseDetailsRecord
+     * @return
+     */
+    @Override
+    public boolean addSuperviseDetailRecord(QualitySuperviseDetailsRecord qualitySuperviseDetailsRecord) {
+        if (qualitySuperviseDetailsRecord.getSuperviseDetailsId() == null) {
+            throw new ErrorException("缂哄皯鐩戠潱璇︾粏淇℃伅id");
+        }
+        if (qualitySuperviseDetailsRecord.getSuperviseDetailsRecordId() == null) {
+            qualitySuperviseDetailsRecordMapper.insert(qualitySuperviseDetailsRecord);
+        } else {
+            qualitySuperviseDetailsRecordMapper.updateById(qualitySuperviseDetailsRecord);
+        }
+
+        if (qualitySuperviseDetailsRecord.getRatifyUserId() != null) {
+
+            // 鏌ヨ璇︽儏淇℃伅
+            QualitySuperviseDetails superviseDetails = qualitySuperviseDetailsMapper.selectById(qualitySuperviseDetailsRecord.getSuperviseDetailsId());
+
+            Integer userId = SecurityUtils.getUserId().intValue();
+            User user = userMapper.selectById(userId);
+            // 娑堟伅鍙戦��
+            InformationNotification info = new InformationNotification();
+            // 鍙戦�佷汉
+            info.setCreateUser(user.getName());
+            info.setMessageType("6");
+            info.setTheme("CNAS璐ㄩ噺鐩戠潱璁板綍瀹℃壒閫氱煡");
+            info.setContent("鐩戠潱椤圭洰涓�: " + superviseDetails.getSuperviseProject() + " 鐩戠潱璁板綍寰呭鎵�");
+            info.setSenderId(userId);
+            // 鎺ユ敹浜�
+            info.setConsigneeId(qualitySuperviseDetailsRecord.getRatifyUserId());
+            info.setJumpPath(MenuJumpPathConstants.QUALITY_SUPERVISE);
+            informationNotificationService.addInformationNotification(info);
+
+            // 鍙戦�佷紒涓氬井淇¢�氱煡
+            threadPoolTaskExecutor.execute(() -> {
+                // 鏌ヨ鍙戦�佷汉
+                User people = userMapper.selectById(qualitySuperviseDetailsRecord.getRatifyUserId());
+                String message = "";
+                message += "CNAS璐ㄩ噺鐩戠潱璁板綍瀹℃壒閫氱煡";
+                message += "\n璇峰幓杩囩▼瑕佹眰-璐ㄩ噺鐩戠潱璁″垝";
+                message += "\n" + "鐩戠潱椤圭洰涓�: " + superviseDetails.getSuperviseProject() + " 鐩戠潱璁板綍寰呭鎵�";
+                //鍙戦�佷紒涓氬井淇℃秷鎭�氱煡
+                try {
+                    WxCpUtils.inform(people.getAccount(), message, null);
+                } catch (Exception e) {
+                    throw new RuntimeException(e);
+                }
+            });
+        }
+        // 娓呯┖鐘舵��
+        qualitySuperviseDetailsRecordMapper.update(null, Wrappers.<QualitySuperviseDetailsRecord>lambdaUpdate()
+                .eq(QualitySuperviseDetailsRecord::getSuperviseDetailsRecordId, qualitySuperviseDetailsRecord.getSuperviseDetailsRecordId())
+                .set(QualitySuperviseDetailsRecord::getIsFinish, null));
+
+        return true;
+    }
+
+    /**
+     * 鐩戠潱璁板綍鎵瑰噯
+     * @param qualitySuperviseDetailsRecord
+     * @return
+     */
+    @Override
+    public boolean addSuperviseRecordOpinion(QualitySuperviseDetailsRecord qualitySuperviseDetailsRecord) {
+        if (qualitySuperviseDetailsRecord.getIsFinish() == null) {
+            throw new RuntimeException("缂哄皯璁板綍缁撴灉鐘舵��");
+        }
+
+        LambdaUpdateWrapper<QualitySuperviseDetailsRecord> wrapper = Wrappers.<QualitySuperviseDetailsRecord>lambdaUpdate()
+                .eq(QualitySuperviseDetailsRecord::getSuperviseDetailsId, qualitySuperviseDetailsRecord.getSuperviseDetailsId())
+                .set(QualitySuperviseDetailsRecord::getRatifyOpinion, qualitySuperviseDetailsRecord.getRatifyOpinion())
+                .set(QualitySuperviseDetailsRecord::getIsAccording, qualitySuperviseDetailsRecord.getIsAccording())
+                .set(QualitySuperviseDetailsRecord::getIsFinish, qualitySuperviseDetailsRecord.getIsFinish());
+
+        // 涓�0娓呴櫎瀹℃牳浜�
+        if (qualitySuperviseDetailsRecord.getIsFinish().equals(0)) {
+            wrapper.set(QualitySuperviseDetailsRecord::getRatifyUserId, null)
+                    .set(QualitySuperviseDetailsRecord::getRatifyTime, null);
+        } else {
+            wrapper.set(QualitySuperviseDetailsRecord::getRatifyTime, LocalDateTime.now());
+        }
+
+        qualitySuperviseDetailsRecordMapper.update(null, wrapper);
+
+
+        return true;
+    }
+
+    /**
+     * 瀵煎嚭鐩戠潱璁板綍琛�
+     * @param superviseDetailsId
+     * @param response
+     */
+    @Override
+    public void exportSuperviseDetailRecord(Integer superviseDetailsId, HttpServletResponse response) {
+        QualitySuperviseDetailsRecord recordDto = qualitySuperviseDetailsRecordMapper.selectSuperviseDetailRecord(superviseDetailsId);
+
+        // 鏌ヨ妫�娴嬩汉鍛�
+        User tserUser = new User();
+        if (StringUtils.isNotBlank(recordDto.getTestMember())) {
+            tserUser = userMapper.selectOne(Wrappers.<User>lambdaQuery()
+                    .eq(User::getName, recordDto.getTestMember())
+                    .last("limit 1"));
+        }
+
+        // 鑾峰彇璺緞
+        InputStream inputStream = this.getClass().getResourceAsStream("/static/supervision-detail-record.docx");
+        ConfigureBuilder builder = Configure.builder();
+        builder.useSpringEL(true);
+        User finalTserUser = tserUser;
+        XWPFTemplate template = XWPFTemplate.compile(inputStream, builder.build()).render(
+                new HashMap<String, Object>() {{
+                    put("supervision", recordDto);
+                    put("testMemberUrl", UserUtils.getFinalUserSignatureUrl(finalTserUser.getId()));
+                    put("supervisoruUrl", UserUtils.getFinalUserSignatureUrl(recordDto.getSupervisor()));
+                    put("technicalDirectorUrl", UserUtils.getFinalUserSignatureUrl(recordDto.getRatifyUserId()));
+                    put("technicalDirectorDateUrl", recordDto.getRatifyTime() != null ?
+                            Pictures.ofStream(DateImageUtil.createDateImage(recordDto.getRatifyTime())).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();
+            inputStream.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException("瀵煎嚭澶辫触");
+        }
+    }
+
+    /*************************************************  涓嶅悎鏍煎伐浣滄帶鍒跺崟 ********************************************************/
+
+    /**
+     * 鏂板鐩戠潱璁板綍涓嶇鍚堟帶鍒朵俊鎭�
+     * @param detailsAccording
+     * @return
+     */
+    @Override
+    public boolean addSuperviseDetailAccording(QualitySuperviseDetailsAccording detailsAccording) {
+        QualitySuperviseDetailsAccording according = new QualitySuperviseDetailsAccording();
+        // 褰撳墠鐧诲綍鐢ㄦ埛淇℃伅鍜岄儴闂�
+        User user = userMapper.selectById(SecurityUtils.getUserId().intValue());
+        String departmentLimsName = userMapper.selectUserDepartmentLimsName(user.getId());
+        switch (detailsAccording.getFlowType()) {
+            // 涓嶇鍚堝伐浣滄儏鍐佃褰�
+            case 0:
+                if (detailsAccording.getSuperviseDetailsId() == null) {
+                    throw new ErrorException("缂哄皯璐ㄩ噺鐩戠潱璇︽儏Id");
+                }
+                according.setSuperviseDetailsId(detailsAccording.getSuperviseDetailsId());
+                according.setOccurrenceDepartment(detailsAccording.getOccurrenceDepartment());//鍙戠敓閮ㄩ棬
+                according.setHeadDepartment(detailsAccording.getHeadDepartment());//閮ㄩ棬璐熻矗浜�
+                according.setFindWay(detailsAccording.getFindWay());//鍙戠幇閫斿緞
+                according.setRecordDetail(detailsAccording.getRecordDetail());//涓嶇鍚堣褰曡缁�
+                according.setRecordAccording(detailsAccording.getRecordAccording());//涓嶅悎鏍艰褰曚緷鎹�
+
+                according.setFoundDepartment(departmentLimsName);//鍙戠幇閮ㄩ棬
+                according.setRecordUserId(user.getId());//璁板綍浜篿d
+                according.setRecordUserName(user.getName());//璁板綍浜�
+                according.setRecordTime(LocalDate.now());//璁板綍鏃堕棿
+
+                // 澶勭悊浜轰俊鎭�
+                User actionsUser = userMapper.selectById(detailsAccording.getActionsUserId());
+                String actionsDepartmentLims = userMapper.selectUserDepartmentLimsName(actionsUser.getId());
+
+                according.setResponsibleDepartment(actionsDepartmentLims);//璐d换閮ㄩ棬
+                according.setActionsUserId(actionsUser.getId());//澶勭悊浜篿d
+                according.setActionsUserName(actionsUser.getName());//澶勭悊浜�
+
+                according.setSupervisedUserId(detailsAccording.getSupervisedUserId());//琚洃鐫d汉id
+                // 琚洃鐫d汉
+                User supervisedUser = userMapper.selectById(detailsAccording.getSupervisedUserId());
+                according.setSupervisedUserName(supervisedUser.getName());//琚洃鐫d汉
+                according.setActionsTime(detailsAccording.getSupervisedTime());//琚洃鐫f椂闂�
+                qualitySuperviseDetailsAccordingMapper.insert(according);
+                break;
+
+            // 1澶勭悊鎺柦
+            case 1:
+                according.setSuperviseDetailsAccordingId(detailsAccording.getSuperviseDetailsAccordingId());
+                according.setEliminateMeasure(detailsAccording.getEliminateMeasure());//娓呴櫎涓嶇鍚堟帾鏂�
+                according.setActionsTime(LocalDate.now());//澶勭悊鏃堕棿
+
+                // 绾犳璐熻矗浜轰俊鎭�
+                User correctsUser = userMapper.selectById(detailsAccording.getCorrectUserId());
+
+                according.setCorrectUserId(correctsUser.getId());//绾犳璐熻矗浜篿d
+                according.setCorrectUserName(correctsUser.getName());//绾犳璐熻矗浜�
+
+                qualitySuperviseDetailsAccordingMapper.updateById(according);
+                break;
+
+            // 绾犳鎺柦
+            case 2:
+                according.setSuperviseDetailsAccordingId(detailsAccording.getSuperviseDetailsAccordingId());
+                according.setCorrectContent(detailsAccording.getCorrectContent());//绾犳鎺柦鍐呭
+                according.setIsCorrect(detailsAccording.getIsCorrect());//鏄惁绾犳澶勭悊
+                according.setCorrectTime(LocalDate.now());//绾犳濉啓鏃堕棿
+
+                // 璐ㄩ噺璐熻矗浜�
+                User qualityUser = userMapper.selectById(detailsAccording.getQualityManagerUserId());
+                according.setQualityManagerUserId(qualityUser.getId());//璐ㄩ噺璐熻矗浜篿d
+                according.setQualityManagerUserName(qualityUser.getName());//璐ㄩ噺璐熻矗浜�
+
+                qualitySuperviseDetailsAccordingMapper.updateById(according);
+                break;
+
+            //鏄惁閫氱煡瀹㈡埛鍙仮澶嶅伐浣�
+            case 3:
+                according.setSuperviseDetailsAccordingId(detailsAccording.getSuperviseDetailsAccordingId());
+                according.setNotifyCustomer(detailsAccording.getNotifyCustomer());//閫氱煡瀹㈡埛
+                according.setBackToWork(detailsAccording.getBackToWork());//鍥炲宸ヤ綔
+
+                according.setQualityManagerTime(LocalDate.now());//鏃ユ湡
+                according.setIsFinish(1);
+                qualitySuperviseDetailsAccordingMapper.updateById(according);
+                break;
+        }
+        return true;
+    }
+
+    /**
+     * (瑁呭娴佺▼)鏂板鐩戠潱璁板綍涓嶇鍚堟帶鍒朵俊鎭�
+     * @param detailsAccording
+     * @return
+     */
+    @Override
+    public boolean addEquipSuperviseDetailAccording(QualitySuperviseDetailsAccording detailsAccording) {
+        if (detailsAccording.getSuperviseDetailsId() == null) {
+            throw new ErrorException("缂哄皯璐ㄩ噺鐩戠潱璇︽儏Id");
+        }
+
+        // 褰撳墠鐧诲綍鐢ㄦ埛淇℃伅鍜岄儴闂�
+        Integer userId = SecurityUtils.getUserId().intValue();
+        User user = userMapper.selectById(userId);
+        String departmentLimsName = userMapper.selectUserDepartmentLimsName(user.getId());
+        detailsAccording.setFoundDepartment(departmentLimsName);//鍙戠幇閮ㄩ棬
+        detailsAccording.setRecordUserId(user.getId());//璁板綍浜篿d
+        detailsAccording.setRecordUserName(user.getName());//璁板綍浜�
+        // 琚洃鐫d汉
+        User supervisedUser = userMapper.selectById(detailsAccording.getSupervisedUserId());
+        detailsAccording.setSupervisedUserName(supervisedUser.getName());//琚洃鐫�
+
+        if (detailsAccording.getSuperviseDetailsAccordingId() == null) {
+            qualitySuperviseDetailsAccordingMapper.insert(detailsAccording);
+        } else {
+            qualitySuperviseDetailsAccordingMapper.updateById(detailsAccording);
+        }
+
+        if (detailsAccording.getApproverUserId() != null) {
+            // 鏌ヨ璇︽儏淇℃伅
+            QualitySuperviseDetails superviseDetails = qualitySuperviseDetailsMapper.selectById(detailsAccording.getSuperviseDetailsId());
+
+            // 娑堟伅鍙戦��
+            InformationNotification info = new InformationNotification();
+            // 鍙戦�佷汉
+            info.setCreateUser(user.getName());
+            info.setMessageType("6");
+            info.setTheme("CNAS璐ㄩ噺鐩戠潱涓嶅悎鏍兼帶鍒跺崟濉啓閫氱煡");
+            info.setContent("鐩戠潱椤圭洰涓�: " + superviseDetails.getSuperviseProject() + " 鐩戠潱涓嶅悎鏍兼帶鍒跺崟寰呭~鍐�");
+            info.setSenderId(userId);
+            // 鎺ユ敹浜�
+            info.setConsigneeId(detailsAccording.getApproverUserId());
+            info.setJumpPath(MenuJumpPathConstants.QUALITY_SUPERVISE);
+            informationNotificationService.addInformationNotification(info);
+
+            // 鍙戦�佷紒涓氬井淇¢�氱煡
+            threadPoolTaskExecutor.execute(() -> {
+                // 鏌ヨ鍙戦�佷汉
+                User people = userMapper.selectById(detailsAccording.getApproverUserId());
+                String message = "";
+                message += "CNAS璐ㄩ噺鐩戠潱璁板綍瀹℃壒閫氱煡";
+                message += "\n璇峰幓杩囩▼瑕佹眰-璐ㄩ噺鐩戠潱璁″垝";
+                message += "\n" + "鐩戠潱椤圭洰涓�: " + superviseDetails.getSuperviseProject() + " 鐩戠潱涓嶅悎鏍兼帶鍒跺崟寰呭~鍐�";
+                //鍙戦�佷紒涓氬井淇℃秷鎭�氱煡
+                try {
+                    WxCpUtils.inform(people.getAccount(), message, null);
+                } catch (Exception e) {
+                    throw new RuntimeException(e);
+                }
+            });
+        }
+
+        // 娓呯┖鐘舵��
+        qualitySuperviseDetailsAccordingMapper.update(null, Wrappers.<QualitySuperviseDetailsAccording>lambdaUpdate()
+                .eq(QualitySuperviseDetailsAccording::getSuperviseDetailsAccordingId, detailsAccording.getSuperviseDetailsAccordingId())
+                .set(QualitySuperviseDetailsAccording::getIsFinish, null));
+
+        return true;
+    }
+
+    /**
+     * (瑁呭娴佺▼)鎵瑰噯鐩戠潱璁板綍涓嶇鍚堟帶鍒朵俊鎭�
+     * 鎵瑰噯瀹屾垚鍚庣粺涓�濉啓涓変釜娴佺▼浜篿d鍜岄儴闂�
+     * @param detailsAccording
+     * @return
+     */
+    @Override
+    public boolean approverEquipSuperviseDetailAccording(QualitySuperviseDetailsAccording detailsAccording) {
+        if (detailsAccording.getIsFinish() == null) {
+            throw new RuntimeException("缂哄皯鎵瑰噯鐘舵��");
+        }
+
+        QualitySuperviseDetailsAccording according = new QualitySuperviseDetailsAccording();
+        according.setSuperviseDetailsAccordingId(detailsAccording.getSuperviseDetailsAccordingId());
+
+        if (detailsAccording.getIsFinish().equals(1)) {
+            // 褰撳墠鐧诲綍鐢ㄦ埛淇℃伅鍜岄儴闂�
+            User user = userMapper.selectById(SecurityUtils.getUserId().intValue());
+            String departmentLimsName = userMapper.selectUserDepartmentLimsName(user.getId());
+
+            according.setResponsibleDepartment(departmentLimsName);//璐d换閮ㄩ棬
+            according.setActionsUserId(user.getId());//澶勭悊浜篿d
+            according.setActionsUserName(user.getName());//澶勭悊浜�
+
+            according.setCorrectUserId(user.getId());//绾犳璐熻矗浜篿d
+            according.setCorrectUserName(user.getName());//绾犳璐熻矗浜�
+
+            according.setQualityManagerUserId(user.getId());//璐ㄩ噺璐熻矗浜篿d
+            according.setQualityManagerUserName(user.getName());//璐ㄩ噺璐熻矗浜�
+        } else {
+            qualitySuperviseDetailsAccordingMapper.update(null, Wrappers.<QualitySuperviseDetailsAccording>lambdaUpdate()
+                    .eq(QualitySuperviseDetailsAccording::getSuperviseDetailsAccordingId, detailsAccording.getSuperviseDetailsAccordingId())
+                    .set(QualitySuperviseDetailsAccording::getResponsibleDepartment, null)
+                    .set(QualitySuperviseDetailsAccording::getActionsUserId, null)
+                    .set(QualitySuperviseDetailsAccording::getActionsUserName, null)
+                    .set(QualitySuperviseDetailsAccording::getCorrectUserId, null)
+                    .set(QualitySuperviseDetailsAccording::getCorrectUserName, null)
+                    .set(QualitySuperviseDetailsAccording::getQualityManagerUserId, null)
+                    .set(QualitySuperviseDetailsAccording::getQualityManagerUserName, null)
+                    .set(QualitySuperviseDetailsAccording::getApproverUserId, null));
+        }
+
+        according.setIsFinish(detailsAccording.getIsFinish());
+        qualitySuperviseDetailsAccordingMapper.updateById(according);
+        return true;
+    }
+
+    /**
+     * 鏌ヨ鐩戠潱璁板綍涓嶇鍚堟帶鍒朵俊鎭�
+     * @param superviseDetailsId
+     * @return
+     */
+    @Override
+    public QualitySuperviseDetailsAccording getSuperviseDetailAccording(Integer superviseDetailsId) {
+        QualitySuperviseDetailsAccording detailsAccording;
+
+        detailsAccording = qualitySuperviseDetailsAccordingMapper.selectOne(Wrappers.<QualitySuperviseDetailsAccording>lambdaQuery()
+                .eq(QualitySuperviseDetailsAccording::getSuperviseDetailsId, superviseDetailsId));
+
+        if (detailsAccording == null) {
+            detailsAccording = new QualitySuperviseDetailsAccording();
+            // 鏌ヨ鐩戠潱璁″垝璇︽儏
+            QualitySuperviseDetails superviseDetails = qualitySuperviseDetailsMapper.selectById(superviseDetailsId);
+            superviseDetails.setSuperviseDetailsId(superviseDetailsId);
+            detailsAccording.setSupervisedUserId(superviseDetails.getSupervisedUserId());
+            detailsAccording.setSupervisedUserName(superviseDetails.getSupervisee());
+        }
+        return detailsAccording;
+    }
+
+    /**
+     * 鏌ヨ涓嶇鍚堥」
+     * @param page
+     * @param detailsAccording
+     * @return
+     */
+    @Override
+    public IPage<QualitySuperviseDetailsAccording> pageSuperviseDetailAccording(Page page, QualitySuperviseDetailsAccording detailsAccording) {
+        return qualitySuperviseDetailsAccordingMapper.pageSuperviseDetailAccording(page, QueryWrappers.queryWrappers(detailsAccording));
+    }
+
+    /**
+     * 瀵煎嚭鐩戠潱璁板綍涓嶇鍚堟帶鍒朵俊鎭�
+     * @param superviseDetailAccordingId
+     * @param response
+     */
+    @Override
+    public void superviseDetailAccordingExport(Integer superviseDetailAccordingId, HttpServletResponse response) {
+        QualitySuperviseDetailsAccordingDto exportDto = qualitySuperviseDetailsAccordingMapper.selectSuperviseDetailsAccording(superviseDetailAccordingId);
+        // 鍙戠幇閮ㄩ棬
+        String discovererUrl = null;
+        if (exportDto.getRecordUserId() != null) {
+            discovererUrl = userMapper.selectById(exportDto.getRecordUserId()).getSignatureUrl();
+            if (StringUtils.isBlank(discovererUrl)) {
+                throw new ErrorException("鎵句笉鍒板彂鐜伴儴闂ㄤ汉鐨勭鍚�");
+            }
+        }
+
+        // 澶勭悊鎺柦璐熻矗浜�
+        String responsibleUrl = null;
+        if (exportDto.getCorrectUserId() != null) {
+            responsibleUrl = userMapper.selectById(exportDto.getCorrectUserId()).getSignatureUrl();
+            if (StringUtils.isBlank(responsibleUrl)) {
+                throw new ErrorException("鎵句笉鍒板鐞嗘帾鏂借礋璐d汉鐨勭鍚�");
+            }
+        }
+
+        // 鎶�鏈礋璐d汉
+        String correctiveUrl = null;
+        if (exportDto.getQualityManagerUserId() != null) {
+            correctiveUrl = userMapper.selectById(exportDto.getQualityManagerUserId()).getSignatureUrl();
+            if (StringUtils.isBlank(correctiveUrl)) {
+                throw new ErrorException("鎵句笉鍒版妧鏈礋璐d汉鐨勭鍚�");
+            }
+        }
+
+        // 璐ㄩ噺璐熻矗浜�
+        String qualityUrl = null;
+        if (exportDto.getQualityManagerUserId() != null) {
+            qualityUrl = userMapper.selectById(exportDto.getQualityManagerUserId()).getSignatureUrl();
+            if (StringUtils.isBlank(qualityUrl)) {
+                throw new ErrorException("鎵句笉鍒拌川閲忚礋璐d汉鐨勭鍚�");
+            }
+        }
+
+        // 鑾峰彇璺緞
+        InputStream inputStream = this.getClass().getResourceAsStream("/static/supervision-detail-according.docx");
+        ConfigureBuilder builder = Configure.builder();
+        String finalDiscovererUrl = discovererUrl;
+        String finalResponsibleUrl = responsibleUrl;
+        String finalCorrectiveUrl = correctiveUrl;
+        String finalQualityUrl = qualityUrl;
+        XWPFTemplate template = XWPFTemplate.compile(inputStream, builder.build()).render(
+                new HashMap<String, Object>() {{
+                    put("control", exportDto);
+                    put("discovererUrl", StringUtils.isNotBlank(finalDiscovererUrl) ? Pictures.ofLocal(imgUrl + "/" + finalDiscovererUrl).create() : null);
+                    put("responsibleUrl", StringUtils.isNotBlank(finalResponsibleUrl) ? Pictures.ofLocal(imgUrl + "/" + finalResponsibleUrl).create() : null);
+                    put("correctiveUrl", StringUtils.isNotBlank(finalCorrectiveUrl) ? Pictures.ofLocal(imgUrl + "/" + finalCorrectiveUrl).create() : null);
+                    put("qualityUrl", StringUtils.isNotBlank(finalQualityUrl) ? Pictures.ofLocal(imgUrl + "/" + finalQualityUrl).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();
+            inputStream.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException("瀵煎嚭澶辫触");
+        }
+    }
+
+    /*************************************************  绾犳鎺柦澶勭悊鍗� ********************************************************/
+
+
+    @Override
+    public boolean addSuperviseDetailCorrect(QualitySuperviseDetailsCorrect detailsCorrect) {
+        QualitySuperviseDetailsCorrect correct = new QualitySuperviseDetailsCorrect();
+        // 褰撳墠鐧诲綍鐢ㄦ埛淇℃伅鍜岄儴闂�
+        User user = userMapper.selectById(SecurityUtils.getUserId().intValue());
+        String departmentLimsName = userMapper.selectUserDepartmentLimsName(user.getId());
+
+        switch (detailsCorrect.getFlowType()) {
+            // 涓嶅悎鏍兼彁鍑�
+            case 0:
+                if (detailsCorrect.getSuperviseDetailsId() == null) {
+                    throw new ErrorException("缂哄皯璐ㄩ噺鐩戠潱璇︽儏Id");
+                }
+                correct.setSuperviseDetailsId(detailsCorrect.getSuperviseDetailsId());
+                correct.setRaiseResult(detailsCorrect.getRaiseResult());//涓嶅悎鏍艰〃杩�
+                correct.setVdeRaiseResult(detailsCorrect.getVdeRaiseResult());//vde涓撳鍙戠幇
+                correct.setRaiseDepartment(departmentLimsName);//鎻愬嚭閮ㄩ棬
+                correct.setRaiseUserId(user.getId());//鎻愬嚭浜篿d
+                correct.setRaiseUserName(user.getName());// 鎻愬嚭浜�
+                correct.setRaiseTime(LocalDate.now());// 鎻愬嚭鏃堕棿
+
+                // 鍘熷洜鍒嗘瀽浜轰俊鎭�
+                User causeUser = userMapper.selectById(detailsCorrect.getCauseUserId());
+                String causeDepartmentLims = userMapper.selectUserDepartmentLimsName(causeUser.getId());
+
+                correct.setCauseDepartment(causeDepartmentLims);//鍘熷洜鍒嗘瀽璐d换閮ㄩ棬
+                correct.setCauseUserId(causeUser.getId());//1鍘熷洜鍒嗘瀽浜篿d
+                correct.setCauseUserName(causeUser.getName());// 1鍘熷洜鍒嗘瀽浜�
+                qualitySuperviseDetailsCorrectMapper.insert(correct);
+
+                break;
+
+            // 鍘熷洜鍒嗘瀽
+            case 1:
+                correct.setSuperviseDetailsCorrectId(detailsCorrect.getSuperviseDetailsCorrectId());
+                correct.setCauseResult(detailsCorrect.getCauseResult());//鍘熷洜鍒嗘瀽
+                correct.setCauseTime(LocalDate.now());// 1鍘熷洜鍒嗘瀽鏃堕棿
+
+                // 绾犳浜轰俊鎭�
+                User correctUser = userMapper.selectById(detailsCorrect.getCorrectUserId());
+                String correctUserDepartmentLims = userMapper.selectUserDepartmentLimsName(correctUser.getId());
+
+                correct.setCorrectDepartment(correctUserDepartmentLims);//2绾犳璐d换閮ㄩ棬
+                correct.setCorrectUserId(correctUser.getId());//2绾犳浜篿d
+                correct.setCorrectUserName(correctUser.getName());// 2绾犳浜�
+                qualitySuperviseDetailsCorrectMapper.updateById(correct);
+                break;
+
+            // 绾犳鎺柦
+            case 2:
+                correct.setSuperviseDetailsCorrectId(detailsCorrect.getSuperviseDetailsCorrectId());
+                correct.setCorrectResult(detailsCorrect.getCorrectResult());//2绾犳鎺柦
+                correct.setRaiseDepartmentAffirm(detailsCorrect.getRaiseDepartmentAffirm());//2鎻愬嚭閮ㄩ棬纭
+                correct.setCorrectTime(LocalDate.now());// 2绾犳鏃堕棿
+
+                // 楠岃瘉浜轰俊鎭�
+                User validationUser = userMapper.selectById(detailsCorrect.getValidationUserId());
+                String validationUserDepartmentLims = userMapper.selectUserDepartmentLimsName(validationUser.getId());
+
+                correct.setValidationDepartment(validationUserDepartmentLims);//3楠岃瘉閮ㄩ棬
+                correct.setValidationUserId(validationUser.getId());//3楠岃瘉浜篿d
+                correct.setValidationUserName(validationUser.getName());// 3楠岃瘉浜�
+                qualitySuperviseDetailsCorrectMapper.updateById(correct);
+                break;
+
+            // 楠岃瘉缁撴灉
+            case 3:
+                correct.setSuperviseDetailsCorrectId(detailsCorrect.getSuperviseDetailsCorrectId());
+                correct.setValidationResult(detailsCorrect.getValidationResult());//3楠岃瘉缁撴灉
+                correct.setValidationTime(LocalDate.now());// 3楠岃瘉鏃堕棿
+                correct.setIsFinish(1);
+                qualitySuperviseDetailsCorrectMapper.updateById(correct);
+                break;
+        }
+
+        return true;
+    }
+
+    /**
+     * (瑁呭娴佺▼)鏂板鐩戠潱绾犳澶勭悊淇℃伅
+     * @return
+     */
+    @Override
+    public boolean addEquipSuperviseDetailCorrect(QualitySuperviseDetailsCorrect detailsCorrect) {
+        if (detailsCorrect.getSuperviseDetailsId() == null) {
+            throw new ErrorException("缂哄皯璐ㄩ噺鐩戠潱璇︽儏Id");
+        }
+        // 褰撳墠鐧诲綍鐢ㄦ埛淇℃伅鍜岄儴闂�
+        Integer userId = SecurityUtils.getUserId().intValue();
+        User user = userMapper.selectById(userId);
+        String departmentLimsName = userMapper.selectUserDepartmentLimsName(user.getId());
+
+        detailsCorrect.setRaiseDepartment(departmentLimsName);//鎻愬嚭閮ㄩ棬
+        detailsCorrect.setRaiseUserId(user.getId());//鎻愬嚭浜篿d
+        detailsCorrect.setRaiseUserName(user.getName());// 鎻愬嚭浜�
+        if (detailsCorrect.getSuperviseDetailsCorrectId() == null) {
+            qualitySuperviseDetailsCorrectMapper.insert(detailsCorrect);
+        } else {
+            qualitySuperviseDetailsCorrectMapper.updateById(detailsCorrect);
+        }
+
+        if (detailsCorrect.getApproverUserId() != null) {
+            // 鏌ヨ璇︽儏淇℃伅
+            QualitySuperviseDetails superviseDetails = qualitySuperviseDetailsMapper.selectById(detailsCorrect.getSuperviseDetailsId());
+
+            // 娑堟伅鍙戦��
+            InformationNotification info = new InformationNotification();
+            // 鍙戦�佷汉
+            info.setCreateUser(user.getName());
+            info.setMessageType("6");
+            info.setTheme("CNAS璐ㄩ噺鐩戠潱绾犳鎺柦濉啓閫氱煡");
+            info.setContent("鐩戠潱椤圭洰涓�: " + superviseDetails.getSuperviseProject() + " 鐩戠潱绾犳鎺柦寰呭~鍐�");
+            info.setSenderId(userId);
+            // 鎺ユ敹浜�
+            info.setConsigneeId(detailsCorrect.getApproverUserId());
+            info.setJumpPath(MenuJumpPathConstants.QUALITY_SUPERVISE);
+            informationNotificationService.addInformationNotification(info);
+
+            // 鍙戦�佷紒涓氬井淇¢�氱煡
+            threadPoolTaskExecutor.execute(() -> {
+                // 鏌ヨ鍙戦�佷汉
+                User people = userMapper.selectById(detailsCorrect.getApproverUserId());
+                String message = "";
+                message += "CNAS璐ㄩ噺鐩戠潱绾犳鎺柦濉啓閫氱煡";
+                message += "\n璇峰幓杩囩▼瑕佹眰-璐ㄩ噺鐩戠潱璁″垝";
+                message += "\n" + "鐩戠潱椤圭洰涓�: " + superviseDetails.getSuperviseProject() + " 鐩戠潱绾犳鎺柦寰呭~鍐�";
+                //鍙戦�佷紒涓氬井淇℃秷鎭�氱煡
+                try {
+                    WxCpUtils.inform(people.getAccount(), message, null);
+                } catch (Exception e) {
+                    throw new RuntimeException(e);
+                }
+            });
+        }
+
+        // 娓呯┖鐘舵��
+        qualitySuperviseDetailsCorrectMapper.update(null, Wrappers.<QualitySuperviseDetailsCorrect>lambdaUpdate()
+                .eq(QualitySuperviseDetailsCorrect::getSuperviseDetailsCorrectId, detailsCorrect.getSuperviseDetailsCorrectId())
+                .set(QualitySuperviseDetailsCorrect::getIsFinish, null));
+        return true;
+    }
+
+    /**
+     * (瑁呭娴佺▼)鎵瑰噯鐩戠潱绾犳澶勭悊淇℃伅
+     * @return
+     */
+    @Override
+    public boolean approveEquipSuperviseDetailCorrect(QualitySuperviseDetailsCorrect detailsCorrect) {
+        if (detailsCorrect.getIsFinish() == null) {
+            throw new RuntimeException("缂哄皯鎵瑰噯鐘舵��");
+        }
+
+        QualitySuperviseDetailsCorrect correct = new QualitySuperviseDetailsCorrect();
+        // 褰撳墠鐧诲綍鐢ㄦ埛淇℃伅鍜岄儴闂�
+        User user = userMapper.selectById(SecurityUtils.getUserId().intValue());
+        String departmentLimsName = userMapper.selectUserDepartmentLimsName(user.getId());
+        correct.setSuperviseDetailsCorrectId(detailsCorrect.getSuperviseDetailsCorrectId());
+
+        if (detailsCorrect.getIsFinish().equals(1)) {
+            correct.setCauseDepartment(departmentLimsName);//鍘熷洜鍒嗘瀽璐d换閮ㄩ棬
+            correct.setCauseUserId(user.getId());//1鍘熷洜鍒嗘瀽浜篿d
+            correct.setCauseUserName(user.getName());// 1鍘熷洜鍒嗘瀽浜�
+
+            correct.setCorrectDepartment(departmentLimsName);//2绾犳璐d换閮ㄩ棬
+            correct.setCorrectUserId(user.getId());//2绾犳浜篿d
+            correct.setCorrectUserName(user.getName());// 2绾犳浜�
+
+            correct.setValidationDepartment(departmentLimsName);//3楠岃瘉閮ㄩ棬
+            correct.setValidationUserId(user.getId());//3楠岃瘉浜篿d
+            correct.setValidationUserName(user.getName());// 3楠岃瘉浜�
+        } else {
+            qualitySuperviseDetailsCorrectMapper.update(null, Wrappers.<QualitySuperviseDetailsCorrect>lambdaUpdate()
+                    .eq(QualitySuperviseDetailsCorrect::getSuperviseDetailsCorrectId, detailsCorrect.getSuperviseDetailsCorrectId())
+                    .set(QualitySuperviseDetailsCorrect::getCauseDepartment, null)
+                    .set(QualitySuperviseDetailsCorrect::getCauseUserId, null)
+                    .set(QualitySuperviseDetailsCorrect::getCauseUserName, null)
+                    .set(QualitySuperviseDetailsCorrect::getCorrectDepartment, null)
+                    .set(QualitySuperviseDetailsCorrect::getCorrectUserId, null)
+                    .set(QualitySuperviseDetailsCorrect::getCorrectUserName, null)
+                    .set(QualitySuperviseDetailsCorrect::getValidationDepartment, null)
+                    .set(QualitySuperviseDetailsCorrect::getValidationUserId, null)
+                    .set(QualitySuperviseDetailsCorrect::getValidationUserName, null)
+                    .set(QualitySuperviseDetailsCorrect::getApproverUserId, null)
+            );
+        }
+
+        correct.setIsFinish(detailsCorrect.getIsFinish());
+        qualitySuperviseDetailsCorrectMapper.updateById(correct);
+
+        return true;
+    }
+
+    /**
+     * 鏌ヨ鐩戠潱绾犳澶勭悊
+     * @param superviseDetailsId
+     * @return
+     */
+    @Override
+    public QualitySuperviseDetailsCorrect getSuperviseDetailCorrect(Integer superviseDetailsId) {
+        QualitySuperviseDetailsCorrect detailsCorrect;
+
+        detailsCorrect = qualitySuperviseDetailsCorrectMapper.selectOne(Wrappers.<QualitySuperviseDetailsCorrect>lambdaQuery()
+                .eq(QualitySuperviseDetailsCorrect::getSuperviseDetailsId, superviseDetailsId));
+
+        if (detailsCorrect == null) {
+            detailsCorrect = new QualitySuperviseDetailsCorrect();
+            detailsCorrect.setSuperviseDetailsId(superviseDetailsId);
+        }
+        return detailsCorrect;
+    }
+
+    /**
+     * 鏌ヨ鐩戠潱绾犳鎺柦鍒楄〃
+     * @param page
+     * @param detailsCorrect
+     * @return
+     */
+    @Override
+    public IPage<QualitySuperviseDetailsCorrect> pageSuperviseDetailCorrect(Page page, QualitySuperviseDetailsCorrect detailsCorrect) {
+        return qualitySuperviseDetailsCorrectMapper.pageSuperviseDetailAccording(page, QueryWrappers.queryWrappers(detailsCorrect));
+    }
+
+    /**
+     * 鏂板鐩戠潱绾犳鎺柦闄勪欢
+     * @param superviseDetailsCorrectId
+     * @param file
+     * @return
+     */
+    @Override
+    public boolean uploadSuperviseDetailCorrectFile(Integer superviseDetailsCorrectId, MultipartFile file) {
+        if (superviseDetailsCorrectId == null) {
+            throw new ErrorException("缂哄皯绾犳鎺柦id");
+        }
+
+        String urlString;
+        String pathName;
+        String path;
+        String filename = file.getOriginalFilename();
+        String contentType = file.getContentType();
+        QualitySuperviseDetailsCorrectFile superviseDetailsCorrectFile = new QualitySuperviseDetailsCorrectFile();
+        superviseDetailsCorrectFile.setSuperviseDetailsCorrectId(superviseDetailsCorrectId);
+        superviseDetailsCorrectFile.setFileName(filename);
+        if (contentType != null && contentType.startsWith("image/")) {
+            // 鏄浘鐗�
+            path = imgUrl;
+            superviseDetailsCorrectFile.setType(1);
+        } else {
+            // 鏄枃浠�
+            path = wordUrl;
+            superviseDetailsCorrectFile.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));
+            superviseDetailsCorrectFile.setFileUrl(pathName);
+            qualitySuperviseDetailsCorrectFileMapper.insert(superviseDetailsCorrectFile);
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new ErrorException(e.getMessage());
+        }
+    }
+
+    /**
+     * 鏌ヨ鐩戠潱绾犳鎺柦闄勪欢
+     * @param superviseDetailsCorrectId
+     * @return
+     */
+    @Override
+    public List<QualitySuperviseDetailsCorrectFile> getSuperviseDetailCorrectFileList(Integer superviseDetailsCorrectId) {
+        return qualitySuperviseDetailsCorrectFileMapper.selectList(Wrappers.<QualitySuperviseDetailsCorrectFile>lambdaQuery()
+                .eq(QualitySuperviseDetailsCorrectFile::getSuperviseDetailsCorrectId, superviseDetailsCorrectId));
+    }
+
+    /**
+     * 瀵煎嚭鐩戠潱绾犳鎺柦
+     * @param superviseDetailsCorrectId
+     * @param response
+     */
+    @Override
+    public void exportSuperviseDetaillCorrect(Integer superviseDetailsCorrectId, HttpServletResponse response) {
+        QualitySuperviseDetailsCorrect detailsCorrect = qualitySuperviseDetailsCorrectMapper.selectById(superviseDetailsCorrectId);
+        QualitySuperviseDetailsCorrectDto detailsCorrectDto = new QualitySuperviseDetailsCorrectDto();
+        BeanUtils.copyProperties(detailsCorrect, detailsCorrectDto);
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+        // 鎻愬嚭鏃堕棿
+        detailsCorrectDto.setRaiseTimeString(detailsCorrectDto.getRaiseTime() != null
+                ? detailsCorrectDto.getRaiseTime().format(formatter) : null);
+        // 鍘熷洜鍒嗘瀽鏃堕棿
+        detailsCorrectDto.setCauseTimeString(detailsCorrectDto.getCauseTime() != null
+                ? detailsCorrectDto.getCauseTime().format(formatter) : null);
+
+        // 绾犳鏃堕棿
+        detailsCorrectDto.setCorrectTimeString(detailsCorrectDto.getCorrectTime() != null
+                ? detailsCorrectDto.getCorrectTime().format(formatter) : null);
+
+        // 楠岃瘉鏃堕棿
+        detailsCorrectDto.setValidationTimeString(detailsCorrectDto.getValidationTime() != null
+                ? detailsCorrectDto.getValidationTime().format(formatter) : null);
+
+
+        // 鎻愬嚭浜虹鍚�
+        String raiseUrl = null;
+        if (detailsCorrectDto.getRaiseUserId() != null) {
+            raiseUrl = userMapper.selectById(detailsCorrectDto.getRaiseUserId()).getSignatureUrl();
+            if (StringUtils.isBlank(raiseUrl)) {
+                throw new ErrorException("鎵句笉鍒版彁鍑轰汉鐨勭鍚�");
+            }
+        }
+
+        // 鍘熷洜鍒嗘瀽浜�
+        String causeUrl = null;
+        if (detailsCorrectDto.getCauseUserId() != null) {
+            causeUrl = userMapper.selectById(detailsCorrectDto.getCauseUserId()).getSignatureUrl();
+            if (StringUtils.isBlank(causeUrl)) {
+                throw new ErrorException("鎵句笉鍒板師鍥犲垎鏋愪汉鐨勭鍚�");
+            }
+        }
+
+        // 绾犳浜�
+        String correctUrl = null;
+        if (detailsCorrectDto.getCorrectUserId() != null) {
+            correctUrl = userMapper.selectById(detailsCorrectDto.getCorrectUserId()).getSignatureUrl();
+            if (StringUtils.isBlank(correctUrl)) {
+                throw new ErrorException("鎵句笉鍒扮籂姝d汉鐨勭鍚�");
+            }
+        }
+
+        // 楠岃瘉浜�
+        String validationUrl = null;
+        if (detailsCorrectDto.getValidationUserId() != null) {
+            validationUrl = userMapper.selectById(detailsCorrectDto.getValidationUserId()).getSignatureUrl();
+            if (StringUtils.isBlank(validationUrl)) {
+                throw new ErrorException("鎵句笉鍒伴獙璇佷汉鐨勭鍚�");
+            }
+        }
+
+        // 鑾峰彇璺緞
+        InputStream inputStream = this.getClass().getResourceAsStream("/static/supervise-detail-correct.docx");
+        ConfigureBuilder builder = Configure.builder();
+        builder.useSpringEL(true);
+        String finalRaiseUrl = raiseUrl;
+        String finalCauseUrl = causeUrl;
+        String finalCorrectUrl = correctUrl;
+        String finalValidationUrl = validationUrl;
+        XWPFTemplate template = XWPFTemplate.compile(inputStream, builder.build()).render(
+                new HashMap<String, Object>() {{
+                    put("correct", detailsCorrectDto);
+                    put("raiseUrl", StringUtils.isNotBlank(finalRaiseUrl) ? Pictures.ofLocal(imgUrl + "/" + finalRaiseUrl).create() : null);
+                    put("causeUrl", StringUtils.isNotBlank(finalCauseUrl) ? Pictures.ofLocal(imgUrl + "/" + finalCauseUrl).create() : null);
+                    put("correctUrl", StringUtils.isNotBlank(finalCorrectUrl) ? Pictures.ofLocal(imgUrl + "/" + finalCorrectUrl).create() : null);
+                    put("validationUrl", StringUtils.isNotBlank(finalValidationUrl) ? Pictures.ofLocal(imgUrl + "/" + finalValidationUrl).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();
+            inputStream.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException("瀵煎嚭澶辫触");
+        }
+
+    }
+}
+
diff --git a/cnas-process/src/main/java/com/ruoyi/process/task/QualitySuperviseSchedule.java b/cnas-process/src/main/java/com/ruoyi/process/task/QualitySuperviseSchedule.java
new file mode 100644
index 0000000..0d42e19
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/task/QualitySuperviseSchedule.java
@@ -0,0 +1,142 @@
+package com.ruoyi.process.task;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+
+import com.ruoyi.common.core.domain.entity.User;
+import com.ruoyi.common.utils.WxCpUtils;
+import com.ruoyi.process.mapper.QualitySuperviseDetailsMapper;
+import com.ruoyi.process.mapper.QualitySuperviseDetailsRecordMapper;
+import com.ruoyi.process.mapper.QualitySuperviseManagementReviewMapper;
+import com.ruoyi.process.pojo.QualitySuperviseDetails;
+import com.ruoyi.process.pojo.QualitySuperviseDetailsRecord;
+import com.ruoyi.process.pojo.QualitySuperviseManagementReview;
+import com.ruoyi.system.mapper.UserMapper;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+import org.springframework.stereotype.Component;
+
+import jakarta.annotation.Resource;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * 璐ㄩ噺鐩戠潱濉啓鎻愰啋
+ */
+@Component
+public class QualitySuperviseSchedule {
+    @Resource
+    private QualitySuperviseDetailsMapper qualitySuperviseDetailsMapper;
+    @Resource
+    private UserMapper userMapper;
+    @Resource
+    private ThreadPoolTaskExecutor threadPoolTaskExecutor;
+    @Resource
+    private QualitySuperviseManagementReviewMapper qualitySuperviseManagementReviewMapper;
+    @Resource
+    private QualitySuperviseDetailsRecordMapper qualitySuperviseDetailsRecordMapper;
+
+    /**
+     * 璐ㄩ噺鐩戠潱濉啓鎻愰啋
+     */
+//    @Scheduled(cron = "0/5 * * * * *")
+    @Scheduled(cron = "0 0 9 1 * *") // 姣忔湀1鍙锋墽琛�
+    public void task1() {
+        // 鏌ヨ褰撴湀鐩戠潱璁″垝
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy.M");
+        String format = LocalDateTime.now().format(formatter);
+        List<QualitySuperviseDetails> qualitySuperviseDetails = qualitySuperviseDetailsMapper.selectList(Wrappers.<QualitySuperviseDetails>lambdaQuery()
+                .eq(QualitySuperviseDetails::getSuperviseTime, format));
+
+        for (QualitySuperviseDetails qualitySuperviseDetail : qualitySuperviseDetails) {
+            threadPoolTaskExecutor.execute(() -> {
+                // 鏌ヨ琚洃鐫d汉淇℃伅
+                User user = userMapper.selectById(qualitySuperviseDetail.getSupervisedUserId());
+                // 浼佷笟寰俊閫氱煡鍩硅
+                String message = "";
+                message += "璐ㄩ噺鐩戠潱璁″垝鎻愰啋閫氱煡";
+                message += "\n鐩戠潱鏃ユ湡: " + qualitySuperviseDetail.getSuperviseTime();
+                message += "\n鐩戠潱鐩殑: " + qualitySuperviseDetail.getSupervisePurpose();
+                message += "\n鐩戠潱椤圭洰: " + qualitySuperviseDetail.getSuperviseProject();
+                message += "\n琚洃鐫d汉: " + qualitySuperviseDetail.getSupervisee();
+                message += "\n璁″垝褰撴湀杩涜鐩戠潱璁″垝";
+
+                //鍙戦�佷紒涓氬井淇℃秷鎭�氱煡
+                try {
+                    WxCpUtils.inform(user.getAccount(), message, null);
+                } catch (Exception e) {
+                    throw new RuntimeException(e);
+                }
+            });
+        }
+    }
+
+
+    /**
+     * 姣忔湀28鍙疯嚜鍔ㄧ敓鎴愯川閲忕洃鐫f�荤粨
+     */
+//    @Scheduled(cron = "0/5 * * * * *")
+    @Scheduled(cron = "0 0 9 28 * *") // 姣忔湀28鍙锋墽琛�
+    public void task2() {
+        LocalDateTime now = LocalDateTime.now();
+        // 鏌ヨ褰撴湀鐩戠潱璁″垝
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy.M");
+        String format = now.format(formatter);
+        List<QualitySuperviseDetails> qualitySuperviseDetails = qualitySuperviseDetailsMapper.selectList(Wrappers.<QualitySuperviseDetails>lambdaQuery()
+                .eq(QualitySuperviseDetails::getSuperviseTime, format));
+
+        // 鏍规嵁瀹氭湡鐩戠潱鍜屽姩鎬佺洃鐫e尯鍒�
+        Map<String, List<QualitySuperviseDetails>> superviseReasonMap = qualitySuperviseDetails.stream().collect(Collectors.groupingBy(QualitySuperviseDetails::getSuperviseReason));
+
+        // 鑾峰彇褰撴湀鏃ユ湡
+        DateTimeFormatter formatter2 = DateTimeFormatter.ofPattern("yyyy骞碝M鏈�");
+        String format2 = now.format(formatter2);
+
+        // 鑾峰彇璁″垝鍐呭
+        String implementationSupervisee = "";
+                List<QualitySuperviseDetails> implementationList = superviseReasonMap.get("瀹氭湡鐩戠潱");
+        if (CollectionUtils.isNotEmpty(implementationList)) {
+            // 鑾峰彇瀹氭湡鐩戠潱浜哄憳淇℃伅
+            List<String> collect = implementationList.stream().map(QualitySuperviseDetails::getSupervisee).collect(Collectors.toList());
+            implementationSupervisee = CollUtil.join(collect, ",");
+        }
+        String implementationContent = "宸ヤ綔涓弗鏍兼寜鐓у勾搴﹁川閲忕洃鐫e伐浣滆鍒掕繘琛屾墽琛屻�倇}瀵箋}杩涜涓�娆″畾鏈熺洃鐫c�傚湪鐩戠潱杩囩▼涓紝娌℃湁鍙戠幇涓嶇鍚堢殑鐜拌薄銆傛楠屽憳鑳界啛缁冪殑鎸夌収瑙勫畾鐨勮姹傝繘琛岃澶囩殑鎿嶄綔锛屽浜庢爣鍑嗚兘鐔熻锛屾墍浣跨敤鐨勮澶囧潎鍦ㄦ牎鍑嗗懆鏈熷唴锛岃兘娓呮瀹屾暣鐨勭殑璁板綍鍘熷鏁版嵁骞跺嚭鍏锋姤鍛婏紱鍦ㄨ瘯楠岀幆澧冩柟闈紝鑳藉涓ユ牸鐨勬寜鐓ф爣鍑嗘墽琛屻��";
+        String formatImplementationContent = StrUtil.format(implementationContent, format2, implementationSupervisee);
+
+        //鑾峰彇鍔ㄦ�佸唴瀹�
+        String dynamicSupervisee = "";
+        List<QualitySuperviseDetails> dynamicList = superviseReasonMap.get("鍔ㄦ�佺洃鐫�");
+        if (CollectionUtils.isNotEmpty(dynamicList)) {
+            List<String> collect = dynamicList.stream()
+                    .map(details ->  StrUtil.format("瀵箋}鍔ㄦ�佺洃鐫�1娆″湪鐩戠潱杩囩▼涓�", details.getSupervisee())).collect(Collectors.toList());
+            dynamicSupervisee = CollUtil.join(collect, "锛�");
+        }
+        String dynamicContent = "鍦ㄤ繚璇佽川閲忕洃鐫h鍒掔殑鍚屾椂锛屼篃鍧氭寔鎸夌収棰嗗瑕佹眰鍔犲己涓嶅畾鏈熺洃鐫e姩浣溿�倇}浠絳}锛屾病鏈夊彂鐜颁笉绗﹀悎鐨勭幇璞°�傛楠屽憳鑳界啛缁冪殑鎸夌収瑙勫畾鐨勮姹傝繘琛岃澶囩殑鎿嶄綔锛屽浜庢爣鍑嗚兘鐔熻锛屾墍浣跨敤鐨勮澶囧潎鍦ㄦ牎鍑嗗懆鏈熷唴锛岃兘娓呮瀹屾暣鐨勭殑璁板綍鍘熷鏁版嵁骞跺嚭鍏锋姤鍛婏紱鍦ㄨ瘯楠岀幆澧冩柟闈紝鑳藉涓ユ牸鐨勬寜鐓ф爣鍑嗘墽琛屻��";
+        String formatdynamicContent = StrUtil.format(dynamicContent, format2, dynamicSupervisee);
+
+        // 鑾峰彇鐩戠潱鍛樹俊鎭�
+        QualitySuperviseDetails superviseDetails = qualitySuperviseDetails.get(0);
+        QualitySuperviseDetailsRecord detailsRecord = qualitySuperviseDetailsRecordMapper.selectOne(Wrappers.<QualitySuperviseDetailsRecord>lambdaQuery()
+                .eq(QualitySuperviseDetailsRecord::getSuperviseDetailsId, superviseDetails.getSuperviseDetailsId())
+                .last("limit 1"));
+        String supervisor = detailsRecord.getSupervisor();
+
+        // 鍒涘缓璇勫瀵硅薄
+        QualitySuperviseManagementReview managementReview = new QualitySuperviseManagementReview();
+        String yearDate = now.format(DateTimeFormatter.ofPattern("yyyy骞�"));
+        String monthDate = now.format(DateTimeFormatter.ofPattern("MM鏈�"));
+        managementReview.setFileName(StrUtil.format("{}绠$悊璇勫杈撳叆鏉愭枡锛坽}锛塤{}", yearDate, supervisor, monthDate));
+        managementReview.setImplementationContent(formatImplementationContent);
+        managementReview.setDynamicContent(formatdynamicContent);
+        managementReview.setSupervisor(supervisor);
+        managementReview.setSuperviseDate(LocalDate.now());
+        qualitySuperviseManagementReviewMapper.insert(managementReview);
+    }
+
+}
diff --git a/cnas-process/src/main/resources/mapper/InconsistentDistributionDetailMapper.xml b/cnas-process/src/main/resources/mapper/InconsistentDistributionDetailMapper.xml
new file mode 100644
index 0000000..8dde5b2
--- /dev/null
+++ b/cnas-process/src/main/resources/mapper/InconsistentDistributionDetailMapper.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.process.mapper.InconsistentDistributionDetailMapper">
+
+
+</mapper>
diff --git a/cnas-process/src/main/resources/mapper/InconsistentDistributionMapper.xml b/cnas-process/src/main/resources/mapper/InconsistentDistributionMapper.xml
new file mode 100644
index 0000000..f8d88e1
--- /dev/null
+++ b/cnas-process/src/main/resources/mapper/InconsistentDistributionMapper.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.ruoyi.process.mapper.InconsistentDistributionMapper">
+
+    <!-- 涓嶇鍚堥」鍒嗛〉鏌ヨ -->
+    <select id="pageInconsistentDistribution" resultType="com.ruoyi.process.dto.InconsistentDistributionDto">
+        select *
+        from (select cid.*,
+                     u1.name create_user_name,
+                     u2.name update_user_name
+              from cnas_inconsistent_distribution cid
+                       left join user u1 on u1.id = cid.create_user
+                       left join user u2 on u2.id = cid.update_user
+              order by cid.create_time desc) a
+        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
+            ${ew.customSqlSegment}
+        </if>
+    </select>
+
+</mapper>
diff --git a/cnas-process/src/main/resources/mapper/InspectionOrderDetailMapper.xml b/cnas-process/src/main/resources/mapper/InspectionOrderDetailMapper.xml
new file mode 100644
index 0000000..4cd91ee
--- /dev/null
+++ b/cnas-process/src/main/resources/mapper/InspectionOrderDetailMapper.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.process.mapper.InspectionOrderDetailMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.ruoyi.process.pojo.InspectionOrderDetail">
+        <id column="inspection_order_detail_id" property="inspectionOrderDetailId" />
+        <result column="inspection_order_id" property="inspectionOrderId" />
+        <result column="sample_number" property="sampleNumber" />
+        <result column="test_item" property="testItem" />
+        <result column="test_standard" property="testStandard" />
+        <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>
+
+</mapper>
diff --git a/cnas-process/src/main/resources/mapper/InspectionOrderMapper.xml b/cnas-process/src/main/resources/mapper/InspectionOrderMapper.xml
new file mode 100644
index 0000000..ba0c03f
--- /dev/null
+++ b/cnas-process/src/main/resources/mapper/InspectionOrderMapper.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.ruoyi.process.mapper.InspectionOrderMapper">
+
+    <!--妫�楠屽鎵樺崟鍒嗛〉鏌ヨ-->
+    <select id="pageInspectionOrder" resultType="com.ruoyi.process.dto.InspectionOrderDto">
+        select *
+        from (select *
+        from cnas_inspection_order
+        order by create_time desc) a
+        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
+            ${ew.customSqlSegment}
+        </if>
+    </select>
+
+    <!--濮旀墭鍗曟煡璇㈡垚鍝佽鍗�-->
+    <select id="getInsOrderOnInspection" resultType="com.ruoyi.inspect.pojo.InsOrder">
+        select *
+        from (select *
+        from ins_order
+        where state = 4 and ifs_inventory_id is null
+        order by entrust_code desc) a
+        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
+            ${ew.customSqlSegment}
+        </if>
+    </select>
+</mapper>
diff --git a/cnas-process/src/main/resources/mapper/ProcessComplainMapper.xml b/cnas-process/src/main/resources/mapper/ProcessComplainMapper.xml
new file mode 100644
index 0000000..6033fa3
--- /dev/null
+++ b/cnas-process/src/main/resources/mapper/ProcessComplainMapper.xml
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.process.mapper.ProcessComplainMapper">
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.ruoyi.process.pojo.ProcessComplain">
+        <id column="id" property="id"/>
+        <result column="complain_no" property="complainNo"/>
+        <result column="complain_name" property="complainName"/>
+        <result column="ins_report_id" property="insReportId"/>
+        <result column="sample_code" property="sampleCode"/>
+        <result column="create_user" property="createUser"/>
+        <result column="complainant" property="complainant"/>
+        <result column="create_time" property="createTime"/>
+        <result column="update_user" property="updateUser"/>
+        <result column="update_time" property="updateTime"/>
+        <result column="complain_method" property="complainMethod"/>
+        <result column="problem_records" property="problemRecords"/>
+        <result column="problem_records_user" property="problemRecordsUser"/>
+        <result column="problem_records_time" property="problemRecordsTime"/>
+        <result column="duty_ownership" property="dutyOwnership"/>
+        <result column="duty_ownership_user" property="dutyOwnershipUser"/>
+        <result column="duty_ownership_time" property="dutyOwnershipTime"/>
+        <result column="cause_analysis" property="causeAnalysis"/>
+        <result column="cause_analysis_user" property="causeAnalysisUser"/>
+        <result column="cause_analysis_time" property="causeAnalysisTime"/>
+        <result column="corrective_action" property="correctiveAction"/>
+        <result column="corrective_action_user" property="correctiveActionUser"/>
+        <result column="corrective_action_time" property="correctiveActionTime"/>
+        <result column="corrective_action_confirmation" property="correctiveActionConfirmation"/>
+        <result column="corrective_action_confirmation_user" property="correctiveActionConfirmationUser"/>
+        <result column="corrective_action_confirmation_time" property="correctiveActionConfirmationTime"/>
+    </resultMap>
+    <select id="pageProcessComplain" resultType="com.ruoyi.process.pojo.ProcessComplain">
+        select *
+        from (select cpc.*,name complainant
+        from cnas_process_complain cpc left join user u on cpc.create_user = u.id)A
+        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
+            ${ew.customSqlSegment}
+        </if>
+    </select>
+    <select id="getProcessComplain" resultType="com.ruoyi.process.dto.ProcessComplainDto">
+        select cpc.*,
+            ir.code,
+               u1.name complainant,
+               u1.phone,
+               u1.email,
+               u2.name problemRecordsUserName,
+               u3.name dutyOwnershipUserName,
+               u4.name causeAnalysisUserName,
+               u5.name correctiveActionUserName,
+               u6.name correctiveActionConfirmationUserName
+        from cnas_process_complain cpc
+                 left join user u1 on cpc.create_user = u1.id
+                 left join user u2 on cpc.problem_records_user = u2.id
+                 left join user u3 on cpc.duty_ownership_user = u3.id
+                 left join user u4 on cpc.cause_analysis_user = u4.id
+                 left join user u5 on cpc.corrective_action_user = u5.id
+                 left join user u6 on cpc.corrective_action_confirmation_user = u6.id
+            left join ins_report ir on cpc.ins_report_id = ir.id
+        where cpc.id=#{id}
+    </select>
+</mapper>
diff --git a/cnas-process/src/main/resources/mapper/ProcessDealMapper.xml b/cnas-process/src/main/resources/mapper/ProcessDealMapper.xml
new file mode 100644
index 0000000..037afa8
--- /dev/null
+++ b/cnas-process/src/main/resources/mapper/ProcessDealMapper.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.ruoyi.process.mapper.ProcessDealMapper">
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.ruoyi.process.pojo.ProcessDeal">
+        <id column="id" property="id"/>
+        <result column="sample_name" property="sampleName"/>
+        <result column="sample_code" property="sampleCode"/>
+        <result column="sample_supplier" property="sampleSupplier"/>
+        <result column="num" property="num"/>
+        <result column="deal_method" property="dealMethod"/>
+        <result column="deal_time" property="dealTime"/>
+        <result column="create_user" property="createUser"/>
+        <result column="update_user" property="updateUser"/>
+        <result column="create_time" property="createTime"/>
+        <result column="update_time" property="updateTime"/>
+        <result column="totaldeal_id" property="totaldealId"/>
+    </resultMap>
+    <select id="pageProcessDeal" resultType="com.ruoyi.process.pojo.ProcessDeal">
+        select *
+        from (select * from cnas_process_deal) A
+        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
+            ${ew.customSqlSegment}
+        </if>
+    </select>
+
+    <select id="selectDeal" resultType="com.ruoyi.process.dto.ProcessDealDto">
+        select ROW_NUMBER() OVER (ORDER BY id) AS indexs,
+               id,
+               sample_name,
+               sample_code,
+               sample_supplier,
+               num,
+               deal_method,
+               DATE_FORMAT(deal_time, '%Y-%m-%d') dealTimeStr
+        from cnas_process_deal
+        where totaldeal_id = #{id}
+    </select>
+</mapper>
diff --git a/cnas-process/src/main/resources/mapper/ProcessEvaluateMapper.xml b/cnas-process/src/main/resources/mapper/ProcessEvaluateMapper.xml
new file mode 100644
index 0000000..bea6799
--- /dev/null
+++ b/cnas-process/src/main/resources/mapper/ProcessEvaluateMapper.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.process.mapper.ProcessEvaluateMapper">
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.ruoyi.process.pojo.ProcessEvaluate">
+        <id column="id" property="id"/>
+        <result column="report_name" property="reportName"/>
+        <result column="report_url" property="reportUrl"/>
+        <result column="evaluate_user" property="evaluateUser"/>
+        <result column="evaluateUserName" property="evaluateUserName"/>
+        <result column="evaluate_time" property="evaluateTime"/>
+        <result column="note" property="note"/>
+        <result column="create_user" property="createUser"/>
+        <result column="update_user" property="updateUser"/>
+        <result column="create_time" property="createTime"/>
+        <result column="update_time" property="updateTime"/>
+    </resultMap>
+    <select id="pageProcessEvaluate" resultType="com.ruoyi.process.pojo.ProcessEvaluate">
+        select * from (select cpe.*,u.name evaluateUserName
+        from cnas_process_evaluate cpe
+        left join user u on cpe.evaluate_user = u.id)A
+        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
+            ${ew.customSqlSegment}
+        </if>
+    </select>
+</mapper>
diff --git a/cnas-process/src/main/resources/mapper/ProcessMethodSearchNewArchivedMapper.xml b/cnas-process/src/main/resources/mapper/ProcessMethodSearchNewArchivedMapper.xml
new file mode 100644
index 0000000..963db04
--- /dev/null
+++ b/cnas-process/src/main/resources/mapper/ProcessMethodSearchNewArchivedMapper.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.process.mapper.ProcessMethodSearchNewArchivedMapper">
+
+    <select id="pageSearchNewArchived" resultType="com.ruoyi.process.dto.ProcessMethodSearchNewArchivedDto">
+        select *
+        from (select cqm.*,
+        u1.name write_name,
+        u3.name ratify_name
+        from cnas_process_method_search_new_archived 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-process/src/main/resources/mapper/ProcessMethodSearchNewBackupsMapper.xml b/cnas-process/src/main/resources/mapper/ProcessMethodSearchNewBackupsMapper.xml
new file mode 100644
index 0000000..46e55a3
--- /dev/null
+++ b/cnas-process/src/main/resources/mapper/ProcessMethodSearchNewBackupsMapper.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.ruoyi.process.mapper.ProcessMethodSearchNewBackupsMapper">
+
+    <select id="pageSearchNewBackups" resultType="com.ruoyi.process.pojo.ProcessMethodSearchNewBackups">
+        select *
+        from (select *
+        from cnas_process_method_search_new_backups
+        order by create_time desc
+        ) a
+        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
+            ${ew.customSqlSegment}
+        </if>
+    </select>
+
+</mapper>
diff --git a/cnas-process/src/main/resources/mapper/ProcessMethodSearchNewMapper.xml b/cnas-process/src/main/resources/mapper/ProcessMethodSearchNewMapper.xml
new file mode 100644
index 0000000..7be9498
--- /dev/null
+++ b/cnas-process/src/main/resources/mapper/ProcessMethodSearchNewMapper.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+<mapper namespace="com.ruoyi.process.mapper.ProcessMethodSearchNewMapper">
+
+    <!-- 鏍囧噯鏌ユ柊鍒嗛〉鏌ヨ -->
+    <select id="pageMethodSearchNew" resultType="com.ruoyi.process.pojo.ProcessMethodSearchNew">
+        select *
+        from (select *
+        from cnas_process_method_search_new
+        <where>
+            <if test="beginDate != null and beginDate != '' and endDate != null and endDate != ''">
+                and create_time between #{beginDate} and #{endDate}
+            </if>
+        </where>
+        order by create_time desc
+        ) a
+        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
+            ${ew.customSqlSegment}
+        </if>
+    </select>
+</mapper>
diff --git a/cnas-process/src/main/resources/mapper/ProcessMethodVerifyCalibrationsFileMapper.xml b/cnas-process/src/main/resources/mapper/ProcessMethodVerifyCalibrationsFileMapper.xml
new file mode 100644
index 0000000..b5e95d0
--- /dev/null
+++ b/cnas-process/src/main/resources/mapper/ProcessMethodVerifyCalibrationsFileMapper.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+<mapper namespace="com.ruoyi.process.mapper.ProcessMethodVerifyCalibrationsFileMapper">
+    <select id="selectCalibrationsFileList"
+            resultType="com.ruoyi.process.dto.ProcessMethodVerifyCalibrationsFileDto">
+        select cf.*,
+               d.device_name,
+               d.management_number
+        from cnas_process_method_verify_calibrations_file cf
+                 left join device d on d.id = cf.device_id
+        where cf.method_verify_id = #{methodVerifyId}
+    </select>
+
+    <!-- 璁惧璇佷功鏌ヨ鏍″噯璇佷功 -->
+    <select id="selectCalibrationsFile" resultType="java.lang.String">
+        select system_file_name
+        from device_metric_record
+        where device_id = #{deviceId}
+          and type = 'calibrate'
+          and status = '0yes'
+        order by create_time desc
+        limit 1
+    </select>
+</mapper>
diff --git a/cnas-process/src/main/resources/mapper/ProcessMethodVerifyMachineAttachmentMapper.xml b/cnas-process/src/main/resources/mapper/ProcessMethodVerifyMachineAttachmentMapper.xml
new file mode 100644
index 0000000..aadcf87
--- /dev/null
+++ b/cnas-process/src/main/resources/mapper/ProcessMethodVerifyMachineAttachmentMapper.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+<mapper namespace="com.ruoyi.process.mapper.ProcessMethodVerifyMachineAttachmentMapper">
+
+</mapper>
diff --git a/cnas-process/src/main/resources/mapper/ProcessMethodVerifyMapper.xml b/cnas-process/src/main/resources/mapper/ProcessMethodVerifyMapper.xml
new file mode 100644
index 0000000..ff31958
--- /dev/null
+++ b/cnas-process/src/main/resources/mapper/ProcessMethodVerifyMapper.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.ruoyi.process.mapper.ProcessMethodVerifyMapper">
+
+    <!-- 鏍囧噯鏂规硶璺熸柊楠岃瘉鍒楄〃 -->
+    <select id="pagesMethodVerify" resultType="com.ruoyi.process.pojo.ProcessMethodVerify">
+        select * from (
+        select method_verify_id,
+        method_name,
+        verify_reason,
+        technology_change,
+        confirm_date,
+        create_time,
+        operation_type
+        from cnas_process_method_verify
+        order by create_time desc
+        ) a
+        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
+            ${ew.customSqlSegment}
+        </if>
+    </select>
+</mapper>
diff --git a/cnas-process/src/main/resources/mapper/ProcessMethodVerifyMethodFileMapper.xml b/cnas-process/src/main/resources/mapper/ProcessMethodVerifyMethodFileMapper.xml
new file mode 100644
index 0000000..4bc5d74
--- /dev/null
+++ b/cnas-process/src/main/resources/mapper/ProcessMethodVerifyMethodFileMapper.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+<mapper namespace="com.ruoyi.process.mapper.ProcessMethodVerifyMethodFileMapper">
+
+
+</mapper>
diff --git a/cnas-process/src/main/resources/mapper/ProcessMethodVerifyWorkFileMapper.xml b/cnas-process/src/main/resources/mapper/ProcessMethodVerifyWorkFileMapper.xml
new file mode 100644
index 0000000..f7dfffd
--- /dev/null
+++ b/cnas-process/src/main/resources/mapper/ProcessMethodVerifyWorkFileMapper.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+<mapper namespace="com.ruoyi.process.mapper.ProcessMethodVerifyWorkFileMapper">
+
+    <!-- 鏍规嵁鐢ㄦ埛id鏌ヨ涓婂矖璇佸湴鍧� -->
+    <select id="selectWorkFile" resultType="java.lang.String">
+        select system_file_name
+        from cnas_person_post_authorization_record
+        where user_id = #{userId}
+        order by create_time desc
+        limit 1
+    </select>
+</mapper>
diff --git a/cnas-process/src/main/resources/mapper/ProcessOrderDeviceMapper.xml b/cnas-process/src/main/resources/mapper/ProcessOrderDeviceMapper.xml
new file mode 100644
index 0000000..4165595
--- /dev/null
+++ b/cnas-process/src/main/resources/mapper/ProcessOrderDeviceMapper.xml
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.process.mapper.ProcessOrderDeviceMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.ruoyi.process.pojo.ProcessOrderDevice">
+        <id column="id" property="id" />
+        <result column="device_id" property="deviceId" />
+        <result column="inspection_order_id" property="inspectionOrderId" />
+        <result column="sample_code" property="sampleCode" />
+        <result column="use_before" property="useBefore" />
+        <result column="use_after" property="useAfter" />
+        <result column="abnormal" property="abnormal" />
+        <result column="use_start_date" property="useStartDate" />
+        <result column="use_person_id" property="usePersonId" />
+        <result column="use_person" property="usePerson" />
+        <result column="remark" property="remark" />
+        <result column="use_end_date" property="useEndDate" />
+    </resultMap>
+    <select id="selectDeviceNumber" resultType="java.lang.String">
+        select distinct d.management_number
+        from  cnas_process_order_device cpod
+                 left join device d on d.id = cpod.device_id
+        where cpod.inspection_order_id = #{inspectionOrderId}
+    </select>
+    <select id="selectDeviceIdsByNumbers" resultType="java.lang.Integer">
+        select id
+        from device
+        where management_number in
+        <foreach collection="deviceNumbers" index="index" open="(" separator="," close=")" item="val">
+            #{val}
+        </foreach>
+    </select>
+    <select id="deviceRecordPage" resultType="com.ruoyi.process.pojo.ProcessOrderDevice">
+        select cpod.*,
+        d.device_name,
+        d.management_number
+        from cnas_process_order_device cpod
+        left join device d on d.id = cpod.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>
+        ORDER BY (cpod.use_start_date IS NULL) desc , cpod.use_start_date DESC
+    </select>
+</mapper>
diff --git a/cnas-process/src/main/resources/mapper/ProcessReportMapper.xml b/cnas-process/src/main/resources/mapper/ProcessReportMapper.xml
new file mode 100644
index 0000000..62e82d0
--- /dev/null
+++ b/cnas-process/src/main/resources/mapper/ProcessReportMapper.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.process.mapper.ProcessReportMapper">
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.ruoyi.process.pojo.ProcessReport">
+        <id column="id" property="id"/>
+        <result column="ins_report_code" property="insReportCode"/>
+        <result column="pages" property="pages"/>
+        <result column="number" property="number"/>
+        <result column="send" property="send"/>
+        <result column="method" property="method"/>
+        <result column="send_time" property="sendTime"/>
+        <result column="send_user" property="sendUser"/>
+        <result column="signatory" property="signatory"/>
+        <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="pageProcessReport" resultType="com.ruoyi.process.dto.ProcessReportDto">
+        select * from (select cpr.* ,
+        u1.name sendUserName
+        from cnas_process_report cpr
+        left join user u1 on send_user=u1.id )A
+        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
+            ${ew.customSqlSegment}
+        </if>
+    </select>
+    <select id="exportProcessReport" resultType="com.ruoyi.process.dto.ProcessReportDto">
+        select ROW_NUMBER() OVER (ORDER BY cpr.id) AS indexs,
+        cpr.* ,
+        u1.signature_url sendUserUrl
+        from cnas_process_report cpr
+        left join user u1 on send_user=u1.id
+    </select>
+</mapper>
diff --git a/cnas-process/src/main/resources/mapper/ProcessSampleMapper.xml b/cnas-process/src/main/resources/mapper/ProcessSampleMapper.xml
new file mode 100644
index 0000000..6ca612d
--- /dev/null
+++ b/cnas-process/src/main/resources/mapper/ProcessSampleMapper.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.ruoyi.process.mapper.ProcessSampleMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.ruoyi.process.pojo.ProcessSample">
+        <id column="id" property="id" />
+        <result column="sample_name" property="sampleName" />
+        <result column="sample_code" property="sampleCode" />
+        <result column="sample_supplier" property="sampleSupplier" />
+        <result column="num" property="num" />
+        <result column="sample_state" property="sampleState" />
+        <result column="create_user" property="createUser" />
+        <result column="update_user" property="updateUser" />
+        <result column="create_time" property="createTime" />
+        <result column="update_time" property="updateTime" />
+        <result column="receive_date" property="receiveDate" />
+        <result column="leave_date" property="leaveDate" />
+        <result column="deal_time" property="dealTime" />
+    </resultMap>
+    <select id="pageProcessSample" resultType="com.ruoyi.process.pojo.ProcessSample">
+        select *
+        from (select * from cnas_process_sample) A
+        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
+            ${ew.customSqlSegment}
+        </if>
+    </select>
+</mapper>
diff --git a/cnas-process/src/main/resources/mapper/ProcessTotaldealMapper.xml b/cnas-process/src/main/resources/mapper/ProcessTotaldealMapper.xml
new file mode 100644
index 0000000..c6a1bda
--- /dev/null
+++ b/cnas-process/src/main/resources/mapper/ProcessTotaldealMapper.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.process.mapper.ProcessTotaldealMapper">
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.ruoyi.process.pojo.ProcessTotaldeal">
+        <id column="id" property="id"/>
+        <result column="examine_user" property="examineUser"/>
+        <result column="examine_state" property="examineState"/>
+        <result column="examineUserName" property="examineUserName"/>
+        <result column="ratify_user" property="ratifyUser"/>
+        <result column="ratify_state" property="ratifyState"/>
+        <result column="ratifyUserName" property="ratifyUserName"/>
+        <result column="submit_user" property="submitUser"/>
+        <result column="submit_state" property="submitState"/>
+        <result column="submitUserName" property="submitUserName"/>
+        <result column="month" property="month"/>
+    </resultMap>
+    <select id="pageProcessTotaldeal" resultType="com.ruoyi.process.pojo.ProcessTotaldeal">
+        select *
+        from (select cpt.*, u1.name examineUserName , u2.name ratifyUserName,u3.name submitUserName
+        from cnas_process_totaldeal cpt
+        left join user u1 on u1.id = examine_user
+        left join user u2 on u2.id = ratify_user
+        left join user u3 on u3.id = submit_user) A
+        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
+            ${ew.customSqlSegment}
+        </if>
+    </select>
+</mapper>
diff --git a/cnas-process/src/main/resources/mapper/QualityMonitorDetailsEvaluateFileMapper.xml b/cnas-process/src/main/resources/mapper/QualityMonitorDetailsEvaluateFileMapper.xml
new file mode 100644
index 0000000..5091ec4
--- /dev/null
+++ b/cnas-process/src/main/resources/mapper/QualityMonitorDetailsEvaluateFileMapper.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.process.mapper.QualityMonitorDetailsEvaluateFileMapper">
+
+</mapper>
diff --git a/cnas-process/src/main/resources/mapper/QualityMonitorDetailsEvaluateMapper.xml b/cnas-process/src/main/resources/mapper/QualityMonitorDetailsEvaluateMapper.xml
new file mode 100644
index 0000000..0f05609
--- /dev/null
+++ b/cnas-process/src/main/resources/mapper/QualityMonitorDetailsEvaluateMapper.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+<mapper namespace="com.ruoyi.process.mapper.QualityMonitorDetailsEvaluateMapper">
+
+    <!-- 鏌ヨ璐ㄩ噺鐩戞帶璇勪环 -->
+    <select id="getQualityMonitorEvaluate" resultType="com.ruoyi.process.pojo.QualityMonitorDetailsEvaluate">
+        select cqmde.*,
+               u1.name implement_name,
+               u2.name ratify_user_name
+        from cnas_quality_monitor_details_evaluate cqmde
+                 left join user u1 on u1.id = cqmde.implement_user_id
+                 left join user u2 on u2.id = cqmde.ratify_user_id
+        where cqmde.quality_monitor_details_id = #{qualityMonitorDetailsId}
+    </select>
+</mapper>
diff --git a/cnas-process/src/main/resources/mapper/QualityMonitorDetailsMapper.xml b/cnas-process/src/main/resources/mapper/QualityMonitorDetailsMapper.xml
new file mode 100644
index 0000000..aa500be
--- /dev/null
+++ b/cnas-process/src/main/resources/mapper/QualityMonitorDetailsMapper.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.ruoyi.process.mapper.QualityMonitorDetailsMapper">
+    <select id="pageQualityMonitorDetail" resultType="com.ruoyi.process.dto.QualityMonitorDetailsDto">
+        select * from (
+        SELECT cqmd.*,
+        CASE
+        WHEN cqmder.is_finish = 1 THEN 3
+        WHEN cqmder.is_finish = 0 THEN 2
+        WHEN cqmder.quality_monitor_details_id IS NOT NULL THEN 1
+        ELSE 0 END details_ratify_status,
+        CASE
+        WHEN cqmd.ratify_status = 1 THEN 3
+        WHEN cqmd.ratify_status = 0 THEN 2
+        WHEN cqmd.finish_report_url IS NOT NULL THEN 1
+        ELSE 0 END report_status,
+        CASE
+        WHEN cqmde.is_finish = 1 THEN 3
+        WHEN cqmde.ratify_user_id IS NOT NULL THEN 2
+        WHEN cqmde.implement_user_id IS NOT NULL and cqmde.details_evaluate_id is not null THEN 1
+        ELSE 0 END evaluate_status
+        FROM cnas_quality_monitor_details cqmd
+        LEFT JOIN cnas_quality_monitor_details_evaluate cqmde
+        ON cqmd.quality_monitor_details_id = cqmde.quality_monitor_details_id
+        LEFT JOIN cnas_quality_monitor_details_ratify cqmder
+        ON cqmder.quality_monitor_details_id = cqmd.quality_monitor_details_id
+        order by cqmd.quality_monitor_details_id
+        ) a
+        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
+            ${ew.customSqlSegment}
+        </if>
+        order by quality_monitor_id, monitor_purpose, -- 鎻愬彇骞翠唤
+        CAST(SUBSTRING(planned_time, 1, 4) AS SIGNED) ASC,
+        -- 鎻愬彇鏈堜唤
+        CASE
+        WHEN planned_time LIKE '% - %' THEN 1
+        ELSE CAST(SUBSTRING_INDEX(SUBSTRING(planned_time, 6), '鏈�', 1) AS SIGNED)
+        END ASC
+    </select>
+</mapper>
diff --git a/cnas-process/src/main/resources/mapper/QualityMonitorDetailsRatifyMapper.xml b/cnas-process/src/main/resources/mapper/QualityMonitorDetailsRatifyMapper.xml
new file mode 100644
index 0000000..4d1627b
--- /dev/null
+++ b/cnas-process/src/main/resources/mapper/QualityMonitorDetailsRatifyMapper.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+<mapper namespace="com.ruoyi.process.mapper.QualityMonitorDetailsRatifyMapper">
+
+</mapper>
diff --git a/cnas-process/src/main/resources/mapper/QualityMonitorMapper.xml b/cnas-process/src/main/resources/mapper/QualityMonitorMapper.xml
new file mode 100644
index 0000000..c04764c
--- /dev/null
+++ b/cnas-process/src/main/resources/mapper/QualityMonitorMapper.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.ruoyi.process.mapper.QualityMonitorMapper">
+    <!-- 鐩戞帶璁″垝鍒嗛〉鏌ヨ -->
+    <select id="pageQualityMonitor" resultType="com.ruoyi.process.dto.QualityMonitorDto">
+        select *
+        from (select cqm.*,
+                     u1.name write_name,
+                     u2.name examine_name,
+                     u3.name ratify_name
+              from cnas_quality_monitor cqm
+                       left join user u1 on u1.id = cqm.write_user_id
+                       left join user u2 on u2.id = cqm.examine_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-process/src/main/resources/mapper/QualitySuperviseDetailsAccordingMapper.xml b/cnas-process/src/main/resources/mapper/QualitySuperviseDetailsAccordingMapper.xml
new file mode 100644
index 0000000..be39018
--- /dev/null
+++ b/cnas-process/src/main/resources/mapper/QualitySuperviseDetailsAccordingMapper.xml
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+<mapper namespace="com.ruoyi.process.mapper.QualitySuperviseDetailsAccordingMapper">
+
+    <!-- 鏌ヨ涓嶇鍚堟帶鍒跺崟鍒楄〃 -->
+    <select id="pageSuperviseDetailAccording"
+            resultType="com.ruoyi.process.pojo.QualitySuperviseDetailsAccording">
+        select *
+        from (select *
+              from cnas_quality_supervise_details_according
+              order by create_time desc
+             ) a
+        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
+            ${ew.customSqlSegment}
+        </if>
+    </select>
+
+    <select id="selectSuperviseDetailsAccording"
+            resultType="com.ruoyi.process.dto.QualitySuperviseDetailsAccordingDto">
+        select sda.*,
+        DATE_FORMAT(sda.record_time, '%Y-%m-%d') discovererDateString,               <!-- 鍙戠幇鏃堕棿 -->
+        DATE_FORMAT(sda.actions_time, '%Y-%m-%d') responsibleDepartmentDateString,   <!-- 澶勭悊鏃堕棿 -->
+        DATE_FORMAT(sda.correct_time, '%Y-%m-%d') correctiveMeasureDateString,       <!-- 绾犳鏃堕棿 -->
+        DATE_FORMAT(sda.quality_manager_time, '%Y-%m-%d') qualitySupervisorDateString,<!-- 璐ㄩ噺鏃堕棿 -->
+        DATE_FORMAT(sda.supervised_time, '%Y-%m-%d') supervisedTimeString,             <!-- 琚洃鐫f椂闂� -->
+        case when sda.is_correct = 1 then '鈽�'
+        else '鈻�' end correctiveMeasureFollowTracksYes, <!-- 绾犳鎺柦澶勭悊鍗曡窡韪�(鏄�) -->
+        case when sda.is_correct = 2 then '鈽�'
+        else '鈻�' end correctiveMeasureFollowTracksNo,   <!-- 绾犳鎺柦澶勭悊鍗曡窡韪�(鍚�) -->
+        case when sda.notify_customer = 1 then '鈽�'
+        else '鈻�' end whetherInformCustomerYes,        <!-- 鍛婄煡瀹㈡埛(鏄�) -->
+        case when sda.notify_customer = 2 then '鈽�'
+        else '鈻�' end whetherInformCustomerNo,          <!-- 鍛婄煡瀹㈡埛(鍚�) -->
+        case when sda.back_to_work = 1 then '鈽�'
+        else '鈻�' end whetherResumeWorkYes,              <!-- 鎭㈠宸ヤ綔(鏄�) -->
+        case when sda.back_to_work = 2 then '鈽�'
+        else '鈻�' end whetherResumeWorkNo,                <!-- 鎭㈠宸ヤ綔(鍚�) -->
+        case when sda.find_way = 0 then '鈽�'
+        else '鈻�' end discoveryApproach0,
+        case when sda.find_way = 1 then '鈽�'
+        else '鈻�' end discoveryApproach1,
+        case when sda.find_way = 2 then '鈽�'
+        else '鈻�' end discoveryApproach2,
+        case when sda.find_way = 3 then '鈽�'
+        else '鈻�' end discoveryApproach3,
+        case when sda.find_way = 4 then '鈽�'
+        else '鈻�' end discoveryApproach4,
+        case when sda.find_way = 5 then '鈽�'
+        else '鈻�' end discoveryApproach5,
+        case when sda.find_way = 6 then '鈽�'
+        else '鈻�' end discoveryApproach6,
+        case when sda.find_way = 7 then '鈽�'
+        else '鈻�' end discoveryApproach7
+        from cnas_quality_supervise_details_according sda
+        where sda.supervise_details_id = #{superviseDetailId}
+    </select>
+</mapper>
diff --git a/cnas-process/src/main/resources/mapper/QualitySuperviseDetailsCorrectFileMapper.xml b/cnas-process/src/main/resources/mapper/QualitySuperviseDetailsCorrectFileMapper.xml
new file mode 100644
index 0000000..09d7fe6
--- /dev/null
+++ b/cnas-process/src/main/resources/mapper/QualitySuperviseDetailsCorrectFileMapper.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+<mapper namespace="com.ruoyi.process.mapper.QualitySuperviseDetailsCorrectFileMapper">
+
+
+</mapper>
diff --git a/cnas-process/src/main/resources/mapper/QualitySuperviseDetailsCorrectMapper.xml b/cnas-process/src/main/resources/mapper/QualitySuperviseDetailsCorrectMapper.xml
new file mode 100644
index 0000000..e0f4cea
--- /dev/null
+++ b/cnas-process/src/main/resources/mapper/QualitySuperviseDetailsCorrectMapper.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+<mapper namespace="com.ruoyi.process.mapper.QualitySuperviseDetailsCorrectMapper">
+
+    <!-- 鏌ヨ鐩戠潱绾犳鎺柦鍒楄〃 -->
+    <select id="pageSuperviseDetailAccording" resultType="com.ruoyi.process.pojo.QualitySuperviseDetailsCorrect">
+        select *
+        from (select *
+              from cnas_quality_supervise_details_correct
+              order by create_time desc) a
+        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
+            ${ew.customSqlSegment}
+        </if>
+    </select>
+</mapper>
diff --git a/cnas-process/src/main/resources/mapper/QualitySuperviseDetailsMapper.xml b/cnas-process/src/main/resources/mapper/QualitySuperviseDetailsMapper.xml
new file mode 100644
index 0000000..0e8b619
--- /dev/null
+++ b/cnas-process/src/main/resources/mapper/QualitySuperviseDetailsMapper.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+<mapper namespace="com.ruoyi.process.mapper.QualitySuperviseDetailsMapper">
+
+    <!-- 璐ㄩ噺鐩戠潱璁″垝璇︽儏鍒楄〃 -->
+    <select id="pageQualitySuperviseDetail" resultType="com.ruoyi.process.dto.QualitySuperviseDetailsDto">
+        select *
+        from (select cd.*,
+        cr.is_according,
+        ca.is_correct,
+        cc.supervise_details_correct_id,
+        case
+        when cr.is_finish = 1 then 3
+        when cr.is_finish = 0 then 2
+        when cr.supervise_details_record_id is not null then 1
+        else 0
+        end record_status,
+        case
+        when ca.is_finish = 1 then 3
+        when ca.is_finish = 0 then 2
+        when ca.supervise_details_according_id is not null then 1
+        else 0
+        end according_status,
+        case
+        when cc.is_finish = 1 then 3
+        when cc.is_finish = 0 then 2
+        when cc.supervise_details_correct_id is not null then 1
+        else 0
+        end correct_status
+        from cnas_quality_supervise_details cd
+        left join cnas_quality_supervise_details_record cr
+        on cr.supervise_details_id = cd.supervise_details_id
+        left join cnas_quality_supervise_details_according ca
+        on ca.supervise_details_id = cd.supervise_details_id
+        left join cnas_quality_supervise_details_correct cc
+        on cc.supervise_details_id = cd.supervise_details_id
+        where 1=1
+        <choose>
+            <when test="causeType != null and causeType == 1">
+                and cd.supervise_reason not like '%鍔ㄦ��%'
+            </when>
+            <when test="causeType != null and causeType == 2">
+                and cd.supervise_reason like '%鍔ㄦ��%'
+            </when>
+            <otherwise>
+                and cd.supervise_reason not like '%鍔ㄦ��%'
+            </otherwise>
+        </choose>
+              order by STR_TO_DATE(CONCAT(cd.supervise_time, '.01'), '%Y.%m.%d')) a
+        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
+            ${ew.customSqlSegment}
+        </if>
+    </select>
+</mapper>
diff --git a/cnas-process/src/main/resources/mapper/QualitySuperviseDetailsRecordMapper.xml b/cnas-process/src/main/resources/mapper/QualitySuperviseDetailsRecordMapper.xml
new file mode 100644
index 0000000..1dd051f
--- /dev/null
+++ b/cnas-process/src/main/resources/mapper/QualitySuperviseDetailsRecordMapper.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+<mapper namespace="com.ruoyi.process.mapper.QualitySuperviseDetailsRecordMapper">
+
+    <!--瀵煎嚭鐩戠潱璁板綍琛�-->
+    <select id="selectSuperviseDetailRecord" resultType="com.ruoyi.process.pojo.QualitySuperviseDetailsRecord">
+        select cqsdr.*
+        from cnas_quality_supervise_details_record cqsdr
+        where cqsdr.supervise_details_id = #{superviseDetailsId}
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/cnas-process/src/main/resources/mapper/QualitySuperviseManagementReviewMapper.xml b/cnas-process/src/main/resources/mapper/QualitySuperviseManagementReviewMapper.xml
new file mode 100644
index 0000000..ff901d2
--- /dev/null
+++ b/cnas-process/src/main/resources/mapper/QualitySuperviseManagementReviewMapper.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.process.mapper.QualitySuperviseManagementReviewMapper">
+
+
+    <select id="pageManagementReview" resultType="com.ruoyi.process.pojo.QualitySuperviseManagementReview">
+        select *
+        from cnas_quality_supervise_management_review
+        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
+            ${ew.customSqlSegment}
+        </if>
+    </select>
+
+</mapper>
diff --git a/cnas-process/src/main/resources/mapper/QualitySuperviseMapper.xml b/cnas-process/src/main/resources/mapper/QualitySuperviseMapper.xml
new file mode 100644
index 0000000..17f17c8
--- /dev/null
+++ b/cnas-process/src/main/resources/mapper/QualitySuperviseMapper.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+<mapper namespace="com.ruoyi.process.mapper.QualitySuperviseMapper">
+
+    <!-- 鐩戠潱璁″垝鍒楄〃 -->
+    <select id="pageQualitySupervise" resultType="com.ruoyi.process.pojo.QualitySupervise">
+        select *
+        from (select *
+              from cnas_quality_supervise
+              order by create_time desc ) a
+        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
+            ${ew.customSqlSegment}
+        </if>
+    </select>
+    <!-- 鏌ヨ璇ヨ鍒掔洃鐫e憳 -->
+
+    <select id="getRecordUser" resultType="java.util.Map">
+        select u.id   userId,
+               u.name userName
+        from user u
+                 left join cnas_quality_supervise cqs on find_in_set(u.id, cqs.record_user_ids)
+                 left join cnas_quality_supervise_details cqsd on cqs.supervise_id = cqsd.supervise_id
+        where cqsd.supervise_details_id = #{superviseDetailsId}
+    </select>
+
+</mapper>
diff --git a/cnas-process/src/main/resources/static/excel/check-records.xlsx b/cnas-process/src/main/resources/static/excel/check-records.xlsx
new file mode 100644
index 0000000..7afdfff
--- /dev/null
+++ b/cnas-process/src/main/resources/static/excel/check-records.xlsx
Binary files differ
diff --git a/cnas-process/src/main/resources/static/inconsistent-distribution.docx b/cnas-process/src/main/resources/static/inconsistent-distribution.docx
new file mode 100644
index 0000000..d41623f
--- /dev/null
+++ b/cnas-process/src/main/resources/static/inconsistent-distribution.docx
Binary files differ
diff --git a/cnas-process/src/main/resources/static/inspection-order.docx b/cnas-process/src/main/resources/static/inspection-order.docx
new file mode 100644
index 0000000..32e08a2
--- /dev/null
+++ b/cnas-process/src/main/resources/static/inspection-order.docx
Binary files differ
diff --git a/cnas-process/src/main/resources/static/method-verify.docx b/cnas-process/src/main/resources/static/method-verify.docx
new file mode 100644
index 0000000..8ab5461
--- /dev/null
+++ b/cnas-process/src/main/resources/static/method-verify.docx
Binary files differ
diff --git a/cnas-process/src/main/resources/static/quality-monitor-details-ratify.docx b/cnas-process/src/main/resources/static/quality-monitor-details-ratify.docx
new file mode 100644
index 0000000..420d810
--- /dev/null
+++ b/cnas-process/src/main/resources/static/quality-monitor-details-ratify.docx
Binary files differ
diff --git a/cnas-process/src/main/resources/static/quality-monitor-evaluate.docx b/cnas-process/src/main/resources/static/quality-monitor-evaluate.docx
new file mode 100644
index 0000000..c3e8a2e
--- /dev/null
+++ b/cnas-process/src/main/resources/static/quality-monitor-evaluate.docx
Binary files differ
diff --git a/cnas-process/src/main/resources/static/quality-monitor.docx b/cnas-process/src/main/resources/static/quality-monitor.docx
new file mode 100644
index 0000000..8ad9990
--- /dev/null
+++ b/cnas-process/src/main/resources/static/quality-monitor.docx
Binary files differ
diff --git a/cnas-process/src/main/resources/static/quality-supervise.docx b/cnas-process/src/main/resources/static/quality-supervise.docx
new file mode 100644
index 0000000..2d94d9c
--- /dev/null
+++ b/cnas-process/src/main/resources/static/quality-supervise.docx
Binary files differ
diff --git a/cnas-process/src/main/resources/static/report-deal.docx b/cnas-process/src/main/resources/static/report-deal.docx
new file mode 100644
index 0000000..7f515a5
--- /dev/null
+++ b/cnas-process/src/main/resources/static/report-deal.docx
Binary files differ
diff --git a/cnas-process/src/main/resources/static/sample-deal.docx b/cnas-process/src/main/resources/static/sample-deal.docx
new file mode 100644
index 0000000..7cc0d8b
--- /dev/null
+++ b/cnas-process/src/main/resources/static/sample-deal.docx
Binary files differ
diff --git a/cnas-process/src/main/resources/static/sample-receive.docx b/cnas-process/src/main/resources/static/sample-receive.docx
new file mode 100644
index 0000000..7030cf9
--- /dev/null
+++ b/cnas-process/src/main/resources/static/sample-receive.docx
Binary files differ
diff --git a/cnas-process/src/main/resources/static/supervise-detail-correct.docx b/cnas-process/src/main/resources/static/supervise-detail-correct.docx
new file mode 100644
index 0000000..f5e3a23
--- /dev/null
+++ b/cnas-process/src/main/resources/static/supervise-detail-correct.docx
Binary files differ
diff --git a/cnas-process/src/main/resources/static/supervise-management-eview.docx b/cnas-process/src/main/resources/static/supervise-management-eview.docx
new file mode 100644
index 0000000..7dcdc48
--- /dev/null
+++ b/cnas-process/src/main/resources/static/supervise-management-eview.docx
Binary files differ
diff --git a/cnas-process/src/main/resources/static/supervision-detail-according.docx b/cnas-process/src/main/resources/static/supervision-detail-according.docx
new file mode 100644
index 0000000..0b2ac36
--- /dev/null
+++ b/cnas-process/src/main/resources/static/supervision-detail-according.docx
Binary files differ
diff --git a/cnas-process/src/main/resources/static/supervision-detail-record.docx b/cnas-process/src/main/resources/static/supervision-detail-record.docx
new file mode 100644
index 0000000..24cab26
--- /dev/null
+++ b/cnas-process/src/main/resources/static/supervision-detail-record.docx
Binary files differ
diff --git a/cnas-require/src/main/java/com/ruoyi/require/controller/FeCalibrationScheduleController.java b/cnas-require/src/main/java/com/ruoyi/require/controller/FeCalibrationScheduleController.java
new file mode 100644
index 0000000..d2c3399
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/controller/FeCalibrationScheduleController.java
@@ -0,0 +1,97 @@
+package com.ruoyi.require.controller;
+
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.read.listener.PageReadListener;
+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.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.require.excel.FeCalibrationScheduleExport;
+import com.ruoyi.require.pojo.FeCalibrationSchedule;
+import com.ruoyi.require.service.FeCalibrationScheduleService;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.List;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author 
+ * @since 2024-11-13 02:53:05
+ */
+@Tag(name = "閲忓�兼函婧愯鍒�")
+@RestController
+@RequestMapping("/feCalibrationSchedule")
+public class FeCalibrationScheduleController {
+
+    @Resource
+    private FeCalibrationScheduleService feCalibrationScheduleService;
+
+    @Operation(summary = "閲忓�兼函婧愯鍒掓煡璇�")
+    @GetMapping("/getPageCalibrationSchedule")
+    public Result<IPage<FeCalibrationSchedule>> getPageCalibrationSchedule(Page page, String instrumentName, String managementNumber) {
+        IPage<FeCalibrationSchedule> ipage = feCalibrationScheduleService.page(page,instrumentName, managementNumber);
+        return Result.success(ipage);
+    }
+
+    @Operation(summary = "閲忓�兼函婧愯鍒掓柊澧炵紪杈�")
+    @PostMapping("/addCalibrationSchedule")
+    public Result addCalibrationSchedule(@RequestBody FeCalibrationSchedule feCalibrationSchedule) {
+        return Result.success(feCalibrationScheduleService.saveOrUpdate(feCalibrationSchedule));
+    }
+
+    @Operation(summary = "閲忓�兼函婧愯鍒掑垹闄�")
+    @GetMapping("/removeCalibrationSchedule")
+    public Result removeCalibrationSchedule(Integer id) {
+        return Result.success(feCalibrationScheduleService.removeById(id));
+    }
+
+
+    @Operation(summary = "閲忓�兼函婧愯鍒掑鍑�")
+    @PostMapping("exportOfValueTraceabilityPlan")
+    public void exportOfValueTraceabilityPlan(String instrumentName, String managementNumber,
+                                       HttpServletResponse response) throws Exception {
+        IPage<FeCalibrationSchedule> data = feCalibrationScheduleService.page(new Page<>(1, -1),instrumentName, managementNumber);
+        List<FeCalibrationScheduleExport> studentList  = JSONObject.parseArray(JSON.toJSONString(data.getRecords()), FeCalibrationScheduleExport.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(FeCalibrationScheduleExport.class)
+                .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()) // 鑷�傚簲鍒楀
+                .sheet("sheet")
+                .doWrite(studentList);
+    }
+
+    @Operation(summary = "importOfValueTraceabilityPlan")
+    @PostMapping("/importOfValueTraceabilityPlan")
+    public void importOfValueTraceabilityPlan(MultipartFile file) throws IOException {
+        if (file.isEmpty()) {
+            return;
+        }
+        EasyExcel.read(file.getInputStream(), FeCalibrationScheduleExport.class, new PageReadListener<FeCalibrationScheduleExport>(dataList -> {
+            List<FeCalibrationSchedule> studentList  = JSONObject.parseArray(JSON.toJSONString(dataList), FeCalibrationSchedule.class);
+            feCalibrationScheduleService.saveOrUpdateBatch(studentList);
+        })).sheet().doRead();
+    }
+
+
+//    Equipment quantity traceability management
+    @Operation(summary = "閲忓�兼函婧愯鍒掑鍑簑ord")
+    @GetMapping("/exportWordOfValueTraceabilityPlan")
+    public void exportWordOfValueTraceabilityPlan(HttpServletResponse response) throws IOException {
+        feCalibrationScheduleService.exportWordOfValueTraceabilityPlan(response);
+    }
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/controller/FeIlluminationController.java b/cnas-require/src/main/java/com/ruoyi/require/controller/FeIlluminationController.java
new file mode 100644
index 0000000..6b3c453
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/controller/FeIlluminationController.java
@@ -0,0 +1,88 @@
+package com.ruoyi.require.controller;
+
+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.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.require.dto.FeIlluminationAddDto;
+import com.ruoyi.require.dto.FeIlluminationDto;
+import com.ruoyi.require.pojo.FeIllumination;
+import com.ruoyi.require.pojo.FeIlluminationDetectionArea;
+import com.ruoyi.require.service.FeIlluminationDetectionAreaService;
+import com.ruoyi.require.service.FeIlluminationService;
+import io.swagger.v3.oas.annotations.Operation;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import jakarta.servlet.http.HttpServletResponse;
+
+/**
+ * <p>
+ * 璁炬柦鍜岀幆澧冩潯浠�-璁炬柦鍜岀幆澧冩潯浠惰姹�-鐓у害璁板綍琛� 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 
+ * @since 2024-11-07 04:15:57
+ */
+@RestController
+@RequestMapping("/feIllumination")
+public class FeIlluminationController {
+
+    @Autowired
+    private FeIlluminationService feIlluminationService;
+
+    @Autowired
+    private FeIlluminationDetectionAreaService feIlluminationDetectionAreaService;
+
+    @PostMapping("addFeLightningProtection")
+    @Operation(summary = "璁炬柦鍜岀幆澧冩潯浠惰姹�-鐓у害璁板綍琛�-妫�娴嬪尯鍩� 鏂板/淇敼")
+    public Result<?> addFeLightningProtection(@RequestBody FeIlluminationAddDto feIlluminationAddDto) {
+        FeIllumination feIllumination = new FeIllumination();
+        BeanUtils.copyProperties(feIlluminationAddDto, feIllumination);
+        feIlluminationService.saveOrUpdate(feIllumination);
+        if (CollectionUtils.isNotEmpty(feIlluminationAddDto.getIlluminationDetectionAreaList())) {
+            feIlluminationAddDto.getIlluminationDetectionAreaList().forEach(i -> i.setIntensityIlluminationId(feIllumination.getIntensityIlluminationId()));
+            feIlluminationDetectionAreaService.saveOrUpdateBatch(feIlluminationAddDto.getIlluminationDetectionAreaList());
+        }
+        return Result.success();
+    }
+
+    @DeleteMapping("deleteFeLightningProtection")
+    @Operation(summary = "璁炬柦鍜岀幆澧冩潯浠惰姹�-鐓у害璁板綍琛�-妫�娴嬪尯鍩� 鍒犻櫎")
+    public Result<?> deleteFeLightningProtection(@RequestParam("intensityIlluminationId") Integer intensityIlluminationId) {
+        feIlluminationService.removeById(intensityIlluminationId);
+        return Result.success();
+    }
+
+    @GetMapping("getFeLightningProtection")
+    @Operation(summary = "鐓у害璁板綍琛�-妫�娴嬪尯鍩� 鏌ヨ")
+    public Result<IPage<FeIlluminationDto>> getFeLightningProtection(Page page) {
+        IPage<FeIlluminationDto> page1 = feIlluminationService.getFeLightningProtection(page);
+        return Result.success(page1);
+    }
+
+    @DeleteMapping("deleteFeIlluminationDetectionArea")
+    @Operation(summary = "鐓у害璁板綍琛�-妫�娴嬪尯鍩� 鍒犻櫎")
+    public Result<?> deleteFeIlluminationDetectionArea(@RequestParam("detectionAreaId") Integer detectionAreaId) {
+        return Result.success(feIlluminationDetectionAreaService.removeById(detectionAreaId));
+    }
+
+    @GetMapping("getFeIlluminationDetectionArea")
+    @Operation(summary = "鐓у害璁板綍琛�-妫�娴嬪尯鍩� 鏍规嵁鐓у害璁板綍鏌ヨ")
+    public Result<?> getFeIlluminationDetectionArea(@RequestParam("intensityIlluminationId") Integer intensityIlluminationId) {
+        return Result.success(feIlluminationDetectionAreaService.list(Wrappers.<FeIlluminationDetectionArea>lambdaQuery()
+                .eq(FeIlluminationDetectionArea::getIntensityIlluminationId, intensityIlluminationId)));
+    }
+
+    /**
+     * 瀵煎嚭鐓у害璁板綍
+     * @return
+     */
+    @Operation(summary = "瀵煎嚭鐓у害璁板綍")
+    @GetMapping("/exportFeIllumination")
+    public void exportFeIllumination(Integer intensityIlluminationId, HttpServletResponse response){
+        feIlluminationService.exportFeIllumination(intensityIlluminationId, response);
+    }
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/controller/FeLightningProtectionController.java b/cnas-require/src/main/java/com/ruoyi/require/controller/FeLightningProtectionController.java
new file mode 100644
index 0000000..e3aa189
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/controller/FeLightningProtectionController.java
@@ -0,0 +1,80 @@
+package com.ruoyi.require.controller;
+
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.common.utils.FileSaveUtil;
+import com.ruoyi.require.excel.FeLightningProtectionExcel;
+import com.ruoyi.require.pojo.FeLightningProtection;
+import com.ruoyi.require.service.FeLightningProtectionService;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import jakarta.servlet.http.HttpServletResponse;
+import java.util.List;
+
+/**
+ * <p>
+ * 璁炬柦鍜岀幆澧冩潯浠�-璁炬柦鍜岀幆澧冩潯浠惰姹�-闃查浄妫�娴� 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 
+ * @since 2024-11-07 04:16:36
+ */
+@Tag(name = "璁炬柦鍜岀幆澧冩潯浠惰姹�-闃查浄妫�娴�")
+@RestController
+@RequestMapping("/feLightningProtection")
+public class FeLightningProtectionController {
+
+    @Autowired
+    private FeLightningProtectionService feLightningProtectionService;
+
+    @PostMapping("addLightningProtectionDetection")
+    @Operation(summary = "璁炬柦鍜岀幆澧冩潯浠惰姹�-闃查浄妫�娴嬫柊澧�/淇敼")
+    public Result<?> addLightningProtectionDetection(FeLightningProtection feLightningProtection,
+                                                     @RequestPart(value = "file", required = false) MultipartFile file) {
+        if (ObjectUtils.isNotEmpty(file)) {
+            String s = FileSaveUtil.uploadWordFile(file);
+            feLightningProtection.setSystemFileName(s);
+            feLightningProtection.setFileName(file.getOriginalFilename());
+        }
+        feLightningProtectionService.saveOrUpdate(feLightningProtection);
+        return Result.success();
+    }
+
+    @DeleteMapping("deleteLightningProtectionDetection")
+    @Operation(summary = "璁炬柦鍜岀幆澧冩潯浠惰姹�-闃查浄妫�娴嬪垹闄�")
+    public Result<?> deleteFeLightningProtection(@RequestParam("lightningProtectionId") Integer lightningProtectionId) {
+        feLightningProtectionService.removeById(lightningProtectionId);
+        return Result.success();
+    }
+
+    @GetMapping("getLightningProtectionDetection")
+    @Operation(summary = "璁炬柦鍜岀幆澧冩潯浠惰姹�-闃查浄妫�娴嬫煡璇�")
+    public Result<IPage<FeLightningProtection>> getFeLightningProtection(Page page) {
+        IPage<FeLightningProtection> page1 = feLightningProtectionService.page(page);
+        return Result.success(page1);
+    }
+
+    @Operation(summary = "璁炬柦鍜岀幆澧冩潯浠惰姹�-闃查浄妫�娴嬪鍑�")
+    @GetMapping("exportOfLightningProtectionDetection")
+    public void exportOfLightningProtectionDetection(HttpServletResponse response) throws Exception {
+        List<FeLightningProtectionExcel> ipage = feLightningProtectionService.exportOfLightningProtectionDetection();
+        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(FeLightningProtectionExcel.class)
+                .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()) // 鑷�傚簲鍒楀
+                .sheet("sheet")
+                .doWrite(ipage);
+    }
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/controller/FePowerStableController.java b/cnas-require/src/main/java/com/ruoyi/require/controller/FePowerStableController.java
new file mode 100644
index 0000000..e057abb
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/controller/FePowerStableController.java
@@ -0,0 +1,99 @@
+package com.ruoyi.require.controller;
+
+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.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.require.dto.FePowerStableAddDto;
+import com.ruoyi.require.dto.FePowerStableDto;
+import com.ruoyi.require.pojo.FeMeasuredQuantity;
+import com.ruoyi.require.pojo.FePowerStable;
+import com.ruoyi.require.service.FeMeasuredQuantityService;
+import com.ruoyi.require.service.FePowerStableService;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import jakarta.servlet.http.HttpServletResponse;
+
+/**
+ * <p>
+ * 璁炬柦鍜岀幆澧冩潯浠�-璁炬柦鍜岀幆澧冩潯浠惰姹�-鐢垫簮绋冲畾鎬� 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-07 04:16:52
+ */
+@Tag(name = "璁炬柦鍜岀幆澧冩潯浠�-璁炬柦鍜岀幆澧冩潯浠惰姹�-鐢垫簮绋冲畾鎬�")
+@RestController
+@RequestMapping("/fePowerStable")
+public class FePowerStableController {
+
+    @Autowired
+    private FeMeasuredQuantityService feMeasuredQuantityService;
+
+    @Autowired
+    private FePowerStableService fePowerStableService;
+
+    @PostMapping("addLaboratoryFacilityPowerStable")
+    @Operation(summary = "鐢垫簮绋冲畾鎬ф柊澧�/淇敼")
+    public Result<?> addLaboratoryFacilityPowerStable(@RequestBody FePowerStableAddDto fePowerStableAddDto) {
+        FePowerStable fePowerStable = new FePowerStable();
+        BeanUtils.copyProperties(fePowerStableAddDto, fePowerStable);
+        fePowerStableService.saveOrUpdate(fePowerStable);
+        if (CollectionUtils.isNotEmpty(fePowerStableAddDto.getFeMeasuredQuantityList())) {
+            fePowerStableAddDto.getFeMeasuredQuantityList().forEach(i -> i.setPowerStableId(fePowerStable.getPowerStableId()));
+            feMeasuredQuantityService.saveOrUpdateBatch(fePowerStableAddDto.getFeMeasuredQuantityList());
+        }
+        return Result.success();
+    }
+
+    @DeleteMapping("deleteLaboratoryFacilityPowerStable")
+    @Operation(summary = "鐢垫簮绋冲畾鎬у垹闄�")
+    public Result<FePowerStable> deleteLaboratoryFacilityPowerStable(@RequestParam("powerStableId") Integer powerStableId) {
+        fePowerStableService.removeById(powerStableId);
+        feMeasuredQuantityService.remove(Wrappers.<FeMeasuredQuantity>lambdaQuery()
+                .eq(FeMeasuredQuantity::getPowerStableId, powerStableId));
+        return Result.success();
+    }
+
+    @GetMapping("getLaboratoryFacilityPowerStablePage")
+    @Operation(summary = "鐢垫簮绋冲畾鎬ф煡璇�")
+    public Result<IPage<FePowerStableDto>> getLaboratoryFacilityPowerStablePage(
+            Page page) {
+        IPage<FePowerStableDto> page1 = fePowerStableService.getLaboratoryFacilityPowerStablePage(page);
+        return Result.success(page1);
+    }
+
+    @Operation(summary = "閫夋嫨璁惧鍚庢煡璇㈡渶鏂拌澶囩紪鍙凤紝鏍″噯鏃ユ湡")
+    @GetMapping("getCalibrationDate")
+    public Result<?> getCalibrationDate(@RequestParam("deviceId") Integer deviceId) {
+        return Result.success(fePowerStableService.getCalibrationDate(deviceId));
+    }
+
+    @DeleteMapping("deleteFeMeasuredQuantity")
+    @Operation(summary = "鐢垫簮绋冲畾鎬�-娴嬪畾閲� 鍒犻櫎")
+    public Result<?> deleteFeMeasuredQuantity(@RequestParam("measuredQuantityId") Integer measuredQuantityId) {
+        return Result.success(feMeasuredQuantityService.removeById(measuredQuantityId));
+    }
+
+    @GetMapping("getFeMeasuredQuantityService")
+    @Operation(summary = "鐢垫簮绋冲畾鎬�-娴嬪畾閲� 鏍规嵁鐢垫簮绋冲畾鎬ф煡璇�")
+    public Result<?> getFeMeasuredQuantityService(@RequestParam("powerStableId") Integer powerStableId) {
+        return Result.success(feMeasuredQuantityService.list(Wrappers.<FeMeasuredQuantity>lambdaQuery()
+                .eq(FeMeasuredQuantity::getPowerStableId, powerStableId)));
+    }
+
+    /**
+     * 瀵煎嚭鐢垫簮绋冲畾鎬�
+     * @return
+     */
+    @Operation(summary = "瀵煎嚭鐢垫簮绋冲畾鎬�")
+    @GetMapping("/exportFePowerStable")
+    public void exportFePowerStable(Integer powerStableId, HttpServletResponse response){
+        fePowerStableService.exportFePowerStable(powerStableId, response);
+    }
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/controller/FeStandardSubstanceAcceptanceController.java b/cnas-require/src/main/java/com/ruoyi/require/controller/FeStandardSubstanceAcceptanceController.java
new file mode 100644
index 0000000..923fc72
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/controller/FeStandardSubstanceAcceptanceController.java
@@ -0,0 +1,88 @@
+package com.ruoyi.require.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.require.dto.AcceptanceDto;
+import com.ruoyi.require.pojo.FeStandardSubstanceAcceptanceInspection;
+import com.ruoyi.require.service.FeStandardSubstanceAcceptanceInspectionService;
+import com.ruoyi.require.service.FeStandardSubstanceAcceptanceService;
+import com.ruoyi.require.vo.AcceptanceVo;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.*;
+
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletResponse;
+
+/**
+ * <p>
+ * 鏍囧噯鐗╄川楠屾敹 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 
+ * @since 2024-11-14 03:29:41
+ */
+@Tag(name = "鏍囧噯鐗╄川楠屾敹")
+@RestController
+@RequestMapping("/feStandardSubstanceAcceptance")
+public class FeStandardSubstanceAcceptanceController {
+
+    @Autowired
+    private FeStandardSubstanceAcceptanceInspectionService inspectionService;
+    @Resource
+    private FeStandardSubstanceAcceptanceService feStandardSubstanceAcceptanceService;
+
+    @Operation(summary = "鏂板")
+    @PostMapping("/addAcceptance")
+    @Transactional
+    public Result addAcceptance(@RequestBody AcceptanceDto dto) {
+        feStandardSubstanceAcceptanceService.addAcceptance(dto);
+        return Result.success();
+    }
+
+    @Operation(summary = "鏍囧噯鐗╄川楠屾敹鏌ヨ")
+    @GetMapping("/getPageAcceptance")
+    public Result<IPage<AcceptanceVo>> getPageAcceptance(Page page, String name) {
+        IPage<AcceptanceVo> ipage = feStandardSubstanceAcceptanceService.getPageAcceptance(page, name);
+        return Result.success(ipage);
+    }
+
+    @Operation(summary = "鏍囧噯鐗╄川楠屾敹鍒犻櫎")
+    @GetMapping("/deleteAcceptance/{id}")
+    public Result deleteAcceptance(@PathVariable("id") Integer id) {
+        return Result.success(feStandardSubstanceAcceptanceService.deleteAcceptance(id));
+    }
+
+    @Operation(summary = "缂栬緫")
+    @PostMapping("/updateAcceptance")
+    public Result updateAcceptance(@RequestBody AcceptanceDto acceptanceDto) {
+        feStandardSubstanceAcceptanceService.updateById(acceptanceDto.getAcceptance());
+        for (FeStandardSubstanceAcceptanceInspection v : acceptanceDto.getList()) {
+            if (v.getId()== null) {
+                inspectionService.save(v);
+            }else {
+                inspectionService.updateById(v);
+            }
+        }
+        return Result.success();
+    }
+
+
+    @Operation(summary = "鏍囧噯鐗╄川楠屾敹鏌ヨ")
+    @GetMapping("/getAcceptanceDetails")
+    public Result getAcceptanceDetails(Integer id) {
+        return Result.success(feStandardSubstanceAcceptanceService.getAcceptanceDetails(id));
+    }
+
+    @Operation(summary = "瀵煎嚭鏍囧噯鐗╄川楠屾敹")
+    @GetMapping("/exportFeStandardSubstanceAcceptance")
+    public Result exportFeStandardSubstanceAcceptance(HttpServletResponse response) {
+        feStandardSubstanceAcceptanceService.exportFeStandardSubstanceAcceptance(response);
+        return Result.success();
+    }
+
+
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/controller/FeStandardSubstanceController.java b/cnas-require/src/main/java/com/ruoyi/require/controller/FeStandardSubstanceController.java
new file mode 100644
index 0000000..d860fea
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/controller/FeStandardSubstanceController.java
@@ -0,0 +1,93 @@
+package com.ruoyi.require.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.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.require.excel.FeStandardSubstanceExcel;
+import org.springframework.web.multipart.MultipartFile;
+import com.ruoyi.require.pojo.FeStandardSubstance;
+import com.ruoyi.require.service.FeStandardSubstanceService;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
+import org.springframework.web.bind.annotation.*;
+
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletResponse;
+import java.util.List;
+
+/**
+ * <p>
+ * 鏍囧噯鐗╄川娓呭崟 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 
+ * @since 2024-11-13 03:58:59
+ */
+@Tag(name = "鏍囧噯鐗╄川娓呭崟")
+@RestController
+@RequestMapping("/feStandardSubstance")
+public class FeStandardSubstanceController {
+
+
+    @Resource
+    private FeStandardSubstanceService feStandardSubstanceService;
+
+    @Operation(summary = "鏍囧噯鐗╄川娓呭崟鏌ヨ")
+    @GetMapping("/getPageStandardSubstance")
+    public Result<IPage<FeStandardSubstance>> getPageStandardSubstance(Page page, FeStandardSubstance feStandardSubstance) {
+        IPage<FeStandardSubstance> ipage = feStandardSubstanceService.page(page, feStandardSubstance);
+        return Result.success(ipage);
+    }
+
+    @Operation(summary = "鏍囧噯鐗╄川娓呭崟鏂板缂栬緫")
+    @PostMapping("/addStandardSubstance")
+    public Result addStandardSubstance(@RequestBody FeStandardSubstance feStandardSubstance) {
+        return Result.success(feStandardSubstanceService.saveOrUpdate(feStandardSubstance));
+    }
+
+    @Operation(summary = "鏍囧噯鐗╄川娓呭崟鍒犻櫎")
+    @DeleteMapping("/removeStandardSubstance")
+    public Result removeStandardSubstance(Integer id) {
+        return Result.success(feStandardSubstanceService.removeById(id));
+    }
+
+    @Operation(summary = "鏍囧噯鐗╄川娓呭崟鏌ヨ鎵�鏈�")
+    @GetMapping("/getStandardSubstanceAll")
+    public Result<List<FeStandardSubstance>> getStandardSubstanceAll( ) {
+        return Result.success(feStandardSubstanceService.list());
+    }
+
+    @Operation(summary = "鏍囧噯鐗╄川娓呭崟瀵煎嚭")
+    @GetMapping("exportOfStandardSubstanceList")
+    public void exportOfStandardSubstanceList(FeStandardSubstance feStandardSubstance,
+                                              HttpServletResponse response) throws Exception {
+        IPage<FeStandardSubstance> ipage = feStandardSubstanceService.page(new Page<>(1, -1), feStandardSubstance);
+        List<FeStandardSubstanceExcel> studentList  = JSONObject.parseArray(JSON.toJSONString(ipage.getRecords()), FeStandardSubstanceExcel.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(FeStandardSubstanceExcel.class)
+                .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()) // 鑷�傚簲鍒楀
+                .sheet("sheet")
+                .doWrite(studentList);
+    }
+
+    @Operation(summary = "涓嬭浇鏍囧噯鐗╄川瀵煎叆妯℃澘")
+    @GetMapping("/importTemplate")
+    public void importTemplate(HttpServletResponse response) {
+        feStandardSubstanceService.downloadImportTemplate(response);
+    }
+
+    @Operation(summary = "瀵煎叆鏍囧噯鐗╄川娓呭崟")
+    @PostMapping("/importStandardSubstance")
+    public Result importStandardSubstance(MultipartFile file) {
+        return Result.success(feStandardSubstanceService.importStandardSubstance(file));
+    }
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/controller/FeStandardSubstanceRecordController.java b/cnas-require/src/main/java/com/ruoyi/require/controller/FeStandardSubstanceRecordController.java
new file mode 100644
index 0000000..fef8599
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/controller/FeStandardSubstanceRecordController.java
@@ -0,0 +1,60 @@
+package com.ruoyi.require.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.require.pojo.FeStandardSubstanceRecord;
+import com.ruoyi.require.service.FeStandardSubstanceRecordService;
+import com.ruoyi.require.vo.SubstanceRecordVo;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.*;
+
+import jakarta.annotation.Resource;
+
+/**
+ * <p>
+ * 鏍囧噯鐗╄川娓呭崟鍊熺敤褰掕繕璁板綍琛� 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-14 01:49:11
+ */
+@Tag(name = "鏍囧噯鐗╄川娓呭崟鍊熺敤褰掕繕璁板綍")
+@RestController
+@RequestMapping("/feStandardSubstanceRecord")
+public class FeStandardSubstanceRecordController {
+
+    @Resource
+    private FeStandardSubstanceRecordService feStandardSubstanceRecordService;
+
+    @Operation(summary = "鏍囧噯鐗╄川娓呭崟鍊熺敤")
+    @PostMapping("/borrowSubstance")
+    @Transactional
+    public Result borrowSubstance(@RequestBody FeStandardSubstanceRecord record) {
+        feStandardSubstanceRecordService.borrowSubstance(record);
+        return Result.success();
+    }
+
+    @Operation(summary = "鏍囧噯鐗╄川娓呭崟褰掕繕")
+    @PostMapping("/returnSubstance")
+    @Transactional
+    public Result returnSubstance(@RequestBody FeStandardSubstanceRecord record) {
+        feStandardSubstanceRecordService.returnSubstance(record);
+        return Result.success();
+    }
+
+    @Operation(summary = "鏍囧噯鐗╄川娓呭崟棰嗙敤鏌ヨ")
+    @PostMapping("/getSubstanceRecord")
+    public Result getSubstanceRecord(Integer id) {
+        return Result.success(feStandardSubstanceRecordService.getSubstanceRecord(id));
+    }
+
+    @Operation(summary = "鍒嗛〉鏌ヨ")
+    @GetMapping("/getPageSubstanceRecord")
+    public Result<IPage<SubstanceRecordVo>> getPageSubstanceRecord(Page page, SubstanceRecordVo vo) {
+        IPage<SubstanceRecordVo> ipage = feStandardSubstanceRecordService.getPage(page,vo);
+        return Result.success(ipage);
+    }
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/controller/FeTempHumDateController.java b/cnas-require/src/main/java/com/ruoyi/require/controller/FeTempHumDateController.java
new file mode 100644
index 0000000..85596b0
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/controller/FeTempHumDateController.java
@@ -0,0 +1,118 @@
+package com.ruoyi.require.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.ruoyi.common.core.domain.Result;
+import com.ruoyi.require.dto.FeTempHumDateDto;
+import com.ruoyi.require.dto.FeTempHumRecordDto;
+import com.ruoyi.require.pojo.FeTempHumDate;
+import com.ruoyi.require.pojo.FeTempHumRecord;
+import com.ruoyi.require.service.FeTempHumDateService;
+import com.ruoyi.require.service.FeTempHumRecordService;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import jakarta.servlet.http.HttpServletResponse;
+
+/**
+ * <p>
+ * 璁炬柦鍜岀幆澧冩潯浠�-璁炬柦鍜岀幆澧冩潯浠惰姹�-娓╂箍搴� 鍖哄煙 -鐖� 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-09 11:02:18
+ */
+@Tag(name = "娓╂箍搴﹁褰�")
+@RestController
+@RequestMapping("/feTempHumDate")
+public class FeTempHumDateController {
+
+    @Autowired
+    private FeTempHumDateService feTempHumDateService;
+
+    @Autowired
+    private FeTempHumRecordService feTempHumRecordService;
+
+    @PostMapping("addFeTempHumDate")
+    @Operation(summary = "璇曢獙鍖哄煙-鏂板/淇敼")
+    public Result<?> addFeTempHumDate(@RequestBody FeTempHumDate feTempHumDate) {
+        feTempHumDateService.saveOrUpdate(feTempHumDate);
+        return Result.success();
+    }
+
+    @DeleteMapping("deleteFeTempHumDate")
+    @Operation(summary = "璇曢獙鍖哄煙-鍒犻櫎")
+    public Result<?> deleteFeTempHumDate(
+            @RequestParam("dateId") Integer dateId) {
+        feTempHumDateService.removeById(dateId);
+        return Result.success();
+    }
+
+    @GetMapping("getFeTempHumDate")
+    @Operation(summary = "璇曢獙鍖哄煙-鏌ヨ")
+    public Result<IPage<FeTempHumDateDto>> getFeTempHumDate(Page page, FeTempHumDateDto feTempHumDateDto) {
+        IPage<FeTempHumDateDto> page1 = feTempHumDateService.getFeTempHumDate(page, feTempHumDateDto);
+        return Result.success(page1);
+    }
+
+    @PostMapping("addFeTempHumRecord")
+    @Operation(summary = "娓╂箍搴﹁褰曟柊澧�/淇敼")
+    public Result<FeTempHumRecord> addFeTempHumRecord(@RequestBody FeTempHumRecord feTempHumRecord) {
+        if (feTempHumRecord.getTempHumId() == null) {
+            feTempHumRecordService.save(feTempHumRecord);
+        } else {
+            feTempHumRecordService.update(Wrappers.<FeTempHumRecord>lambdaUpdate()
+                    .eq(FeTempHumRecord::getTempHumId, feTempHumRecord.getTempHumId())
+                    .set(FeTempHumRecord::getMorningTestTime, feTempHumRecord.getMorningTestTime())
+                    .set(FeTempHumRecord::getMorningTemp, feTempHumRecord.getMorningTemp())
+                    .set(FeTempHumRecord::getMorningHum, feTempHumRecord.getMorningHum())
+                    .set(FeTempHumRecord::getMorningRecorderId, feTempHumRecord.getMorningRecorderId())
+                    .set(FeTempHumRecord::getAfternoonTime, feTempHumRecord.getAfternoonTime())
+                    .set(FeTempHumRecord::getAfternoonTemp, feTempHumRecord.getAfternoonTemp())
+                    .set(FeTempHumRecord::getAfternoonHum, feTempHumRecord.getAfternoonHum())
+                    .set(FeTempHumRecord::getAfternoonRecorderId, feTempHumRecord.getAfternoonRecorderId())
+            );
+        }
+        return Result.success();
+    }
+
+    @DeleteMapping("deleteFeTempHumRecord")
+    @Operation(summary = "娓╂箍搴﹁褰曞垹闄�")
+    public Result<?> deleteFeTempHumRecord(
+            @RequestParam("tempHumId") Integer tempHumId) {
+        feTempHumRecordService.removeById(tempHumId);
+        return Result.success();
+    }
+
+    @GetMapping("getFeTempHumRecordPage")
+    @Operation(summary = "娓╂箍搴﹁褰曟煡璇�")
+    public Result<IPage<FeTempHumRecordDto>> getFeTempHumRecordPage(Page page, Integer dateId) {
+        IPage<FeTempHumRecordDto> page1 = feTempHumRecordService.getFeTempHumRecordPage(page, dateId);
+        return Result.success(page1);
+    }
+
+    /**
+     * 娓╂箍搴﹁褰曞鍑�
+     * @return
+     */
+    @Operation(summary = "瀵煎嚭")
+    @GetMapping("/exportTemperatureAndHumidityRecords")
+    public void exportTemperatureAndHumidityRecords(Integer dateId, HttpServletResponse response){
+        feTempHumDateService.exportTemperatureAndHumidityRecords(dateId, response);
+    }
+
+    /**
+     * 娓╂箍搴︾‘璁�
+     * @param feTempHumDate
+     * @return
+     */
+    @Operation(summary = "娓╂箍搴︾‘璁�")
+    @PostMapping("affirmFeTempHumDate")
+    public Result<?> affirmFeTempHumDate(@RequestBody FeTempHumDate feTempHumDate) {
+        feTempHumDateService.affirmFeTempHumDate(feTempHumDate);
+        return Result.success();
+    }
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/controller/ForeignRegisterController.java b/cnas-require/src/main/java/com/ruoyi/require/controller/ForeignRegisterController.java
new file mode 100644
index 0000000..f041cdd
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/controller/ForeignRegisterController.java
@@ -0,0 +1,96 @@
+package com.ruoyi.require.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.common.utils.JackSonUtil;
+import com.ruoyi.require.dto.ForeignRegisterDto;
+import com.ruoyi.require.pojo.ForeignRegister;
+import com.ruoyi.require.service.ForeignRegisterService;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+
+import jakarta.servlet.http.HttpServletResponse;
+import java.util.Map;
+
+/**
+ * <p>
+ * 澶栨潵浜哄憳鐧昏 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-19 07:17:35
+ */
+@Tag(name = "澶栨潵浜哄憳鐧昏")
+@AllArgsConstructor
+@RestController
+@RequestMapping("/foreignRegister")
+public class ForeignRegisterController {
+
+    private ForeignRegisterService foreignRegisterService;
+
+    /**
+     * 澶栨潵浜哄憳鐧昏鍒嗛〉鏌ヨ
+     * @param page
+     * @param foreignRegister
+     * @return
+     */
+    @Operation(summary = "澶栨潵浜哄憳鐧昏鍒嗛〉鏌ヨ")
+    @GetMapping("/pageForeignRegister")
+    public Result<IPage<ForeignRegisterDto>> pageForeignRegister(Page page,ForeignRegisterDto foreignRegister) throws Exception {
+        return Result.success(foreignRegisterService.pageForeignRegister(page, foreignRegister));
+    }
+
+    /**
+     * 澶栨潵浜哄憳鐧昏鏂板
+     * @return
+     */
+    @Operation(summary = "澶栨潵浜哄憳鐧昏鏂板")
+    @PostMapping("/addForeignRegister")
+    public Result addForeignRegister(@RequestBody ForeignRegister foreignRegister){
+        return Result.success(foreignRegisterService.save(foreignRegister));
+    }
+
+    /**
+     * 澶栨潵浜哄憳鐧昏淇敼
+     * @return
+     */
+    @Operation(summary = "澶栨潵浜哄憳鐧昏淇敼")
+    @PostMapping("/updateForeignRegister")
+    public Result updateForeignRegister(@RequestBody ForeignRegister foreignRegister){
+        return Result.success(foreignRegisterService.updateById(foreignRegister));
+    }
+
+    /**
+     * 澶栨潵浜哄憳鐧昏鍒犻櫎
+     * @return
+     */
+    @Operation(summary = "澶栨潵浜哄憳鐧昏鍒犻櫎")
+    @DeleteMapping("/delForeignRegister")
+    public Result delForeignRegister(Integer registerId){
+        return Result.success(foreignRegisterService.removeById(registerId));
+    }
+
+    /**
+     * 澶栨潵浜哄憳鐧昏鏌ョ湅璇︽儏
+     * @return
+     */
+    @Operation(summary = "澶栨潵浜哄憳鐧昏鏌ョ湅璇︽儏")
+    @GetMapping("/getForeignRegisterOne")
+    public Result<ForeignRegister> getForeignRegisterOne(Integer registerId){
+        return Result.success(foreignRegisterService.getById(registerId));
+    }
+
+    /**
+     * 瀵煎嚭澶栨潵浜哄憳鐧昏
+     * @return
+     */
+    @Operation(summary = "瀵煎嚭澶栨潵浜哄憳鐧昏")
+    @GetMapping("/exportForeignRegister")
+    public void exportForeignRegister(ForeignRegisterDto foreignRegister, HttpServletResponse response){
+        foreignRegisterService.exportForeignRegister(foreignRegister, response);
+    }
+
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/controller/InternalWastesController.java b/cnas-require/src/main/java/com/ruoyi/require/controller/InternalWastesController.java
new file mode 100644
index 0000000..8e0efd2
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/controller/InternalWastesController.java
@@ -0,0 +1,96 @@
+package com.ruoyi.require.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.common.utils.JackSonUtil;
+import com.ruoyi.require.dto.InternalWastesDto;
+import com.ruoyi.require.pojo.InternalWastes;
+import com.ruoyi.require.service.InternalWastesService;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+
+import jakarta.servlet.http.HttpServletResponse;
+import java.util.Map;
+
+/**
+ * <p>
+ * 瀹夊叏鍐呭姟涓夊簾鐧昏 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-19 06:39:27
+ */
+@Tag(name = "瀹夊叏鍐呭姟涓夊簾鐧昏")
+@AllArgsConstructor
+@RestController
+@RequestMapping("/internalWastes")
+public class InternalWastesController {
+
+    private InternalWastesService internalWastesService;
+
+    /**
+     * 瀹夊叏鍐呭姟涓夊簾澶勭悊鍒嗛〉鏌ヨ
+     * @param page
+     * @param internalWastes
+     * @return
+     */
+    @Operation(summary = "瀹夊叏鍐呭姟涓夊簾澶勭悊鍒嗛〉鏌ヨ")
+    @GetMapping("/pageInternalWastes")
+    public Result<IPage<InternalWastesDto>> pageInternalWastes(Page page,InternalWastes internalWastes) throws Exception {
+        return Result.success(internalWastesService.pageInternalWastes(page, internalWastes));
+    }
+
+    /**
+     * 瀹夊叏鍐呭姟涓夊簾澶勭悊鏂板
+     * @return
+     */
+    @Operation(summary = "瀹夊叏鍐呭姟涓夊簾澶勭悊鏂板")
+    @PostMapping("/addInternalWastes")
+    public Result addInternalWastes(@RequestBody InternalWastesDto internalWastes){
+        return Result.success(internalWastesService.addInternalWastes(internalWastes));
+    }
+
+    /**
+     * 瀹夊叏鍐呭姟涓夊簾澶勭悊淇敼
+     * @return
+     */
+    @Operation(summary = "瀹夊叏鍐呭姟涓夊簾澶勭悊淇敼")
+    @PostMapping("/updateInternalWastes")
+    public Result updateInternalWastes(@RequestBody InternalWastesDto internalWastes){
+        return Result.success(internalWastesService.updateInternalWastes(internalWastes));
+    }
+
+    /**
+     * 瀹夊叏鍐呭姟涓夊簾澶勭悊鍒犻櫎
+     * @return
+     */
+    @Operation(summary = "瀹夊叏鍐呭姟涓夊簾澶勭悊鍒犻櫎")
+    @DeleteMapping("/delInternalWastes")
+    public Result delInternalWastes(Integer wastesId){
+        return Result.success(internalWastesService.delInternalWastes(wastesId));
+    }
+
+    /**
+     * 瀹夊叏鍐呭姟涓夊簾澶勭悊鏌ョ湅璇︽儏
+     * @return
+     */
+    @Operation(summary = "瀹夊叏鍐呭姟涓夊簾澶勭悊鏌ョ湅璇︽儏")
+    @GetMapping("/getInternalWastesOne")
+    public Result<InternalWastesDto> getInternalWastesOne(Integer wastesId){
+        return Result.success(internalWastesService.getInternalWastesOne(wastesId));
+    }
+
+    /**
+     * 瀵煎嚭涓夊簾澶勭悊
+     * @return
+     */
+    @Operation(summary = "瀵煎嚭涓夊簾澶勭悊")
+    @GetMapping("/exportInternalWastes")
+    public void exportInternalWastes(Integer wastesId, HttpServletResponse response){
+        internalWastesService.exportInternalWastes(wastesId, response);
+    }
+
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/controller/ProcurementSuppliesContentsController.java b/cnas-require/src/main/java/com/ruoyi/require/controller/ProcurementSuppliesContentsController.java
new file mode 100644
index 0000000..3bcb819
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/controller/ProcurementSuppliesContentsController.java
@@ -0,0 +1,75 @@
+package com.ruoyi.require.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.framework.exception.ErrorException;
+import com.ruoyi.require.pojo.ProcurementSuppliesContents;
+import com.ruoyi.require.service.ProcurementSuppliesContentsService;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+
+import java.time.LocalDateTime;
+import java.util.List;
+
+@Tag(name = "鏈嶅姟鍜屼緵搴斿搧閲囪喘鍏徃鍒楄〃")
+@RestController
+@RequestMapping("/procurementSuppliesContents")
+@AllArgsConstructor
+public class ProcurementSuppliesContentsController {
+
+    private ProcurementSuppliesContentsService procurementSuppliesService;
+
+    @Operation(summary = "鏌ヨ鐩綍鍒楄〃")
+    @GetMapping("/directoryListing")
+    public Result directoryListing() {
+        return Result.success(procurementSuppliesService.directoryListing());
+    }
+
+    @Operation(summary = "鏍规嵁id鏌ヨ")
+    @GetMapping("/selectProcurementSuppliesContentById")
+    public Result selectProcurementSuppliesContentById(Integer id) {
+        return Result.success(procurementSuppliesService.getById(id));
+    }
+
+    @Operation(summary = "娣诲姞瀛愯妭鐐�")
+    @PostMapping("/addProcurementSuppliesContents")
+    public Result addProcurementSuppliesContents(@RequestBody ProcurementSuppliesContents procurementSupplies) {
+        procurementSupplies.setUpdateTime(LocalDateTime.now());
+        procurementSuppliesService.save(procurementSupplies);
+        return Result.success(procurementSupplies.getId());
+    }
+
+    @Operation(summary = "鏇存柊瀛愯妭鐐�")
+    @PostMapping("/updateProcurementSuppliesContents")
+    public Result updateProcurementSuppliesContents(@RequestBody ProcurementSuppliesContents procurementSupplies) {
+        return Result.success(procurementSuppliesService.updateById(procurementSupplies));
+    }
+
+    @Operation(summary = "鍒犻櫎瀛愯妭鐐�")
+    @DeleteMapping("/deleteProcurementSuppliesContentById")
+    public Result deleteProcurementSuppliesContentById(Integer id) {
+        List<ProcurementSuppliesContents> list = procurementSuppliesService.list(new LambdaQueryWrapper<ProcurementSuppliesContents>()
+                .eq(ProcurementSuppliesContents::getParentId, id));
+        if(list.size() > 0) {
+            throw new ErrorException("璇ヨ妭鐐瑰惈鏈夊瓙鑺傜偣,璇峰厛鍒犻櫎瀛愯妭鐐�");
+        }
+        procurementSuppliesService.removeById(id);
+        return Result.success();
+    }
+
+    @Operation(summary = "鏌ヨ鎵�鏈夎妭鐐�")
+    @GetMapping("/getNodeNames")
+    public Result getNodeNames() {
+        return Result.success(procurementSuppliesService.getNodeNames());
+    }
+
+    @Operation(summary = "鑾峰彇鎵�鏈変汉鍛�")
+    @GetMapping("/getUserList")
+    public Result getUserList() {
+        return Result.success(procurementSuppliesService.getUserList());
+    }
+
+
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/controller/ProcurementSuppliesExpendsController.java b/cnas-require/src/main/java/com/ruoyi/require/controller/ProcurementSuppliesExpendsController.java
new file mode 100644
index 0000000..96c6860
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/controller/ProcurementSuppliesExpendsController.java
@@ -0,0 +1,49 @@
+package com.ruoyi.require.controller;
+
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.common.exception.ServiceException;
+import com.ruoyi.require.dto.ProcurementSuppliesExpendDto;
+import com.ruoyi.require.service.ProcurementSuppliesExpendsService;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * <p>
+ *  鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-15 03:47:19
+ */
+@Tag(name = "鏈嶅姟鍜屼緵搴斿搧閲囪喘鑰楁潗娑堣��")
+@RestController
+@RequestMapping("/procurementSuppliesExpends")
+public class ProcurementSuppliesExpendsController {
+    @Autowired
+    private ProcurementSuppliesExpendsService procurementSuppliesExpendsService;
+
+    @Operation(summary = "鏌ヨ鎵�鏈夎褰�")
+    @GetMapping("/procurementSuppliesExpendlist")
+    public Result procurementSuppliesExpendlist(Long procurementSuppliesListId) {
+        return Result.success(procurementSuppliesExpendsService.selectAll(procurementSuppliesListId));
+    }
+
+    @Operation(summary = "鏂板娑堣�楄褰�")
+    @PostMapping("/addProcurementSuppliesExpends")
+    public Result addProcurementSuppliesExpends(@RequestBody ProcurementSuppliesExpendDto dto) throws ServiceException {
+        Integer added = procurementSuppliesExpendsService.addExpends(dto);
+
+        if ( added == 0) {
+            throw new RuntimeException("褰撳墠搴撳瓨涓嶈冻");
+        }
+        return Result.success(added);
+    }
+
+    @Operation(summary = "鍒犻櫎娑堣�楄褰�")
+    @DeleteMapping("/deleteProcurementSuppliesExpends")
+    public Result deleteProcurementSuppliesExpends(Long expendId) throws ServiceException {
+        return Result.success(procurementSuppliesExpendsService.deleteExpends(expendId));
+    }
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/controller/ProcurementSuppliesListController.java b/cnas-require/src/main/java/com/ruoyi/require/controller/ProcurementSuppliesListController.java
new file mode 100644
index 0000000..f355e3f
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/controller/ProcurementSuppliesListController.java
@@ -0,0 +1,93 @@
+package com.ruoyi.require.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.common.core.domain.entity.User;
+import com.ruoyi.require.dto.ProcurementSuppliesListDto;
+import com.ruoyi.require.mapper.ProcurementSuppliesListMapper;
+import com.ruoyi.require.mapper.SupplierManagementMapper;
+import com.ruoyi.require.pojo.ProcurementSuppliesList;
+import com.ruoyi.require.pojo.SupplierManagement;
+import com.ruoyi.require.service.ProcurementSuppliesListService;
+import com.ruoyi.system.mapper.UserMapper;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import jakarta.servlet.http.HttpServletResponse;
+
+/**
+ * <p>
+ * 鏈嶅姟涓庝緵搴斿晢 鑰楁潗鍒楄〃 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-15 04:04:32
+ */
+@Tag(name = "鏈嶅姟鍜屼緵搴斿搧閲囪喘鑰楁潗")
+@RestController
+@RequestMapping("/procurementSuppliesList")
+public class ProcurementSuppliesListController {
+    @Autowired
+    private ProcurementSuppliesListService procurementSuppliesListService;
+
+    @Autowired
+    private ProcurementSuppliesListMapper listMapper;
+
+    @Autowired
+    private UserMapper userMapper;
+
+    @Autowired
+    private SupplierManagementMapper supplierManagementMapper;
+
+    @Operation(summary = "鍒嗛〉鏌ヨ")
+    @GetMapping("/procurementSuppliesList")
+    public Result<IPage<ProcurementSuppliesListDto>> procurementSuppliesList(Page page, ProcurementSuppliesListDto list) {
+        return Result.success(procurementSuppliesListService.selectList(page, list));
+    }
+
+    @Operation(summary = "鏍规嵁id鏌ヨ鑰楁潗")
+    @GetMapping("/selectProcurementSuppliesListById")
+    public Result selectProcurementSuppliesListById(Integer id) {
+        ProcurementSuppliesList procurementSuppliesStore = listMapper.selectById(id);
+        ProcurementSuppliesListDto dto = new ProcurementSuppliesListDto();
+        BeanUtils.copyProperties(procurementSuppliesStore, dto);
+
+        User user = userMapper.selectById(procurementSuppliesStore.getPersonInCharge());
+        User updateUser = userMapper.selectById(procurementSuppliesStore.getUpdateUser());
+        SupplierManagement supplierManagement = supplierManagementMapper.selectById(procurementSuppliesStore.getSupplier());
+
+        dto.setPersonInChargeName(user.getName());
+        dto.setUpdateUserName(updateUser.getName());
+        dto.setSupplierName(supplierManagement.getSupplierName());
+        return Result.success(dto);
+    }
+
+    @Operation(summary = "鏂板鑰楁潗")
+    @PostMapping("/addProcurementSuppliesList")
+    public Result addProcurementSuppliesList(@RequestBody ProcurementSuppliesListDto dto) {
+        return Result.success(procurementSuppliesListService.addProcurementSuppliesList(dto));
+    }
+
+    @Operation(summary = "缂栬緫鑰楁潗")
+    @PostMapping("/updateProcurementSuppliesList")
+    public Result updateProcurementSuppliesList(@RequestBody ProcurementSuppliesListDto dto) {
+        return Result.success(procurementSuppliesListService.updateProcurementSuppliesList(dto));
+    }
+
+    @Operation(summary = "鍒犻櫎鑰楁潗")
+    @DeleteMapping("/deleteProcurementSuppliesList")
+    public Result deleteProcurementSuppliesList(Long id) {
+        return Result.success(listMapper.deleteById(id));
+    }
+
+    @Operation(summary = "瀵煎嚭鑰楁潗鍒楄〃")
+    @GetMapping("/exportProcurementSuppliesList")
+    public void exportProcurementSuppliesList(Integer parentId ,HttpServletResponse response) throws Exception {
+        procurementSuppliesListService.exportProcurementSuppliesList(parentId,response);
+
+    }
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/controller/ProcurementSuppliesStoreController.java b/cnas-require/src/main/java/com/ruoyi/require/controller/ProcurementSuppliesStoreController.java
new file mode 100644
index 0000000..a91dcc9
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/controller/ProcurementSuppliesStoreController.java
@@ -0,0 +1,80 @@
+package com.ruoyi.require.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.common.utils.JackSonUtil;
+import com.ruoyi.require.dto.StoreDto;
+import com.ruoyi.require.pojo.ProcurementSuppliesConsumables;
+import com.ruoyi.require.pojo.ProcurementSuppliesStore;
+import com.ruoyi.require.service.ProcurementSuppliesConsumablesService;
+import com.ruoyi.require.service.ProcurementSuppliesStoreService;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+
+import jakarta.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Tag(name = "鏈嶅姟鍜屼緵搴斿搧閲囪喘鑰楁潗鍏ュ簱")
+@RestController
+@RequestMapping("/procurementSuppliesStore")
+@AllArgsConstructor
+public class ProcurementSuppliesStoreController {
+
+    private ProcurementSuppliesStoreService storeService;
+
+    private ProcurementSuppliesConsumablesService consumablesService;
+
+
+    @Operation(summary = "鑰楁潗鍏ュ簱鍒嗛〉鏌ヨ")
+    @GetMapping("/storeList")
+    public Result storeList(Page page,StoreDto storeDto) throws Exception {
+        return Result.success(storeService.selectStoreList(page, storeDto));
+    }
+
+    @Operation(summary = "娣诲姞鑰楁潗鍏ュ簱鍒楄〃")
+    @PostMapping("/addStore")
+    public Result addStore(@RequestBody Map<String,Object> map) {
+        storeService.addStore(map);
+        return Result.success();
+    }
+
+    @Operation(summary = "鍒犻櫎鑰楁潗鍏ュ簱")
+    @DeleteMapping("/deleteStore")
+    public Result deleteStore(@RequestParam("id") Integer id,@RequestParam("consumablesId") Integer consumablesId) {
+        storeService.deleteStore(id,consumablesId);
+        return Result.success();
+    }
+
+    @Operation(summary = "鏇存柊鑰楁潗鍏ュ簱")
+        @PostMapping("/updateStore")
+    public Result updateStore(@RequestBody Map<String,Object> map) {
+        storeService.updateStore(map);
+        return Result.success();
+    }
+
+    @Operation(summary = "鏍规嵁id鏌ヨ鑰楁潗鍏ュ簱")
+    @GetMapping("/selectStoreById")
+    public Result selectStore(Integer id) {
+        HashMap<String, Object> map = new HashMap<>();
+        ProcurementSuppliesStore procurementSuppliesStore = storeService.getById(id);
+        List<ProcurementSuppliesConsumables> list = consumablesService.list(new LambdaQueryWrapper<ProcurementSuppliesConsumables>()
+                .eq(ProcurementSuppliesConsumables::getStoreId, id));
+        map.put("store", procurementSuppliesStore);
+        map.put("consumables", list);
+        return Result.success(map);
+    }
+
+    @Operation(summary = "瀵煎嚭Excel")
+    @GetMapping("/exportExcel")
+    public void exportExcel(Integer parentId, HttpServletResponse response) throws IOException {
+        storeService.exportExcel(parentId, response);
+    }
+
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/controller/SupplierManagementController.java b/cnas-require/src/main/java/com/ruoyi/require/controller/SupplierManagementController.java
new file mode 100644
index 0000000..216a5ab
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/controller/SupplierManagementController.java
@@ -0,0 +1,91 @@
+package com.ruoyi.require.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.require.pojo.SupplierManagement;
+import com.ruoyi.require.service.ProcurementSuppliesContentsService;
+import com.ruoyi.require.service.SupplierManagementService;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
+import lombok.AllArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import jakarta.servlet.http.HttpServletResponse;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 
+ * @since 2024-11-15 02:46:45
+ */
+@Tag(name = "渚涘簲鍟嗙鐞�")
+@RestController
+@RequestMapping("/supplierManagement")
+@AllArgsConstructor
+public class SupplierManagementController {
+
+    @Autowired
+    private SupplierManagementService supplierManagementService;
+
+    @Autowired
+    private ProcurementSuppliesContentsService procurementSuppliesContentsService;
+
+
+    @Operation(summary = "鏌ヨ渚涙柟鍚嶅綍")
+    @GetMapping("/selectSupplierManagementByParentId/{parentId}")
+    public Result<List<SupplierManagement>> selectSupplierManagementByParentId(@PathVariable Integer parentId) throws Exception {
+        return Result.success(supplierManagementService.selectSupplierManagementByParentId(parentId));
+    }
+
+
+    @Operation(summary = "鍒嗛〉鏌ヨ鍚堟牸渚涙柟鍚嶅綍")
+    @GetMapping("/selectQualifiedSupplierManagementPage")
+    public Result<IPage<SupplierManagement>> selectQualifiedSupplierManagement(SupplierManagement supplierManagement, Page page) throws Exception {
+        return Result.success(supplierManagementService.selectQualifiedSupplierManagement(page, supplierManagement));
+    }
+
+    @Operation(summary = "鏍规嵁ID鏌ヨ渚涘簲鍟�")
+    @GetMapping("/selectQualifiedSupplierManagementById/{supplierManagementId}")
+    public Result<List<SupplierManagement>> selectQualifiedSupplierManagementById(@PathVariable Integer supplierManagementId) throws Exception {
+        return Result.success(supplierManagementService.selectQualifiedSupplierManagementById(supplierManagementId));
+    }
+
+    @Operation(summary = "鏂板渚涘簲鍟�")
+    @PostMapping("/addSupplierManagement")
+    public Result addSupplierManagement(@RequestBody SupplierManagement supplierManagement) {
+        return Result.success(supplierManagementService.save(supplierManagement));
+    }
+
+    @Operation(summary = "淇敼渚涘簲鍟�")
+    @PostMapping("/updateSupplierManagement")
+    public Result updateSupplierManagement(@RequestBody SupplierManagement supplierManagement) {
+        supplierManagement.setUpdateUser(SecurityUtils.getUserId().intValue());
+        return Result.success(supplierManagementService.updateById(supplierManagement));
+    }
+
+    @Operation(summary = "鍒犻櫎渚涘簲鍟�")
+    @DeleteMapping("/delSupplierManagement")
+    public Result delSupplierManagement(Integer supplierManagementId) {
+        return Result.success(supplierManagementService.removeById(supplierManagementId));
+    }
+
+    @Operation(summary = "瀵煎嚭渚涘簲鍟�")
+    @PostMapping("/exportSupplierManagement/{parentId}")
+    public void exportSupplierManagement(@PathVariable Integer parentId, HttpServletResponse response) throws Exception {
+        supplierManagementService.exportSupplierManagement(parentId, response);
+    }
+
+    @Operation(summary = "鏌ヨ鍏ㄩ儴渚涙柟鍚嶅綍")
+    @GetMapping("/selectSupplierManagementAll")
+    public Result<List<SupplierManagement>> selectSupplierManagementAll() throws Exception {
+        return Result.success(supplierManagementService.selectSupplierManagementAll());
+    }
+
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/controller/SuppliersDirectoryContentsController.java b/cnas-require/src/main/java/com/ruoyi/require/controller/SuppliersDirectoryContentsController.java
new file mode 100644
index 0000000..31e90fa
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/controller/SuppliersDirectoryContentsController.java
@@ -0,0 +1,77 @@
+package com.ruoyi.require.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.framework.exception.ErrorException;
+import com.ruoyi.require.pojo.SuppliersDirectoryContents;
+import com.ruoyi.require.service.SuppliersDirectoryContentsService;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.time.LocalDateTime;
+import java.util.List;
+
+/**
+ * <p>
+ * 鏈嶅姟鍜屼緵搴斿搧閲囪喘鐩綍 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author
+ * @since 2024-12-17 06:14:51
+ */
+@Tag(name = "渚涘簲鍟嗙鐞嗘爲")
+@RestController
+@RequestMapping("/suppliersDirectoryContents")
+public class SuppliersDirectoryContentsController {
+
+    @Autowired
+    private SuppliersDirectoryContentsService suppliersDirectoryContentsService;
+
+    @Operation(summary = "鏌ヨ鐩綍鍒楄〃")
+    @GetMapping("/suppliersDirectoryContentsListing")
+    public Result suppliersDirectoryContentsListing() {
+        return Result.success(suppliersDirectoryContentsService.directoryListing());
+
+    }
+
+    @Operation(summary = "鏍规嵁id鏌ヨ")
+    @GetMapping("/selectSuppliersDirectoryContentsById")
+    public Result selectSuppliersDirectoryContentsById(Integer id) {
+        return Result.success(suppliersDirectoryContentsService.getById(id));
+    }
+
+    @Operation(summary = "娣诲姞瀛愯妭鐐�")
+    @PostMapping("/addSuppliersDirectoryContents")
+    public Result addSuppliersDirectoryContents(@RequestBody SuppliersDirectoryContents suppliersDirectoryContents ) {
+        suppliersDirectoryContents.setUpdateTime(LocalDateTime.now());
+        suppliersDirectoryContentsService.save(suppliersDirectoryContents);
+        return Result.success(suppliersDirectoryContents.getId());
+    }
+
+    @Operation(summary = "鏇存柊瀛愯妭鐐�")
+    @PostMapping("/updateSuppliersDirectoryContents")
+    public Result updateSuppliersDirectoryContents(@RequestBody SuppliersDirectoryContents suppliersDirectoryContents) {
+        return Result.success(suppliersDirectoryContentsService.updateById(suppliersDirectoryContents));
+    }
+
+    @Operation(summary = "鍒犻櫎瀛愯妭鐐�")
+    @DeleteMapping("/deleteSuppliersDirectoryContentsById")
+    public Result deleteSuppliersDirectoryContentsById(Integer id) {
+        List<SuppliersDirectoryContents> list = suppliersDirectoryContentsService.list(new LambdaQueryWrapper<SuppliersDirectoryContents>()
+                .eq(SuppliersDirectoryContents::getParentId, id));
+        if(list.size() > 0) {
+            throw new ErrorException("璇ヨ妭鐐瑰惈鏈夊瓙鑺傜偣,璇峰厛鍒犻櫎瀛愯妭鐐�");
+        }
+        suppliersDirectoryContentsService.removeById(id);
+        return Result.success();
+    }
+
+    @Operation(summary = "鏌ヨ鎵�鏈夎妭鐐�")
+    @GetMapping("/getSuppliersDirectoryContentsNodeNames")
+    public Result getSuppliersDirectoryContentsNodeNames() {
+        return Result.success(suppliersDirectoryContentsService.getSuppliersDirectoryContentsNodeNames());
+    }
+
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/dto/AcceptanceDto.java b/cnas-require/src/main/java/com/ruoyi/require/dto/AcceptanceDto.java
new file mode 100644
index 0000000..a369361
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/dto/AcceptanceDto.java
@@ -0,0 +1,15 @@
+package com.ruoyi.require.dto;
+
+import com.ruoyi.require.pojo.FeStandardSubstanceAcceptance;
+import com.ruoyi.require.pojo.FeStandardSubstanceAcceptanceInspection;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class AcceptanceDto {
+
+    private FeStandardSubstanceAcceptance acceptance;
+
+    private List<FeStandardSubstanceAcceptanceInspection> list;
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/dto/FeIlluminationAddDto.java b/cnas-require/src/main/java/com/ruoyi/require/dto/FeIlluminationAddDto.java
new file mode 100644
index 0000000..8bea73c
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/dto/FeIlluminationAddDto.java
@@ -0,0 +1,15 @@
+package com.ruoyi.require.dto;
+
+import com.ruoyi.require.pojo.FeIllumination;
+import com.ruoyi.require.pojo.FeIlluminationDetectionArea;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class FeIlluminationAddDto extends FeIllumination {
+
+    @Schema(description = "璁炬柦鍜岀幆澧冩潯浠惰姹�-鐓у害璁板綍琛�-妫�娴嬪尯鍩�")
+    private List<FeIlluminationDetectionArea> illuminationDetectionAreaList;
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/dto/FeIlluminationDto.java b/cnas-require/src/main/java/com/ruoyi/require/dto/FeIlluminationDto.java
new file mode 100644
index 0000000..2b3ec9c
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/dto/FeIlluminationDto.java
@@ -0,0 +1,21 @@
+package com.ruoyi.require.dto;
+
+import com.ruoyi.require.pojo.FeIllumination;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+@Data
+public class FeIlluminationDto extends FeIllumination {
+    @Schema(description = "妫�娴嬭��")
+    private String checkerUser;
+
+    @Schema(description = "鏍告煡浜�")
+    private String testerUser;
+
+    @Schema(description = "璁惧鍚嶇О")
+    private String deviceName;
+
+    @Schema(description = "璁惧缂栧彿")
+    private String managementNumber;
+
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/dto/FeIlluminationExportDto.java b/cnas-require/src/main/java/com/ruoyi/require/dto/FeIlluminationExportDto.java
new file mode 100644
index 0000000..3853805
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/dto/FeIlluminationExportDto.java
@@ -0,0 +1,25 @@
+package com.ruoyi.require.dto;
+
+import com.ruoyi.require.pojo.FeIllumination;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * @Author zhuo
+ * @Date 2024/11/28
+ */
+@Data
+public class FeIlluminationExportDto extends FeIllumination {
+
+    @Schema(description = "璁惧鍚嶇О")
+    private String deviceName;
+
+    @Schema(description = "璁惧缂栧彿")
+    private String managementNumber;
+
+    @Schema(description = "鏍″噯鏃ユ湡")
+    private String calibrationDateString;
+
+    @Schema(description = "涓嬫鏍″噯鏃ユ湡")
+    private String nextCalibrationDateString;
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/dto/FePowerStableAddDto.java b/cnas-require/src/main/java/com/ruoyi/require/dto/FePowerStableAddDto.java
new file mode 100644
index 0000000..b449811
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/dto/FePowerStableAddDto.java
@@ -0,0 +1,15 @@
+package com.ruoyi.require.dto;
+
+import com.ruoyi.require.pojo.FeMeasuredQuantity;
+import com.ruoyi.require.pojo.FePowerStable;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class FePowerStableAddDto extends FePowerStable {
+
+    @Schema(description = "璁炬柦鍜岀幆澧冩潯浠惰姹�-鐢垫簮绋冲畾鎬�-娴嬪畾閲�")
+    private List<FeMeasuredQuantity> feMeasuredQuantityList;
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/dto/FePowerStableDto.java b/cnas-require/src/main/java/com/ruoyi/require/dto/FePowerStableDto.java
new file mode 100644
index 0000000..2c547c8
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/dto/FePowerStableDto.java
@@ -0,0 +1,22 @@
+package com.ruoyi.require.dto;
+
+import com.ruoyi.require.pojo.FePowerStable;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+@Data
+public class FePowerStableDto extends FePowerStable {
+
+    @Schema(description = "妫�娴嬭��")
+    private String checkerUser;
+
+    @Schema(description = "鏍告煡浜�")
+    private String testerUser;
+
+    @Schema(description = "璁惧鍚嶇О")
+    private String deviceName;
+
+    @Schema(description = "璁惧缂栧彿")
+    private String managementNumber;
+
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/dto/FePowerStableExportDto.java b/cnas-require/src/main/java/com/ruoyi/require/dto/FePowerStableExportDto.java
new file mode 100644
index 0000000..88d843f
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/dto/FePowerStableExportDto.java
@@ -0,0 +1,30 @@
+package com.ruoyi.require.dto;
+
+import com.ruoyi.require.pojo.FePowerStable;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * @Author zhuo
+ * @Date 2024/11/28
+ */
+@Data
+public class FePowerStableExportDto extends FePowerStable {
+
+    @Schema(description = "娴嬭瘯鏃ユ湡")
+    private String testDateString;
+
+    @Schema(description = "璁惧鍚嶇О")
+    private String deviceName;
+
+    @Schema(description = "璁惧缂栧彿")
+    private String managementNumber;
+
+    @Schema(description = "鏍″噯鏃ユ湡")
+    private String calibrationDateString;
+
+    @Schema(description = "涓嬫鏍″噯鏃ユ湡")
+    private String nextCalibrationDateString;
+
+
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/dto/FeTempHumDateDto.java b/cnas-require/src/main/java/com/ruoyi/require/dto/FeTempHumDateDto.java
new file mode 100644
index 0000000..358543f
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/dto/FeTempHumDateDto.java
@@ -0,0 +1,21 @@
+package com.ruoyi.require.dto;
+
+import com.ruoyi.require.pojo.FeTempHumDate;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+@Data
+public class FeTempHumDateDto extends FeTempHumDate {
+
+    @Schema(description = "鍒涘缓浜�")
+    private String createName;
+
+    @Schema(description = "璁板綍鍛�")
+    private String registrarUserName;
+
+    @Schema(description = "娓╁害鍖洪棿")
+    private String temperatureSection;
+
+    @Schema(description = "婀垮害鍖洪棿")
+    private String humiditySection;
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/dto/FeTempHumRecordDto.java b/cnas-require/src/main/java/com/ruoyi/require/dto/FeTempHumRecordDto.java
new file mode 100644
index 0000000..cf64329
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/dto/FeTempHumRecordDto.java
@@ -0,0 +1,64 @@
+package com.ruoyi.require.dto;
+
+import com.deepoove.poi.data.PictureRenderData;
+import com.ruoyi.require.pojo.FeTempHumRecord;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+@Data
+public class FeTempHumRecordDto extends FeTempHumRecord {
+
+    @Schema(description = "涓嬪崍璁板綍鍛樺悕绉�")
+    private String afternoonRecorderUser;
+
+    @Schema(description = "涓婂崍璁板綍鍛樺悕绉�")
+    private String morningRecorderUser;
+
+    @Schema(description = "妫�娴嬪ぉ")
+    private Integer month;
+
+    @Schema(description = "涓嬪崍鏃堕棿")
+    private String afternoonTimeStr;
+
+    @Schema(description = "涓婂崍-鏃堕棿")
+    private String morningTestTimeStr;
+
+    @Schema(description = "妫�娴嬪ぉ")
+    private Integer monthDay;
+
+    @Schema(description = "鐧昏鍛�")
+    private Integer registrarUserId;
+
+    @Schema(description = "璇曢獙鍖哄煙鍚嶇О")
+    private String testAreaName;
+
+    @Schema(description = "涓婂崍璁板綍鍛樼鍚嶅湴鍧�")
+    private String morningRecorderUrl;
+
+    @Schema(description = "涓嬪崍璁板綍鍛樼鍚嶅湴鍧�")
+    private String afternoonRecorderUrl;
+
+
+    @Schema(description = "涓婂崍璁板綍鍛樼鍚嶅湴鍧�")
+    private PictureRenderData morningRecorderUrlRender;
+
+    @Schema(description = "涓嬪崍璁板綍鍛樼鍚嶅湴鍧�")
+    private PictureRenderData afternoonRecorderUrlRender;
+
+
+    @Schema(description = "鏈�楂樻俯搴�")
+    private Double temperatureHighest;
+
+    @Schema(description = "鏈�浣庢俯搴�")
+    private Double temperatureLowest;
+
+    @Schema(description = "鏈�楂樻箍搴�")
+    private Double humidityHighest;
+
+    @Schema(description = "鏈�浣庢箍搴�")
+    private Double humidityLowest;
+
+    @Schema(description = "鏄惁鏄枒闂暟鎹�")
+    private Integer isIssue;
+
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/dto/ForeignRegisterDto.java b/cnas-require/src/main/java/com/ruoyi/require/dto/ForeignRegisterDto.java
new file mode 100644
index 0000000..eef9be5
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/dto/ForeignRegisterDto.java
@@ -0,0 +1,32 @@
+package com.ruoyi.require.dto;
+
+import com.deepoove.poi.data.PictureRenderData;
+import com.ruoyi.require.pojo.ForeignRegister;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * @Author zhuo
+ * @Date 2024/11/19
+ */
+@Data
+public class ForeignRegisterDto extends ForeignRegister {
+
+    @Schema(description = "寮�濮嬫椂闂�")
+    private String beginDate;
+
+    @Schema(description = "缁撴潫鏃堕棿")
+    private String endDate;
+
+    @Schema(description = "闄悓浜哄憳绛惧悕")
+    private PictureRenderData accompanyingRender;
+
+    @Schema(description = "鎵瑰噯浜哄憳绛惧悕")
+    private PictureRenderData approveRender;
+
+    @Schema(description = "闄悓浜哄憳绛惧悕鍦板潃")
+    private String accompanyingUrl;
+
+    @Schema(description = "闄悓浜哄憳绛惧悕鍦板潃")
+    private String approveUrl;
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/dto/InternalWastesDto.java b/cnas-require/src/main/java/com/ruoyi/require/dto/InternalWastesDto.java
new file mode 100644
index 0000000..dea1bdd
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/dto/InternalWastesDto.java
@@ -0,0 +1,26 @@
+package com.ruoyi.require.dto;
+
+import com.ruoyi.require.pojo.InternalWastes;
+import com.ruoyi.require.pojo.InternalWastesDetail;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @Author zhuo
+ * @Date 2024/11/19
+ */
+@Data
+public class InternalWastesDto extends InternalWastes {
+
+    @Schema(description = "涓夊簾鐧昏璇︽儏")
+    private List<InternalWastesDetail> wastesDetailList;
+
+    @Schema(description = "鍒涘缓浜�")
+    private String createUserName;
+
+    @Schema(description = "淇敼浜�")
+    private String updateUserName;
+
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/dto/ProcurementSuppliesExpendDto.java b/cnas-require/src/main/java/com/ruoyi/require/dto/ProcurementSuppliesExpendDto.java
new file mode 100644
index 0000000..6022164
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/dto/ProcurementSuppliesExpendDto.java
@@ -0,0 +1,11 @@
+package com.ruoyi.require.dto;
+
+import com.ruoyi.require.pojo.ProcurementSuppliesExpends;
+import lombok.Data;
+
+@Data
+public class ProcurementSuppliesExpendDto extends ProcurementSuppliesExpends {
+    private String listName; // 椤圭洰鑰楁潗鍚嶇О
+    private String enterUserName; // 褰曞叆浜哄悕绉�
+    private String updateUserName; // 鏇存柊浜哄悕绉�
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/dto/ProcurementSuppliesListDto.java b/cnas-require/src/main/java/com/ruoyi/require/dto/ProcurementSuppliesListDto.java
new file mode 100644
index 0000000..1e70361
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/dto/ProcurementSuppliesListDto.java
@@ -0,0 +1,15 @@
+package com.ruoyi.require.dto;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.ruoyi.require.pojo.ProcurementSuppliesList;
+import lombok.Data;
+
+@Data
+public class ProcurementSuppliesListDto extends ProcurementSuppliesList {
+    @ExcelProperty("鍙傝�冧緵搴斿晢")
+    private String supplierName; // 渚涘簲鍟嗗悕绉�
+    @ExcelProperty("鏇存柊浜�")
+    private String updateUserName; // 鏇存柊浜哄悕绉�
+    @ExcelProperty("璐熻矗浜�")
+    private String personInChargeName; // 璐熻矗浜哄悕绉�
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/dto/StoreDto.java b/cnas-require/src/main/java/com/ruoyi/require/dto/StoreDto.java
new file mode 100644
index 0000000..818c205
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/dto/StoreDto.java
@@ -0,0 +1,22 @@
+package com.ruoyi.require.dto;
+
+import com.ruoyi.require.pojo.ProcurementSuppliesStore;
+import lombok.Data;
+
+@Data
+public class StoreDto extends ProcurementSuppliesStore {
+
+
+    private String consumablesName;
+
+    private Integer storeNumber;
+
+    private Double totalPrice;
+
+    private String registrantName;
+
+    private String storageUserName;
+
+    private Integer consumablesId;
+
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/dto/SupplierManagementDto.java b/cnas-require/src/main/java/com/ruoyi/require/dto/SupplierManagementDto.java
new file mode 100644
index 0000000..321017f
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/dto/SupplierManagementDto.java
@@ -0,0 +1,67 @@
+package com.ruoyi.require.dto;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+@Data
+@ExcelIgnoreUnannotated
+public class SupplierManagementDto {
+
+    @Schema(description = "渚涘簲鍟�")
+    @ExcelProperty("渚涘簲鍟�")
+    private String supplierName;
+
+    @Schema(description = "缂栧彿")
+    @ExcelProperty("缂栧彿")
+    private String supplierRef;
+
+    @Schema(description = "渚涘簲鍟嗙墿鍝佹湇鍔″悕绉�")
+    @ExcelProperty("渚涘簲鍟嗙墿鍝佹湇鍔″悕绉�")
+    private String supplierItemServiceName;
+
+    @Schema(description = "閭紪")
+    @ExcelProperty("閭紪")
+    private String postalCode;
+
+    @Schema(description = "鍦板潃")
+    @ExcelProperty("鍦板潃")
+    private String adress;
+
+    @Schema(description = "鑱旂郴浜�")
+    @ExcelProperty("鑱旂郴浜�")
+    private String contacts;
+
+    @Schema(description = "鑱旂郴鐢佃瘽")
+    @ExcelProperty("鑱旂郴鐢佃瘽")
+    private String phone;
+
+    @Schema(description = "鎴峰悕")
+    @ExcelProperty("鎴峰悕")
+    private String householdName;
+
+    @Schema(description = "浼犵湡")
+    @ExcelProperty("浼犵湡")
+    private String fax;
+
+    @Schema(description = "寮�鎴疯")
+    @ExcelProperty("寮�鎴疯")
+    private String openingName;
+
+    @Schema(description = "缃戝潃")
+    @ExcelProperty("缃戝潃")
+    private String website;
+
+    @Schema(description = "璐﹀彿")
+    @ExcelProperty("璐﹀彿")
+    private String accountName;
+
+    @Schema(description = "email")
+    @ExcelProperty("email")
+    private String email;
+
+    @Schema(description = "澶囨敞")
+    @ExcelProperty("澶囨敞")
+    private String remarks;
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/excel/FeCalibrationScheduleExport.java b/cnas-require/src/main/java/com/ruoyi/require/excel/FeCalibrationScheduleExport.java
new file mode 100644
index 0000000..5048365
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/excel/FeCalibrationScheduleExport.java
@@ -0,0 +1,36 @@
+package com.ruoyi.require.excel;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Data
+public class FeCalibrationScheduleExport {
+    @ExcelProperty("浠櫒鍚嶇О")
+    private String instrumentName;
+
+    @ExcelProperty("瑙勬牸鍨嬪彿")
+    private String model;
+
+    @ExcelProperty("绠$悊缂栧彿")
+    private Integer managementNumber;
+
+    @ExcelProperty("鎶�鏈寚鏍�")
+    private String technicalIndicators;
+
+    @ExcelProperty("妫�瀹氬懆鏈�")
+    private String verificationCyde;
+
+    @ExcelProperty("妫�瀹氬崟浣�")
+    private String verificationUnit;
+
+    @ExcelProperty("鏈�杩戞瀹氭椂闂�")
+    private LocalDateTime recentlyTime;
+
+    @ExcelProperty("璁″垝涓嬫妫�瀹氭椂闂�")
+    private LocalDateTime nextTime;
+
+    @ExcelProperty("澶囨敞")
+    private String remark;
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/excel/FeLightningProtectionExcel.java b/cnas-require/src/main/java/com/ruoyi/require/excel/FeLightningProtectionExcel.java
new file mode 100644
index 0000000..b47e79a
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/excel/FeLightningProtectionExcel.java
@@ -0,0 +1,22 @@
+package com.ruoyi.require.excel;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import lombok.Data;
+
+@Data
+public class FeLightningProtectionExcel {
+    @ExcelProperty("鍘熸枃浠跺悕")
+    private String fileName;
+
+    @ExcelProperty("妫�娴嬫棩鏈�")
+    private String detectionDate;
+
+    @ExcelProperty("鏈夋晥鏈�")
+    private String termValidity;
+
+    @ExcelProperty("妫�娴嬪崟浣�")
+    private String detectionUnit;
+
+    @ExcelProperty("鍒涘缓鏃堕棿")
+    private String createTime;
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/excel/FeStandardSubstanceExcel.java b/cnas-require/src/main/java/com/ruoyi/require/excel/FeStandardSubstanceExcel.java
new file mode 100644
index 0000000..2f0691c
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/excel/FeStandardSubstanceExcel.java
@@ -0,0 +1,54 @@
+package com.ruoyi.require.excel;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Data
+public class FeStandardSubstanceExcel {
+    @ExcelProperty("鏍囧噯鐗╄川鍚嶇О")
+    private String name;
+
+    @ExcelProperty("瑙勬牸鍨嬪彿")
+    private String model;
+
+    @ExcelProperty("鐢熶骇鍘傚")
+    private String factoryManufacturer;
+
+    @ExcelProperty("鍑哄満缂栧彿")
+    private String factoryNum;
+
+    @ExcelProperty("绠$悊缂栧彿")
+    private String manageNum;
+
+    @ExcelProperty("涓嶇‘瀹氬害")
+    private String uncertainty;
+
+    @ExcelProperty("鏁伴噺")
+    private Long quantity;
+
+    @ExcelProperty("璐疆鏃ユ湡")
+    private LocalDateTime acquisitionDate;
+
+    @ExcelProperty("鏈夋晥鏈�")
+    private LocalDateTime effectiveDate;
+
+    @ExcelProperty("鏂囨。缂栧彿")
+    private String fileNum;
+
+    @ExcelProperty("瀛樻斁浣嶇疆")
+    private String position;
+
+    @ExcelProperty("鍊熻皟鐘舵��")
+    private Integer state;
+
+    @ExcelProperty("澶囨敞")
+    private String remark;
+
+    @ExcelProperty("鍒涘缓浜�")
+    private String createUser;
+
+    @ExcelProperty("鍒涘缓鏃ユ湡")
+    private LocalDateTime createTime;
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/excel/FeStandardSubstanceImport.java b/cnas-require/src/main/java/com/ruoyi/require/excel/FeStandardSubstanceImport.java
new file mode 100644
index 0000000..1588fd8
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/excel/FeStandardSubstanceImport.java
@@ -0,0 +1,46 @@
+package com.ruoyi.require.excel;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ColumnWidth;
+import lombok.Data;
+
+@Data
+@ColumnWidth(22)
+public class FeStandardSubstanceImport {
+
+    @ExcelProperty("鏍囧噯鐗╄川鍚嶇О*")
+    private String name;
+
+    @ExcelProperty("瑙勬牸鍨嬪彿*")
+    private String model;
+
+    @ExcelProperty("鐢熶骇鍘傚*")
+    private String factoryManufacturer;
+
+    @ExcelProperty("鍑哄巶缂栧彿*")
+    private String factoryNum;
+
+    @ExcelProperty("绠$悊缂栧彿*")
+    private String manageNum;
+
+    @ExcelProperty("涓嶇‘瀹氬害*")
+    private String uncertainty;
+
+    @ExcelProperty("鏁伴噺*")
+    private String quantity;
+
+    @ExcelProperty("璐疆鏃ユ湡*(yyyy-MM-dd)")
+    private String acquisitionDate;
+
+    @ExcelProperty("鏈夋晥鏈�*(yyyy-MM-dd)")
+    private String effectiveDate;
+
+    @ExcelProperty("妗f缂栧彿*")
+    private String fileNum;
+
+    @ExcelProperty("瀛樻斁浣嶇疆*")
+    private String position;
+
+    @ExcelProperty("澶囨敞")
+    private String remark;
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/excel/StoreExcel.java b/cnas-require/src/main/java/com/ruoyi/require/excel/StoreExcel.java
new file mode 100644
index 0000000..d0d7b88
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/excel/StoreExcel.java
@@ -0,0 +1,37 @@
+package com.ruoyi.require.excel;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import lombok.Data;
+
+import java.time.LocalDate;
+
+@Data
+public class StoreExcel {
+    @ExcelProperty("鍏ュ簱鍗曞彿")
+    private String oddNumbers;
+
+    @ExcelProperty("鑰楁潗鍚嶇О")
+    private String consumablesName;
+
+    @ExcelProperty("鍏ュ簱鏁伴噺")
+    private Integer storeNumber;
+
+    @ExcelProperty("鍏ュ簱鎬讳环")
+    private Double totalPrice;
+
+    @ExcelProperty("鍏ュ簱浜�")
+    private String storageUserName;
+
+    @ExcelProperty("鍏ュ簱鏃ユ湡")
+    private LocalDate storageTime;
+
+    @ExcelProperty("璇存槑")
+    private String remark;
+
+    @ExcelProperty("鐧昏浜�")
+    private String registrantName;
+
+    @ExcelProperty("鐧昏鏃ユ湡")
+    private LocalDate registrantTime;
+
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/mapper/CollectLaboratoryMapper.java b/cnas-require/src/main/java/com/ruoyi/require/mapper/CollectLaboratoryMapper.java
new file mode 100644
index 0000000..9452260
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/mapper/CollectLaboratoryMapper.java
@@ -0,0 +1,15 @@
+package com.ruoyi.require.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.require.pojo.CollectLaboratory;
+
+/**
+ * 娓╂箍搴﹂噰闆嗗疄楠屽缁戝畾
+ *
+ * @author zhuo
+ * @since 2024-12-18
+ */
+public interface CollectLaboratoryMapper extends BaseMapper<CollectLaboratory> {
+
+}
+
diff --git a/cnas-require/src/main/java/com/ruoyi/require/mapper/CollectTemperatureHumidityMapper.java b/cnas-require/src/main/java/com/ruoyi/require/mapper/CollectTemperatureHumidityMapper.java
new file mode 100644
index 0000000..957f967
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/mapper/CollectTemperatureHumidityMapper.java
@@ -0,0 +1,15 @@
+package com.ruoyi.require.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.require.pojo.CollectTemperatureHumidity;
+
+/**
+ * 娓╂箍搴﹂噰闆嗕俊鎭�
+ *
+ * @author zhuo
+ * @since 2024-12-18
+ */
+public interface CollectTemperatureHumidityMapper extends BaseMapper<CollectTemperatureHumidity> {
+
+}
+
diff --git a/cnas-require/src/main/java/com/ruoyi/require/mapper/FeCalibrationScheduleMapper.java b/cnas-require/src/main/java/com/ruoyi/require/mapper/FeCalibrationScheduleMapper.java
new file mode 100644
index 0000000..0194659
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/mapper/FeCalibrationScheduleMapper.java
@@ -0,0 +1,20 @@
+package com.ruoyi.require.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.ruoyi.require.pojo.FeCalibrationSchedule;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author 
+ * @since 2024-11-13 02:53:05
+ */
+public interface FeCalibrationScheduleMapper extends BaseMapper<FeCalibrationSchedule> {
+
+    IPage<FeCalibrationSchedule> ipage(Page page, @Param("instrumentName") String instrumentName, @Param("managementNumber") String managementNumber);
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/mapper/FeIlluminationDetectionAreaMapper.java b/cnas-require/src/main/java/com/ruoyi/require/mapper/FeIlluminationDetectionAreaMapper.java
new file mode 100644
index 0000000..7dbbfd2
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/mapper/FeIlluminationDetectionAreaMapper.java
@@ -0,0 +1,16 @@
+package com.ruoyi.require.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.require.pojo.FeIlluminationDetectionArea;
+
+/**
+ * <p>
+ * 璁炬柦鍜岀幆澧冩潯浠�-璁炬柦鍜岀幆澧冩潯浠惰姹�-鐓у害璁板綍琛�-妫�娴嬪尯鍩� Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author
+ * @since 2024-11-07 04:16:28
+ */
+public interface FeIlluminationDetectionAreaMapper extends BaseMapper<FeIlluminationDetectionArea> {
+
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/mapper/FeIlluminationMapper.java b/cnas-require/src/main/java/com/ruoyi/require/mapper/FeIlluminationMapper.java
new file mode 100644
index 0000000..ec63cdc
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/mapper/FeIlluminationMapper.java
@@ -0,0 +1,28 @@
+package com.ruoyi.require.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.ruoyi.require.dto.FeIlluminationDto;
+import com.ruoyi.require.dto.FeIlluminationExportDto;
+import com.ruoyi.require.pojo.FeIllumination;
+
+/**
+ * <p>
+ * 璁炬柦鍜岀幆澧冩潯浠�-璁炬柦鍜岀幆澧冩潯浠惰姹�-鐓у害璁板綍琛� Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author
+ * @since 2024-11-07 04:15:57
+ */
+public interface FeIlluminationMapper extends BaseMapper<FeIllumination> {
+
+    IPage<FeIlluminationDto> getFeLightningProtection(Page page);
+
+    /**
+     * 鏌ヨ鐓ф槑璁板綍
+     * @param intensityIlluminationId
+     * @return
+     */
+    FeIlluminationExportDto selectFeIllumination(Integer intensityIlluminationId);
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/mapper/FeLightningProtectionMapper.java b/cnas-require/src/main/java/com/ruoyi/require/mapper/FeLightningProtectionMapper.java
new file mode 100644
index 0000000..995561e
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/mapper/FeLightningProtectionMapper.java
@@ -0,0 +1,21 @@
+package com.ruoyi.require.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.require.excel.FeLightningProtectionExcel;
+import com.ruoyi.require.pojo.FeLightningProtection;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 璁炬柦鍜岀幆澧冩潯浠�-璁炬柦鍜岀幆澧冩潯浠惰姹�-闃查浄妫�娴� Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author
+ * @since 2024-11-07 04:16:36
+ */
+public interface FeLightningProtectionMapper extends BaseMapper<FeLightningProtection> {
+
+    List<FeLightningProtectionExcel> exportOfLightningProtectionDetection();
+
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/mapper/FeMeasuredQuantityMapper.java b/cnas-require/src/main/java/com/ruoyi/require/mapper/FeMeasuredQuantityMapper.java
new file mode 100644
index 0000000..86cca2d
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/mapper/FeMeasuredQuantityMapper.java
@@ -0,0 +1,16 @@
+package com.ruoyi.require.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.require.pojo.FeMeasuredQuantity;
+
+/**
+ * <p>
+ * 璁炬柦鍜岀幆澧冩潯浠�-璁炬柦鍜岀幆澧冩潯浠惰姹�-鐢垫簮绋冲畾鎬�-娴嬪畾閲� Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 
+ * @since 2024-11-07 04:16:44
+ */
+public interface FeMeasuredQuantityMapper extends BaseMapper<FeMeasuredQuantity> {
+
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/mapper/FePowerStableMapper.java b/cnas-require/src/main/java/com/ruoyi/require/mapper/FePowerStableMapper.java
new file mode 100644
index 0000000..7f345bc
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/mapper/FePowerStableMapper.java
@@ -0,0 +1,34 @@
+package com.ruoyi.require.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.ruoyi.require.dto.FePowerStableDto;
+import com.ruoyi.require.dto.FePowerStableExportDto;
+import com.ruoyi.require.pojo.FePowerStable;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.Map;
+import java.util.Objects;
+
+/**
+ * <p>
+ * 璁炬柦鍜岀幆澧冩潯浠�-璁炬柦鍜岀幆澧冩潯浠惰姹�-鐢垫簮绋冲畾鎬� Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author
+ * @since 2024-11-07 04:16:52
+ */
+public interface FePowerStableMapper extends BaseMapper<FePowerStable> {
+
+    IPage<FePowerStableDto> getLaboratoryFacilityPowerStablePage(Page page);
+
+    Map<String, Objects> getCalibrationDate(Integer deviceId);
+
+    /**
+     * 鏌ヨ鐢垫簮绋冲畾鎬�
+     * @param powerStableId
+     * @return
+     */
+    FePowerStableExportDto selectPowerStable(@Param("powerStableId") Integer powerStableId);
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/mapper/FeStandardSubstanceAcceptanceInspectionMapper.java b/cnas-require/src/main/java/com/ruoyi/require/mapper/FeStandardSubstanceAcceptanceInspectionMapper.java
new file mode 100644
index 0000000..0eea361
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/mapper/FeStandardSubstanceAcceptanceInspectionMapper.java
@@ -0,0 +1,16 @@
+package com.ruoyi.require.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.require.pojo.FeStandardSubstanceAcceptanceInspection;
+
+/**
+ * <p>
+ * 楠屾敹寮�绠辫褰� Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 
+ * @since 2024-11-14 03:30:09
+ */
+public interface FeStandardSubstanceAcceptanceInspectionMapper extends BaseMapper<FeStandardSubstanceAcceptanceInspection> {
+
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/mapper/FeStandardSubstanceAcceptanceMapper.java b/cnas-require/src/main/java/com/ruoyi/require/mapper/FeStandardSubstanceAcceptanceMapper.java
new file mode 100644
index 0000000..b43f56d
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/mapper/FeStandardSubstanceAcceptanceMapper.java
@@ -0,0 +1,22 @@
+package com.ruoyi.require.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.ruoyi.require.pojo.FeStandardSubstanceAcceptance;
+import com.ruoyi.require.vo.AcceptanceVo;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * <p>
+ * 鏍囧噯鐗╄川楠屾敹 Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author
+ * @since 2024-11-14 03:29:41
+ */
+public interface FeStandardSubstanceAcceptanceMapper extends BaseMapper<FeStandardSubstanceAcceptance> {
+
+
+    IPage<AcceptanceVo> getPageAcceptance(Page page, @Param("name")String name);
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/mapper/FeStandardSubstanceMapper.java b/cnas-require/src/main/java/com/ruoyi/require/mapper/FeStandardSubstanceMapper.java
new file mode 100644
index 0000000..e544c4a
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/mapper/FeStandardSubstanceMapper.java
@@ -0,0 +1,20 @@
+package com.ruoyi.require.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.ruoyi.require.pojo.FeStandardSubstance;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * <p>
+ * 鏍囧噯鐗╄川娓呭崟 Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 
+ * @since 2024-11-13 03:58:59
+ */
+public interface FeStandardSubstanceMapper extends BaseMapper<FeStandardSubstance> {
+
+    IPage<FeStandardSubstance> getPage(Page page,@Param("ew")FeStandardSubstance feStandardSubstance);
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/mapper/FeStandardSubstanceRecordMapper.java b/cnas-require/src/main/java/com/ruoyi/require/mapper/FeStandardSubstanceRecordMapper.java
new file mode 100644
index 0000000..c12e23d
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/mapper/FeStandardSubstanceRecordMapper.java
@@ -0,0 +1,22 @@
+package com.ruoyi.require.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.ruoyi.require.pojo.FeStandardSubstanceRecord;
+import com.ruoyi.require.vo.SubstanceRecordVo;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * <p>
+ * 鏍囧噯鐗╄川娓呭崟鍊熺敤褰掕繕璁板綍琛� Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author
+ * @since 2024-11-14 01:49:11
+ */
+public interface FeStandardSubstanceRecordMapper extends BaseMapper<FeStandardSubstanceRecord> {
+
+
+    IPage<SubstanceRecordVo> getPage(Page page,@Param("ew") SubstanceRecordVo vo);
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/mapper/FeTempHumDateMapper.java b/cnas-require/src/main/java/com/ruoyi/require/mapper/FeTempHumDateMapper.java
new file mode 100644
index 0000000..a3f00ac
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/mapper/FeTempHumDateMapper.java
@@ -0,0 +1,30 @@
+package com.ruoyi.require.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.require.dto.FeTempHumDateDto;
+import com.ruoyi.require.pojo.FeTempHumDate;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * <p>
+ * 璁炬柦鍜岀幆澧冩潯浠�-璁炬柦鍜岀幆澧冩潯浠惰姹�-娓╂箍搴� 鍖哄煙 -鐖� Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author
+ * @since 2024-11-09 11:02:18
+ */
+public interface FeTempHumDateMapper extends BaseMapper<FeTempHumDate> {
+
+    IPage<FeTempHumDateDto> getFeTempHumDate(Page page, @Param("ew") QueryWrapper<FeTempHumDateDto> ew);
+
+    /**
+     * 鏌ヨ杩欎釜鏈堟槸鍚︽湁璇ュ疄楠屽鐨勪换鍔�
+     * @param laboratory 瀹為獙瀹�
+     * @param formattedDate 褰撳墠鏈堜唤
+     * @return 杩斿洖鏉℃暟
+     */
+    int selectFeTempHumDateIncludeFormattedDate(@Param("laboratory") String laboratory, @Param("formattedDate") String formattedDate);
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/mapper/FeTempHumRecordMapper.java b/cnas-require/src/main/java/com/ruoyi/require/mapper/FeTempHumRecordMapper.java
new file mode 100644
index 0000000..e132e14
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/mapper/FeTempHumRecordMapper.java
@@ -0,0 +1,30 @@
+package com.ruoyi.require.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.ruoyi.require.dto.FeTempHumRecordDto;
+import com.ruoyi.require.pojo.FeTempHumRecord;
+import org.apache.ibatis.annotations.Param;
+
+import java.time.LocalDate;
+import java.util.List;
+
+/**
+ * <p>
+ * 璁炬柦鍜岀幆澧冩潯浠�-璁炬柦鍜岀幆澧冩潯浠惰姹�-娓╂箍搴﹁褰� Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 
+ * @since 2024-11-07 04:28:52
+ */
+public interface FeTempHumRecordMapper extends BaseMapper<FeTempHumRecord> {
+
+    IPage<FeTempHumRecordDto> getFeTempHumRecordPage(Page page, @Param("dateId") Integer dateId);
+
+    /**
+     * 鏌ヨ鏈夋棩鏈熶絾鏄湭濉啓鍚嶅瓧鐨�
+     * @return
+     */
+    List<FeTempHumRecordDto> selectNoaffirm(LocalDate date);
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/mapper/ForeignRegisterMapper.java b/cnas-require/src/main/java/com/ruoyi/require/mapper/ForeignRegisterMapper.java
new file mode 100644
index 0000000..f81c973
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/mapper/ForeignRegisterMapper.java
@@ -0,0 +1,39 @@
+package com.ruoyi.require.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.require.dto.ForeignRegisterDto;
+import com.ruoyi.require.pojo.ForeignRegister;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 澶栨潵浜哄憳鐧昏 Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author
+ * @since 2024-11-19 07:17:35
+ */
+public interface ForeignRegisterMapper extends BaseMapper<ForeignRegister> {
+
+    /**
+     * 澶栨潵浜哄憳鐧昏鍒嗛〉鏌ヨ
+     * @return
+     */
+    IPage<ForeignRegisterDto> pageForeignRegister(Page page, @Param("ew") QueryWrapper<ForeignRegisterDto> ew,
+                                                  @Param("beginDate") String beginDate,
+                                                  @Param("endDate") String endDate);
+
+    /**
+     * 鏌ヨ澶栨潵浜哄憳鐧昏鍒楄〃
+     * @param foreignRegister
+     * @return
+     */
+    List<ForeignRegisterDto> getForeignRegisterList(@Param("ew") QueryWrapper<ForeignRegisterDto> ew,
+                                                    @Param("beginDate") String beginDate,
+                                                    @Param("endDate") String endDate);
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/mapper/InternalWastesDetailMapper.java b/cnas-require/src/main/java/com/ruoyi/require/mapper/InternalWastesDetailMapper.java
new file mode 100644
index 0000000..58525cf
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/mapper/InternalWastesDetailMapper.java
@@ -0,0 +1,16 @@
+package com.ruoyi.require.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.require.pojo.InternalWastesDetail;
+
+/**
+ * <p>
+ * 瀹夊叏鍐呭姟涓夊簾鐧昏璇︽儏 Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author
+ * @since 2024-11-19 06:39:54
+ */
+public interface InternalWastesDetailMapper extends BaseMapper<InternalWastesDetail> {
+
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/mapper/InternalWastesMapper.java b/cnas-require/src/main/java/com/ruoyi/require/mapper/InternalWastesMapper.java
new file mode 100644
index 0000000..1d91e2b
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/mapper/InternalWastesMapper.java
@@ -0,0 +1,31 @@
+package com.ruoyi.require.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.require.dto.InternalWastesDto;
+import com.ruoyi.require.pojo.InternalWastes;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * <p>
+ * 瀹夊叏鍐呭姟涓夊簾鐧昏 Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author
+ * @since 2024-11-19 06:39:27
+ */
+@Mapper
+public interface InternalWastesMapper extends BaseMapper<InternalWastes> {
+
+
+    /**
+     * 瀹夊叏鍐呭姟涓夊簾鐧昏鍒嗛〉鏌ヨ
+     * @param page
+     * @param ew
+     * @return
+     */
+    IPage<InternalWastesDto> pageInternalWastes(Page page, @Param("ew") QueryWrapper<InternalWastes> ew);
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/mapper/ProcurementSuppliesConsumablesMapper.java b/cnas-require/src/main/java/com/ruoyi/require/mapper/ProcurementSuppliesConsumablesMapper.java
new file mode 100644
index 0000000..8d9eddf
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/mapper/ProcurementSuppliesConsumablesMapper.java
@@ -0,0 +1,9 @@
+package com.ruoyi.require.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.require.pojo.ProcurementSuppliesConsumables;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface ProcurementSuppliesConsumablesMapper extends BaseMapper<ProcurementSuppliesConsumables> {
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/mapper/ProcurementSuppliesContentsMapper.java b/cnas-require/src/main/java/com/ruoyi/require/mapper/ProcurementSuppliesContentsMapper.java
new file mode 100644
index 0000000..6f41af3
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/mapper/ProcurementSuppliesContentsMapper.java
@@ -0,0 +1,9 @@
+package com.ruoyi.require.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.require.pojo.ProcurementSuppliesContents;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface ProcurementSuppliesContentsMapper extends BaseMapper<ProcurementSuppliesContents> {
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/mapper/ProcurementSuppliesExpendsMapper.java b/cnas-require/src/main/java/com/ruoyi/require/mapper/ProcurementSuppliesExpendsMapper.java
new file mode 100644
index 0000000..217f106
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/mapper/ProcurementSuppliesExpendsMapper.java
@@ -0,0 +1,16 @@
+package com.ruoyi.require.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.require.pojo.ProcurementSuppliesExpends;
+
+/**
+ * <p>
+ *  Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author
+ * @since 2024-11-15 03:47:19
+ */
+public interface ProcurementSuppliesExpendsMapper extends BaseMapper<ProcurementSuppliesExpends> {
+
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/mapper/ProcurementSuppliesListMapper.java b/cnas-require/src/main/java/com/ruoyi/require/mapper/ProcurementSuppliesListMapper.java
new file mode 100644
index 0000000..ad5ec8d
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/mapper/ProcurementSuppliesListMapper.java
@@ -0,0 +1,30 @@
+package com.ruoyi.require.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.ruoyi.require.dto.ProcurementSuppliesListDto;
+import com.ruoyi.require.pojo.ProcurementSuppliesList;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 鏈嶅姟涓庝緵搴斿晢 鑰楁潗鍒楄〃 Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author
+ * @since 2024-11-15 04:04:32
+ */
+@Mapper
+public interface ProcurementSuppliesListMapper extends BaseMapper<ProcurementSuppliesList> {
+    IPage<ProcurementSuppliesList> selectProcurementSuppliesList(Page page, @Param("ew") ProcurementSuppliesListDto ew);
+
+    ProcurementSuppliesList selectProcurementSuppliesListForUpdate(@Param("id") Long id);
+
+    List<ProcurementSuppliesList> selectProcurementSuppliesListAll(@Param("ew") ProcurementSuppliesListDto ew);
+
+    List<ProcurementSuppliesList> selectProcurementSuppliesListByContentsId(@Param("id") Integer contentsId);
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/mapper/ProcurementSuppliesStoreMapper.java b/cnas-require/src/main/java/com/ruoyi/require/mapper/ProcurementSuppliesStoreMapper.java
new file mode 100644
index 0000000..93b16ec
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/mapper/ProcurementSuppliesStoreMapper.java
@@ -0,0 +1,27 @@
+package com.ruoyi.require.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.require.dto.StoreDto;
+import com.ruoyi.require.excel.StoreExcel;
+import com.ruoyi.require.pojo.ProcurementSuppliesStore;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+@Mapper
+public interface ProcurementSuppliesStoreMapper extends BaseMapper<ProcurementSuppliesStore> {
+
+    IPage<StoreDto> selectStoreList(Page page, @Param("ew") QueryWrapper<StoreDto> ew);
+
+    /**
+     *       鍜屾爲鍏宠仈鐨勬潯浠讹紝锛岋紝鐩墠娌℃湁鍏宠仈鍏崇郴    WHERE s.contents_id = #{contentsId}
+     * @param contentsId
+     * @return
+     */
+    List<StoreExcel> exportExcel(Integer contentsId);
+
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/mapper/SupplierManagementMapper.java b/cnas-require/src/main/java/com/ruoyi/require/mapper/SupplierManagementMapper.java
new file mode 100644
index 0000000..d22d549
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/mapper/SupplierManagementMapper.java
@@ -0,0 +1,31 @@
+package com.ruoyi.require.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.require.pojo.SupplierManagement;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * <p>
+ *  Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 
+ * @since 2024-11-15 02:46:45
+ */
+@Mapper
+public interface SupplierManagementMapper extends BaseMapper<SupplierManagement> {
+
+    IPage<SupplierManagement> pageSupplierManagement(Page page, @Param("ew") QueryWrapper<SupplierManagement> supplierManagementQueryWrapper);
+
+    IPage<SupplierManagement> selectQualifiedSupplierManagement(Page page, @Param("ew") QueryWrapper<SupplierManagement> supplierManagementQueryWrapper);
+
+    List<SupplierManagement> selectSupplierManagementAll(@Param("parentId") Integer parentId);
+
+    List<SupplierManagement> selectSupplierManagement(@Param("parentId")Integer parentId);
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/mapper/SuppliersDirectoryContentsMapper.java b/cnas-require/src/main/java/com/ruoyi/require/mapper/SuppliersDirectoryContentsMapper.java
new file mode 100644
index 0000000..9ebedff
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/mapper/SuppliersDirectoryContentsMapper.java
@@ -0,0 +1,16 @@
+package com.ruoyi.require.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.require.pojo.SuppliersDirectoryContents;
+
+/**
+ * <p>
+ * 鏈嶅姟鍜屼緵搴斿搧閲囪喘鐩綍 Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author
+ * @since 2024-12-17 06:14:51
+ */
+public interface SuppliersDirectoryContentsMapper extends BaseMapper<SuppliersDirectoryContents> {
+
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/pojo/CollectLaboratory.java b/cnas-require/src/main/java/com/ruoyi/require/pojo/CollectLaboratory.java
new file mode 100644
index 0000000..f95b5be
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/pojo/CollectLaboratory.java
@@ -0,0 +1,41 @@
+package com.ruoyi.require.pojo;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * 娓╂箍搴﹂噰闆嗗疄楠屽缁戝畾
+ *
+ * @author zhuo
+ * @since 2024-12-18
+ */
+@Data
+@TableName("collect_laboratory")
+public class CollectLaboratory {
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @Schema(description = "瀹為獙瀹�")
+    private String laboratory;
+
+    @Schema(description = "娓╂箍搴﹁澶囩紪鍙�")
+    private String deviceCode;
+
+    @Schema(description = "鏈�楂樻俯搴�")
+    private Double temperatureHighest;
+
+    @Schema(description = "鏈�浣庢俯搴�")
+    private Double temperatureLowest;
+
+    @Schema(description = "鏈�楂樻箍搴�")
+    private Double humidityHighest;
+
+    @Schema(description = "鏈�浣庢箍搴�")
+    private Double humidityLowest;
+
+}
+
diff --git a/cnas-require/src/main/java/com/ruoyi/require/pojo/CollectTemperatureHumidity.java b/cnas-require/src/main/java/com/ruoyi/require/pojo/CollectTemperatureHumidity.java
new file mode 100644
index 0000000..95b2f27
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/pojo/CollectTemperatureHumidity.java
@@ -0,0 +1,66 @@
+package com.ruoyi.require.pojo;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * 娓╂箍搴﹂噰闆嗕俊鎭�
+ *
+ * @author zhuo
+ * @since 2024-12-18
+ */
+@Data
+@TableName("collect_temperature_humidity")
+public class CollectTemperatureHumidity {
+
+    @TableId(type = IdType.AUTO)
+    private Integer superviseId;
+    //7801娓╁害
+    private Double code7801Temperature;
+    //7801婀垮害
+    private Double code7801Humidity;
+    //7802娓╁害
+    private Double code7802Temperature;
+    //7802婀垮害
+    private Double code7802Humidity;
+    //7803娓╁害
+    private Double code7803Temperature;
+    //7803婀垮害
+    private Double code7803Humidity;
+    //7804娓╁害
+    private Double code7804Temperature;
+    //7804婀垮害
+    private Double code7804Humidity;
+    //7805娓╁害
+    private Double code7805Temperature;
+    //7805婀垮害
+    private Double code7805Humidity;
+    //7806娓╁害
+    private Double code7806Temperature;
+    //7806婀垮害
+    private Double code7806Humidity;
+    //7807娓╁害
+    private Double code7807Temperature;
+    //7807婀垮害
+    private Double code7807Humidity;
+    //7808娓╁害
+    private Double code7808Temperature;
+    //7808婀垮害
+    private Double code7808Humidity;
+    //7809娓╁害
+    private Double code7809Temperature;
+    //7809婀垮害
+    private Double code7809Humidity;
+    //7810娓╁害
+    private Double code7810Temperature;
+    //7810婀垮害
+    private Double code7810Humidity;
+    //閲囬泦鏃堕棿
+    private Date collectTime;
+
+}
+
diff --git a/cnas-require/src/main/java/com/ruoyi/require/pojo/FeCalibrationSchedule.java b/cnas-require/src/main/java/com/ruoyi/require/pojo/FeCalibrationSchedule.java
new file mode 100644
index 0000000..47400c2
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/pojo/FeCalibrationSchedule.java
@@ -0,0 +1,84 @@
+package com.ruoyi.require.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 浠櫒璁惧妫�瀹�/鏍″噯璁″垝琛�
+ * </p>
+ *
+ * @author 
+ * @since 2024-11-13 02:53:05
+ */
+@Getter
+@Setter
+@TableName("cnas_fe_calibration_schedule")
+@Schema(description = "浠櫒璁惧妫�瀹�/鏍″噯璁″垝琛�")
+public class FeCalibrationSchedule implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @Schema(description = "浠櫒鍚嶇О")
+    private String instrumentName;
+
+    @Schema(description = "瑙勬牸鍨嬪彿")
+    private String model;
+
+    @Schema(description = "绠$悊缂栧彿")
+    private String managementNumber;
+
+    @Schema(description = "鎶�鏈寚鏍�")
+    private String technicalIndicators;
+
+    @Schema(description = "妫�瀹氬懆鏈�")
+    private String verificationCyde;
+
+    @Schema(description = "妫�瀹氬崟浣�")
+    private String verificationUnit;
+
+    @Schema(description = "鏈�杩戞瀹氭椂闂�")
+    private LocalDateTime recentlyTime;
+
+    @Schema(description = "璁″垝涓嬫妫�瀹氭椂闂�")
+    private LocalDateTime nextTime;
+
+    @Schema(description = "澶囨敞")
+    private String remark;
+
+    @Schema(description = "缂栧埗")
+    private String organization;
+
+    @Schema(description = "缂栧埗鏃ユ湡")
+    private LocalDateTime organizationDate;
+
+    @Schema(description = "鎵瑰噯")
+    private String approve;
+
+    @Schema(description = "鎵瑰噯鏃ユ湡")
+    private LocalDateTime approveDate;
+
+    @TableField(fill = FieldFill.INSERT)
+    private String createUser;
+
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private String updateUser;
+
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+
+    @Schema(description = "搴忓彿id, 瀵煎嚭浣跨敤")
+    @TableField(exist = false, select = false)
+    private Integer index;
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/pojo/FeIllumination.java b/cnas-require/src/main/java/com/ruoyi/require/pojo/FeIllumination.java
new file mode 100644
index 0000000..cf4b277
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/pojo/FeIllumination.java
@@ -0,0 +1,61 @@
+package com.ruoyi.require.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 璁炬柦鍜岀幆澧冩潯浠�-璁炬柦鍜岀幆澧冩潯浠惰姹�-鐓у害璁板綍琛�
+ * </p>
+ *
+ * @author 
+ * @since 2024-11-07 04:15:57
+ */
+@Getter
+@Setter
+@TableName("cnas_fe_illumination")
+@Schema(description = "璁炬柦鍜岀幆澧冩潯浠�-璁炬柦鍜岀幆澧冩潯浠惰姹�-鐓у害璁板綍琛�")
+public class FeIllumination implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @Schema(description = "鐓у害璁板綍琛╥d")
+    @TableId(value = "intensity_illumination_id", type = IdType.AUTO)
+    private Integer intensityIlluminationId;
+
+    @Schema(description = "璁惧id")
+    private Integer deviceId;
+
+    @Schema(description = "缁撹")
+    private String conclusion;
+
+    @Schema(description = "妫�娴嬩汉")
+    private Integer testerId;
+
+    @Schema(description = "鏍告煡浜�")
+    private Integer checkerId;
+
+    @Schema(description = "妫�娴嬫棩鏈�")
+    private LocalDate testDate;
+
+    @Schema(description = "鏍″噯鏃ユ湡")
+    private LocalDateTime lastCalibrationDate;
+
+    @Schema(description = "涓嬫鏍″噯鏃ユ湡")
+    private LocalDateTime nextCalibrationDate;
+
+    @Schema(description = "鍒涘缓鏃堕棿")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @Schema(description = "鏇存柊鏃堕棿")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/pojo/FeIlluminationDetectionArea.java b/cnas-require/src/main/java/com/ruoyi/require/pojo/FeIlluminationDetectionArea.java
new file mode 100644
index 0000000..8d19979
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/pojo/FeIlluminationDetectionArea.java
@@ -0,0 +1,58 @@
+package com.ruoyi.require.pojo;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 璁炬柦鍜岀幆澧冩潯浠�-璁炬柦鍜岀幆澧冩潯浠惰姹�-鐓у害璁板綍琛�-妫�娴嬪尯鍩�
+ * </p>
+ *
+ * @author 
+ * @since 2024-11-07 04:16:28
+ */
+@Getter
+@Setter
+@TableName("cnas_fe_illumination_detection_area")
+@Schema(description = "璁炬柦鍜岀幆澧冩潯浠�-璁炬柦鍜岀幆澧冩潯浠惰姹�-鐓у害璁板綍琛�-妫�娴嬪尯鍩�")
+public class FeIlluminationDetectionArea implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @Schema(description = "妫�娴嬪尯鍩焛d")
+    @TableId(value = "detection_area_id", type = IdType.AUTO)
+    private Integer detectionAreaId;
+
+    @Schema(description = "妫�娴嬪尯鍩熷悕绉�")
+    private String detectionAreaLabel;
+
+    @Schema(description = "妫�娴嬪��-绗竴娆�")
+    private Integer valueOne;
+
+    @Schema(description = "妫�娴嬪��-绗簩娆�")
+    private Integer valueTwo;
+
+    @Schema(description = "妫�娴嬪��-绗笁娆�")
+    private Integer valueThree;
+
+    @Schema(description = "骞冲潎鍊�")
+    private Integer average;
+
+    @Schema(description = "澶囨敞")
+    private String remark;
+
+    @Schema(description = "鐓у害璁板綍琛╥d")
+    private Integer intensityIlluminationId;
+
+    // 瀵煎嚭浣跨敤
+    @TableField(select = false, exist = false)
+    @Schema(description = "搴忓彿(瀵煎嚭浣跨敤)")
+    private Integer index;
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/pojo/FeLightningProtection.java b/cnas-require/src/main/java/com/ruoyi/require/pojo/FeLightningProtection.java
new file mode 100644
index 0000000..c785b90
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/pojo/FeLightningProtection.java
@@ -0,0 +1,58 @@
+package com.ruoyi.require.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+import org.springframework.format.annotation.DateTimeFormat;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.Serializable;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 璁炬柦鍜岀幆澧冩潯浠�-璁炬柦鍜岀幆澧冩潯浠惰姹�-闃查浄妫�娴�
+ * </p>
+ *
+ * @author 
+ * @since 2024-11-07 04:16:36
+ */
+@Getter
+@Setter
+@TableName("cnas_fe_lightning_protection")
+@Schema(description = "璁炬柦鍜岀幆澧冩潯浠�-璁炬柦鍜岀幆澧冩潯浠惰姹�-闃查浄妫�娴�")
+public class FeLightningProtection implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @Schema(description = "涓婚敭id")
+    @TableId(value = "lightning_protection_id", type = IdType.AUTO)
+    private Integer lightningProtectionId;
+
+    @Schema(description = "鍘熸枃浠跺悕")
+    private String fileName;
+
+    @Schema(description = "绯荤粺鐢熸垚鏂囦欢鍚�")
+    private String systemFileName;
+
+    @Schema(description = "妫�娴嬫棩鏈�")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    private LocalDate detectionDate;
+
+    @Schema(description = "鏈夋晥鏈�")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    private LocalDate termValidity;
+
+    @Schema(description = "妫�娴嬪崟浣�")
+    private String detectionUnit;
+
+    @Schema(description = "鍒涘缓鏃堕棿")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @Schema(description = "鏇存柊鏃堕棿")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/pojo/FeMeasuredQuantity.java b/cnas-require/src/main/java/com/ruoyi/require/pojo/FeMeasuredQuantity.java
new file mode 100644
index 0000000..27264a6
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/pojo/FeMeasuredQuantity.java
@@ -0,0 +1,53 @@
+package com.ruoyi.require.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 璁炬柦鍜岀幆澧冩潯浠�-璁炬柦鍜岀幆澧冩潯浠惰姹�-鐢垫簮绋冲畾鎬�-娴嬪畾閲�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-07 04:16:44
+ */
+@Getter
+@Setter
+@TableName("cnas_fe_measured_quantity")
+@Schema(description = "璁炬柦鍜岀幆澧冩潯浠�-璁炬柦鍜岀幆澧冩潯浠惰姹�-鐢垫簮绋冲畾鎬�-娴嬪畾閲�")
+public class FeMeasuredQuantity implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @Schema(description = "涓婚敭id")
+    @TableId(value = "measured_quantity_id", type = IdType.AUTO)
+    private Integer measuredQuantityId;
+
+    @Schema(description = "娴嬪畾閲忓悕绉�")
+    private String measuredQuantityLabel;
+
+    @Schema(description = "鍊糀")
+    private String valueA;
+
+    @Schema(description = "鍊糂")
+    private String valueB;
+
+    @Schema(description = "鍊糃")
+    private String valueC;
+
+    @Schema(description = "鍒涘缓鏃堕棿")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @Schema(description = "鏇存柊鏃堕棿")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+
+    @Schema(description = "鐢垫簮绋冲畾鎬d")
+    private Integer powerStableId;
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/pojo/FePowerStable.java b/cnas-require/src/main/java/com/ruoyi/require/pojo/FePowerStable.java
new file mode 100644
index 0000000..b29df57
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/pojo/FePowerStable.java
@@ -0,0 +1,63 @@
+package com.ruoyi.require.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 璁炬柦鍜岀幆澧冩潯浠�-璁炬柦鍜岀幆澧冩潯浠惰姹�-鐢垫簮绋冲畾鎬�
+ * </p>
+ *
+ * @author 
+ * @since 2024-11-07 04:16:52
+ */
+@Getter
+@Setter
+@TableName("cnas_fe_power_stable")
+@Schema(description = "璁炬柦鍜岀幆澧冩潯浠�-璁炬柦鍜岀幆澧冩潯浠惰姹�-鐢垫簮绋冲畾鎬�")
+public class FePowerStable implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @Schema(description = "鐢垫簮绋冲畾鎬d")
+    @TableId(value = "power_stable_id", type = IdType.AUTO)
+    private Integer powerStableId;
+
+    @Schema(description = "娴嬭瘯鍦扮偣")
+    private String testLocation;
+
+    @Schema(description = "娴嬭瘯鏃ユ湡")
+    private LocalDate testDate;
+
+    @Schema(description = "璁惧id")
+    private Integer deviceId;
+
+    @Schema(description = "缁撹")
+    private String conclusion;
+
+    @Schema(description = "妫�娴嬭�卛d")
+    private Integer testerId;
+
+    @Schema(description = "鏍告煡浜篿d")
+    private Integer checkerId;
+
+    @Schema(description = "鏍″噯鏃ユ湡")
+    private LocalDateTime lastCalibrationDate;
+
+    @Schema(description = "涓嬫鏍″噯鏃ユ湡")
+    private LocalDateTime nextCalibrationDate;
+
+    @Schema(description = "鍒涘缓鏃堕棿")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @Schema(description = "鏇存柊鏃堕棿")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/pojo/FeStandardSubstance.java b/cnas-require/src/main/java/com/ruoyi/require/pojo/FeStandardSubstance.java
new file mode 100644
index 0000000..3c01b66
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/pojo/FeStandardSubstance.java
@@ -0,0 +1,80 @@
+package com.ruoyi.require.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 鏍囧噯鐗╄川娓呭崟
+ * </p>
+ *
+ * @author
+ * @since 2024-11-13 03:58:59
+ */
+@Getter
+@Setter
+@TableName("cnas_fe_standard_substance")
+@Schema(description = "鏍囧噯鐗╄川娓呭崟")
+public class FeStandardSubstance implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @Schema(description = "鏍囧噯鐗╄川鍚嶇О")
+    private String name;
+
+    @Schema(description = "瑙勬牸鍨嬪彿")
+    private String model;
+
+    @Schema(description = "鐢熶骇鍘傚")
+    private String factoryManufacturer;
+
+    @Schema(description = "鍑哄満缂栧彿")
+    private String factoryNum;
+
+    @Schema(description = "绠$悊缂栧彿")
+    private String manageNum;
+
+    @Schema(description = "涓嶇‘瀹氬害")
+    private String uncertainty;
+
+    @Schema(description = "鏁伴噺")
+    private Long quantity;
+
+    @Schema(description = "璐疆鏃ユ湡")
+    private LocalDateTime acquisitionDate;
+
+    @Schema(description = "鏈夋晥鏈�")
+    private LocalDateTime effectiveDate;
+
+    @Schema(description = "鏂囨。缂栧彿")
+    private String fileNum;
+
+    @Schema(description = "瀛樻斁浣嶇疆")
+    private String position;
+
+    @Schema(description = "鍊熻皟鐘舵�侊紙0:鏈�熻皟 1:宸插�熻皟锛�")
+    private Integer state;
+
+    @Schema(description = "澶囨敞")
+    private String remark;
+
+    @TableField(fill = FieldFill.INSERT)
+    private String createUser;
+
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private String updateUser;
+
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/pojo/FeStandardSubstanceAcceptance.java b/cnas-require/src/main/java/com/ruoyi/require/pojo/FeStandardSubstanceAcceptance.java
new file mode 100644
index 0000000..7941564
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/pojo/FeStandardSubstanceAcceptance.java
@@ -0,0 +1,90 @@
+package com.ruoyi.require.pojo;
+
+import com.alibaba.excel.annotation.ExcelIgnore;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serializable;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 鏍囧噯鐗╄川楠屾敹
+ * </p>
+ *
+ * @author
+ * @since 2024-11-14 03:29:41
+ */
+@Getter
+@Setter
+@TableName("cnas_fe_standard_substance_acceptance")
+@Schema(description = "鏍囧噯鐗╄川楠屾敹")
+public class FeStandardSubstanceAcceptance implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @Schema(description = "娓呭崟id")
+    @ExcelProperty("娓呭崟id")
+    private Integer substanceId;
+
+    @Schema(description = "鍒拌揣鏃ユ湡")
+    @ExcelProperty("鍒拌揣鏃ユ湡")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    private LocalDate arriveDate;
+
+    @Schema(description = "缁翠慨鍗曚綅")
+    @ExcelProperty("缁翠慨鍗曚綅")
+    private String maintenanceUnit;
+
+    @Schema(description = "鍙傛暟")
+    @ExcelProperty("鍙傛暟")
+    private String perameters;
+
+    @Schema(description = "瀹夎璋冭瘯鎯呭喌")
+    @ExcelProperty("瀹夎璋冭瘯鎯呭喌")
+    private String installation;
+
+    @Schema(description = "楠屾敹鎯呭喌")
+    @ExcelProperty("楠屾敹鎯呭喌")
+    private String situation;
+
+    @Schema(description = "鎺ュ彈绛惧瓧")
+    @ExcelProperty("鎺ュ彈绛惧瓧")
+    private String signature;
+
+    @Schema(description = "鍘傚浠h〃")
+    @ExcelProperty("鍘傚浠h〃")
+    private String producer;
+
+    @Schema(description = "鎺ユ敹浜�")
+    @ExcelProperty("鎺ユ敹浜�")
+    private String recipient;
+
+    @Schema(description = "闄勪欢")
+    @ExcelProperty("闄勪欢")
+    private String file;
+
+    @ExcelIgnore
+    @TableField(fill = FieldFill.INSERT)
+    private String createUser;
+
+    @ExcelIgnore
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @ExcelIgnore
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private String updateUser;
+
+    @ExcelIgnore
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/pojo/FeStandardSubstanceAcceptanceInspection.java b/cnas-require/src/main/java/com/ruoyi/require/pojo/FeStandardSubstanceAcceptanceInspection.java
new file mode 100644
index 0000000..20a0e51
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/pojo/FeStandardSubstanceAcceptanceInspection.java
@@ -0,0 +1,47 @@
+package com.ruoyi.require.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 楠屾敹寮�绠辫褰�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-14 03:30:09
+ */
+@Getter
+@Setter
+@TableName("cnas_fe_standard_substance_acceptance_inspection")
+@Schema(description = "楠屾敹寮�绠辫褰�")
+public class FeStandardSubstanceAcceptanceInspection implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    private Integer acceptanceId;
+
+    private String name;
+
+    private Integer number;
+
+    @TableField(fill = FieldFill.INSERT)
+    private String createUser;
+
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private String updateUser;
+
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/pojo/FeStandardSubstanceRecord.java b/cnas-require/src/main/java/com/ruoyi/require/pojo/FeStandardSubstanceRecord.java
new file mode 100644
index 0000000..0a576cd
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/pojo/FeStandardSubstanceRecord.java
@@ -0,0 +1,77 @@
+package com.ruoyi.require.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 鏍囧噯鐗╄川娓呭崟鍊熺敤褰掕繕璁板綍琛�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-14 01:49:11
+ */
+@Getter
+@Setter
+@TableName("cnas_fe_standard_substance_record")
+@Schema(description = "鏍囧噯鐗╄川娓呭崟鍊熺敤褰掕繕璁板綍琛�")
+public class FeStandardSubstanceRecord implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @Schema(description = "鐗╄川id")
+    private Integer substanceId;
+
+    @Schema(description = "鍊熺敤-瀹屽ソ鎬�")
+    private String integrity;
+
+    @Schema(description = "鍊熺敤-鍊熺敤浜�")
+    private String borrowUser;
+
+    @Schema(description = "鍊熺敤-鑱旂郴鏂瑰紡")
+    private String phone;
+
+    @Schema(description = "鍊熺敤-鍊熷嚭鏃ユ湡")
+    private LocalDateTime borrowDate;
+
+    @Schema(description = "褰掕繕鏃ユ湡")
+    private LocalDateTime borrowReturnDate;
+
+    @Schema(description = "鍊熷嚭浜�")
+    private String lender;
+
+    @Schema(description = "褰掕繕-妫�鏌ヤ汉")
+    private String rummager;
+
+    @Schema(description = "0锛氬�熺敤 1:褰掕繕")
+    private String status;
+
+    @Schema(description = "褰掕繕浜�")
+    private String returnedPerson;
+
+    @Schema(description = "褰掕繕-鏃ユ湡")
+    private LocalDateTime returnDate;
+
+    @Schema(description = "褰掕繕-瀹屽ソ鎬�")
+    private String returnIntegrity;
+
+    @TableField(fill = FieldFill.INSERT)
+    private String createUser;
+
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private String updateUser;
+
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/pojo/FeTempHumDate.java b/cnas-require/src/main/java/com/ruoyi/require/pojo/FeTempHumDate.java
new file mode 100644
index 0000000..8a4f6f7
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/pojo/FeTempHumDate.java
@@ -0,0 +1,55 @@
+package com.ruoyi.require.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 璁炬柦鍜岀幆澧冩潯浠�-璁炬柦鍜岀幆澧冩潯浠惰姹�-娓╂箍搴� 鍖哄煙 -鐖�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-09 11:02:18
+ */
+@Getter
+@Setter
+@TableName("cnas_fe_temp_hum_date")
+@Schema(description = "璁炬柦鍜岀幆澧冩潯浠�-璁炬柦鍜岀幆澧冩潯浠惰姹�-娓╂箍搴� 鍖哄煙 -鐖�")
+public class FeTempHumDate {
+
+    @Schema(description = "涓婚敭ID")
+    @TableId(value = "date_id", type = IdType.AUTO)
+    private Integer dateId;
+
+    @Schema(description = "鏈堝害鏃堕棿")
+    private String monthDate;
+
+    @Schema(description = "璇曢獙鍖哄煙鍚嶇О")
+    private String testAreaName;
+
+    @Schema(description = "澧炶ˉ淇℃伅")
+    private String subjoin;
+
+    @Schema(description = "鐧昏鍛�")
+    private Integer registrarUserId;
+
+    @Schema(description = "鍒涘缓鏃堕棿")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @Schema(description = "鏇存柊鏃堕棿")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+
+    @Schema(description = "鍒涘缓浜�")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @Schema(description = "鏇存柊浜�")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/pojo/FeTempHumRecord.java b/cnas-require/src/main/java/com/ruoyi/require/pojo/FeTempHumRecord.java
new file mode 100644
index 0000000..91678c2
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/pojo/FeTempHumRecord.java
@@ -0,0 +1,66 @@
+package com.ruoyi.require.pojo;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.time.LocalDate;
+import java.time.LocalTime;
+
+/**
+ * <p>
+ * 璁炬柦鍜岀幆澧冩潯浠�-璁炬柦鍜岀幆澧冩潯浠惰姹�-娓╂箍搴﹁褰�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-07 04:28:52
+ */
+@Getter
+@Setter
+@TableName("cnas_fe_temp_hum_record")
+@Schema(description = "璁炬柦鍜岀幆澧冩潯浠�-璁炬柦鍜岀幆澧冩潯浠惰姹�-娓╂箍搴﹁褰�")
+public class FeTempHumRecord implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @Schema(description = "娓╂箍搴﹁褰�")
+    @TableId(value = "temp_hum_id", type = IdType.AUTO)
+    private Integer tempHumId;
+
+    @Schema(description = "璁板綍鏃ユ湡")
+    private LocalDate recordDate;
+
+    @Schema(description = "涓婂崍-鏃堕棿")
+    private LocalTime morningTestTime;
+
+    @Schema(description = "涓婂崍娓╁害")
+    private String morningTemp;
+
+    @Schema(description = "涓婂崍婀垮害")
+    private String morningHum;
+
+    @Schema(description = "涓婂崍璁板綍鍛�")
+    private Integer morningRecorderId;
+
+    @Schema(description = "涓嬪崍鏃堕棿")
+    private LocalTime afternoonTime;
+
+    @Schema(description = "涓嬪崍娓╁害")
+    private String afternoonTemp;
+
+    @Schema(description = "涓嬪崍婀垮害")
+    private String afternoonHum;
+
+    @Schema(description = "涓嬪崍璁板綍鍛�")
+    private Integer afternoonRecorderId;
+
+    @Schema(description = "澶囨敞")
+    private String note;
+
+    @Schema(description = "娓╁害寰幆涓昏〃id")
+    private Integer dateId;
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/pojo/ForeignRegister.java b/cnas-require/src/main/java/com/ruoyi/require/pojo/ForeignRegister.java
new file mode 100644
index 0000000..dd4df87
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/pojo/ForeignRegister.java
@@ -0,0 +1,73 @@
+package com.ruoyi.require.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 澶栨潵浜哄憳鐧昏
+ * </p>
+ *
+ * @author 
+ * @since 2024-11-19 07:17:35
+ */
+@Data
+@TableName("cnas_foreign_register")
+@Schema(description = "澶栨潵浜哄憳鐧昏")
+public class ForeignRegister {
+
+    @TableId(value = "register_id", type = IdType.AUTO)
+    private Integer registerId;
+
+    @Schema(description = "鐧昏濡傛湡")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    private LocalDate registerDate;
+
+    @Schema(description = "杩涘叆鍖哄煙")
+    private String area;
+
+    @Schema(description = "杩涘叆浜哄憳")
+    private String personnel;
+
+    @Schema(description = "杩涘叆鍘熷洜")
+    private String reason;
+
+    @Schema(description = "闄悓浜哄憳id")
+    private Integer accompanyingId;
+
+    @Schema(description = "闄悓浜哄憳")
+    private String accompanyingName;
+
+    @Schema(description = "鎵瑰噯浜篿d")
+    private Integer approveId;
+
+    @Schema(description = "鎵瑰噯浜�")
+    private String approveName;
+
+    @Schema(description = "淇濆瘑鍙婂叾浠栨儏鍐�")
+    private String confidentiality;
+
+    @Schema(description = "澶囨敞")
+    private String remark;
+
+    @Schema(description = "鍒涘缓浜�")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @Schema(description = "鍒涘缓鏃堕棿")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @Schema(description = "淇敼浜�")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    @Schema(description = "淇敼鏃堕棿")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/pojo/InternalWastes.java b/cnas-require/src/main/java/com/ruoyi/require/pojo/InternalWastes.java
new file mode 100644
index 0000000..ed42035
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/pojo/InternalWastes.java
@@ -0,0 +1,43 @@
+package com.ruoyi.require.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 瀹夊叏鍐呭姟涓夊簾鐧昏
+ * </p>
+ *
+ * @author
+ * @since 2024-11-19 06:39:27
+ */
+@Data
+@TableName("cnas_internal_wastes")
+@Schema(description = "瀹夊叏鍐呭姟涓夊簾鐧昏")
+public class InternalWastes {
+
+    @TableId(value = "wastes_id", type = IdType.AUTO)
+    private Integer wastesId;
+
+    @Schema(description = "澶囨敞")
+    private String remark;
+
+    @Schema(description = "鍒涘缓浜�")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @Schema(description = "鍒涘缓鏃堕棿")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @Schema(description = "淇敼浜�")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    @Schema(description = "淇敼鏃堕棿")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/pojo/InternalWastesDetail.java b/cnas-require/src/main/java/com/ruoyi/require/pojo/InternalWastesDetail.java
new file mode 100644
index 0000000..8bf41fd
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/pojo/InternalWastesDetail.java
@@ -0,0 +1,65 @@
+package com.ruoyi.require.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 瀹夊叏鍐呭姟涓夊簾鐧昏璇︽儏
+ * </p>
+ *
+ * @author
+ * @since 2024-11-19 06:39:54
+ */
+@Data
+@TableName("cnas_internal_wastes_detail")
+@Schema(description = "瀹夊叏鍐呭姟涓夊簾鐧昏璇︽儏")
+public class InternalWastesDetail {
+
+    @TableId(value = "wastes_detail_id", type = IdType.AUTO)
+    private Integer wastesDetailId;
+
+    @Schema(description = "涓昏〃id")
+    private Integer wastesId;
+
+    @Schema(description = "鍚嶇О")
+    private String designation;
+
+    @Schema(description = "浣撶Н")
+    private String volume;
+
+    @Schema(description = "閫佸鐞嗘棩鏈�")
+    private String deliveryDate;
+
+    @Schema(description = "绉讳氦浜�")
+    private String transferPeople;
+
+    @Schema(description = "鎺ユ敹浜�")
+    private String acceptor;
+
+    @Schema(description = "鎺ユ敹鍗曚綅")
+    private String receivingUnit;
+
+    @Schema(description = "鍒涘缓浜�")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @Schema(description = "鍒涘缓鏃堕棿")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @Schema(description = "淇敼浜�")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    @Schema(description = "淇敼鏃堕棿")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+
+    // 瀵煎嚭浣跨敤
+    @TableField(select = false, exist = false)
+    private Integer index;
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/pojo/ProcurementSuppliesConsumables.java b/cnas-require/src/main/java/com/ruoyi/require/pojo/ProcurementSuppliesConsumables.java
new file mode 100644
index 0000000..6655104
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/pojo/ProcurementSuppliesConsumables.java
@@ -0,0 +1,49 @@
+package com.ruoyi.require.pojo;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+@Data
+@TableName("procurement_supplies_consumables")
+@Schema(description = "鑰楁潗閲囪喘鏄庣粏琛�")
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class ProcurementSuppliesConsumables {
+
+    @TableId(type = IdType.AUTO)
+    private Integer id;
+
+    @Schema(description = "鑰楁潗涓昏〃id")
+    private Integer storeId;
+
+    @Schema(description = "鑰楁潗鍚嶇О")
+    private String consumablesName;
+
+    @Schema(description = "鍗曚环")
+    private Double unitPrice;
+
+    @Schema(description = "鍏ュ簱鏁伴噺")
+    private Integer storeNumber;
+
+    @Schema(description = "鎬讳环")
+    private Double totalPrice;
+
+    @Schema(description = "璐у彿")
+    private String itemNumber;
+
+    @Schema(description = "绫诲埆")
+    private String type;
+
+    @Schema(description = "瑙勬牸")
+    private String specifications;
+
+    @Schema(description = "鍙傝�冧緵搴斿晢")
+    private String supplier;
+
+    @Schema(description = "璁¢噺鍗曚綅")
+    private String unit;
+
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/pojo/ProcurementSuppliesContents.java b/cnas-require/src/main/java/com/ruoyi/require/pojo/ProcurementSuppliesContents.java
new file mode 100644
index 0000000..ccbd2ed
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/pojo/ProcurementSuppliesContents.java
@@ -0,0 +1,41 @@
+package com.ruoyi.require.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+import java.util.List;
+
+@Data
+@TableName("procurement_supplies_contents")
+@Schema(description = "鏈嶅姟鍜屼緵搴斿搧閲囪喘琛�")
+public class ProcurementSuppliesContents {
+
+    @TableId(type = IdType.AUTO)
+    private Integer id;
+
+    @Schema(description = "鑺傜偣鍚嶇О")
+    private String nodeName;
+
+    @Schema(description = "浠e彿")
+    private String code;
+
+
+    @Schema(description = "鏇存柊浜�")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    @Schema(description = "鏇存柊鏃堕棿")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+
+    @Schema(description = "鐖惰妭鐐�")
+    private Integer parentId;
+
+    @TableField(exist = false)
+    private List<ProcurementSuppliesContents> children;
+
+
+
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/pojo/ProcurementSuppliesExpends.java b/cnas-require/src/main/java/com/ruoyi/require/pojo/ProcurementSuppliesExpends.java
new file mode 100644
index 0000000..fc65f4d
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/pojo/ProcurementSuppliesExpends.java
@@ -0,0 +1,52 @@
+package com.ruoyi.require.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author 
+ * @since 2024-11-15 03:47:19
+ */
+@Getter
+@Setter
+@TableName("procurement_supplies_expends")
+@Schema(description = "")
+public class ProcurementSuppliesExpends implements Serializable {
+
+
+    @Schema(description = "涓昏〃Id")
+    @TableId(value = "expend_id", type = IdType.AUTO)
+    private Long expendId;
+
+    @Schema(description = "鑰楁潗Id")
+    private Long listId;
+
+    @Schema(description = "娑堣�楁暟閲�")
+    private Integer amount;
+
+    @Schema(description = "褰曞叆浜篿d")
+    private Integer enterUserId;
+
+    @Schema(description = "鏇存柊浜篿d")
+    private Integer updateUserId;
+
+    @Schema(description = "鏇存柊鏃堕棿")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime updateTime;
+
+    @Schema(description = "鍒涘缓鏃堕棿")
+    @TableField(fill = FieldFill.INSERT)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime createTime;
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/pojo/ProcurementSuppliesList.java b/cnas-require/src/main/java/com/ruoyi/require/pojo/ProcurementSuppliesList.java
new file mode 100644
index 0000000..d105e7b
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/pojo/ProcurementSuppliesList.java
@@ -0,0 +1,100 @@
+package com.ruoyi.require.pojo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 鏈嶅姟涓庝緵搴斿晢 鑰楁潗鍒楄〃
+ * </p>
+ *
+ * @author 
+ * @since 2024-11-15 04:04:32
+ */
+@Getter
+@Setter
+@TableName("procurement_supplies_list")
+@Schema(description = "鏈嶅姟涓庝緵搴斿晢 鑰楁潗鍒楄〃")
+public class ProcurementSuppliesList implements Serializable {
+
+
+    @TableId(value = "id", type = IdType.AUTO)
+    @Schema(description = "缂栧彿")
+    @ExcelProperty("缂栧彿")
+    private Long id;
+
+    @Schema(description = "鐩綍id")
+    private Long contentsId;
+
+    @Schema(description = "鑰楁潗绫诲瀷")
+    @ExcelProperty("绫诲埆")
+    private String consumablesType;
+
+    @Schema(description = "璐у彿")
+    @ExcelProperty("璐у彿")
+    private String itemNumber;
+
+    @Schema(description = "鑰楁潗鍚嶇О")
+    @ExcelProperty("鍚嶇О")
+    private String consumablesName;
+
+    @Schema(description = "瑙勬牸")
+    @ExcelProperty("瑙勬牸")
+    private String specifications;
+
+    @Schema(description = "璁¢噺鍗曚綅")
+    @ExcelProperty("璁¢噺鍗曚綅")
+    private String unit;
+
+    @Schema(description = "鍙傝�冧环鏍�")
+    private BigDecimal referencePrice;
+
+    @Schema(description = "瀛樻斁浣嶇疆")
+    private Integer contentId;
+
+    @Schema(description = "璐熻矗浜�")
+    private Integer personInCharge;
+
+    @Schema(description = "搴撳瓨涓婇檺")
+    private Integer upperLimit;
+
+    @Schema(description = "搴撳瓨涓嬮檺")
+    @ExcelProperty("搴撳瓨涓嬮檺")
+    private Integer lowerLimit;
+
+    @Schema(description = "渚涘簲鍟�")
+    private Integer supplier;
+
+    @Schema(description = "鑰楁潗鍥炬爣")
+    private String consumablesIcon;
+
+    @Schema(description = "鑰楁潗闄勪欢")
+    private String attachment;
+
+    @Schema(description = "澶囨敞")
+    @ExcelProperty("澶囨敞")
+    private String remark;
+
+    @TableField(fill = FieldFill.INSERT)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime createTime;
+
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime updateTime;
+
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    @Schema(description = "褰撳墠搴撳瓨鏁伴噺")
+    @ExcelProperty("褰撳墠搴撳瓨")
+    private Integer currentAmount;
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/pojo/ProcurementSuppliesStore.java b/cnas-require/src/main/java/com/ruoyi/require/pojo/ProcurementSuppliesStore.java
new file mode 100644
index 0000000..643f00b
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/pojo/ProcurementSuppliesStore.java
@@ -0,0 +1,51 @@
+package com.ruoyi.require.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 com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.time.LocalDate;
+
+@Data
+@TableName("procurement_supplies_store")
+@Schema(description = "鑰楁潗鍏ュ簱琛�")
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class ProcurementSuppliesStore implements Serializable {
+
+    @TableId(type = IdType.AUTO)
+    private Integer id;
+
+    @Schema(description = "鐩綍id")
+    private Integer contentsId;
+
+    @Schema(description = "鍏ュ簱鍗曞彿")
+    private String oddNumbers;
+
+    @Schema(description = "鍏ュ簱搴撳瓨")
+    private String inventory;
+
+    @Schema(description = "鍏ュ簱鎬婚噾棰�")
+    private Double totalAmount;
+
+    @Schema(description = "鍏ュ簱浜�")
+    private Integer storageUser;
+
+    @Schema(description = "鍏ュ簱鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    private LocalDate storageTime;
+
+    @Schema(description = "鍏ュ簱璇存槑")
+    private String remark;
+
+    @Schema(description = "鐧昏浜�")
+    private Integer registrant;
+
+    @Schema(description = "鐧昏鏃堕棿")
+    private LocalDate registrantTime;
+
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/pojo/SupplierManagement.java b/cnas-require/src/main/java/com/ruoyi/require/pojo/SupplierManagement.java
new file mode 100644
index 0000000..c060854
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/pojo/SupplierManagement.java
@@ -0,0 +1,109 @@
+package com.ruoyi.require.pojo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author 
+ * @since 2024-11-15 02:46:45
+ */
+@Getter
+@Setter
+@TableName("cnas_supplier_management")
+@Schema(description = "")
+public class SupplierManagement implements Serializable {
+
+
+    @Schema(description = "涓昏〃Id")
+    @TableId(value = "supplier_management_id", type = IdType.AUTO)
+    private Integer supplierManagementId;
+
+    @Schema(description = "渚涘簲鍟�")
+    @ExcelProperty("渚涘簲鍟�")
+    private String supplierName;
+
+    @Schema(description = "缂栧彿")
+    @ExcelProperty("缂栧彿")
+    private String supplierRef;
+
+    @Schema(description = "渚涘簲鍟嗙墿鍝佹湇鍔″悕绉�")
+    @ExcelProperty("渚涘簲鍟嗙墿鍝佹湇鍔″悕绉�")
+    private String supplierItemServiceName;
+
+    @Schema(description = "閭紪")
+    @ExcelProperty("閭紪")
+    private String postalCode;
+
+    @Schema(description = "鍦板潃")
+    @ExcelProperty("鍦板潃")
+    private String adress;
+
+    @Schema(description = "logo")
+    private String logo;
+
+    @Schema(description = "鑱旂郴浜�")
+    @ExcelProperty("鑱旂郴浜�")
+    private String contacts;
+
+    @Schema(description = "鑱旂郴鐢佃瘽")
+    @ExcelProperty("鑱旂郴鐢佃瘽")
+    private String phone;
+
+    @Schema(description = "鎴峰悕")
+    @ExcelProperty("鎴峰悕")
+    private String householdName;
+
+    @Schema(description = "浼犵湡")
+    @ExcelProperty("浼犵湡")
+    private String fax;
+
+    @Schema(description = "寮�鎴疯")
+    @ExcelProperty("寮�鎴疯")
+    private String openingName;
+
+    @Schema(description = "缃戝潃")
+    @ExcelProperty("缃戝潃")
+    private String website;
+
+    @Schema(description = "璐﹀彿")
+    @ExcelProperty("璐﹀彿")
+    private String accountName;
+
+    @Schema(description = "email")
+    @ExcelProperty("email")
+    private String email;
+
+    @Schema(description = "澶囨敞")
+    @ExcelProperty("澶囨敞")
+    private String remarks;
+
+    @Schema(description = "闄勪欢")
+    private String enclosure;
+
+    @Schema(description = "鐘舵��")
+    private String status;
+
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    @Schema(description = "鐖秈d")
+    private Integer parentId;
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/pojo/SuppliersDirectoryContents.java b/cnas-require/src/main/java/com/ruoyi/require/pojo/SuppliersDirectoryContents.java
new file mode 100644
index 0000000..fe22453
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/pojo/SuppliersDirectoryContents.java
@@ -0,0 +1,51 @@
+package com.ruoyi.require.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import java.util.List;
+
+/**
+ * <p>
+ * 鏈嶅姟鍜屼緵搴斿搧閲囪喘鐩綍
+ * </p>
+ *
+ * @author
+ * @since 2024-12-17 06:14:51
+ */
+@Getter
+@Setter
+@TableName("suppliers_directory_contents")
+@Schema(description = "鏈嶅姟鍜屼緵搴斿搧閲囪喘鐩綍")
+public class SuppliersDirectoryContents implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @Schema(description = "鑺傜偣鍚嶇О")
+    private String nodeName;
+
+    @Schema(description = "浠e彿")
+    private String code;
+
+    @Schema(description = "鏇存柊浜�")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    @Schema(description = "鏇存柊鏃堕棿")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+
+    @Schema(description = "鐖惰妭鐐�")
+    private Integer parentId;
+
+
+    @TableField(exist = false)
+    private List<SuppliersDirectoryContents> children;
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/service/FeCalibrationScheduleService.java b/cnas-require/src/main/java/com/ruoyi/require/service/FeCalibrationScheduleService.java
new file mode 100644
index 0000000..d942099
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/service/FeCalibrationScheduleService.java
@@ -0,0 +1,29 @@
+package com.ruoyi.require.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.require.pojo.FeCalibrationSchedule;
+import jakarta.servlet.http.HttpServletResponse;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author 
+ * @since 2024-11-13 02:53:05
+ */
+public interface FeCalibrationScheduleService extends IService<FeCalibrationSchedule> {
+
+
+    IPage<FeCalibrationSchedule> page(Page page,String instrumentName, String managementNumber);
+
+    /**
+     * 閲忓�兼函婧愯鍒掑鍑簑ord
+     *
+     * @param response 鍝嶅簲娣诲姞word
+     */
+    void exportWordOfValueTraceabilityPlan(HttpServletResponse response);
+
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/service/FeIlluminationDetectionAreaService.java b/cnas-require/src/main/java/com/ruoyi/require/service/FeIlluminationDetectionAreaService.java
new file mode 100644
index 0000000..a94cdf9
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/service/FeIlluminationDetectionAreaService.java
@@ -0,0 +1,16 @@
+package com.ruoyi.require.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.require.pojo.FeIlluminationDetectionArea;
+
+/**
+ * <p>
+ * 璁炬柦鍜岀幆澧冩潯浠�-璁炬柦鍜岀幆澧冩潯浠惰姹�-鐓у害璁板綍琛�-妫�娴嬪尯鍩� 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 
+ * @since 2024-11-07 04:16:28
+ */
+public interface FeIlluminationDetectionAreaService extends IService<FeIlluminationDetectionArea> {
+
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/service/FeIlluminationService.java b/cnas-require/src/main/java/com/ruoyi/require/service/FeIlluminationService.java
new file mode 100644
index 0000000..3ce0d63
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/service/FeIlluminationService.java
@@ -0,0 +1,29 @@
+package com.ruoyi.require.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.require.dto.FeIlluminationDto;
+import com.ruoyi.require.pojo.FeIllumination;
+
+import jakarta.servlet.http.HttpServletResponse;
+
+/**
+ * <p>
+ * 璁炬柦鍜岀幆澧冩潯浠�-璁炬柦鍜岀幆澧冩潯浠惰姹�-鐓у害璁板綍琛� 鏈嶅姟绫�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-07 04:15:57
+ */
+public interface FeIlluminationService extends IService<FeIllumination> {
+
+    IPage<FeIlluminationDto> getFeLightningProtection(Page page);
+
+    /**
+     * 瀵煎嚭鐓у害璁板綍
+     * @param intensityIlluminationId
+     * @param response
+     */
+    void exportFeIllumination(Integer intensityIlluminationId, HttpServletResponse response);
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/service/FeLightningProtectionService.java b/cnas-require/src/main/java/com/ruoyi/require/service/FeLightningProtectionService.java
new file mode 100644
index 0000000..8e82dbf
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/service/FeLightningProtectionService.java
@@ -0,0 +1,21 @@
+package com.ruoyi.require.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.require.excel.FeLightningProtectionExcel;
+import com.ruoyi.require.pojo.FeLightningProtection;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 璁炬柦鍜岀幆澧冩潯浠�-璁炬柦鍜岀幆澧冩潯浠惰姹�-闃查浄妫�娴� 鏈嶅姟绫�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-07 04:16:36
+ */
+public interface FeLightningProtectionService extends IService<FeLightningProtection> {
+
+    List<FeLightningProtectionExcel> exportOfLightningProtectionDetection();
+
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/service/FeMeasuredQuantityService.java b/cnas-require/src/main/java/com/ruoyi/require/service/FeMeasuredQuantityService.java
new file mode 100644
index 0000000..be296f4
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/service/FeMeasuredQuantityService.java
@@ -0,0 +1,16 @@
+package com.ruoyi.require.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.require.pojo.FeMeasuredQuantity;
+
+/**
+ * <p>
+ * 璁炬柦鍜岀幆澧冩潯浠�-璁炬柦鍜岀幆澧冩潯浠惰姹�-鐢垫簮绋冲畾鎬�-娴嬪畾閲� 鏈嶅姟绫�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-07 04:16:44
+ */
+public interface FeMeasuredQuantityService extends IService<FeMeasuredQuantity> {
+
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/service/FePowerStableService.java b/cnas-require/src/main/java/com/ruoyi/require/service/FePowerStableService.java
new file mode 100644
index 0000000..c6a0064
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/service/FePowerStableService.java
@@ -0,0 +1,33 @@
+package com.ruoyi.require.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.require.dto.FePowerStableDto;
+import com.ruoyi.require.pojo.FePowerStable;
+
+import jakarta.servlet.http.HttpServletResponse;
+import java.util.Map;
+import java.util.Objects;
+
+/**
+ * <p>
+ * 璁炬柦鍜岀幆澧冩潯浠�-璁炬柦鍜岀幆澧冩潯浠惰姹�-鐢垫簮绋冲畾鎬� 鏈嶅姟绫�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-07 04:16:52
+ */
+public interface FePowerStableService extends IService<FePowerStable> {
+
+    IPage<FePowerStableDto> getLaboratoryFacilityPowerStablePage(Page page);
+
+    Map<String, Objects> getCalibrationDate(Integer deviceId);
+
+    /**
+     * 瀵煎嚭鐢垫簮绋冲畾鎬�
+     * @param powerStableId
+     * @param response
+     */
+    void exportFePowerStable(Integer powerStableId, HttpServletResponse response);
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/service/FeStandardSubstanceAcceptanceInspectionService.java b/cnas-require/src/main/java/com/ruoyi/require/service/FeStandardSubstanceAcceptanceInspectionService.java
new file mode 100644
index 0000000..66bb307
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/service/FeStandardSubstanceAcceptanceInspectionService.java
@@ -0,0 +1,16 @@
+package com.ruoyi.require.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.require.pojo.FeStandardSubstanceAcceptanceInspection;
+
+/**
+ * <p>
+ * 楠屾敹寮�绠辫褰� 鏈嶅姟绫�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-14 03:30:09
+ */
+public interface FeStandardSubstanceAcceptanceInspectionService extends IService<FeStandardSubstanceAcceptanceInspection> {
+
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/service/FeStandardSubstanceAcceptanceService.java b/cnas-require/src/main/java/com/ruoyi/require/service/FeStandardSubstanceAcceptanceService.java
new file mode 100644
index 0000000..eb2c7fc
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/service/FeStandardSubstanceAcceptanceService.java
@@ -0,0 +1,33 @@
+package com.ruoyi.require.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.require.dto.AcceptanceDto;
+import com.ruoyi.require.pojo.FeStandardSubstanceAcceptance;
+import com.ruoyi.require.vo.AcceptanceDetailsVo;
+import com.ruoyi.require.vo.AcceptanceVo;
+
+import jakarta.servlet.http.HttpServletResponse;
+
+/**
+ * <p>
+ * 鏍囧噯鐗╄川楠屾敹 鏈嶅姟绫�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-14 03:29:41
+ */
+public interface FeStandardSubstanceAcceptanceService extends IService<FeStandardSubstanceAcceptance> {
+
+
+    void addAcceptance(AcceptanceDto dto);
+
+    IPage<AcceptanceVo> getPageAcceptance(Page page, String name);
+
+    AcceptanceDetailsVo getAcceptanceDetails(Integer id);
+
+    Integer deleteAcceptance(Integer id);
+
+    void exportFeStandardSubstanceAcceptance(HttpServletResponse response);
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/service/FeStandardSubstanceRecordService.java b/cnas-require/src/main/java/com/ruoyi/require/service/FeStandardSubstanceRecordService.java
new file mode 100644
index 0000000..4e52b9a
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/service/FeStandardSubstanceRecordService.java
@@ -0,0 +1,30 @@
+package com.ruoyi.require.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.require.pojo.FeStandardSubstanceRecord;
+import com.ruoyi.require.vo.SubstanceRecordVo;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 鏍囧噯鐗╄川娓呭崟鍊熺敤褰掕繕璁板綍琛� 鏈嶅姟绫�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-14 01:49:11
+ */
+public interface FeStandardSubstanceRecordService extends IService<FeStandardSubstanceRecord> {
+
+
+    void borrowSubstance(FeStandardSubstanceRecord feStandardSubstanceRecord);
+
+    void returnSubstance(FeStandardSubstanceRecord feStandardSubstanceRecord);
+
+    List<FeStandardSubstanceRecord> getSubstanceRecord(Integer id);
+
+    IPage<SubstanceRecordVo> getPage(Page page, SubstanceRecordVo vo);
+
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/service/FeStandardSubstanceService.java b/cnas-require/src/main/java/com/ruoyi/require/service/FeStandardSubstanceService.java
new file mode 100644
index 0000000..bff0a20
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/service/FeStandardSubstanceService.java
@@ -0,0 +1,26 @@
+package com.ruoyi.require.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.require.pojo.FeStandardSubstance;
+import org.springframework.web.multipart.MultipartFile;
+
+import jakarta.servlet.http.HttpServletResponse;
+
+/**
+ * <p>
+ * 鏍囧噯鐗╄川娓呭崟 鏈嶅姟绫�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-13 03:58:59
+ */
+public interface FeStandardSubstanceService extends IService<FeStandardSubstance> {
+
+    IPage<FeStandardSubstance> page(Page page, FeStandardSubstance feStandardSubstance);
+
+    void downloadImportTemplate(HttpServletResponse response);
+
+    int importStandardSubstance(MultipartFile file);
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/service/FeTempHumDateService.java b/cnas-require/src/main/java/com/ruoyi/require/service/FeTempHumDateService.java
new file mode 100644
index 0000000..8afd2e7
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/service/FeTempHumDateService.java
@@ -0,0 +1,30 @@
+package com.ruoyi.require.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.require.dto.FeTempHumDateDto;
+import com.ruoyi.require.pojo.FeTempHumDate;
+
+import jakarta.servlet.http.HttpServletResponse;
+
+/**
+ * <p>
+ * 璁炬柦鍜岀幆澧冩潯浠�-璁炬柦鍜岀幆澧冩潯浠惰姹�-娓╂箍搴� 鍖哄煙 -鐖� 鏈嶅姟绫�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-09 11:02:18
+ */
+public interface FeTempHumDateService extends IService<FeTempHumDate> {
+
+    IPage<FeTempHumDateDto> getFeTempHumDate(Page page, FeTempHumDateDto feTempHumDateDto);
+
+    void exportTemperatureAndHumidityRecords(Integer dateId, HttpServletResponse response);
+
+    /**
+     * 娓╂箍搴︾‘璁�
+     * @param feTempHumDate
+     */
+    void affirmFeTempHumDate(FeTempHumDate feTempHumDate);
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/service/FeTempHumRecordService.java b/cnas-require/src/main/java/com/ruoyi/require/service/FeTempHumRecordService.java
new file mode 100644
index 0000000..392bd66
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/service/FeTempHumRecordService.java
@@ -0,0 +1,20 @@
+package com.ruoyi.require.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.require.dto.FeTempHumRecordDto;
+import com.ruoyi.require.pojo.FeTempHumRecord;
+
+/**
+ * <p>
+ * 璁炬柦鍜岀幆澧冩潯浠�-璁炬柦鍜岀幆澧冩潯浠惰姹�-娓╂箍搴﹁褰� 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 
+ * @since 2024-11-07 04:28:52
+ */
+public interface FeTempHumRecordService extends IService<FeTempHumRecord> {
+
+    IPage<FeTempHumRecordDto> getFeTempHumRecordPage(Page page, Integer dateId);
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/service/ForeignRegisterService.java b/cnas-require/src/main/java/com/ruoyi/require/service/ForeignRegisterService.java
new file mode 100644
index 0000000..e6341a0
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/service/ForeignRegisterService.java
@@ -0,0 +1,34 @@
+package com.ruoyi.require.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.require.dto.ForeignRegisterDto;
+import com.ruoyi.require.pojo.ForeignRegister;
+
+import jakarta.servlet.http.HttpServletResponse;
+
+/**
+ * <p>
+ * 澶栨潵浜哄憳鐧昏 鏈嶅姟绫�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-19 07:17:35
+ */
+public interface ForeignRegisterService extends IService<ForeignRegister> {
+
+    /**
+     * 澶栨潵浜哄憳鐧昏鍒嗛〉鏌ヨ
+     * @param page
+     * @param foreignRegister
+     * @return
+     */
+    IPage<ForeignRegisterDto> pageForeignRegister(Page page, ForeignRegisterDto foreignRegister);
+
+    /**
+     * 瀵煎嚭澶栨潵浜哄憳鐧昏
+     * @param foreignRegister
+     */
+    void exportForeignRegister(ForeignRegisterDto foreignRegister, HttpServletResponse response);
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/service/InternalWastesDetailService.java b/cnas-require/src/main/java/com/ruoyi/require/service/InternalWastesDetailService.java
new file mode 100644
index 0000000..9540ac5
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/service/InternalWastesDetailService.java
@@ -0,0 +1,16 @@
+package com.ruoyi.require.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.require.pojo.InternalWastesDetail;
+
+/**
+ * <p>
+ * 瀹夊叏鍐呭姟涓夊簾鐧昏璇︽儏 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 
+ * @since 2024-11-19 06:39:54
+ */
+public interface InternalWastesDetailService extends IService<InternalWastesDetail> {
+
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/service/InternalWastesService.java b/cnas-require/src/main/java/com/ruoyi/require/service/InternalWastesService.java
new file mode 100644
index 0000000..180ec1e
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/service/InternalWastesService.java
@@ -0,0 +1,63 @@
+package com.ruoyi.require.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.require.dto.InternalWastesDto;
+import com.ruoyi.require.pojo.InternalWastes;
+
+import jakarta.servlet.http.HttpServletResponse;
+
+/**
+ * <p>
+ * 瀹夊叏鍐呭姟涓夊簾鐧昏 鏈嶅姟绫�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-19 06:39:27
+ */
+public interface InternalWastesService extends IService<InternalWastes> {
+
+    /**
+     * 瀹夊叏鍐呭姟涓夊簾澶勭悊鍒嗛〉鏌ヨ
+     * @param page
+     * @param internalWastes
+     * @return
+     */
+    IPage<InternalWastesDto> pageInternalWastes(Page page, InternalWastes internalWastes);
+
+    /**
+     * 瀹夊叏鍐呭姟涓夊簾澶勭悊鏂板
+     * @param internalWastes
+     * @return
+     */
+    boolean addInternalWastes(InternalWastesDto internalWastes);
+
+    /**
+     * 瀹夊叏鍐呭姟涓夊簾澶勭悊淇敼
+     * @param internalWastes
+     * @return
+     */
+    boolean updateInternalWastes(InternalWastesDto internalWastes);
+
+    /**
+     * 瀹夊叏鍐呭姟涓夊簾澶勭悊鍒犻櫎
+     * @param wastesId
+     * @return
+     */
+    boolean delInternalWastes(Integer wastesId);
+
+    /**
+     * 瀹夊叏鍐呭姟涓夊簾澶勭悊鏌ョ湅璇︽儏
+     * @param wastesId
+     * @return
+     */
+    InternalWastesDto getInternalWastesOne(Integer wastesId);
+
+    /**
+     * 瀵煎嚭涓夊簾澶勭悊
+     * @param wastesId
+     * @param response
+     */
+    void exportInternalWastes(Integer wastesId, HttpServletResponse response);
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/service/ProcurementSuppliesConsumablesService.java b/cnas-require/src/main/java/com/ruoyi/require/service/ProcurementSuppliesConsumablesService.java
new file mode 100644
index 0000000..ade7f0c
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/service/ProcurementSuppliesConsumablesService.java
@@ -0,0 +1,7 @@
+package com.ruoyi.require.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.require.pojo.ProcurementSuppliesConsumables;
+
+public interface ProcurementSuppliesConsumablesService extends IService<ProcurementSuppliesConsumables> {
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/service/ProcurementSuppliesContentsService.java b/cnas-require/src/main/java/com/ruoyi/require/service/ProcurementSuppliesContentsService.java
new file mode 100644
index 0000000..930c1c5
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/service/ProcurementSuppliesContentsService.java
@@ -0,0 +1,16 @@
+package com.ruoyi.require.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.require.pojo.ProcurementSuppliesContents;
+
+import java.util.List;
+import java.util.Map;
+
+public interface ProcurementSuppliesContentsService extends IService<ProcurementSuppliesContents> {
+
+    List<ProcurementSuppliesContents> directoryListing();
+
+    List<Map<String,Object>> getNodeNames();
+
+    List<Map<String,Object>> getUserList();
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/service/ProcurementSuppliesExpendsService.java b/cnas-require/src/main/java/com/ruoyi/require/service/ProcurementSuppliesExpendsService.java
new file mode 100644
index 0000000..12c852f
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/service/ProcurementSuppliesExpendsService.java
@@ -0,0 +1,22 @@
+package com.ruoyi.require.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.common.exception.ServiceException;
+import com.ruoyi.require.dto.ProcurementSuppliesExpendDto;
+import com.ruoyi.require.pojo.ProcurementSuppliesExpends;
+
+import java.util.List;
+
+/**
+ * <p>
+ *  鏈嶅姟绫�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-15 03:47:19
+ */
+public interface ProcurementSuppliesExpendsService extends IService<ProcurementSuppliesExpends> {
+    public List<ProcurementSuppliesExpendDto> selectAll(Long procurementSuppliesListId);
+    public Integer addExpends(ProcurementSuppliesExpendDto expendDto) throws ServiceException;
+    public Integer deleteExpends(Long id);
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/service/ProcurementSuppliesListService.java b/cnas-require/src/main/java/com/ruoyi/require/service/ProcurementSuppliesListService.java
new file mode 100644
index 0000000..6a0a0de
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/service/ProcurementSuppliesListService.java
@@ -0,0 +1,28 @@
+package com.ruoyi.require.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.require.dto.ProcurementSuppliesListDto;
+import com.ruoyi.require.pojo.ProcurementSuppliesList;
+
+import jakarta.servlet.http.HttpServletResponse;
+
+/**
+ * <p>
+ * 鏈嶅姟涓庝緵搴斿晢 鑰楁潗鍒楄〃 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 
+ * @since 2024-11-15 04:04:32
+ */
+public interface ProcurementSuppliesListService extends IService<ProcurementSuppliesList> {
+    IPage<ProcurementSuppliesListDto> selectList(Page page, ProcurementSuppliesListDto list);
+
+    public Integer addProcurementSuppliesList(ProcurementSuppliesListDto dto);
+
+    public Integer updateProcurementSuppliesList(ProcurementSuppliesListDto dto);
+
+    void exportProcurementSuppliesList(Integer contentsId,HttpServletResponse response);
+
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/service/ProcurementSuppliesStoreService.java b/cnas-require/src/main/java/com/ruoyi/require/service/ProcurementSuppliesStoreService.java
new file mode 100644
index 0000000..e609e25
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/service/ProcurementSuppliesStoreService.java
@@ -0,0 +1,21 @@
+package com.ruoyi.require.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.require.dto.StoreDto;
+import com.ruoyi.require.pojo.ProcurementSuppliesStore;
+
+import jakarta.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.Map;
+
+public interface ProcurementSuppliesStoreService extends IService<ProcurementSuppliesStore> {
+    void addStore(Map<String,Object> map);
+    void updateStore(Map<String,Object> map);
+
+    void deleteStore(Integer id, Integer consumablesId);
+    IPage<StoreDto> selectStoreList(Page page, StoreDto storeDto);
+
+    void exportExcel(Integer contentsId, HttpServletResponse response) throws IOException;
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/service/SupplierManagementService.java b/cnas-require/src/main/java/com/ruoyi/require/service/SupplierManagementService.java
new file mode 100644
index 0000000..798f98c
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/service/SupplierManagementService.java
@@ -0,0 +1,32 @@
+package com.ruoyi.require.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.require.pojo.SupplierManagement;
+
+import jakarta.servlet.http.HttpServletResponse;
+import java.util.List;
+
+/**
+ * <p>
+ *  鏈嶅姟绫�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-15 02:46:45
+ */
+public interface SupplierManagementService extends IService<SupplierManagement> {
+
+    List<SupplierManagement> selectSupplierManagement(SupplierManagement supplierManagement);
+
+    void exportSupplierManagement(Integer parentId, HttpServletResponse response);
+
+    IPage<SupplierManagement> selectQualifiedSupplierManagement(Page page, SupplierManagement supplierManagement);
+
+    List<SupplierManagement> selectQualifiedSupplierManagementById(Integer supplierManagementId);
+
+    List<SupplierManagement> selectSupplierManagementByParentId(Integer parentId);
+
+    List<SupplierManagement> selectSupplierManagementAll();
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/service/SuppliersDirectoryContentsService.java b/cnas-require/src/main/java/com/ruoyi/require/service/SuppliersDirectoryContentsService.java
new file mode 100644
index 0000000..b69d4ac
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/service/SuppliersDirectoryContentsService.java
@@ -0,0 +1,22 @@
+package com.ruoyi.require.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.require.pojo.SuppliersDirectoryContents;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 鏈嶅姟鍜屼緵搴斿搧閲囪喘鐩綍 鏈嶅姟绫�
+ * </p>
+ *
+ * @author
+ * @since 2024-12-17 06:14:51
+ */
+public interface SuppliersDirectoryContentsService extends IService<SuppliersDirectoryContents> {
+
+    ArrayList<SuppliersDirectoryContents> directoryListing();
+    List<Map<String, Object>> getSuppliersDirectoryContentsNodeNames();
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/service/impl/FeCalibrationScheduleServiceImpl.java b/cnas-require/src/main/java/com/ruoyi/require/service/impl/FeCalibrationScheduleServiceImpl.java
new file mode 100644
index 0000000..1b56257
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/service/impl/FeCalibrationScheduleServiceImpl.java
@@ -0,0 +1,76 @@
+package com.ruoyi.require.service.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.deepoove.poi.XWPFTemplate;
+import com.deepoove.poi.config.Configure;
+import com.ruoyi.inspect.util.HackLoopTableRenderPolicy;
+import com.ruoyi.require.mapper.FeCalibrationScheduleMapper;
+import com.ruoyi.require.pojo.FeCalibrationSchedule;
+import com.ruoyi.require.service.FeCalibrationScheduleService;
+import org.springframework.stereotype.Service;
+
+import jakarta.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-11-13 02:53:05
+ */
+@Service
+public class FeCalibrationScheduleServiceImpl extends ServiceImpl<FeCalibrationScheduleMapper, FeCalibrationSchedule> implements FeCalibrationScheduleService {
+
+    @Override
+    public IPage<FeCalibrationSchedule> page(Page page, String instrumentName, String managementNumber) {
+        IPage<FeCalibrationSchedule> ipage = this.baseMapper.ipage(page,instrumentName, managementNumber);
+        return ipage;
+    }
+
+    @Override
+    public void exportWordOfValueTraceabilityPlan(HttpServletResponse response) {
+        List<FeCalibrationSchedule> feCalibrationSchedules = this.baseMapper.selectList(null);
+
+        int size = feCalibrationSchedules.size();
+        for (int i = 0; i < size; i++) {
+            FeCalibrationSchedule feCalibrationSchedule = feCalibrationSchedules.get(i);
+            feCalibrationSchedule.setIndex(i + 1);
+        }
+
+        // 鑾峰彇璺緞
+        InputStream inputStream = this.getClass().getResourceAsStream("/static/value-traceability-plan.docx");
+        Configure configure = Configure.builder()
+                .bind("feCalibrationSchedule", new HackLoopTableRenderPolicy())
+                .build();
+        XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
+                new HashMap<String, Object>() {{
+                    put("feCalibrationSchedule", feCalibrationSchedules);
+                }}
+        );
+
+        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();
+            inputStream.close();
+            inputStream.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException("瀵煎嚭澶辫触");
+        }
+    }
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/service/impl/FeIlluminationDetectionAreaServiceImpl.java b/cnas-require/src/main/java/com/ruoyi/require/service/impl/FeIlluminationDetectionAreaServiceImpl.java
new file mode 100644
index 0000000..bca9ee3
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/service/impl/FeIlluminationDetectionAreaServiceImpl.java
@@ -0,0 +1,20 @@
+package com.ruoyi.require.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.require.mapper.FeIlluminationDetectionAreaMapper;
+import com.ruoyi.require.pojo.FeIlluminationDetectionArea;
+import com.ruoyi.require.service.FeIlluminationDetectionAreaService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 璁炬柦鍜岀幆澧冩潯浠�-璁炬柦鍜岀幆澧冩潯浠惰姹�-鐓у害璁板綍琛�-妫�娴嬪尯鍩� 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 
+ * @since 2024-11-07 04:16:28
+ */
+@Service
+public class FeIlluminationDetectionAreaServiceImpl extends ServiceImpl<FeIlluminationDetectionAreaMapper, FeIlluminationDetectionArea> implements FeIlluminationDetectionAreaService {
+
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/service/impl/FeIlluminationServiceImpl.java b/cnas-require/src/main/java/com/ruoyi/require/service/impl/FeIlluminationServiceImpl.java
new file mode 100644
index 0000000..00511b3
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/service/impl/FeIlluminationServiceImpl.java
@@ -0,0 +1,124 @@
+package com.ruoyi.require.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.ruoyi.common.utils.DateImageUtil;
+import com.ruoyi.framework.exception.ErrorException;
+import com.ruoyi.inspect.util.HackLoopTableRenderPolicy;
+import com.ruoyi.require.dto.FeIlluminationDto;
+import com.ruoyi.require.dto.FeIlluminationExportDto;
+import com.ruoyi.require.mapper.FeIlluminationDetectionAreaMapper;
+import com.ruoyi.require.mapper.FeIlluminationMapper;
+import com.ruoyi.require.pojo.FeIllumination;
+import com.ruoyi.require.pojo.FeIlluminationDetectionArea;
+import com.ruoyi.require.service.FeIlluminationService;
+import com.ruoyi.system.mapper.UserMapper;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+import jakarta.annotation.Resource;
+import jakarta.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;
+
+/**
+ * <p>
+ * 璁炬柦鍜岀幆澧冩潯浠�-璁炬柦鍜岀幆澧冩潯浠惰姹�-鐓у害璁板綍琛� 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-07 04:15:57
+ */
+@Service
+public class FeIlluminationServiceImpl extends ServiceImpl<FeIlluminationMapper, FeIllumination> implements FeIlluminationService {
+
+    @Resource
+    private FeIlluminationDetectionAreaMapper feIlluminationDetectionAreaMapper;
+    @Resource
+    private UserMapper userMapper;
+
+    @Value("${file.path}")
+    private String imgUrl;
+
+
+    @Override
+    public IPage<FeIlluminationDto> getFeLightningProtection(Page page) {
+        return baseMapper.getFeLightningProtection(page);
+    }
+
+    /**
+     * 瀵煎嚭鐓у害璁板綍
+     * @param intensityIlluminationId
+     * @param response
+     */
+    @Override
+    public void exportFeIllumination(Integer intensityIlluminationId, HttpServletResponse response) {
+        FeIlluminationExportDto illuminationExportDto = baseMapper.selectFeIllumination(intensityIlluminationId);
+        // 妫�娴嬩汉
+        String testerUrl = null;
+        if (illuminationExportDto.getTesterId() != null) {
+            testerUrl = userMapper.selectById(illuminationExportDto.getTesterId()).getSignatureUrl();
+            if (StringUtils.isBlank(testerUrl)) {
+                throw new ErrorException("鎵句笉鍒版娴嬩汉鐨勭鍚�");
+            }
+        }
+
+        // 鏍告煡浜�
+        String checkerUrl = null;
+        if (illuminationExportDto.getCheckerId() != null) {
+            checkerUrl = userMapper.selectById(illuminationExportDto.getCheckerId()).getSignatureUrl();
+            if (StringUtils.isBlank(checkerUrl)) {
+                throw new ErrorException("鎵句笉鍒版牳鏌ヤ汉鐨勭鍚�");
+            }
+        }
+
+        // 鏌ヨ璇︽儏
+        List<FeIlluminationDetectionArea> feIlluminationDetectionAreas = feIlluminationDetectionAreaMapper.selectList(Wrappers.<FeIlluminationDetectionArea>lambdaQuery()
+                .eq(FeIlluminationDetectionArea::getIntensityIlluminationId, intensityIlluminationId));
+
+        // 鑾峰彇璺緞
+        InputStream inputStream = this.getClass().getResourceAsStream("/static/illumination.docx");
+        Configure configure = Configure.builder()
+                .bind("detectionAreaList", new HackLoopTableRenderPolicy())
+                .build();
+        String finalTesterUrl = testerUrl;
+        String finalCheckerUrl = checkerUrl;
+
+        // 鍒ゆ柇妫�娴嬫棩鏈熸槸鍚︿负绌�
+        LocalDateTime finalLocalDateTime = illuminationExportDto.getTestDate() == null ? null : illuminationExportDto.getTestDate().atStartOfDay();
+        XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
+                new HashMap<String, Object>() {{
+                    put("illumination", illuminationExportDto);
+                    put("detectionAreaList", feIlluminationDetectionAreas);
+                    put("testerUrl", StringUtils.isNotBlank(finalTesterUrl) ? Pictures.ofLocal(imgUrl + "/" + finalTesterUrl).create() : null);
+                    put("checkerUrl", StringUtils.isNotBlank(finalCheckerUrl) ? Pictures.ofLocal(imgUrl + "/" + finalCheckerUrl).create() : null);
+                    put("testDateUrl", finalLocalDateTime != null ?
+                            Pictures.ofStream(DateImageUtil.createDateImage(finalLocalDateTime)).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();
+            inputStream.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException("瀵煎嚭澶辫触");
+        }
+    }
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/service/impl/FeLightningProtectionServiceImpl.java b/cnas-require/src/main/java/com/ruoyi/require/service/impl/FeLightningProtectionServiceImpl.java
new file mode 100644
index 0000000..f17fa50
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/service/impl/FeLightningProtectionServiceImpl.java
@@ -0,0 +1,27 @@
+package com.ruoyi.require.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.require.excel.FeLightningProtectionExcel;
+import com.ruoyi.require.mapper.FeLightningProtectionMapper;
+import com.ruoyi.require.pojo.FeLightningProtection;
+import com.ruoyi.require.service.FeLightningProtectionService;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 璁炬柦鍜岀幆澧冩潯浠�-璁炬柦鍜岀幆澧冩潯浠惰姹�-闃查浄妫�娴� 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-07 04:16:36
+ */
+@Service
+public class FeLightningProtectionServiceImpl extends ServiceImpl<FeLightningProtectionMapper, FeLightningProtection> implements FeLightningProtectionService {
+
+    @Override
+    public List<FeLightningProtectionExcel> exportOfLightningProtectionDetection() {
+        return baseMapper.exportOfLightningProtectionDetection();
+    }
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/service/impl/FeMeasuredQuantityServiceImpl.java b/cnas-require/src/main/java/com/ruoyi/require/service/impl/FeMeasuredQuantityServiceImpl.java
new file mode 100644
index 0000000..5c784b3
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/service/impl/FeMeasuredQuantityServiceImpl.java
@@ -0,0 +1,20 @@
+package com.ruoyi.require.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.require.mapper.FeMeasuredQuantityMapper;
+import com.ruoyi.require.pojo.FeMeasuredQuantity;
+import com.ruoyi.require.service.FeMeasuredQuantityService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 璁炬柦鍜岀幆澧冩潯浠�-璁炬柦鍜岀幆澧冩潯浠惰姹�-鐢垫簮绋冲畾鎬�-娴嬪畾閲� 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 
+ * @since 2024-11-07 04:16:44
+ */
+@Service
+public class FeMeasuredQuantityServiceImpl extends ServiceImpl<FeMeasuredQuantityMapper, FeMeasuredQuantity> implements FeMeasuredQuantityService {
+
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/service/impl/FePowerStableServiceImpl.java b/cnas-require/src/main/java/com/ruoyi/require/service/impl/FePowerStableServiceImpl.java
new file mode 100644
index 0000000..4e66a09
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/service/impl/FePowerStableServiceImpl.java
@@ -0,0 +1,124 @@
+package com.ruoyi.require.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.ruoyi.framework.exception.ErrorException;
+import com.ruoyi.inspect.util.HackLoopTableRenderPolicy;
+import com.ruoyi.require.dto.FePowerStableDto;
+import com.ruoyi.require.dto.FePowerStableExportDto;
+import com.ruoyi.require.mapper.FeMeasuredQuantityMapper;
+import com.ruoyi.require.mapper.FePowerStableMapper;
+import com.ruoyi.require.pojo.FeMeasuredQuantity;
+import com.ruoyi.require.pojo.FePowerStable;
+import com.ruoyi.require.service.FePowerStableService;
+import com.ruoyi.system.mapper.UserMapper;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletResponse;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URLEncoder;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+
+/**
+ * <p>
+ * 璁炬柦鍜岀幆澧冩潯浠�-璁炬柦鍜岀幆澧冩潯浠惰姹�-鐢垫簮绋冲畾鎬� 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-07 04:16:52
+ */
+@Service
+public class FePowerStableServiceImpl extends ServiceImpl<FePowerStableMapper, FePowerStable> implements FePowerStableService {
+
+    @Resource
+    private FeMeasuredQuantityMapper feMeasuredQuantityMapper;
+    @Resource
+    private UserMapper userMapper;
+
+    @Value("${file.path}")
+    private String imgUrl;
+
+    @Override
+    public IPage<FePowerStableDto> getLaboratoryFacilityPowerStablePage(Page page) {
+        return baseMapper.getLaboratoryFacilityPowerStablePage(page);
+    }
+
+    @Override
+    public Map<String, Objects> getCalibrationDate(Integer deviceId) {
+        return baseMapper.getCalibrationDate(deviceId);
+    }
+
+    /**
+     * 瀵煎嚭鐢垫簮绋冲畾鎬�
+     * @param powerStableId
+     * @param response
+     */
+    @Override
+    public void exportFePowerStable(Integer powerStableId, HttpServletResponse response) {
+        FePowerStableExportDto powerStable = baseMapper.selectPowerStable(powerStableId);
+
+        // 妫�娴嬩汉
+        String testerUrl = null;
+        if (powerStable.getTesterId() != null) {
+            testerUrl = userMapper.selectById(powerStable.getTesterId()).getSignatureUrl();
+            if (StringUtils.isBlank(testerUrl)) {
+                throw new ErrorException("鎵句笉鍒版娴嬩汉鐨勭鍚�");
+            }
+        }
+
+        // 鏍告煡浜�
+        String checkerUrl = null;
+        if (powerStable.getCheckerId() != null) {
+            checkerUrl = userMapper.selectById(powerStable.getCheckerId()).getSignatureUrl();
+            if (StringUtils.isBlank(checkerUrl)) {
+                throw new ErrorException("鎵句笉鍒版牳鏌ヤ汉鐨勭鍚�");
+            }
+        }
+
+        // 鏌ヨ璇︽儏
+        List<FeMeasuredQuantity> feMeasuredQuantities = feMeasuredQuantityMapper.selectList(Wrappers.<FeMeasuredQuantity>lambdaQuery()
+                .eq(FeMeasuredQuantity::getPowerStableId, powerStableId));
+
+        // 鑾峰彇璺緞
+        InputStream inputStream = this.getClass().getResourceAsStream("/static/power-stable.docx");
+        Configure configure = Configure.builder()
+                .bind("measuredQuantityList", new HackLoopTableRenderPolicy())
+                .build();
+        String finalTesterUrl = testerUrl;
+        String finalCheckerUrl = checkerUrl;
+        XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
+                new HashMap<String, Object>() {{
+                    put("stable", powerStable);
+                    put("measuredQuantityList", feMeasuredQuantities);
+                    put("testerUrl", StringUtils.isNotBlank(finalTesterUrl) ? Pictures.ofLocal(imgUrl + "/" + finalTesterUrl).create() : null);
+                    put("checkerUrl", StringUtils.isNotBlank(finalCheckerUrl) ? Pictures.ofLocal(imgUrl + "/" + finalCheckerUrl).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();
+            inputStream.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException("瀵煎嚭澶辫触");
+        }
+    }
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/service/impl/FeStandardSubstanceAcceptanceInspectionServiceImpl.java b/cnas-require/src/main/java/com/ruoyi/require/service/impl/FeStandardSubstanceAcceptanceInspectionServiceImpl.java
new file mode 100644
index 0000000..d9e90ec
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/service/impl/FeStandardSubstanceAcceptanceInspectionServiceImpl.java
@@ -0,0 +1,20 @@
+package com.ruoyi.require.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.require.mapper.FeStandardSubstanceAcceptanceInspectionMapper;
+import com.ruoyi.require.pojo.FeStandardSubstanceAcceptanceInspection;
+import com.ruoyi.require.service.FeStandardSubstanceAcceptanceInspectionService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 楠屾敹寮�绠辫褰� 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 
+ * @since 2024-11-14 03:30:09
+ */
+@Service
+public class FeStandardSubstanceAcceptanceInspectionServiceImpl extends ServiceImpl<FeStandardSubstanceAcceptanceInspectionMapper, FeStandardSubstanceAcceptanceInspection> implements FeStandardSubstanceAcceptanceInspectionService {
+
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/service/impl/FeStandardSubstanceAcceptanceServiceImpl.java b/cnas-require/src/main/java/com/ruoyi/require/service/impl/FeStandardSubstanceAcceptanceServiceImpl.java
new file mode 100644
index 0000000..edf0b99
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/service/impl/FeStandardSubstanceAcceptanceServiceImpl.java
@@ -0,0 +1,116 @@
+package com.ruoyi.require.service.impl;
+
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.ExcelWriter;
+import com.alibaba.excel.write.metadata.WriteSheet;
+import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.require.dto.AcceptanceDto;
+import com.ruoyi.require.mapper.FeStandardSubstanceAcceptanceInspectionMapper;
+import com.ruoyi.require.mapper.FeStandardSubstanceAcceptanceMapper;
+import com.ruoyi.require.mapper.FeStandardSubstanceMapper;
+import com.ruoyi.require.pojo.FeStandardSubstance;
+import com.ruoyi.require.pojo.FeStandardSubstanceAcceptance;
+import com.ruoyi.require.pojo.FeStandardSubstanceAcceptanceInspection;
+import com.ruoyi.require.service.FeStandardSubstanceAcceptanceInspectionService;
+import com.ruoyi.require.service.FeStandardSubstanceAcceptanceService;
+import com.ruoyi.require.vo.AcceptanceDetailsVo;
+import com.ruoyi.require.vo.AcceptanceVo;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import java.util.List;
+
+/**
+ * <p>
+ * 鏍囧噯鐗╄川楠屾敹 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-14 03:29:41
+ */
+@Service
+public class FeStandardSubstanceAcceptanceServiceImpl extends ServiceImpl<FeStandardSubstanceAcceptanceMapper, FeStandardSubstanceAcceptance> implements FeStandardSubstanceAcceptanceService {
+
+    @Resource
+    private FeStandardSubstanceAcceptanceInspectionMapper feStandardSubstanceAcceptanceInspectionMapper;
+    @Resource
+    private FeStandardSubstanceAcceptanceInspectionService feStandardSubstanceAcceptanceInspectionService;
+    @Resource
+    private FeStandardSubstanceMapper feStandardSubstanceMapper;
+
+
+
+    @Override
+    public void addAcceptance(AcceptanceDto dto) {
+        FeStandardSubstanceAcceptance acceptance = dto.getAcceptance();
+        this.baseMapper.insert(acceptance);
+        List<FeStandardSubstanceAcceptanceInspection> list = dto.getList();
+        if (CollectionUtils.isNotEmpty(list)) {
+            list.forEach(v -> {
+                v.setAcceptanceId(acceptance.getId());
+            });
+            feStandardSubstanceAcceptanceInspectionService.saveBatch(list);
+        }
+    }
+
+    @Override
+    public IPage<AcceptanceVo> getPageAcceptance(Page page, String name) {
+        return this.baseMapper.getPageAcceptance(page,name);
+    }
+
+    @Override
+    public AcceptanceDetailsVo getAcceptanceDetails(Integer id) {
+        FeStandardSubstanceAcceptance acceptance = this.baseMapper.selectById(id);
+        FeStandardSubstance substance = feStandardSubstanceMapper.selectById(acceptance.getSubstanceId());
+        QueryWrapper<FeStandardSubstanceAcceptanceInspection> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("acceptance_id",id);
+        List<FeStandardSubstanceAcceptanceInspection> list = feStandardSubstanceAcceptanceInspectionMapper.selectList(queryWrapper);
+        AcceptanceDetailsVo vo = new AcceptanceDetailsVo();
+        vo.setSubstance(substance);
+        vo.setAcceptance(acceptance);
+        vo.setList(list);
+        return vo;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Integer deleteAcceptance(Integer id) {
+        feStandardSubstanceAcceptanceInspectionMapper.delete(new QueryWrapper<FeStandardSubstanceAcceptanceInspection>()
+                .lambda().eq(FeStandardSubstanceAcceptanceInspection::getAcceptanceId,id));
+        return this.baseMapper.deleteById(id);
+    }
+
+    @Override
+    public void exportFeStandardSubstanceAcceptance(HttpServletResponse response) {
+        List<FeStandardSubstanceAcceptance> list = this.list();
+        response.setContentType("application/vnd.ms-excel");
+        response.setCharacterEncoding("UTF-8");
+        // 杩欓噷URLEncoder.encode鍙互闃叉涓枃涔辩爜 褰撶劧鍜宔asyexcel娌℃湁鍏崇郴
+        try {
+            String fileName = URLEncoder.encode("鏍囧噯鐗╄川楠屾敹", "UTF-8");
+            response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
+            // 鏂板缓ExcelWriter
+            ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()).build();
+            WriteSheet writeSheet = EasyExcel.writerSheet(0, "鏍囧噯鐗╄川楠屾敹").head(FeStandardSubstanceAcceptance.class).build();
+            excelWriter.write(list, writeSheet);
+            // 鍏抽棴娴�
+            excelWriter.finish();
+        } catch (UnsupportedEncodingException e) {
+            e.printStackTrace();
+            throw new RuntimeException("瀵煎嚭澶辫触");
+        } catch (IOException e) {
+            e.printStackTrace();
+            throw new RuntimeException("瀵煎嚭澶辫触");
+        }
+    }
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/service/impl/FeStandardSubstanceRecordServiceImpl.java b/cnas-require/src/main/java/com/ruoyi/require/service/impl/FeStandardSubstanceRecordServiceImpl.java
new file mode 100644
index 0000000..0fb8618
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/service/impl/FeStandardSubstanceRecordServiceImpl.java
@@ -0,0 +1,78 @@
+package com.ruoyi.require.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+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.ruoyi.framework.exception.ErrorException;
+import com.ruoyi.require.mapper.FeStandardSubstanceMapper;
+import com.ruoyi.require.mapper.FeStandardSubstanceRecordMapper;
+import com.ruoyi.require.pojo.FeStandardSubstance;
+import com.ruoyi.require.pojo.FeStandardSubstanceRecord;
+import com.ruoyi.require.service.FeStandardSubstanceRecordService;
+import com.ruoyi.require.vo.SubstanceRecordVo;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import jakarta.annotation.Resource;
+import java.util.List;
+
+/**
+ * <p>
+ * 鏍囧噯鐗╄川娓呭崟鍊熺敤褰掕繕璁板綍琛� 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-14 01:49:11
+ */
+@Transactional(rollbackFor = Exception.class)
+@Service
+public class FeStandardSubstanceRecordServiceImpl extends ServiceImpl<FeStandardSubstanceRecordMapper, FeStandardSubstanceRecord> implements FeStandardSubstanceRecordService {
+
+    @Resource
+    private FeStandardSubstanceMapper feStandardSubstanceMapper;
+
+    @Override
+    public void borrowSubstance(FeStandardSubstanceRecord feStandardSubstanceRecord) {
+        FeStandardSubstance standardSubstance = feStandardSubstanceMapper.selectOne(Wrappers.<FeStandardSubstance>lambdaQuery()
+                .eq(FeStandardSubstance::getId, feStandardSubstanceRecord.getSubstanceId())
+                .eq(FeStandardSubstance::getState, 0)
+                .last("limit 1"));
+        if (ObjectUtils.isEmpty(standardSubstance)){
+            throw new ErrorException("璇ョ墿璐ㄥ凡琚�熷嚭锛�");
+        }
+        this.baseMapper.insert(feStandardSubstanceRecord);
+        standardSubstance.setState(1);
+        feStandardSubstanceMapper.updateById(standardSubstance);
+    }
+
+    @Override
+    public void returnSubstance(FeStandardSubstanceRecord feStandardSubstanceRecord) {
+        FeStandardSubstance standardSubstance = feStandardSubstanceMapper.selectOne(Wrappers.<FeStandardSubstance>lambdaQuery()
+                .eq(FeStandardSubstance::getId, feStandardSubstanceRecord.getSubstanceId())
+                .eq(FeStandardSubstance::getState, 1));
+        if (ObjectUtils.isEmpty(standardSubstance)){
+            throw new ErrorException("璇ョ墿璐ㄦ湭琚鐢紝鏃犻渶褰掕繕锛�");
+        }
+        standardSubstance.setState(0);
+        feStandardSubstanceMapper.updateById(standardSubstance);
+        baseMapper.update(feStandardSubstanceRecord, Wrappers.<FeStandardSubstanceRecord>lambdaUpdate()
+                .eq(FeStandardSubstanceRecord::getSubstanceId, feStandardSubstanceRecord.getSubstanceId())
+                .eq(FeStandardSubstanceRecord::getStatus, 0));
+    }
+
+    @Override
+    public List<FeStandardSubstanceRecord> getSubstanceRecord(Integer id) {
+        QueryWrapper<FeStandardSubstanceRecord> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("substance_id",id);
+        List<FeStandardSubstanceRecord> list = this.baseMapper.selectList(queryWrapper);
+        return list;
+    }
+
+    @Override
+    public IPage<SubstanceRecordVo> getPage(Page page, SubstanceRecordVo vo) {
+        return this.baseMapper.getPage(page,vo);
+    }
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/service/impl/FeStandardSubstanceServiceImpl.java b/cnas-require/src/main/java/com/ruoyi/require/service/impl/FeStandardSubstanceServiceImpl.java
new file mode 100644
index 0000000..7b97938
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/service/impl/FeStandardSubstanceServiceImpl.java
@@ -0,0 +1,144 @@
+package com.ruoyi.require.service.impl;
+
+import com.alibaba.excel.EasyExcel;
+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.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.framework.exception.ErrorException;
+import com.ruoyi.require.excel.FeStandardSubstanceImport;
+import com.ruoyi.require.mapper.FeStandardSubstanceMapper;
+import com.ruoyi.require.pojo.FeStandardSubstance;
+import com.ruoyi.require.service.FeStandardSubstanceService;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.multipart.MultipartFile;
+
+import jakarta.servlet.http.HttpServletResponse;
+import java.net.URLEncoder;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Locale;
+
+/**
+ * <p>
+ * 鏍囧噯鐗╄川娓呭崟 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-13 03:58:59
+ */
+@Service
+public class FeStandardSubstanceServiceImpl extends ServiceImpl<FeStandardSubstanceMapper, FeStandardSubstance> implements FeStandardSubstanceService {
+
+    @Override
+    public IPage<FeStandardSubstance> page(Page page, FeStandardSubstance feStandardSubstance) {
+        return this.baseMapper.getPage(page,feStandardSubstance);
+    }
+
+    @Override
+    public void downloadImportTemplate(HttpServletResponse response) {
+        response.reset();
+        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
+        response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");
+        try {
+            String fileName = URLEncoder.encode("鏍囧噯鐗╄川瀵煎叆妯℃澘.xlsx", "UTF-8");
+            response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
+            EasyExcel.write(response.getOutputStream(), FeStandardSubstanceImport.class)
+                    .sheet("鏍囧噯鐗╄川瀵煎叆妯℃澘")
+                    .doWrite(Collections.emptyList());
+        } catch (Exception e) {
+            throw new RuntimeException("鏍囧噯鐗╄川瀵煎叆妯℃澘涓嬭浇澶辫触", e);
+        }
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public int importStandardSubstance(MultipartFile file) {
+        if (file == null || file.isEmpty()) {
+            throw new ErrorException("璇烽�夋嫨闇�瑕佸鍏ョ殑Excel鏂囦欢");
+        }
+        String fileName = file.getOriginalFilename();
+        if (fileName == null || !fileName.toLowerCase(Locale.ROOT).endsWith(".xlsx")) {
+            throw new ErrorException("浠呮敮鎸�.xlsx鏍煎紡鏂囦欢");
+        }
+
+        final List<FeStandardSubstanceImport> rows;
+        try {
+            rows = EasyExcel.read(file.getInputStream())
+                    .head(FeStandardSubstanceImport.class)
+                    .sheet()
+                    .doReadSync();
+        } catch (Exception e) {
+            throw new ErrorException("Excel瑙f瀽澶辫触锛岃浣跨敤涓嬭浇鐨勫鍏ユā鏉�");
+        }
+        if (CollectionUtils.isEmpty(rows)) {
+            throw new ErrorException("瀵煎叆鏂囦欢娌℃湁鏍囧噯鐗╄川鏁版嵁");
+        }
+
+        List<FeStandardSubstance> substances = new ArrayList<>();
+        for (int i = 0; i < rows.size(); i++) {
+            int rowNumber = i + 2;
+            FeStandardSubstanceImport row = rows.get(i);
+            String manageNum = required(row.getManageNum(), rowNumber, "绠$悊缂栧彿");
+
+            FeStandardSubstance substance = new FeStandardSubstance();
+            substance.setName(required(row.getName(), rowNumber, "鏍囧噯鐗╄川鍚嶇О"));
+            substance.setModel(required(row.getModel(), rowNumber, "瑙勬牸鍨嬪彿"));
+            substance.setFactoryManufacturer(required(row.getFactoryManufacturer(), rowNumber, "鐢熶骇鍘傚"));
+            substance.setFactoryNum(required(row.getFactoryNum(), rowNumber, "鍑哄巶缂栧彿"));
+            substance.setManageNum(manageNum);
+            substance.setUncertainty(required(row.getUncertainty(), rowNumber, "涓嶇‘瀹氬害"));
+            substance.setQuantity(parseQuantity(row.getQuantity(), rowNumber));
+            substance.setAcquisitionDate(parseDate(row.getAcquisitionDate(), rowNumber, "璐疆鏃ユ湡"));
+            substance.setEffectiveDate(parseDate(row.getEffectiveDate(), rowNumber, "鏈夋晥鏈�"));
+            substance.setFileNum(required(row.getFileNum(), rowNumber, "妗f缂栧彿"));
+            substance.setPosition(required(row.getPosition(), rowNumber, "瀛樻斁浣嶇疆"));
+            substance.setRemark(trim(row.getRemark()));
+            substance.setState(0);
+            substances.add(substance);
+        }
+        saveBatch(substances);
+        return substances.size();
+    }
+
+    private Long parseQuantity(String input, int rowNumber) {
+        String value = required(input, rowNumber, "鏁伴噺");
+        try {
+            long quantity = Long.parseLong(value);
+            if (quantity <= 0) {
+                throw new NumberFormatException();
+            }
+            return quantity;
+        } catch (NumberFormatException e) {
+            throw new ErrorException("绗�" + rowNumber + "琛岋細鏁伴噺蹇呴』鏄ぇ浜�0鐨勬暣鏁�");
+        }
+    }
+
+    private LocalDateTime parseDate(String input, int rowNumber, String column) {
+        String value = required(input, rowNumber, column);
+        try {
+            return LocalDate.parse(value.substring(0, Math.min(value.length(), 10)).replace('/', '-'), DateTimeFormatter.ofPattern("yyyy-M-d"))
+                    .atStartOfDay();
+        } catch (Exception e) {
+            throw new ErrorException("绗�" + rowNumber + "琛岋細" + column + "鏍煎紡搴斾负yyyy-MM-dd");
+        }
+    }
+
+    private String required(String input, int rowNumber, String column) {
+        String value = trim(input);
+        if (StringUtils.isBlank(value)) {
+            throw new ErrorException("绗�" + rowNumber + "琛岋細" + column + "涓嶈兘涓虹┖");
+        }
+        return value;
+    }
+
+    private String trim(String value) {
+        return value == null ? null : value.trim();
+    }
+}
\ No newline at end of file
diff --git a/cnas-require/src/main/java/com/ruoyi/require/service/impl/FeTempHumDateServiceImpl.java b/cnas-require/src/main/java/com/ruoyi/require/service/impl/FeTempHumDateServiceImpl.java
new file mode 100644
index 0000000..59c7b07
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/service/impl/FeTempHumDateServiceImpl.java
@@ -0,0 +1,144 @@
+package com.ruoyi.require.service.impl;
+
+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.deepoove.poi.data.Pictures;
+import com.ruoyi.common.utils.QueryWrappers;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.inspect.util.HackLoopTableRenderPolicy;
+import com.ruoyi.require.dto.FeTempHumDateDto;
+import com.ruoyi.require.dto.FeTempHumRecordDto;
+import com.ruoyi.require.mapper.FeTempHumDateMapper;
+import com.ruoyi.require.pojo.FeTempHumDate;
+import com.ruoyi.require.pojo.FeTempHumRecord;
+import com.ruoyi.require.service.FeTempHumDateService;
+import com.ruoyi.require.service.FeTempHumRecordService;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import jakarta.annotation.Resource;
+import jakarta.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;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ * 璁炬柦鍜岀幆澧冩潯浠�-璁炬柦鍜岀幆澧冩潯浠惰姹�-娓╂箍搴� 鍖哄煙 -鐖� 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-09 11:02:18
+ */
+@Service
+public class FeTempHumDateServiceImpl extends ServiceImpl<FeTempHumDateMapper, FeTempHumDate> implements FeTempHumDateService {
+
+    @Resource
+    private FeTempHumRecordService feTempHumRecordService;
+    @Value("${file.path}")
+    private String imgUrl;
+
+    @Override
+    public IPage<FeTempHumDateDto> getFeTempHumDate(Page page, FeTempHumDateDto feTempHumDateDto) {
+        return baseMapper.getFeTempHumDate(page, QueryWrappers.queryWrappers(feTempHumDateDto));
+    }
+
+    @Override
+    public void exportTemperatureAndHumidityRecords(Integer dateId, HttpServletResponse response) {
+        FeTempHumDate feTempHumDate = baseMapper.selectById(dateId);
+        // 鑾峰彇骞村害鏈堝害鏃堕棿
+        String[] month = feTempHumDate.getMonthDate().split("-");
+
+        IPage<FeTempHumRecordDto> list = feTempHumRecordService.getFeTempHumRecordPage(new Page<>(1, -1), dateId);
+        List<FeTempHumRecordDto> feTempHumRecordDtos = list.getRecords();
+        // 鎸夌収澶╂暟鍒嗙粍
+        Map<Integer, List<FeTempHumRecordDto>> groupMap = feTempHumRecordDtos.stream().peek(feTempHumRecordDto -> {
+                    feTempHumRecordDto.setMonthDay(feTempHumRecordDto.getRecordDate().getDayOfMonth());
+                })
+                .collect(Collectors.groupingBy(FeTempHumRecordDto::getMonthDay));
+
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm");
+        // 閬嶅巻31鑾峰彇31涓璞�
+        List<FeTempHumRecordDto> recordDtoList = new ArrayList<>();
+        for (int i = 1; i <= 31; i++) {
+            FeTempHumRecordDto recordDto = new FeTempHumRecordDto();
+            recordDto.setMonth(i);
+            recordDtoList.add(recordDto);
+            // 鑾峰彇褰撳墠鏈堢殑
+            List<FeTempHumRecordDto> recordDtos = groupMap.get(i);
+            if (CollectionUtils.isNotEmpty(recordDtos)) {
+                // 澶嶅埗瀵硅薄
+                BeanUtils.copyProperties(recordDtos.get(0), recordDto, "month");
+                recordDto.setMorningTestTimeStr(recordDto.getMorningTestTime() == null ? null : recordDto.getMorningTestTime().format(formatter));
+                recordDto.setAfternoonTimeStr(recordDto.getAfternoonTime() == null ? null : recordDto.getAfternoonTime().format(formatter));
+                recordDto.setMorningRecorderUrlRender(StringUtils.isNotBlank(recordDto.getMorningRecorderUrl())
+                        ? Pictures.ofLocal(imgUrl + "/" + recordDto.getMorningRecorderUrl()).create() : null);
+                recordDto.setAfternoonRecorderUrlRender(StringUtils.isNotBlank(recordDto.getAfternoonRecorderUrl())
+                        ? Pictures.ofLocal(imgUrl + "/" + recordDto.getAfternoonRecorderUrl()).create() : null);
+            }
+
+        }
+
+        // 鑾峰彇璺緞
+        InputStream inputStream = this.getClass().getResourceAsStream("/static/temp_hum_date.docx");
+        Configure configure = Configure.builder()
+                .bind("recordList", new HackLoopTableRenderPolicy())
+                .build();
+
+        HashMap<String, Object> map = new HashMap<>();
+        map.put("testAreaName", feTempHumDate.getTestAreaName());
+        map.put("experimentalYear", month[0]);
+        map.put("experimentalMonth", month[1]);
+        map.put("subjoin", feTempHumDate.getSubjoin());
+
+        XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
+                new HashMap<String, Object>() {{
+                    put("feTempHum", map);
+                    put("recordList", recordDtoList);
+                }});
+
+        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();
+            inputStream.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException("瀵煎嚭澶辫触");
+        }
+    }
+
+    /**
+     * 娓╂箍搴︾‘璁�
+     * @param feTempHumDate
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void affirmFeTempHumDate(FeTempHumDate feTempHumDate) {
+        // 娓╂箍搴︾‘璁�
+        this.update(Wrappers.<FeTempHumDate>lambdaUpdate()
+                .eq(FeTempHumDate::getDateId, feTempHumDate.getDateId())
+                .set(FeTempHumDate::getRegistrarUserId, feTempHumDate.getRegistrarUserId()));
+
+    }
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/service/impl/FeTempHumRecordServiceImpl.java b/cnas-require/src/main/java/com/ruoyi/require/service/impl/FeTempHumRecordServiceImpl.java
new file mode 100644
index 0000000..c18fdd6
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/service/impl/FeTempHumRecordServiceImpl.java
@@ -0,0 +1,75 @@
+package com.ruoyi.require.service.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.require.dto.FeTempHumRecordDto;
+import com.ruoyi.require.mapper.FeTempHumRecordMapper;
+import com.ruoyi.require.pojo.FeTempHumRecord;
+import com.ruoyi.require.service.FeTempHumRecordService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 璁炬柦鍜岀幆澧冩潯浠�-璁炬柦鍜岀幆澧冩潯浠惰姹�-娓╂箍搴﹁褰� 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-07 04:28:52
+ */
+@Service
+public class FeTempHumRecordServiceImpl extends ServiceImpl<FeTempHumRecordMapper, FeTempHumRecord> implements FeTempHumRecordService {
+
+    @Override
+    public IPage<FeTempHumRecordDto> getFeTempHumRecordPage(Page page, Integer dateId) {
+        IPage<FeTempHumRecordDto> feTempHumRecordPage = baseMapper.getFeTempHumRecordPage(page, dateId);
+        for (FeTempHumRecordDto record : feTempHumRecordPage.getRecords()) {
+            // 鍒ゆ柇鏄惁鏄棶棰樻暟鎹�
+            // 鍒ゆ柇娓╂箍搴︽槸鍚﹁秴杩囧尯闂�
+            boolean flag = false;
+            if (StringUtils.isNotBlank(record.getMorningTemp())) {
+                Double value = Double.valueOf(record.getMorningTemp());
+                if (value > record.getTemperatureHighest() || value < record.getTemperatureLowest()) {
+                    flag = true;
+                }
+            }
+            if (StringUtils.isNotBlank(record.getMorningHum())) {
+                Double value = Double.valueOf(record.getMorningHum());
+                if (value > record.getHumidityHighest() || value < record.getHumidityLowest()) {
+                    flag = true;
+                }
+            }
+            if (StringUtils.isNotBlank(record.getAfternoonTemp())) {
+                Double value = Double.valueOf(record.getAfternoonTemp());
+                if (value > record.getTemperatureHighest() || value < record.getTemperatureLowest()) {
+                    flag = true;
+                }
+            }
+            if (StringUtils.isNotBlank(record.getAfternoonHum())) {
+                Double value = Double.valueOf(record.getAfternoonHum());
+                if (value > record.getHumidityHighest() || value < record.getHumidityLowest()) {
+                    flag = true;
+                }
+            }
+
+            // 鍒ゆ柇鏄惁鏄亽娓╀簩, 鏄亽娓╀簩涓婁笅娓╁害鏄惁瓒呰繃1鎽勬皬搴�
+            if (StringUtils.isNotBlank(record.getTestAreaName()) && record.getTestAreaName().equals("鎭掓俯浜�")) {
+                if (StringUtils.isNotBlank(record.getMorningTemp()) && StringUtils.isNotBlank(record.getAfternoonTemp())) {
+                    if (Double.valueOf(record.getAfternoonTemp()) - Double.valueOf(record.getMorningTemp()) > 1) {
+                        flag = true;
+                    }
+                }
+            }
+
+            if (flag) {
+                record.setIsIssue(1);
+            } else {
+                record.setIsIssue(0);
+            }
+
+
+        }
+        return feTempHumRecordPage;
+    }
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/service/impl/ForeignRegisterServiceImpl.java b/cnas-require/src/main/java/com/ruoyi/require/service/impl/ForeignRegisterServiceImpl.java
new file mode 100644
index 0000000..b699b80
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/service/impl/ForeignRegisterServiceImpl.java
@@ -0,0 +1,102 @@
+package com.ruoyi.require.service.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+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.ruoyi.common.utils.QueryWrappers;
+import com.ruoyi.inspect.util.HackLoopTableRenderPolicy;
+import com.ruoyi.require.dto.ForeignRegisterDto;
+import com.ruoyi.require.mapper.ForeignRegisterMapper;
+import com.ruoyi.require.pojo.ForeignRegister;
+import com.ruoyi.require.service.ForeignRegisterService;
+import com.ruoyi.system.mapper.UserMapper;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+import jakarta.annotation.Resource;
+import jakarta.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-11-19 07:17:35
+ */
+@Service
+public class ForeignRegisterServiceImpl extends ServiceImpl<ForeignRegisterMapper, ForeignRegister> implements ForeignRegisterService {
+    @Resource
+    private UserMapper userMapper;
+    @Value("${file.path}")
+    private String imgUrl;
+
+    /**
+     * 澶栨潵浜哄憳鐧昏鍒嗛〉鏌ヨ
+     * @param page
+     * @param foreignRegister
+     * @return
+     */
+    @Override
+    public IPage<ForeignRegisterDto> pageForeignRegister(Page page, ForeignRegisterDto foreignRegister) {
+        String beginDate = foreignRegister.getBeginDate();
+        String endDate = foreignRegister.getEndDate();
+        foreignRegister.setBeginDate(null);
+        foreignRegister.setEndDate(null);
+        return baseMapper.pageForeignRegister(page, QueryWrappers.queryWrappers(foreignRegister), beginDate, endDate);
+    }
+
+    /**
+     * 瀵煎嚭澶栨潵浜哄憳鐧昏
+     * @param foreignRegister
+     */
+    @Override
+    public void exportForeignRegister(ForeignRegisterDto foreignRegister, HttpServletResponse response) {
+        String beginDate = foreignRegister.getBeginDate();
+        String endDate = foreignRegister.getEndDate();
+        foreignRegister.setBeginDate(null);
+        foreignRegister.setEndDate(null);
+        List<ForeignRegisterDto> register = baseMapper.getForeignRegisterList(QueryWrappers.queryWrappers(foreignRegister), beginDate, endDate);
+
+        for (ForeignRegisterDto foreignRegisterDto : register) {
+            // 娣诲姞鍗忓悓浜哄拰鎵瑰噯浜虹鍚�
+            foreignRegisterDto.setAccompanyingRender(StringUtils.isNotBlank(foreignRegisterDto.getAccompanyingUrl())
+                    ? Pictures.ofLocal(imgUrl + "/" + foreignRegisterDto.getAccompanyingUrl()).create() : null);
+            foreignRegisterDto.setApproveRender(StringUtils.isNotBlank(foreignRegisterDto.getApproveUrl())
+                    ? Pictures.ofLocal(imgUrl + "/" + foreignRegisterDto.getApproveUrl()).create() : null);
+        }
+        // 鑾峰彇璺緞
+        InputStream inputStream = this.getClass().getResourceAsStream("/static/foreign-register.docx");
+        Configure configure = Configure.builder()
+                .bind("register", new HackLoopTableRenderPolicy())
+                .build();
+        XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
+                new HashMap<String, Object>() {{
+                    put("register", register);
+                }});
+        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();
+            inputStream.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException("瀵煎嚭澶辫触");
+        }
+    }
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/service/impl/InternalWastesDetailServiceImpl.java b/cnas-require/src/main/java/com/ruoyi/require/service/impl/InternalWastesDetailServiceImpl.java
new file mode 100644
index 0000000..6c6cefa
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/service/impl/InternalWastesDetailServiceImpl.java
@@ -0,0 +1,20 @@
+package com.ruoyi.require.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.require.mapper.InternalWastesDetailMapper;
+import com.ruoyi.require.pojo.InternalWastesDetail;
+import com.ruoyi.require.service.InternalWastesDetailService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 瀹夊叏鍐呭姟涓夊簾鐧昏璇︽儏 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 
+ * @since 2024-11-19 06:39:54
+ */
+@Service
+public class InternalWastesDetailServiceImpl extends ServiceImpl<InternalWastesDetailMapper, InternalWastesDetail> implements InternalWastesDetailService {
+
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/service/impl/InternalWastesServiceImpl.java b/cnas-require/src/main/java/com/ruoyi/require/service/impl/InternalWastesServiceImpl.java
new file mode 100644
index 0000000..a4afff2
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/service/impl/InternalWastesServiceImpl.java
@@ -0,0 +1,169 @@
+package com.ruoyi.require.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.ruoyi.common.utils.QueryWrappers;
+import com.ruoyi.inspect.util.HackLoopTableRenderPolicy;
+import com.ruoyi.require.dto.InternalWastesDto;
+import com.ruoyi.require.mapper.InternalWastesMapper;
+import com.ruoyi.require.pojo.InternalWastes;
+import com.ruoyi.require.pojo.InternalWastesDetail;
+import com.ruoyi.require.service.InternalWastesDetailService;
+import com.ruoyi.require.service.InternalWastesService;
+import lombok.AllArgsConstructor;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import jakarta.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-11-19 06:39:27
+ */
+@Service
+@AllArgsConstructor
+@Transactional(rollbackFor = Exception.class)
+public class InternalWastesServiceImpl extends ServiceImpl<InternalWastesMapper, InternalWastes> implements InternalWastesService {
+
+    private InternalWastesDetailService internalWastesDetailService;
+
+    /**
+     * 瀹夊叏鍐呭姟涓夊簾鐧昏鍒嗛〉鏌ヨ
+     * @param page
+     * @param internalWastes
+     * @return
+     */
+    @Override
+    public IPage<InternalWastesDto> pageInternalWastes(Page page, InternalWastes internalWastes) {
+        return baseMapper.pageInternalWastes(page, QueryWrappers.queryWrappers(internalWastes));
+    }
+
+    /**
+     * 瀹夊叏鍐呭姟涓夊簾鐧昏鏂板
+     * @param internalWastes
+     * @return
+     */
+    @Override
+    public boolean addInternalWastes(InternalWastesDto internalWastes) {
+
+        baseMapper.insert(internalWastes);
+        // 鏂板璇︽儏
+        for (InternalWastesDetail internalWastesDetail : internalWastes.getWastesDetailList()) {
+            internalWastesDetail.setWastesId(internalWastes.getWastesId());
+        }
+        internalWastesDetailService.saveBatch(internalWastes.getWastesDetailList());
+        return true;
+    }
+
+    /**
+     * 瀹夊叏鍐呭姟涓夊簾鐧昏淇敼
+     * @param internalWastes
+     * @return
+     */
+    @Override
+    public boolean updateInternalWastes(InternalWastesDto internalWastes) {
+        baseMapper.updateById(internalWastes);
+
+        // 鍒犻櫎涔嬪墠鐨勮鎯�
+        internalWastesDetailService.remove(Wrappers.<InternalWastesDetail>lambdaQuery()
+                .eq(InternalWastesDetail::getWastesId, internalWastes.getWastesId()));
+
+        // 鏂板璇︽儏
+        for (InternalWastesDetail internalWastesDetail : internalWastes.getWastesDetailList()) {
+            internalWastesDetail.setWastesId(internalWastes.getWastesId());
+        }
+        internalWastesDetailService.saveBatch(internalWastes.getWastesDetailList());
+
+        return true;
+    }
+
+    /**
+     * 瀹夊叏鍐呭姟涓夊簾鐧昏鍒犻櫎
+     * @param WastesId
+     * @return
+     */
+    @Override
+    public boolean delInternalWastes(Integer WastesId) {
+        internalWastesDetailService.remove(Wrappers.<InternalWastesDetail>lambdaQuery()
+                .eq(InternalWastesDetail::getWastesId, WastesId));
+        baseMapper.deleteById(WastesId);
+        return true;
+    }
+
+    /**
+     * 瀹夊叏鍐呭姟涓夊簾鐧昏鏌ョ湅璇︽儏
+     * @param WastesId
+     * @return
+     */
+    @Override
+    public InternalWastesDto getInternalWastesOne(Integer WastesId) {
+        InternalWastes internalWastes = baseMapper.selectById(WastesId);
+        InternalWastesDto internalWastesDto = new InternalWastesDto();
+        BeanUtils.copyProperties(internalWastes, internalWastesDto);
+
+        // 鏌ヨ璇︾粏淇℃伅
+        internalWastesDto.setWastesDetailList(internalWastesDetailService.list(Wrappers.<InternalWastesDetail>lambdaQuery()
+                .eq(InternalWastesDetail::getWastesId, WastesId)));
+        return internalWastesDto;
+    }
+
+    /**
+     * 瀵煎嚭涓夊簾澶勭悊
+     * @param wastesId
+     * @param response
+     */
+    @Override
+    public void exportInternalWastes(Integer wastesId, HttpServletResponse response) {
+        InternalWastes internalWastes = baseMapper.selectById(wastesId);
+
+        List<InternalWastesDetail> wastesDetailList = internalWastesDetailService.list(Wrappers.<InternalWastesDetail>lambdaQuery()
+                .eq(InternalWastesDetail::getWastesId, wastesId));
+
+        int index = 1;
+        for (InternalWastesDetail detail : wastesDetailList) {
+            detail.setIndex(index);
+            index++;
+        }
+        // 鑾峰彇璺緞
+        InputStream inputStream = this.getClass().getResourceAsStream("/static/internal-wastes.docx");
+        Configure configure = Configure.builder()
+                .bind("wastesDetailList", new HackLoopTableRenderPolicy())
+                .build();
+        XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
+                new HashMap<String, Object>() {{
+                    put("remark", internalWastes.getRemark());
+                    put("wastesDetailList", wastesDetailList);
+                }});
+
+        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();
+            inputStream.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException("瀵煎嚭澶辫触");
+        }
+
+    }
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/service/impl/ProcurementSuppliesConsumablesServiceImpl.java b/cnas-require/src/main/java/com/ruoyi/require/service/impl/ProcurementSuppliesConsumablesServiceImpl.java
new file mode 100644
index 0000000..deeb125
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/service/impl/ProcurementSuppliesConsumablesServiceImpl.java
@@ -0,0 +1,14 @@
+package com.ruoyi.require.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.require.mapper.ProcurementSuppliesConsumablesMapper;
+import com.ruoyi.require.pojo.ProcurementSuppliesConsumables;
+import com.ruoyi.require.service.ProcurementSuppliesConsumablesService;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+
+@Service
+@AllArgsConstructor
+public class ProcurementSuppliesConsumablesServiceImpl extends ServiceImpl<ProcurementSuppliesConsumablesMapper, ProcurementSuppliesConsumables>
+        implements ProcurementSuppliesConsumablesService {
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/service/impl/ProcurementSuppliesContentsServiceImpl.java b/cnas-require/src/main/java/com/ruoyi/require/service/impl/ProcurementSuppliesContentsServiceImpl.java
new file mode 100644
index 0000000..634d4c7
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/service/impl/ProcurementSuppliesContentsServiceImpl.java
@@ -0,0 +1,91 @@
+package com.ruoyi.require.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.common.core.domain.entity.User;
+import com.ruoyi.require.mapper.ProcurementSuppliesContentsMapper;
+import com.ruoyi.require.pojo.ProcurementSuppliesContents;
+import com.ruoyi.require.service.ProcurementSuppliesContentsService;
+import com.ruoyi.system.mapper.UserMapper;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+@Service
+@AllArgsConstructor
+public class ProcurementSuppliesContentsServiceImpl extends ServiceImpl<ProcurementSuppliesContentsMapper, ProcurementSuppliesContents>
+        implements ProcurementSuppliesContentsService {
+
+    private UserMapper userMapper;
+
+    @Override
+    public List<ProcurementSuppliesContents> directoryListing() {
+        ArrayList<ProcurementSuppliesContents> list = new ArrayList<>();
+        // 鏌ュ嚭涓�绾х洰褰�
+        List<ProcurementSuppliesContents> firstLevel = baseMapper.selectList(new LambdaQueryWrapper<ProcurementSuppliesContents>()
+                .isNull(ProcurementSuppliesContents::getParentId));
+
+        // 鏌ュ嚭鍚湁鐖惰妭鐐圭殑 骞堕�氳繃鐖惰妭鐐瑰垎缁�
+        List<ProcurementSuppliesContents> seconds = baseMapper.selectList(new LambdaQueryWrapper<ProcurementSuppliesContents>()
+                .isNotNull(ProcurementSuppliesContents::getParentId));
+        if(firstLevel.size() > 0){
+            Map<Integer, List<ProcurementSuppliesContents>> collect = seconds.stream()
+                    .collect(Collectors.groupingBy(ProcurementSuppliesContents::getParentId));
+            // 鏍规嵁鍒嗙粍鐨刱ey 璧嬪�煎搴旂殑children
+            for (int i = 0; i < firstLevel.size(); i++) {
+                recursion(firstLevel.get(i),collect);
+                list.add(firstLevel.get(i));
+            }
+        }
+        return list;
+    }
+
+    // 閫掑綊璧嬪�糲hildren
+    public ProcurementSuppliesContents recursion(ProcurementSuppliesContents firstLevel, Map<Integer, List<ProcurementSuppliesContents>> collect) {
+        // 灏嗙埗鑺傜偣鐨刢hildren璧嬪��
+        if(collect.containsKey(firstLevel.getId())) {
+            List<ProcurementSuppliesContents> procurementSupplies = collect.get(firstLevel.getId());
+            firstLevel.setChildren(procurementSupplies);
+            for (int i = 0; i < procurementSupplies.size(); i++) {
+                recursion(procurementSupplies.get(i),collect);
+            }
+        }
+        return firstLevel;
+    }
+
+    @Override
+    public List<Map<String, Object>> getNodeNames() {
+        List<ProcurementSuppliesContents> procurementSuppliesContents = baseMapper.selectList(null);
+        List<Map<String, Object>> collect = new ArrayList<>();
+        if(procurementSuppliesContents.size() > 0) {
+            collect = procurementSuppliesContents.stream().map(item -> {
+                HashMap<String, Object> map = new HashMap<>();
+                map.put("id", item.getId());
+                map.put("nodeName", item.getNodeName());
+                return map;
+            }).collect(Collectors.toList());
+        }
+        return collect;
+    }
+
+    @Override
+    public List<Map<String, Object>> getUserList() {
+        // 1 鍋滅敤
+        List<User> users = userMapper.selectList(new LambdaQueryWrapper<User>().eq(User::getStatus, 0));
+        List<Map<String, Object>> collect = new ArrayList<>();
+        if(users.size() > 0) {
+            collect = users.stream().map(item -> {
+                HashMap<String, Object> map = new HashMap<>();
+                map.put("id", item.getId());
+                map.put("nodeName", item.getName());
+                return map;
+            }).collect(Collectors.toList());
+        }
+        return collect;
+    }
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/service/impl/ProcurementSuppliesExpendsServiceImpl.java b/cnas-require/src/main/java/com/ruoyi/require/service/impl/ProcurementSuppliesExpendsServiceImpl.java
new file mode 100644
index 0000000..2f8a263
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/service/impl/ProcurementSuppliesExpendsServiceImpl.java
@@ -0,0 +1,90 @@
+package com.ruoyi.require.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.common.core.domain.entity.User;
+import com.ruoyi.common.exception.ServiceException;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.require.dto.ProcurementSuppliesExpendDto;
+import com.ruoyi.require.mapper.ProcurementSuppliesExpendsMapper;
+import com.ruoyi.require.mapper.ProcurementSuppliesListMapper;
+import com.ruoyi.require.pojo.ProcurementSuppliesExpends;
+import com.ruoyi.require.pojo.ProcurementSuppliesList;
+import com.ruoyi.require.service.ProcurementSuppliesExpendsService;
+import com.ruoyi.system.mapper.UserMapper;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ *  鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-15 03:47:19
+ */
+@Service
+public class ProcurementSuppliesExpendsServiceImpl extends ServiceImpl<ProcurementSuppliesExpendsMapper, ProcurementSuppliesExpends> implements ProcurementSuppliesExpendsService {
+    @Autowired
+    private ProcurementSuppliesExpendsMapper expendsMapper;
+
+    @Autowired
+    private UserMapper userMapper;
+
+    @Autowired
+    private ProcurementSuppliesListMapper listMapper;
+
+    @Override
+    public List<ProcurementSuppliesExpendDto> selectAll(Long procurementSuppliesListId) {
+        List<ProcurementSuppliesExpendDto> res = new ArrayList<>();
+        List<ProcurementSuppliesExpends> list =  expendsMapper.selectList(new QueryWrapper<ProcurementSuppliesExpends>().lambda().eq(ProcurementSuppliesExpends::getListId, procurementSuppliesListId));
+        for (ProcurementSuppliesExpends procurementSuppliesExpend : list) {
+            ProcurementSuppliesExpendDto dto = new ProcurementSuppliesExpendDto();
+            BeanUtils.copyProperties(procurementSuppliesExpend, dto);
+
+            User enterUser = userMapper.selectById(procurementSuppliesExpend.getEnterUserId());
+            User updateUser = userMapper.selectById(procurementSuppliesExpend.getUpdateUserId());
+            dto.setEnterUserName(enterUser.getName());
+            dto.setUpdateUserName(updateUser.getName());
+            res.add(dto);
+        }
+
+        return res;
+    }
+
+    @Override
+    @Transactional
+    public Integer addExpends(ProcurementSuppliesExpendDto expendDto) throws ServiceException {
+        ProcurementSuppliesList list = listMapper.selectProcurementSuppliesListForUpdate(expendDto.getListId());
+
+        ProcurementSuppliesExpends expends = new ProcurementSuppliesExpends();
+        BeanUtils.copyProperties(expendDto, expends);
+        expends.setEnterUserId(SecurityUtils.getUserId().intValue());
+        expends.setUpdateUserId(SecurityUtils.getUserId().intValue());
+        if (list.getCurrentAmount() < expendDto.getAmount()) {
+            return 0;
+        }
+
+        list.setCurrentAmount(list.getCurrentAmount() - expendDto.getAmount());
+
+        listMapper.updateById(list);
+        return expendsMapper.insert(expends);
+    }
+
+    @Override
+    @Transactional
+    public Integer deleteExpends(Long id) {
+        ProcurementSuppliesExpends expend = expendsMapper.selectById(id);
+        ProcurementSuppliesList list = listMapper.selectProcurementSuppliesListForUpdate(expend.getListId());
+        list.setCurrentAmount(list.getCurrentAmount() + expend.getAmount());
+        list.setUpdateUser(SecurityUtils.getUserId().intValue());
+        listMapper.updateById(list);
+        return expendsMapper.deleteById(id);
+    }
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/service/impl/ProcurementSuppliesListServiceImpl.java b/cnas-require/src/main/java/com/ruoyi/require/service/impl/ProcurementSuppliesListServiceImpl.java
new file mode 100644
index 0000000..3447ef0
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/service/impl/ProcurementSuppliesListServiceImpl.java
@@ -0,0 +1,130 @@
+package com.ruoyi.require.service.impl;
+
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.ExcelWriter;
+import com.alibaba.excel.write.metadata.WriteSheet;
+import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
+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.ruoyi.common.core.domain.entity.User;
+import com.ruoyi.inspect.dto.ProcurementSuppliesListEDto;
+import com.ruoyi.require.dto.ProcurementSuppliesListDto;
+import com.ruoyi.require.mapper.ProcurementSuppliesListMapper;
+import com.ruoyi.require.mapper.SupplierManagementMapper;
+import com.ruoyi.require.pojo.ProcurementSuppliesList;
+import com.ruoyi.require.pojo.SupplierManagement;
+import com.ruoyi.require.service.ProcurementSuppliesListService;
+import com.ruoyi.system.mapper.UserMapper;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import jakarta.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * <p>
+ * 鏈嶅姟涓庝緵搴斿晢 鑰楁潗鍒楄〃 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-15 04:04:32
+ */
+@Service
+public class ProcurementSuppliesListServiceImpl extends ServiceImpl<ProcurementSuppliesListMapper, ProcurementSuppliesList> implements ProcurementSuppliesListService {
+    @Autowired
+    private UserMapper userMapper;
+
+    @Autowired
+    private SupplierManagementMapper supplierManagementMapper;
+
+    @Autowired
+    private ProcurementSuppliesListMapper procurementSuppliesListMapper;
+
+    @Override
+    public IPage<ProcurementSuppliesListDto> selectList(Page page, ProcurementSuppliesListDto list) {
+        IPage<ProcurementSuppliesList> iPage = baseMapper.selectProcurementSuppliesList(page, list);
+        IPage<ProcurementSuppliesListDto> result = new Page<>();
+        List<ProcurementSuppliesListDto> dtos = new ArrayList<>();
+        BeanUtils.copyProperties(iPage, result);
+        for (int i = 0; i < iPage.getRecords().size(); i++) {
+            ProcurementSuppliesList record = iPage.getRecords().get(i);
+            ProcurementSuppliesListDto dto = new ProcurementSuppliesListDto();
+            BeanUtils.copyProperties(record, dto);
+            if (record.getPersonInCharge() != 0) {
+                User user = userMapper.selectById(record.getPersonInCharge());
+                dto.setPersonInChargeName(user.getName());
+            }
+            if (record.getUpdateUser() != 0) {
+                User updateUser = userMapper.selectById(record.getUpdateUser());
+                dto.setUpdateUserName(updateUser.getName());
+            }
+
+            if (record.getSupplier() != 0) {
+                SupplierManagement supplierManagement = supplierManagementMapper.selectById(record.getSupplier());
+                dto.setSupplierName(supplierManagement.getSupplierName());
+            }
+
+            dtos.add(dto);
+        }
+        result.setRecords(dtos);
+
+        return result;
+    }
+
+    @Override
+    public Integer addProcurementSuppliesList(ProcurementSuppliesListDto dto) {
+        ProcurementSuppliesList list = new ProcurementSuppliesList();
+        BeanUtils.copyProperties(dto, list);
+        return baseMapper.insert(list);
+    }
+
+    @Override
+    public Integer updateProcurementSuppliesList(ProcurementSuppliesListDto dto) {
+        ProcurementSuppliesList list = new ProcurementSuppliesList();
+        BeanUtils.copyProperties(dto, list);
+        return baseMapper.updateById(list);
+    }
+
+    @Override
+    public void exportProcurementSuppliesList(Integer contentsId,HttpServletResponse response) {
+//        List<ProcurementSuppliesList> data = this.list(new QueryWrapper<ProcurementSuppliesList>().lambda()
+//                .select(ProcurementSuppliesList::getId
+//                        , ProcurementSuppliesList::getUnit
+//                        , ProcurementSuppliesList::getLowerLimit
+//                        , ProcurementSuppliesList::getConsumablesType
+//                        , ProcurementSuppliesList::getItemNumber
+//                        , ProcurementSuppliesList::getConsumablesName
+//                        , ProcurementSuppliesList::getSpecifications
+//                        , ProcurementSuppliesList::getCurrentAmount
+//                        , ProcurementSuppliesList::getRemark).eq(ProcurementSuppliesList::getContentsId, contentsId));
+        List<ProcurementSuppliesList> data = procurementSuppliesListMapper.selectProcurementSuppliesListByContentsId(contentsId);
+        if (data.size()==0) {
+            throw new RuntimeException("鏃犳暟鎹�");
+        }
+        response.setContentType("application/vnd.ms-excel");
+        response.setCharacterEncoding("UTF-8");
+        // 杩欓噷URLEncoder.encode鍙互闃叉涓枃涔辩爜 褰撶劧鍜宔asyexcel娌℃湁鍏崇郴
+        try {
+            String fileName = URLEncoder.encode("鑰楁潗鍒楄〃", "UTF-8");
+            response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
+            // 鏂板缓ExcelWriter
+            ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()).build();
+            WriteSheet writeSheet = EasyExcel.writerSheet(0, "鑰楁潗鍒楄〃").head(ProcurementSuppliesListEDto.class).build();
+            excelWriter.write(data, writeSheet);
+            // 鍏抽棴娴�
+            excelWriter.finish();
+        } catch (UnsupportedEncodingException e) {
+            e.printStackTrace();
+            throw new RuntimeException("瀵煎嚭澶辫触");
+        } catch (IOException e) {
+            e.printStackTrace();
+            throw new RuntimeException("瀵煎嚭澶辫触");
+        }
+    }
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/service/impl/ProcurementSuppliesStoreServiceImpl.java b/cnas-require/src/main/java/com/ruoyi/require/service/impl/ProcurementSuppliesStoreServiceImpl.java
new file mode 100644
index 0000000..65fecad
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/service/impl/ProcurementSuppliesStoreServiceImpl.java
@@ -0,0 +1,124 @@
+package com.ruoyi.require.service.impl;
+
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.ExcelWriter;
+import com.alibaba.excel.write.metadata.WriteSheet;
+import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
+import com.alibaba.fastjson2.JSON;
+import com.alibaba.fastjson2.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.common.utils.QueryWrappers;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.require.dto.StoreDto;
+import com.ruoyi.require.excel.StoreExcel;
+import com.ruoyi.require.mapper.ProcurementSuppliesConsumablesMapper;
+import com.ruoyi.require.mapper.ProcurementSuppliesStoreMapper;
+import com.ruoyi.require.pojo.ProcurementSuppliesConsumables;
+import com.ruoyi.require.pojo.ProcurementSuppliesStore;
+import com.ruoyi.require.service.ProcurementSuppliesStoreService;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import jakarta.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+
+@Service
+@AllArgsConstructor
+public class ProcurementSuppliesStoreServiceImpl extends ServiceImpl<ProcurementSuppliesStoreMapper, ProcurementSuppliesStore>
+        implements ProcurementSuppliesStoreService {
+
+    private ProcurementSuppliesConsumablesMapper consumablesMapper;
+
+
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void addStore(Map<String,Object> map) {
+        ProcurementSuppliesStore procurementSuppliesStore = JSONObject.parseObject(JSONObject.toJSONString(map.get("store")), ProcurementSuppliesStore.class);
+        procurementSuppliesStore.setRegistrant(SecurityUtils.getUserId().intValue());
+        procurementSuppliesStore.setRegistrantTime(LocalDate.now());
+        baseMapper.insert(procurementSuppliesStore);
+        List<ProcurementSuppliesConsumables> list = JSON.parseArray(JSONObject.toJSONString(map.get("consumables")), ProcurementSuppliesConsumables.class);
+        // 鐢熸垚璐у彿
+        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyyMMdd");
+        if(!Objects.isNull(list) && list.size() > 0) {
+            for (int i = 0; i < list.size(); i++) {
+                list.get(i).setStoreId(procurementSuppliesStore.getId());
+                String itemNumber ="HCRK" + LocalDate.now().format(dateTimeFormatter) +  String.format("%03d", i);
+                list.get(i).setItemNumber(itemNumber);
+                consumablesMapper.insert(list.get(i));
+            }
+        }
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void updateStore(Map<String,Object> map) {
+        ProcurementSuppliesStore procurementSuppliesStore = JSONObject.parseObject(JSONObject.toJSONString(map.get("store")), ProcurementSuppliesStore.class);
+        baseMapper.updateById(procurementSuppliesStore);
+        List<ProcurementSuppliesConsumables> list = JSON.parseArray(JSONObject.toJSONString(map.get("consumables")), ProcurementSuppliesConsumables.class);
+        consumablesMapper.delete(new LambdaQueryWrapper<ProcurementSuppliesConsumables>()
+                .eq(ProcurementSuppliesConsumables::getStoreId, procurementSuppliesStore.getId()));
+        if(!Objects.isNull(list) && list.size() > 0) {
+            for (int i = 0; i < list.size(); i++) {
+                list.get(i).setId(null);
+                list.get(i).setStoreId(procurementSuppliesStore.getId());
+                consumablesMapper.insert(list.get(i));
+            }
+        }
+    }
+
+    @Override
+    public void deleteStore(Integer id, Integer consumablesId) {
+        consumablesMapper.deleteById(consumablesId);
+        List<ProcurementSuppliesConsumables> consumables = consumablesMapper.selectList(new LambdaQueryWrapper<ProcurementSuppliesConsumables>()
+                .eq(ProcurementSuppliesConsumables::getStoreId, id));
+        // 鍒ゆ柇鏄惁杩樻湁鑰楁潗 娌℃湁灏卞皢涓昏〃Store鍒犻櫎
+        if(CollectionUtils.isEmpty(consumables)) {
+            baseMapper.deleteById(id);
+        }
+    }
+
+    @Override
+    public  IPage<StoreDto> selectStoreList(Page page, StoreDto storeDto) {
+        IPage<StoreDto> iPage = baseMapper.selectStoreList(page, QueryWrappers.queryWrappers(storeDto));
+        return iPage;
+    }
+
+    /**
+     * 瀵煎嚭excel
+     * @param contentsId
+     * @param response
+     */
+    @Override
+    public void exportExcel(Integer contentsId, HttpServletResponse response) throws IOException {
+        List<StoreExcel> storeExcels = baseMapper.exportExcel(contentsId);
+        response.setContentType("application/vnd.ms-excel");
+        response.setCharacterEncoding("UTF-8");
+        // 杩欓噷URLEncoder.encode鍙互闃叉涓枃涔辩爜 褰撶劧鍜宔asyexcel娌℃湁鍏崇郴
+        String fileName = null;
+        try {
+            fileName = URLEncoder.encode("鑰楁潗鍏ュ簱", "UTF-8");
+        } catch (UnsupportedEncodingException e) {
+            throw new RuntimeException(e);
+        }
+        response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
+        ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()).build();
+        WriteSheet writeSheet = EasyExcel.writerSheet(0, "鑰楁潗鍏ュ簱").head(StoreExcel.class).build();
+        excelWriter.write(storeExcels, writeSheet);
+        excelWriter.finish();
+    }
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/service/impl/SupplierManagementServiceImpl.java b/cnas-require/src/main/java/com/ruoyi/require/service/impl/SupplierManagementServiceImpl.java
new file mode 100644
index 0000000..2c8e5ee
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/service/impl/SupplierManagementServiceImpl.java
@@ -0,0 +1,91 @@
+package com.ruoyi.require.service.impl;
+
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.ExcelWriter;
+import com.alibaba.excel.write.metadata.WriteSheet;
+import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+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.ruoyi.common.utils.QueryWrappers;
+import com.ruoyi.require.dto.SupplierManagementDto;
+import com.ruoyi.require.mapper.SupplierManagementMapper;
+import com.ruoyi.require.pojo.SupplierManagement;
+import com.ruoyi.require.service.SupplierManagementService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import jakarta.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import java.util.List;
+
+/**
+ * <p>
+ * 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author
+ * @since 2024-11-15 02:46:45
+ */
+@Service
+public class SupplierManagementServiceImpl extends ServiceImpl<SupplierManagementMapper, SupplierManagement> implements SupplierManagementService {
+
+    @Autowired
+    private SupplierManagementMapper supplierManagementMapper;
+
+    public SupplierManagementServiceImpl(SupplierManagementMapper supplierManagementMapper) {
+        this.supplierManagementMapper = supplierManagementMapper;
+    }
+
+    @Override
+    public List<SupplierManagement> selectSupplierManagement(SupplierManagement supplierManagement) {
+        return this.list();
+    }
+
+    @Override
+    public void exportSupplierManagement(Integer parentId, HttpServletResponse response) {
+        List<SupplierManagement> data = supplierManagementMapper.selectSupplierManagementAll(parentId);
+        response.setContentType("application/vnd.ms-excel");
+        response.setCharacterEncoding("UTF-8");
+        // 杩欓噷URLEncoder.encode鍙互闃叉涓枃涔辩爜 褰撶劧鍜宔asyexcel娌℃湁鍏崇郴
+        try {
+            String fileName = URLEncoder.encode("渚涘簲鍟嗙鐞�", "UTF-8");
+            response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
+            // 鏂板缓ExcelWriter
+            ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()).build();
+            WriteSheet writeSheet = EasyExcel.writerSheet(0, "渚涘簲鍟嗙鐞�").head(SupplierManagementDto.class).build();
+            excelWriter.write(data, writeSheet);
+            // 鍏抽棴娴�
+            excelWriter.finish();
+        } catch (UnsupportedEncodingException e) {
+            e.printStackTrace();
+            throw new RuntimeException("瀵煎嚭澶辫触");
+        } catch (IOException e) {
+            e.printStackTrace();
+            throw new RuntimeException("瀵煎嚭澶辫触");
+        }
+    }
+
+    @Override
+    public IPage<SupplierManagement> selectQualifiedSupplierManagement(Page page, SupplierManagement supplierManagement) {
+        return baseMapper.selectQualifiedSupplierManagement(page, QueryWrappers.queryWrappers(supplierManagement));
+    }
+
+    @Override
+    public List<SupplierManagement> selectQualifiedSupplierManagementById(Integer supplierManagementId) {
+        return this.list(new QueryWrapper<SupplierManagement>().lambda().eq(SupplierManagement::getSupplierManagementId , supplierManagementId));
+    }
+
+    @Override
+    public List<SupplierManagement> selectSupplierManagementByParentId(Integer parentId) {
+        return supplierManagementMapper.selectSupplierManagement(parentId);
+    }
+
+    @Override
+    public List<SupplierManagement> selectSupplierManagementAll() {
+        return supplierManagementMapper.selectList(null);
+    }
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/service/impl/SuppliersDirectoryContentsServiceImpl.java b/cnas-require/src/main/java/com/ruoyi/require/service/impl/SuppliersDirectoryContentsServiceImpl.java
new file mode 100644
index 0000000..8e7a7f1
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/service/impl/SuppliersDirectoryContentsServiceImpl.java
@@ -0,0 +1,76 @@
+package com.ruoyi.require.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.require.mapper.SuppliersDirectoryContentsMapper;
+import com.ruoyi.require.pojo.SuppliersDirectoryContents;
+import com.ruoyi.require.service.SuppliersDirectoryContentsService;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ * 鏈嶅姟鍜屼緵搴斿搧閲囪喘鐩綍 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author
+ * @since 2024-12-17 06:14:51
+ */
+@Service
+public class SuppliersDirectoryContentsServiceImpl extends ServiceImpl<SuppliersDirectoryContentsMapper, SuppliersDirectoryContents> implements SuppliersDirectoryContentsService {
+
+    @Override
+    public ArrayList<SuppliersDirectoryContents> directoryListing() {
+        ArrayList<SuppliersDirectoryContents> list = new ArrayList<>();
+        // 鏌ュ嚭涓�绾х洰褰�
+        List<SuppliersDirectoryContents> firstLevel = baseMapper.selectList(new LambdaQueryWrapper<SuppliersDirectoryContents>()
+                .isNull(SuppliersDirectoryContents::getParentId));
+
+        // 鏌ュ嚭鍚湁鐖惰妭鐐圭殑 骞堕�氳繃鐖惰妭鐐瑰垎缁�
+        List<SuppliersDirectoryContents> seconds = baseMapper.selectList(new LambdaQueryWrapper<SuppliersDirectoryContents>()
+                .isNotNull(SuppliersDirectoryContents::getParentId));
+        if(firstLevel.size() > 0){
+            Map<Integer, List<SuppliersDirectoryContents>> collect = seconds.stream()
+                    .collect(Collectors.groupingBy(SuppliersDirectoryContents::getParentId));
+            // 鏍规嵁鍒嗙粍鐨刱ey 璧嬪�煎搴旂殑children
+            for (int i = 0; i < firstLevel.size(); i++) {
+                recursion(firstLevel.get(i),collect);
+                list.add(firstLevel.get(i));
+            }
+        }
+        return list;
+    }
+
+    @Override
+    public List<Map<String, Object>> getSuppliersDirectoryContentsNodeNames() {
+        List<SuppliersDirectoryContents> procurementSuppliesContents = baseMapper.selectList(null);
+        List<Map<String, Object>> collect = new ArrayList<>();
+        if(procurementSuppliesContents.size() > 0) {
+            collect = procurementSuppliesContents.stream().map(item -> {
+                HashMap<String, Object> map = new HashMap<>();
+                map.put("id", item.getId());
+                map.put("nodeName", item.getNodeName());
+                return map;
+            }).collect(Collectors.toList());
+        }
+        return collect;
+    }
+
+
+    public SuppliersDirectoryContents recursion(SuppliersDirectoryContents firstLevel, Map<Integer, List<SuppliersDirectoryContents>> collect) {
+        // 灏嗙埗鑺傜偣鐨刢hildren璧嬪��
+        if(collect.containsKey(firstLevel.getId())) {
+            List<SuppliersDirectoryContents> procurementSupplies = collect.get(firstLevel.getId());
+            firstLevel.setChildren(procurementSupplies);
+            for (int i = 0; i < procurementSupplies.size(); i++) {
+                recursion(procurementSupplies.get(i),collect);
+            }
+        }
+        return firstLevel;
+    }
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/task/FeTempHumDateSchedule.java b/cnas-require/src/main/java/com/ruoyi/require/task/FeTempHumDateSchedule.java
new file mode 100644
index 0000000..80df6f6
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/task/FeTempHumDateSchedule.java
@@ -0,0 +1,387 @@
+package com.ruoyi.require.task;
+
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.ruoyi.common.core.domain.entity.User;
+import com.ruoyi.common.utils.WxCpUtils;
+import com.ruoyi.require.dto.FeTempHumRecordDto;
+import com.ruoyi.require.mapper.CollectLaboratoryMapper;
+import com.ruoyi.require.mapper.CollectTemperatureHumidityMapper;
+import com.ruoyi.require.mapper.FeTempHumDateMapper;
+import com.ruoyi.require.mapper.FeTempHumRecordMapper;
+import com.ruoyi.require.pojo.CollectLaboratory;
+import com.ruoyi.require.pojo.CollectTemperatureHumidity;
+import com.ruoyi.require.pojo.FeTempHumDate;
+import com.ruoyi.require.pojo.FeTempHumRecord;
+import com.ruoyi.system.mapper.UserMapper;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+import org.springframework.stereotype.Component;
+
+import jakarta.annotation.Resource;
+import java.lang.reflect.Field;
+import java.text.SimpleDateFormat;
+import java.time.LocalDate;
+import java.time.LocalTime;
+import java.time.format.DateTimeFormatter;
+import java.util.Calendar;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * Author: yuan
+ * Date: 2024-12-19 鏄熸湡鍥� 8:33:56
+ * Description:
+ */
+@Component
+public class FeTempHumDateSchedule {
+
+    @Autowired
+    private CollectLaboratoryMapper collectLaboratoryMapper;
+    @Autowired
+    private FeTempHumDateMapper feTempHumDateMapper;
+    @Autowired
+    private CollectTemperatureHumidityMapper collectTemperatureHumidityMapper;
+    @Autowired
+    private FeTempHumRecordMapper feTempHumRecordMapper;
+    @Autowired
+    private ThreadPoolTaskExecutor threadPoolTaskExecutor;
+    @Resource
+    private UserMapper userMapper;
+
+    // 鑾峰彇褰撳墠骞翠唤鍜屾湀浠� 濡傦細2024-11
+    private final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
+    private String formattedDate = sdf.format(Calendar.getInstance().getTime());
+
+    /**
+     * 妫�鏌ュ疄楠屽鏄惁鏈変换鍔�
+     */
+    public synchronized void checkLaboratoriesSchedule() {
+        // 鑾峰彇褰撳墠骞翠唤鍜屾湀浠� 濡傦細2024-11
+        formattedDate = sdf.format(Calendar.getInstance().getTime());
+        // 鏌ヨ鎵�鏈夌殑瀹為獙瀹�
+        List<CollectLaboratory> collectLaboratories = collectLaboratoryMapper.selectList(null);
+        // 閬嶅巻瀹為獙瀹わ紝鍒ゆ柇浠诲姟鍒楄〃涓槸鍚﹀瓨璇ュ疄楠屽鐨勪换鍔�
+        for (CollectLaboratory collectLaboratory : collectLaboratories) {
+            // 鏌ヨ鏁版嵁搴撲腑鏄惁瀛樺湪璇ュ疄楠屽鐨勪换鍔�
+            int count = feTempHumDateMapper.selectFeTempHumDateIncludeFormattedDate(collectLaboratory.getLaboratory(), formattedDate);
+            // 鏌ヨ缁撴灉涓�0锛岃鏄庢暟鎹簱涓笉瀛樺湪璇ュ疄楠屽鐨勪换鍔★紝闇�瑕佹柊澧�
+            if (count == 0) {
+                FeTempHumDate feTempHumDate = new FeTempHumDate();
+                feTempHumDate.setMonthDate(formattedDate);
+                feTempHumDate.setTestAreaName(collectLaboratory.getLaboratory());
+                if (collectLaboratory.getLaboratory().equals("鎭掓俯浜�")) {
+                    feTempHumDate.setSubjoin("娉�: 璇ュ疄楠屽鐜鏉′欢娓╁害娉㈠姩涓嶅ぇ浜幝�1鈩冭姹�");
+                }
+                feTempHumDateMapper.insert(feTempHumDate);
+            }
+        }
+    }
+
+    /**
+     * 姣忓ぉ9鐐规墽琛屼竴娆� 闄や簡鏄熸湡澶�
+     * 鑾峰彇娓╁害婀垮害
+     */
+//    @Scheduled(cron = "0/5 * * * * *")
+    @Scheduled(cron = "0 0 9 * * 1-6") // 姣忓ぉ9鐐规墽琛屼竴娆� 闄や簡鏄熸湡澶�
+    public void task1() {
+        checkLaboratoriesSchedule();
+        // 鏍规嵁鏃堕棿闄嶅簭锛岃幏鍙栧埌鏈�鏂扮殑涓�鏉℃暟鎹�
+        CollectTemperatureHumidity collectTemperatureHumidity = collectTemperatureHumidityMapper.selectOne(Wrappers.<CollectTemperatureHumidity>lambdaQuery()
+                .orderByDesc(CollectTemperatureHumidity::getCollectTime)
+                .last("limit 1"));
+
+        // 鑾峰彇鎵�鏈夌殑瀹為獙瀹�
+        List<CollectLaboratory> collectLaboratories = collectLaboratoryMapper.selectList(null);
+        // 閬嶅巻鑾峰彇瀹為獙瀹ょ紪鍙� 鑾峰彇娓╂箍搴� 淇濆瓨鍦ㄥ搴旂殑
+        for (CollectLaboratory collectLaboratory : collectLaboratories) {
+            // 瀹為獙瀹ょ紪鍙�
+            int labNumber = Integer.parseInt(collectLaboratory.getDeviceCode());
+            // 鏍规嵁瀹為獙瀹ょ紪鍙锋嫾鎺ュ搴旂殑婀垮害鍜屾俯搴﹀瓧娈�
+            String temperatureField = "code" + labNumber + "Temperature";
+            String humidityField = "code" + labNumber + "Humidity";
+            // 鑾峰彇娓╁害
+            Double temperature = getFieldValue(collectTemperatureHumidity, temperatureField) != null ? (Double) getFieldValue(collectTemperatureHumidity, temperatureField) : Double.valueOf(00.0);
+            // 鑾峰彇婀垮害
+            Double humidity = getFieldValue(collectTemperatureHumidity, humidityField) != null ? (Double) getFieldValue(collectTemperatureHumidity, humidityField) : Double.valueOf(00.0);
+            // 鏌ヨ璇曢獙鍖哄煙
+            FeTempHumDate feTempHumDate = feTempHumDateMapper.selectOne(Wrappers.<FeTempHumDate>lambdaQuery()
+                    .eq(FeTempHumDate::getMonthDate, formattedDate)
+                    .eq(FeTempHumDate::getTestAreaName, collectLaboratory.getLaboratory())
+                    .orderByDesc(FeTempHumDate::getCreateTime)
+                    .last("limit 1"));
+            Integer dateId = feTempHumDate.getDateId();
+            // 鍒ゆ柇浠婂ぉ鏄惁鏈夋俯婀垮害璁板綍
+            FeTempHumRecord feTempHumRecord = record(dateId);
+            // 鏌ヨ鍑烘潵灏变唬琛ㄤ粖澶╄褰曡繃浜嗗氨涓嶈褰�
+            if (feTempHumRecord != null) {
+                // 鏈夋俯搴︽箍搴﹁褰曞氨涓嶈褰�
+                continue;
+            }
+
+            // 鍒涘缓浠婂ぉ娓╂箍搴﹁褰曞璞� 璁板綍涓婂崍娓╁害婀垮害
+            FeTempHumRecord newFeTempHumRecord = new FeTempHumRecord();
+            newFeTempHumRecord.setRecordDate(LocalDate.now());
+            newFeTempHumRecord.setMorningTestTime(LocalTime.now());
+            newFeTempHumRecord.setMorningTemp(temperature.toString());
+            newFeTempHumRecord.setMorningHum(humidity.toString());
+            newFeTempHumRecord.setDateId(dateId);
+            feTempHumRecordMapper.insert(newFeTempHumRecord);
+
+            // 鍒ゆ柇娓╂箍搴︽槸鍚﹁秴杩�, 瓒呰繃鎻愰啋
+            if (feTempHumDate.getRegistrarUserId() != null) {
+                if (temperature < collectLaboratory.getTemperatureLowest() || temperature > collectLaboratory.getTemperatureHighest() ||
+                        humidity< collectLaboratory.getHumidityLowest() || humidity > collectLaboratory.getHumidityHighest()) {
+                    // 鍙戦�佷紒涓氬井淇¢�氱煡
+                    threadPoolTaskExecutor.execute(() -> {
+                        // 鏌ヨ鎺ユ敹浜�
+                        User personnel = userMapper.selectById(feTempHumDate.getRegistrarUserId());
+
+                        String message = "";
+                        message += "涓婂崍瀹為獙瀹ゆ俯搴︽垨婀垮害瓒呰繃鎸囧畾鍖洪棿, 璇峰幓鏌ョ湅";
+                        message += "\n璇峰幓璧勬簮绠$悊-璁炬柦鍜岀幆澧冩俯搴︿竴娓╂箍搴﹁褰�";
+                        message += StrUtil.format("\n瀹為獙瀹ゅ尯鍩�: {}", feTempHumDate.getTestAreaName());
+                        //鍙戦�佷紒涓氬井淇℃秷鎭�氱煡
+                        try {
+                            WxCpUtils.inform(personnel.getAccount(), message, null);
+                        } catch (Exception e) {
+                            throw new RuntimeException(e);
+                        }
+                    });
+                }
+            }
+
+        }
+    }
+
+    /**
+     * 鍒ゆ柇浠婂ぉ鏄惁鏈夋俯婀垮害璁板綍
+     */
+    private FeTempHumRecord record(Integer dateId) {
+        // 鑾峰彇浠婂ぉ鐨勬棩鏈�
+        LocalDate today = LocalDate.now();
+        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("HH:mm:ss");
+        // 鑾峰彇浠婂ぉ鐨� 00:00:00 鍜� 23:59:59
+        String start = today.atStartOfDay().format(dateTimeFormatter);  // 00:00:00
+        String end = today.atTime(LocalTime.MAX).format(dateTimeFormatter); // 23:59:59
+        // 鏌ヨ浠婂ぉ鏄惁鏈夋俯婀垮害璁板綍
+        return feTempHumRecordMapper.selectOne(Wrappers.<FeTempHumRecord>lambdaQuery()
+                // 鍝釜瀹為獙瀹�
+                .eq(FeTempHumRecord::getDateId, dateId)
+                // 璁板綍鏃堕棿鍦ㄤ粖澶╀箣鍐�
+                .eq(FeTempHumRecord::getRecordDate, today)
+                .between(FeTempHumRecord::getMorningTestTime, start, end)
+                .orderByDesc(FeTempHumRecord::getTempHumId)
+                .last("limit 1"));
+    }
+
+    /**
+     * 姣忓ぉ14鐐规墽琛屼竴娆� 闄や簡鏄熸湡鍏拰鏄熸湡澶�
+     * 鑾峰彇娓╁害婀垮害
+     */
+//    @Scheduled(cron = "0/5 * * * * *")
+    @Scheduled(cron = "0 0 14 * * 1-5") // 姣忓ぉ14鐐规墽琛屼竴娆� 闄や簡鏄熸湡鍏拰鏄熸湡澶�
+    public void task2() {
+
+        // 妫�鏌ュ疄楠屽鏄惁鏈変换鍔� 濡傛灉娌℃湁鏂板浠诲姟
+        checkLaboratoriesSchedule();
+        // 鏍规嵁鏃堕棿闄嶅簭锛岃幏鍙栧埌鏈�鏂扮殑涓�鏉℃暟鎹�
+        CollectTemperatureHumidity collectTemperatureHumidity = collectTemperatureHumidityMapper.selectOne(Wrappers.<CollectTemperatureHumidity>lambdaQuery()
+                .orderByDesc(CollectTemperatureHumidity::getCollectTime)
+                .last("limit 1"));
+        // 鑾峰彇鎵�鏈夌殑瀹為獙瀹�
+        List<CollectLaboratory> collectLaboratories = collectLaboratoryMapper.selectList(null);
+        // 閬嶅巻鑾峰彇瀹為獙瀹ょ紪鍙� 鑾峰彇娓╂箍搴� 淇濆瓨鍦ㄥ搴旂殑
+        for (CollectLaboratory collectLaboratory : collectLaboratories) {
+            // 瀹為獙瀹ょ紪鍙�
+            int labNumber = Integer.parseInt(collectLaboratory.getDeviceCode());
+            // 鏍规嵁瀹為獙瀹ょ紪鍙锋嫾鎺ュ搴旂殑婀垮害鍜屾俯搴﹀瓧娈�
+            String temperatureField = "code" + labNumber + "Temperature";
+            String humidityField = "code" + labNumber + "Humidity";
+            // 鑾峰彇娓╁害
+            Double temperature = getFieldValue(collectTemperatureHumidity, temperatureField) != null ? (Double) getFieldValue(collectTemperatureHumidity, temperatureField) : Double.valueOf(00.0);
+            // 鑾峰彇婀垮害
+            Double humidity = getFieldValue(collectTemperatureHumidity, humidityField) != null ? (Double) getFieldValue(collectTemperatureHumidity, humidityField) : Double.valueOf(00.0);
+            // 鏌ヨ璇曢獙鍖哄煙
+            FeTempHumDate feTempHumDate = feTempHumDateMapper.selectOne(Wrappers.<FeTempHumDate>lambdaQuery()
+                    .eq(FeTempHumDate::getMonthDate, formattedDate)
+                    .eq(FeTempHumDate::getTestAreaName, collectLaboratory.getLaboratory())
+                    .orderByDesc(FeTempHumDate::getCreateTime)
+                    .last("limit 1"));
+            Integer dateId = feTempHumDate.getDateId();
+            // 鏌ヨ浠婂ぉ鏄惁鏈夋俯婀垮害璁板綍
+            FeTempHumRecord feTempHumRecord = record(dateId);
+            // 濡傛灉娌℃湁鏌ヨ缁撴灉灏辫鏄庝笂鍗堟病鏈夎褰�
+            if (feTempHumRecord == null) {
+                // 鍒涘缓浠婂ぉ娓╂箍搴﹁褰曞璞� 璁板綍涓嬪崍娓╁害婀垮害
+                FeTempHumRecord newFeTempHumRecord = new FeTempHumRecord();
+                newFeTempHumRecord.setAfternoonTime(LocalTime.now());
+                newFeTempHumRecord.setAfternoonTemp(temperature.toString());
+                newFeTempHumRecord.setAfternoonHum(humidity.toString());
+                newFeTempHumRecord.setDateId(dateId);
+                feTempHumRecordMapper.insert(newFeTempHumRecord);
+                continue;
+            }
+
+            // 鏌ヨ鍑烘潵灏变唬琛ㄤ粖澶╄褰曡繃 鍐嶅垽鏂笅鍗堟湁璁板綍杩囨病鏈�
+            // 娓╁害鏄惁璁板綍杩�
+            if (feTempHumRecord.getAfternoonTemp() == null) {
+                // 娌℃湁灏辫嚜鍔ㄨ褰�
+                feTempHumRecord.setAfternoonTemp(temperature.toString());
+                // 淇敼璁板綍鏃堕棿
+                feTempHumRecord.setAfternoonTime(LocalTime.now());
+            }
+            // 婀垮害鏄惁璁板綍杩�
+            if (feTempHumRecord.getAfternoonHum() == null) {
+                // 娌℃湁灏辫嚜鍔ㄨ褰�
+                feTempHumRecord.setAfternoonHum(humidity.toString());
+                // 淇敼璁板綍鏃堕棿
+                feTempHumRecord.setAfternoonTime(LocalTime.now());
+            }
+            feTempHumRecordMapper.updateById(feTempHumRecord);
+
+            // 鍒ゆ柇娓╂箍搴︽槸鍚﹁秴杩�, 瓒呰繃鎻愰啋
+            if (feTempHumDate.getRegistrarUserId() != null) {
+                if (temperature < collectLaboratory.getTemperatureLowest() || temperature > collectLaboratory.getTemperatureHighest() ||
+                        humidity< collectLaboratory.getHumidityLowest() || humidity > collectLaboratory.getHumidityHighest()) {
+                    // 鍙戦�佷紒涓氬井淇¢�氱煡
+                    threadPoolTaskExecutor.execute(() -> {
+                        // 鏌ヨ鎺ユ敹浜�
+                        User personnel = userMapper.selectById(feTempHumDate.getRegistrarUserId());
+
+                        String message = "";
+                        message += "涓嬪崍瀹為獙瀹ゆ俯搴︽垨婀垮害瓒呰繃鎸囧畾鍖洪棿, 璇峰幓鏌ョ湅";
+                        message += "\n璇峰幓璧勬簮绠$悊-璁炬柦鍜岀幆澧冩俯搴︿竴娓╂箍搴﹁褰�";
+                        message += StrUtil.format("\n瀹為獙瀹ゅ尯鍩�: {}", feTempHumDate.getTestAreaName());
+                        //鍙戦�佷紒涓氬井淇℃秷鎭�氱煡
+                        try {
+                            WxCpUtils.inform(personnel.getAccount(), message, null);
+                        } catch (Exception e) {
+                            throw new RuntimeException(e);
+                        }
+                    });
+                }
+
+                if (feTempHumDate.getTestAreaName().equals("鎭掓俯浜�")) {
+                    // 鍒ゆ柇涓婁笅鍗堟俯宸槸鍚﹁秴杩�1
+                    if (temperature - Double.valueOf(feTempHumRecord.getMorningTemp()) > 1) {
+                        // 鍙戦�佷紒涓氬井淇¢�氱煡
+                        threadPoolTaskExecutor.execute(() -> {
+                            // 鏌ヨ鎺ユ敹浜�
+                            User personnel = userMapper.selectById(feTempHumDate.getRegistrarUserId());
+
+                            String message = "";
+                            message += "鎭掓俯浜屽疄楠屽涓婁笅娓╁樊瓒呰繃 1鈩�, 璇峰幓鏌ョ湅";
+                            message += "\n璇峰幓璧勬簮绠$悊-璁炬柦鍜岀幆澧冩俯搴︿竴娓╂箍搴﹁褰�";
+                            message += StrUtil.format("\n瀹為獙瀹ゅ尯鍩�: {}", feTempHumDate.getTestAreaName());
+                            //鍙戦�佷紒涓氬井淇℃秷鎭�氱煡
+                            try {
+                            WxCpUtils.inform(personnel.getAccount(), message, null);
+                            } catch (Exception e) {
+                                throw new RuntimeException(e);
+                            }
+                        });
+                    }
+                }
+            }
+        }
+    }
+
+    /**
+     * 鏄熸湡澶╂墽琛屾坊鍔犵┖鐧芥暟鎹�
+     * 鑾峰彇娓╁害婀垮害
+     */
+//    @Scheduled(cron = "0/5 * * * * *")
+    @Scheduled(cron = "0 0 9 * * 7") //
+    public void task3() {
+        checkLaboratoriesSchedule();
+
+        // 鑾峰彇鎵�鏈夌殑瀹為獙瀹�
+        List<CollectLaboratory> collectLaboratories = collectLaboratoryMapper.selectList(null);
+        // 閬嶅巻鑾峰彇瀹為獙瀹ょ紪鍙� 鑾峰彇娓╂箍搴� 淇濆瓨鍦ㄥ搴旂殑
+        for (CollectLaboratory collectLaboratory : collectLaboratories) {
+            // 鏌ヨ璇曢獙鍖哄煙
+            FeTempHumDate feTempHumDate = feTempHumDateMapper.selectOne(Wrappers.<FeTempHumDate>lambdaQuery()
+                    .eq(FeTempHumDate::getMonthDate, formattedDate)
+                    .eq(FeTempHumDate::getTestAreaName, collectLaboratory.getLaboratory())
+                    .orderByDesc(FeTempHumDate::getCreateTime)
+                    .last("limit 1"));
+            Integer dateId = feTempHumDate.getDateId();
+            // 鍒ゆ柇浠婂ぉ鏄惁鏈夋俯婀垮害璁板綍
+            // 鑾峰彇浠婂ぉ鐨勬棩鏈�
+            LocalDate today = LocalDate.now();
+            // 鏌ヨ浠婂ぉ鏄惁鏈夋俯婀垮害璁板綍
+            Long count = feTempHumRecordMapper.selectCount(Wrappers.<FeTempHumRecord>lambdaQuery()
+                    // 鍝釜瀹為獙瀹�
+                    .eq(FeTempHumRecord::getDateId, dateId)
+                    // 璁板綍鏃堕棿鍦ㄤ粖澶╀箣鍐�
+                    .eq(FeTempHumRecord::getRecordDate, today));
+            // 鏌ヨ鍑烘潵灏变唬琛ㄤ粖澶╄褰曡繃浜嗗氨涓嶈褰�
+            if (!count.equals(0L)) {
+                // 鏈夋俯搴︽箍搴﹁褰曞氨涓嶈褰�
+                continue;
+            }
+
+            // 鍒涘缓浠婂ぉ娓╂箍搴﹁褰曞璞� 璁板綍涓婂崍娓╁害婀垮害
+            FeTempHumRecord newFeTempHumRecord = new FeTempHumRecord();
+            newFeTempHumRecord.setRecordDate(LocalDate.now());
+            newFeTempHumRecord.setDateId(dateId);
+            feTempHumRecordMapper.insert(newFeTempHumRecord);
+        }
+    }
+
+    /**
+     * 鎵弿瀹為獙瀹ゆ俯搴﹁褰曞垽鏂槸鍚︽湁娌℃湁纭鐨勬俯搴︿俊鎭�
+     *
+     */
+//    @Scheduled(cron = "0/5 * * * * *")
+    @Scheduled(cron = "0 0 16 * * 1-6") // 姣忓ぉ15鐐规墽琛屼竴娆� 闄や簡鏄熸湡澶�
+    public void affirmTempHum() {
+        // 鏌ヨ鏈夋棩鏈熶絾鏄湭濉啓鍚嶅瓧鐨�
+        List<FeTempHumRecordDto> feTempHumRecordList = feTempHumRecordMapper.selectNoaffirm(LocalDate.now());
+
+        for (FeTempHumRecordDto feTempHumRecord : feTempHumRecordList) {
+
+            // 鍙戦�佷紒涓氬井淇¢�氱煡
+            threadPoolTaskExecutor.execute(() -> {
+                // 鏌ヨ鎺ユ敹浜�
+                User personnel = userMapper.selectById(feTempHumRecord.getRegistrarUserId());
+
+                String message = "";
+                message += "娓╂箍搴﹁褰曠‘璁ら�氱煡";
+                message += "\n璇峰幓璧勬簮绠$悊-璁炬柦鍜岀幆澧冩俯搴︿竴娓╂箍搴﹁褰�";
+                message += StrUtil.format("\n瀹為獙瀹ゅ尯鍩�: {}", feTempHumRecord.getTestAreaName());
+                //鍙戦�佷紒涓氬井淇℃秷鎭�氱煡
+                try {
+                    WxCpUtils.inform(personnel.getAccount(), message, null);
+                } catch (Exception e) {
+                    throw new RuntimeException(e);
+                }
+            });
+
+        }
+
+    }
+
+
+    /**
+     * 鏍规嵁瀹為獙瀹ょ紪鍙疯幏鍙栨俯搴︽箍搴�
+     *
+     * @param collectTemperatureHumidity 娓╁害婀垮害鏁版嵁
+     * @param fieldName                  瀛楁鍚�
+     * @return 瀛楁鍊�
+     */
+    public static Object getFieldValue(CollectTemperatureHumidity collectTemperatureHumidity, String fieldName) {
+        try {
+            Field field = collectTemperatureHumidity.getClass().getDeclaredField(fieldName);
+            field.setAccessible(true); // 璁剧疆鍙互璁块棶绉佹湁瀛楁
+            return field.get(collectTemperatureHumidity); // 鑾峰彇瀛楁鐨勫��
+        } catch (NoSuchFieldException | IllegalAccessException e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/vo/AcceptanceDetailsVo.java b/cnas-require/src/main/java/com/ruoyi/require/vo/AcceptanceDetailsVo.java
new file mode 100644
index 0000000..11378dc
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/vo/AcceptanceDetailsVo.java
@@ -0,0 +1,22 @@
+package com.ruoyi.require.vo;
+
+import com.ruoyi.require.pojo.FeStandardSubstance;
+import com.ruoyi.require.pojo.FeStandardSubstanceAcceptance;
+import com.ruoyi.require.pojo.FeStandardSubstanceAcceptanceInspection;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class AcceptanceDetailsVo extends FeStandardSubstanceAcceptance {
+
+    @Schema(description = "鐗╄川娓呭崟")
+    private FeStandardSubstance substance;
+
+    @Schema(description = "楠屾敹鍗�")
+    private FeStandardSubstanceAcceptance acceptance;
+
+    @Schema(description = "寮�绠辫褰�")
+    private List<FeStandardSubstanceAcceptanceInspection> list;
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/vo/AcceptanceVo.java b/cnas-require/src/main/java/com/ruoyi/require/vo/AcceptanceVo.java
new file mode 100644
index 0000000..38133df
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/vo/AcceptanceVo.java
@@ -0,0 +1,46 @@
+package com.ruoyi.require.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Data
+public class AcceptanceVo {
+
+    @Schema(description = "妫�楠岃〃id")
+    private Integer id;
+
+    @Schema(description = "鏍囧噯鐗╄川鍚嶇О")
+    private String name;
+
+    @Schema(description = "瑙勬牸鍨嬪彿")
+    private String model;
+
+    @Schema(description = "鐢熶骇鍘傚")
+    private String factoryManufacturer;
+
+    @Schema(description = "鍑哄満缂栧彿")
+    private String factoryNum;
+
+    @Schema(description = "绠$悊缂栧彿")
+    private String manageNum;
+
+    @Schema(description = "涓嶇‘瀹氬害")
+    private String uncertainty;
+
+    @Schema(description = "鏁伴噺")
+    private Long quantity;
+
+    @Schema(description = "璐疆鏃ユ湡")
+    private LocalDateTime acquisitionDate;
+
+    @Schema(description = "鏈夋晥鏈�")
+    private LocalDateTime effectiveDate;
+
+    @Schema(description = "鏂囨。缂栧彿")
+    private String fileNum;
+
+    @Schema(description = "瀛樻斁浣嶇疆")
+    private String position;
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/require/vo/SubstanceRecordVo.java b/cnas-require/src/main/java/com/ruoyi/require/vo/SubstanceRecordVo.java
new file mode 100644
index 0000000..d98cad5
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/require/vo/SubstanceRecordVo.java
@@ -0,0 +1,46 @@
+package com.ruoyi.require.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Data
+public class SubstanceRecordVo {
+
+    @Schema(description = "id")
+    private Integer id;
+
+    @Schema(description = "鏍囧噯鐗╄川鍚嶇О")
+    private String name;
+
+    @Schema(description = "瑙勬牸鍨嬪彿")
+    private String model;
+
+    @Schema(description = "鍑哄満缂栧彿")
+    private String factoryNum;
+
+    @Schema(description = "鏁伴噺")
+    private Long quantity;
+
+    @Schema(description = "棰嗙敤浜�")
+    private String borrowUser;
+
+    @Schema(description = "鍊熷嚭鏃ユ湡")
+    private LocalDateTime borrowDate;
+
+    @Schema(description = "褰掕繕鏃ユ湡")
+    private LocalDateTime returnDate;
+
+    @Schema(description = "褰掕繕浜�")
+    private String returnedPerson;
+
+    @Schema(description = "瀹屽ソ鎬�")
+    private String returnIntegrity;
+
+    @Schema(description = "0锛氬�熺敤 1:褰掕繕")
+    private String status;
+
+    @Schema(description = "澶囨敞")
+    private String remark;
+}
diff --git a/cnas-require/src/main/resources/mapper/FeIlluminationMapper.xml b/cnas-require/src/main/resources/mapper/FeIlluminationMapper.xml
new file mode 100644
index 0000000..70e1768
--- /dev/null
+++ b/cnas-require/src/main/resources/mapper/FeIlluminationMapper.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.ruoyi.require.mapper.FeIlluminationMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.ruoyi.require.pojo.FeIllumination">
+        <id column="intensity_illumination_id" property="intensityIlluminationId" />
+        <result column="device_id" property="deviceId" />
+        <result column="conclusion" property="conclusion" />
+        <result column="tester_id" property="testerId" />
+        <result column="checker_id" property="checkerId" />
+        <result column="test_date" property="testDate" />
+        <result column="create_time" property="createTime" />
+        <result column="update_time" property="updateTime" />
+    </resultMap>
+
+    <select id="getFeLightningProtection" resultType="com.ruoyi.require.dto.FeIlluminationDto">
+        SELECT cdi.*, u1.name checker_user, u2.name tester_user, dv.device_name, dv.management_number
+        FROM cnas_fe_illumination cdi
+                 left join device dv on dv.id = cdi.device_id
+                 left join user u1 on u1.id = cdi.checker_id
+                 left join user u2 on u2.id = cdi.tester_id
+    </select>
+
+    <!-- 鏌ヨ鐓ф槑璁板綍 -->
+    <select id="selectFeIllumination" resultType="com.ruoyi.require.dto.FeIlluminationExportDto">
+        SELECT cdi.*,
+               dv.device_name,
+               dv.management_number,
+               DATE_FORMAT(d.calibration_date, '%Y-%m-%d') calibrationDateString,
+               DATE_FORMAT(d.next_calibration_date, '%Y-%m-%d') nextCalibrationDateString
+        FROM cnas_fe_illumination cdi
+                 left join device dv on dv.id = cdi.device_id
+                 LEFT JOIN (SELECT d.id,
+                                   dmr.calibration_date,
+                                   dmr.next_calibration_date
+                            FROM device d
+                                     LEFT JOIN device_metric_record dmr ON dmr.device_id = d.id
+                                AND dmr.type = 'calibrate'
+                            GROUP BY d.id
+                            HAVING max(dmr.id)) d ON d.id = cdi.device_id
+                 left join user u1 on u1.id = cdi.checker_id
+                 left join user u2 on u2.id = cdi.tester_id
+        where cdi.intensity_illumination_id = #{intensityIlluminationId}
+    </select>
+</mapper>
diff --git a/cnas-require/src/main/resources/mapper/FeLightningProtectionMapper.xml b/cnas-require/src/main/resources/mapper/FeLightningProtectionMapper.xml
new file mode 100644
index 0000000..4d3096d
--- /dev/null
+++ b/cnas-require/src/main/resources/mapper/FeLightningProtectionMapper.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.ruoyi.require.mapper.FeLightningProtectionMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.ruoyi.require.pojo.FeLightningProtection">
+        <id column="lightning_protection_id" property="lightningProtectionId" />
+        <result column="file_name" property="fileName" />
+        <result column="system_file_name" property="systemFileName" />
+        <result column="detection_date" property="detectionDate" />
+        <result column="term_validity" property="termValidity" />
+        <result column="detection_unit" property="detectionUnit" />
+        <result column="create_time" property="createTime" />
+        <result column="update_time" property="updateTime" />
+    </resultMap>
+
+    <select id="exportOfLightningProtectionDetection" resultType="com.ruoyi.require.excel.FeLightningProtectionExcel">
+        select * from cnas_fe_lightning_protection
+    </select>
+</mapper>
diff --git a/cnas-require/src/main/resources/mapper/FePowerStableMapper.xml b/cnas-require/src/main/resources/mapper/FePowerStableMapper.xml
new file mode 100644
index 0000000..39937b6
--- /dev/null
+++ b/cnas-require/src/main/resources/mapper/FePowerStableMapper.xml
@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.require.mapper.FePowerStableMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.ruoyi.require.pojo.FePowerStable">
+        <id column="power_stable_id" property="powerStableId" />
+        <result column="test_location" property="testLocation" />
+        <result column="test_date" property="testDate" />
+        <result column="device_id" property="deviceId" />
+        <result column="conclusion" property="conclusion" />
+        <result column="tester_id" property="testerId" />
+        <result column="checker_id" property="checkerId" />
+        <result column="create_time" property="createTime" />
+        <result column="update_time" property="updateTime" />
+    </resultMap>
+
+    <select id="getLaboratoryFacilityPowerStablePage" resultType="com.ruoyi.require.dto.FePowerStableDto">
+        SELECT cfps.*, u1.name checker_user, u2.name tester_user, dv.device_name, dv.management_number
+        FROM cnas_fe_power_stable cfps
+                 left join device dv on dv.id = cfps.device_id
+                 left join user u1 on u1.id = cfps.checker_id
+                 left join user u2 on u2.id = cfps.tester_id
+    </select>
+
+    <select id="getCalibrationDate" resultType="java.util.Map">
+        SELECT
+            d.device_name deviceName,
+            d.management_number managementNumber,
+            date_format(dmr.calibration_date,'%Y-%m-%d') calibrationDate,
+            date_format(dmr.next_calibration_date,'%Y-%m-%d') nextCalibrationDate
+        FROM
+            device d
+                LEFT JOIN device_metric_record dmr ON dmr.device_id = d.id
+                AND dmr.type = 'calibrate'
+        where d.id = #{deviceId}
+        GROUP BY
+            d.id
+    </select>
+
+    <!-- 鏌ヨ鐢垫簮绋冲畾鎬� -->
+    <select id="selectPowerStable" resultType="com.ruoyi.require.dto.FePowerStableExportDto">
+        SELECT cfps.*,
+               dv.device_name,
+               dv.management_number,
+               DATE_FORMAT(cfps.test_date, '%Y-%m-%d') testDateString,
+               DATE_FORMAT(d.calibration_date, '%Y-%m-%d') calibrationDateString,
+               DATE_FORMAT(d.next_calibration_date, '%Y-%m-%d') nextCalibrationDateString
+        FROM cnas_fe_power_stable cfps
+                 left join device dv on dv.id = cfps.device_id
+                 LEFT JOIN (SELECT d.id,
+                                   dmr.calibration_date,
+                                   dmr.next_calibration_date
+                            FROM device d
+                                     LEFT JOIN device_metric_record dmr ON dmr.device_id = d.id
+                                AND dmr.type = 'calibrate'
+                            GROUP BY d.id
+                            HAVING max(dmr.id)) d ON d.id = cfps.device_id
+                 left join user u1 on u1.id = cfps.checker_id
+                 left join user u2 on u2.id = cfps.tester_id
+        where cfps.power_stable_id = #{powerStableId}
+    </select>
+</mapper>
diff --git a/cnas-require/src/main/resources/mapper/FeStandardSubstanceAcceptanceMapper.xml b/cnas-require/src/main/resources/mapper/FeStandardSubstanceAcceptanceMapper.xml
new file mode 100644
index 0000000..e336198
--- /dev/null
+++ b/cnas-require/src/main/resources/mapper/FeStandardSubstanceAcceptanceMapper.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.ruoyi.require.mapper.FeStandardSubstanceAcceptanceMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.ruoyi.require.pojo.FeStandardSubstanceAcceptance">
+        <id column="id" property="id" />
+        <result column="substance_id" property="substanceId" />
+        <result column="arrive_date" property="arriveDate" />
+        <result column="maintenance_unit" property="maintenanceUnit" />
+        <result column="perameters" property="perameters" />
+        <result column="installation" property="installation" />
+        <result column="situation" property="situation" />
+        <result column="signature" property="signature" />
+        <result column="producer" property="producer" />
+        <result column="recipient" property="recipient" />
+        <result column="file" property="file" />
+        <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="getPageAcceptance" resultType="com.ruoyi.require.vo.AcceptanceVo">
+        SELECT
+            sa.id,
+            ss.name,
+            ss.model,
+            ss.factory_manufacturer,
+            ss.factory_num,
+            ss.manage_num,
+            ss.uncertainty,
+            ss.quantity,
+            ss.acquisition_date,
+            ss.effective_date,
+            ss.file_num,
+            ss.position
+        FROM cnas_fe_standard_substance_acceptance sa
+                 LEFT JOIN cnas_fe_standard_substance ss on ss.id = sa.substance_id
+        <where>
+            <if test="name != null and name != ''">
+                ss.name like CONCAT('%', #{name}, '%')
+            </if>
+        </where>
+    </select>
+
+</mapper>
diff --git a/cnas-require/src/main/resources/mapper/FeStandardSubstanceMapper.xml b/cnas-require/src/main/resources/mapper/FeStandardSubstanceMapper.xml
new file mode 100644
index 0000000..5a9d0bd
--- /dev/null
+++ b/cnas-require/src/main/resources/mapper/FeStandardSubstanceMapper.xml
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.require.mapper.FeStandardSubstanceMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.ruoyi.require.pojo.FeStandardSubstance">
+        <id column="id" property="id" />
+        <result column="name" property="name" />
+        <result column="model" property="model" />
+        <result column="factory_manufacturer" property="factoryManufacturer" />
+        <result column="factory_num" property="factoryNum" />
+        <result column="manage_num" property="manageNum" />
+        <result column="uncertainty" property="uncertainty" />
+        <result column="quantity" property="quantity" />
+        <result column="acquisition_date" property="acquisitionDate" />
+        <result column="effective_date" property="effectiveDate" />
+        <result column="file_num" property="fileNum" />
+        <result column="position" property="position" />
+        <result column="state" property="state" />
+        <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="getPage" resultType="com.ruoyi.require.pojo.FeStandardSubstance">
+        select * from cnas_fe_standard_substance
+        <where>
+            <if test="ew.name != null and ew.name != ''">
+                name like CONCAT('%', #{ew.name}, '%')
+            </if>
+            <if test="ew.factoryManufacturer != null and ew.factoryManufacturer != ''">
+                and factory_manufacturer like CONCAT('%', #{ew.factoryManufacturer}, '%')
+            </if>
+            <if test="ew.factoryNum != null and ew.factoryNum != ''">
+                and factory_num like CONCAT('%', #{factoryNum}, '%')
+            </if>
+            <if test="ew.manageNum != null and ew.manageNum != ''">
+                and manage_num like CONCAT('%', #{ew.manageNum}, '%')
+            </if>
+            <if test="ew.model != null and ew.model != ''">
+                and model like CONCAT('%', #{ew.model}, '%')
+            </if>
+            <if test="ew.effectiveDate != null and ew.effectiveDate != ''">
+                and effective_date =  #{ew.effectiveDate}
+            </if>
+            <if test="ew.fileNum != null and ew.fileNum != ''">
+                and file_num like CONCAT('%', #{ew.fileNum}, '%')
+            </if>
+            <if test="ew.position != null and ew.position != ''">
+                and position like CONCAT('%', #{ew.position}, '%')
+            </if>
+        </where>
+    </select>
+
+</mapper>
diff --git a/cnas-require/src/main/resources/mapper/FeStandardSubstanceRecordMapper.xml b/cnas-require/src/main/resources/mapper/FeStandardSubstanceRecordMapper.xml
new file mode 100644
index 0000000..315d743
--- /dev/null
+++ b/cnas-require/src/main/resources/mapper/FeStandardSubstanceRecordMapper.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.require.mapper.FeStandardSubstanceRecordMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.ruoyi.require.pojo.FeStandardSubstanceRecord">
+        <id column="id" property="id" />
+        <result column="substance_id" property="substanceId" />
+        <result column="integrity" property="integrity" />
+        <result column="borrow_user" property="borrowUser" />
+        <result column="phone" property="phone" />
+        <result column="borrow_date" property="borrowDate" />
+        <result column="return_date" property="returnDate" />
+        <result column="lender" property="lender" />
+        <result column="rummager" property="rummager" />
+        <result column="status" property="status" />
+        <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="getPage" resultType="com.ruoyi.require.vo.SubstanceRecordVo">
+        SELECT
+        ssr.id,
+        ss.name,
+        ss.model,
+        ss.factory_num,
+        ss.quantity,
+        ssr.borrow_user,
+        ssr.borrow_date,
+        ssr.return_date,
+        ssr.integrity,
+        ssr.return_integrity,
+        ssr.returned_person,
+        ss.remark
+        FROM cnas_fe_standard_substance_record ssr
+        LEFT JOIN cnas_fe_standard_substance ss on ss.id = ssr.substance_id
+        <where>
+            <if test="ew.name != null and ew.name != ''">
+                ss.name like CONCAT('%', #{ew.name}, '%')
+            </if>
+            <if test="ew.model != null and ew.model != ''">
+                and ss.model like CONCAT('%', #{ew.model}, '%')
+            </if>
+            <if test="ew.factoryNum != null and ew.factoryNum != ''">
+                and ss.factory_num like CONCAT('%', #{ew.factoryNum}, '%')
+            </if>
+        </where>
+    </select>
+
+</mapper>
diff --git a/cnas-require/src/main/resources/mapper/FeTempHumDateMapper.xml b/cnas-require/src/main/resources/mapper/FeTempHumDateMapper.xml
new file mode 100644
index 0000000..299d25d
--- /dev/null
+++ b/cnas-require/src/main/resources/mapper/FeTempHumDateMapper.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.ruoyi.require.mapper.FeTempHumDateMapper">
+
+    <select id="getFeTempHumDate" resultType="com.ruoyi.require.dto.FeTempHumDateDto">
+        select * from (
+        select c.*,
+        u.name registrar_user_name,
+        concat('鈮�', cl.temperature_lowest, '&amp;', '鈮�', cl.temperature_highest) temperature_section,
+        concat('鈮�', cl.humidity_lowest, '&amp;', '鈮�', cl.humidity_highest) humidity_section
+        from cnas_fe_temp_hum_date c
+        left join user u on c.registrar_user_id = u.id
+        left join collect_laboratory cl on cl.laboratory = c.test_area_name) a
+        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
+            ${ew.customSqlSegment}
+        </if>
+        order by month_date desc
+    </select>
+    <select id="selectFeTempHumDateIncludeFormattedDate" resultType="java.lang.Integer">
+        select count(*)
+        from cnas_fe_temp_hum_date
+        where test_area_name = #{laboratory}
+          and month_date = #{formattedDate}
+    </select>
+</mapper>
diff --git a/cnas-require/src/main/resources/mapper/FeTempHumRecordMapper.xml b/cnas-require/src/main/resources/mapper/FeTempHumRecordMapper.xml
new file mode 100644
index 0000000..fb79da3
--- /dev/null
+++ b/cnas-require/src/main/resources/mapper/FeTempHumRecordMapper.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.require.mapper.FeTempHumRecordMapper">
+
+    <select id="getFeTempHumRecordPage" resultType="com.ruoyi.require.dto.FeTempHumRecordDto">
+        select c.*,
+               u1.name          afternoon_recorder_user,
+               u2.name          morning_recorder_user,
+               u1.signature_url afternoon_recorder_url,
+               u2.signature_url morning_recorder_url,
+               cl.temperature_lowest,
+               cl.temperature_highest,
+               cl.humidity_lowest,
+               cl.humidity_highest,
+               cd.test_area_name
+        from cnas_fe_temp_hum_record c
+                 left join user u1 on u1.id = c.afternoon_recorder_id
+                 left join user u2 on u2.id = c.morning_recorder_id
+                 left join cnas_fe_temp_hum_date cd on cd.date_id = c.date_id
+                 left join collect_laboratory cl on cl.laboratory = cd.test_area_name
+        where c.date_id = #{dateId}
+        ORDER BY c.record_date desc
+    </select>
+
+    <!-- 鏌ヨ鏈夋棩鏈熶絾鏄湭濉啓鍚嶅瓧鐨� -->
+    <select id="selectNoaffirm" resultType="com.ruoyi.require.dto.FeTempHumRecordDto">
+        select cr.*,
+               cd.registrar_user_id,
+               cd.test_area_name
+        from cnas_fe_temp_hum_record cr
+                 left join cnas_fe_temp_hum_date cd on cd.date_id = cr.date_id
+        where cr.record_date = #{date}
+          and (morning_test_time is not null and morning_recorder_id is null)
+          and cd.registrar_user_id is not null
+    </select>
+</mapper>
diff --git a/cnas-require/src/main/resources/mapper/ForeignRegisterMapper.xml b/cnas-require/src/main/resources/mapper/ForeignRegisterMapper.xml
new file mode 100644
index 0000000..a619f2f
--- /dev/null
+++ b/cnas-require/src/main/resources/mapper/ForeignRegisterMapper.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.ruoyi.require.mapper.ForeignRegisterMapper">
+
+    <!-- 澶栨潵浜哄憳鐧昏鍒嗛〉鏌ヨ -->
+    <select id="pageForeignRegister" resultType="com.ruoyi.require.dto.ForeignRegisterDto">
+        select *
+        from (select *
+        from cnas_foreign_register
+        <where>
+            <if test="beginDate != null and beginDate != '' and endDate != null and endDate != ''">
+                register_date between #{beginDate} and #{endDate}
+            </if>
+        </where>
+        order by create_time desc) a
+        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
+            ${ew.customSqlSegment}
+        </if>
+    </select>
+    <select id="getForeignRegisterList" resultType="com.ruoyi.require.dto.ForeignRegisterDto">
+        select *
+        from (select cfr.*,
+        u1.signature_url accompanyingUrl,
+        u2.signature_url approveUrl
+        from cnas_foreign_register cfr
+        left join user u1 on u1.id = cfr.accompanying_id
+        left join user u2 on u2.id = cfr.approve_id
+        <where>
+            <if test="beginDate != null and beginDate != '' and endDate != null and endDate != ''">
+                cfr.register_date between #{beginDate} and #{endDate}
+            </if>
+        </where>
+        order by cfr.create_time desc) a
+        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
+            ${ew.customSqlSegment}
+        </if>
+    </select>
+
+</mapper>
diff --git a/cnas-require/src/main/resources/mapper/InternalWastesMapper.xml b/cnas-require/src/main/resources/mapper/InternalWastesMapper.xml
new file mode 100644
index 0000000..1ee1a73
--- /dev/null
+++ b/cnas-require/src/main/resources/mapper/InternalWastesMapper.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.ruoyi.require.mapper.InternalWastesMapper">
+
+    <!-- 瀹夊叏鍐呭姟涓夊簾鐧昏鍒楄〃 -->
+    <select id="pageInternalWastes" resultType="com.ruoyi.require.dto.InternalWastesDto">
+        select *
+        from (select ciw.*,
+              u1.name create_user_name,
+              u2.name update_user_name
+        from cnas_internal_wastes ciw
+        left join user u1 on u1.id = ciw.create_user
+        left join user u2 on u2.id = ciw.update_user
+        order by ciw.create_time desc) a
+        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
+            ${ew.customSqlSegment}
+        </if>
+    </select>
+
+</mapper>
diff --git a/cnas-require/src/main/resources/mapper/ProcurementSuppliesListMapper.xml b/cnas-require/src/main/resources/mapper/ProcurementSuppliesListMapper.xml
new file mode 100644
index 0000000..229983a
--- /dev/null
+++ b/cnas-require/src/main/resources/mapper/ProcurementSuppliesListMapper.xml
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.require.mapper.ProcurementSuppliesListMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.ruoyi.require.pojo.ProcurementSuppliesList">
+        <id column="id" property="id" />
+        <result column="contents_id" property="contentsId" />
+        <result column="consumables_type" property="consumablesType" />
+        <result column="item_number" property="itemNumber" />
+        <result column="consumables_name" property="consumablesName" />
+        <result column="specifications" property="specifications" />
+        <result column="unit" property="unit" />
+        <result column="reference_price" property="referencePrice" />
+        <result column="content_id" property="contentId" />
+        <result column="person_in_charge" property="personInCharge" />
+        <result column="upper_limit" property="upperLimit" />
+        <result column="lower_limit" property="lowerLimit" />
+        <result column="supplier" property="supplier" />
+        <result column="consumables_icon" property="consumablesIcon" />
+        <result column="attachment" property="attachment" />
+        <result column="remark" property="remark" />
+        <result column="create_time" property="createTime" />
+        <result column="update_time" property="updateTime" />
+        <result column="update_user" property="updateUser" />
+        <result column="current_amount" property="currentAmount" />
+    </resultMap>
+
+    <select id="selectProcurementSuppliesList" resultMap="BaseResultMap">
+        select * from procurement_supplies_list
+        <where>
+            <if test="ew.contentId != null and ew.contentId != ''">
+                and content_id = ${ew.contentId}
+            </if>
+        </where>
+    </select>
+
+    <select id="selectProcurementSuppliesListForUpdate" resultMap="BaseResultMap">
+        select * from procurement_supplies_list where id = ${id} for update
+    </select>
+
+    <select id="selectProcurementSuppliesListAll" resultMap="BaseResultMap">
+        select
+            contents_id,item_number, consumables_type, consumables_name, specifications, supplier, upper_limit,
+        lower_limit, unit, remark, person_in_charge, update_user, update_time
+        from procurement_supplies_list
+        <where>
+            <if test="ew.contentId != null and ew.contentId != ''">
+                and content_id = ${ew.contentId}
+            </if>
+        </where>
+    </select>
+    <select id="selectProcurementSuppliesListByContentsId"
+            resultType="com.ruoyi.require.pojo.ProcurementSuppliesList">
+        select id,
+               item_number,
+               consumables_type,
+               consumables_name,
+               specifications,
+               lower_limit,
+               unit,
+               remark
+        from procurement_supplies_list
+        where contents_id = ${id}
+           or contents_id in
+              (SELECT id
+               FROM `procurement_supplies_contents`
+               WHERE id = ${id}
+                  OR parent_id = ${id})
+    </select>
+</mapper>
diff --git a/cnas-require/src/main/resources/mapper/ProcurementSuppliesStoreMapper.xml b/cnas-require/src/main/resources/mapper/ProcurementSuppliesStoreMapper.xml
new file mode 100644
index 0000000..20f4dd9
--- /dev/null
+++ b/cnas-require/src/main/resources/mapper/ProcurementSuppliesStoreMapper.xml
@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+<mapper namespace="com.ruoyi.require.mapper.ProcurementSuppliesStoreMapper">
+    <resultMap id="map" type="com.ruoyi.require.dto.StoreDto">
+        <id column="id" property="id"/>
+        <result column="consumables_id" property="consumablesId"/>
+        <result column="odd_numbers" property="oddNumbers"/>
+        <result column="consumables_name" property="consumablesName"/>
+        <result column="store_number" property="storeNumber"/>
+        <result column="total_price" property="totalPrice"/>
+        <result column="storage_user" property="storageUser"/>
+        <result column="storage_time" property="storageTime"/>
+        <result column="remark" property="remark"/>
+        <result column="registrant" property="registrant"/>
+        <result column="registrant_time" property="registrantTime"/>
+        <result column="storageUserName" property="storageUserName"/>
+        <result column="registrantName" property="registrantName"/>
+    </resultMap>
+
+    <resultMap id="storeExcelMap" type="com.ruoyi.require.excel.StoreExcel">
+        <result column="odd_numbers" property="oddNumbers"/>
+        <result column="consumables_name" property="consumablesName"/>
+        <result column="store_number" property="storeNumber"/>
+        <result column="total_price" property="totalPrice"/>
+        <result column="storage_time" property="storageTime"/>
+        <result column="remark" property="remark"/>
+        <result column="registrant_time" property="registrantTime"/>
+        <result column="storageUserName" property="storageUserName"/>
+        <result column="registrantName" property="registrantName"/>
+    </resultMap>
+
+
+    <select id="selectStoreList" resultMap="map">
+select * from (
+        SELECT
+        s.id,
+        c.id AS consumables_id,
+        s.contents_id,
+        s.odd_numbers,
+        c.consumables_name,
+        c.store_number,
+        c.total_price,
+        s.storage_user,
+        s.storage_time,
+        s.remark,
+        s.registrant,
+        s.registrant_time,
+        u.name AS storageUserName,
+        u1.name AS registrantName
+        FROM
+        `procurement_supplies_store` s
+        LEFT JOIN procurement_supplies_consumables c ON s.id = c.store_id
+        LEFT JOIN user u ON u.id = s.storage_user
+        LEFT JOIN user u1 ON u1.id = s.registrant
+        )a
+        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
+            ${ew.customSqlSegment}
+        </if>
+    </select>
+
+    <select id="exportExcel" resultMap="storeExcelMap">
+        SELECT * FROM (
+                          SELECT
+                              s.odd_numbers,
+                              c.consumables_name,
+                              c.store_number,
+                              c.total_price,
+                              s.storage_time,
+                              s.remark,
+                              s.registrant_time,
+                              u.name AS storageUserName,
+                              u1.name AS registrantName
+                          FROM
+                              `procurement_supplies_store` s
+                                  LEFT JOIN procurement_supplies_consumables c ON s.id = c.store_id
+                                  LEFT JOIN user u ON u.id = s.storage_user
+                                  LEFT JOIN user u1 ON u1.id = s.registrant
+
+                      ) a
+    </select>
+
+
+
+</mapper>
\ No newline at end of file
diff --git a/cnas-require/src/main/resources/mapper/SupplierManagementMapper.xml b/cnas-require/src/main/resources/mapper/SupplierManagementMapper.xml
new file mode 100644
index 0000000..431dc29
--- /dev/null
+++ b/cnas-require/src/main/resources/mapper/SupplierManagementMapper.xml
@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.require.mapper.SupplierManagementMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.ruoyi.require.pojo.SupplierManagement">
+        <id column="supplier_management_id" property="supplierManagementId" />
+        <result column="supplier_name" property="supplierName" />
+        <result column="supplier_ref" property="supplierRef" />
+        <result column="supplier_item_service_name" property="supplierItemServiceName" />
+        <result column="postal_code" property="postalCode" />
+        <result column="adress" property="adress" />
+        <result column="logo" property="logo" />
+        <result column="contacts" property="contacts" />
+        <result column="phone" property="phone" />
+        <result column="household_name" property="householdName" />
+        <result column="fax" property="fax" />
+        <result column="opening_name" property="openingName" />
+        <result column="website" property="website" />
+        <result column="account_name" property="accountName" />
+        <result column="email" property="email" />
+        <result column="remarks" property="remarks" />
+        <result column="enclosure" property="enclosure" />
+        <result column="create_time" property="createTime" />
+        <result column="create_user" property="createUser" />
+        <result column="update_time" property="updateTime" />
+        <result column="update_user" property="updateUser" />
+        <result column="status" property="status" />
+        <result column="parent_id" property="parentId" />
+    </resultMap>
+    <select id="pageSupplierManagement" resultType="com.ruoyi.require.pojo.SupplierManagement">
+        select *
+        from (select *
+        from cnas_supplier_management
+        order by create_time desc
+        ) a
+        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
+            ${ew.customSqlSegment}
+        </if>
+    </select>
+
+    <select id="selectQualifiedSupplierManagement" resultType="com.ruoyi.require.pojo.SupplierManagement">
+        select *
+        from (select *
+        from cnas_supplier_management
+        where status = 0
+        order by create_time desc
+        ) a
+        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
+            ${ew.customSqlSegment}
+        </if>
+    </select>
+    <select id="selectSupplierManagementAll" resultType="com.ruoyi.require.pojo.SupplierManagement">
+        SELECT
+            csm.supplier_name,
+            csm.supplier_ref,
+            csm.supplier_item_service_name,
+            csm.postal_code,
+            csm.adress,
+            csm.contacts,
+            csm.phone,
+            csm.household_name,
+            csm.fax,
+            csm.opening_name,
+            csm.website,
+            csm.account_name,
+            csm.email
+        FROM
+	        cnas_supplier_management csm
+        where csm.parent_id in (select id from procurement_supplies_contents where id = #{parentId} or parent_id = #{parentId})
+    </select>
+    <select id="selectSupplierManagement" resultType="com.ruoyi.require.pojo.SupplierManagement">
+        select
+            *
+        from cnas_supplier_management csm
+        where
+            csm.parent_id = #{parentId} or
+            csm.parent_id in
+        (select id from procurement_supplies_contents where id = #{parentId} or parent_id = #{parentId})
+    </select>
+</mapper>
diff --git a/cnas-require/src/main/resources/static/foreign-register.docx b/cnas-require/src/main/resources/static/foreign-register.docx
new file mode 100644
index 0000000..ca6eed5
--- /dev/null
+++ b/cnas-require/src/main/resources/static/foreign-register.docx
Binary files differ
diff --git a/cnas-require/src/main/resources/static/illumination.docx b/cnas-require/src/main/resources/static/illumination.docx
new file mode 100644
index 0000000..58311e0
--- /dev/null
+++ b/cnas-require/src/main/resources/static/illumination.docx
Binary files differ
diff --git a/cnas-require/src/main/resources/static/internal-wastes.docx b/cnas-require/src/main/resources/static/internal-wastes.docx
new file mode 100644
index 0000000..7f03f75
--- /dev/null
+++ b/cnas-require/src/main/resources/static/internal-wastes.docx
Binary files differ
diff --git a/cnas-require/src/main/resources/static/power-stable.docx b/cnas-require/src/main/resources/static/power-stable.docx
new file mode 100644
index 0000000..69fe3b1
--- /dev/null
+++ b/cnas-require/src/main/resources/static/power-stable.docx
Binary files differ
diff --git a/cnas-require/src/main/resources/static/temp_hum_date.docx b/cnas-require/src/main/resources/static/temp_hum_date.docx
new file mode 100644
index 0000000..422869a
--- /dev/null
+++ b/cnas-require/src/main/resources/static/temp_hum_date.docx
Binary files differ
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysRoleMenuMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysRoleMenuMapper.java
index 6602bee..a30de23 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysRoleMenuMapper.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysRoleMenuMapper.java
@@ -1,7 +1,9 @@
 package com.ruoyi.system.mapper;
 
 import java.util.List;
+import org.apache.ibatis.annotations.Param;
 import com.ruoyi.system.domain.SysRoleMenu;
+import com.ruoyi.system.domain.vo.SysRoleVo;
 
 /**
  * 瑙掕壊涓庤彍鍗曞叧鑱旇〃 鏁版嵁灞�
@@ -41,4 +43,13 @@
      * @return 缁撴灉
      */
     public int batchRoleMenu(List<SysRoleMenu> roleMenuList);
+
+    /**
+     * 鏍规嵁鏉冮檺鏍囪瘑鍜岀敤鎴穒d鏌ヨ鏉冮檺
+     *
+     * @param permsName 鏉冮檺鏍囪瘑
+     * @param userId 鐢ㄦ埛ID
+     * @return 缁撴灉
+     */
+    public SysRoleVo selectRoleMenu(@Param("permsName") String permsName, @Param("userId") Long userId);
 }
diff --git a/ruoyi-system/src/main/resources/mapper/system/SysRoleMenuMapper.xml b/ruoyi-system/src/main/resources/mapper/system/SysRoleMenuMapper.xml
index cb60a85..58b0645 100644
--- a/ruoyi-system/src/main/resources/mapper/system/SysRoleMenuMapper.xml
+++ b/ruoyi-system/src/main/resources/mapper/system/SysRoleMenuMapper.xml
@@ -13,6 +13,19 @@
 	    select count(1) from sys_role_menu where menu_id = #{menuId}
 	</select>
 
+	<!-- 鏍规嵁鏉冮檺鏍囪瘑鍜岀敤鎴穒d鏌ヨ鏉冮檺 -->
+	<select id="selectRoleMenu" resultType="com.ruoyi.system.domain.vo.SysRoleVo">
+		select sm.perms,
+			   sm.menu_name,
+			   srm.is_rersonal
+		from sys_role_menu srm
+				 left join sys_menu sm on sm.menu_id = srm.menu_id
+				 left join sys_user_role sur on srm.role_id = sur.role_id
+		where sm.perms = #{permsName}
+		  and sur.user_id = #{userId}
+		group by sm.menu_id
+	</select>
+
 	<delete id="deleteRoleMenuByRoleId" parameterType="Long">
 		delete from sys_role_menu where role_id=#{roleId}
 	</delete>

--
Gitblit v1.9.3