From e8e73529983bf656d8aa6627215045f56cc27103 Mon Sep 17 00:00:00 2001
From: zhuo <2089219845@qq.com>
Date: 星期一, 24 二月 2025 11:01:00 +0800
Subject: [PATCH] Merge branch 'dev' into dev_ly

---
 cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonJobResponsibilitiesService.java              |   27 
 cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonJobResponsibilitiesDto.java                      |   16 
 cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonBasicInfoWorkService.java                    |   16 
 cnas-device/src/main/java/com/ruoyi/device/dto/DeviceInspectionRecordDto.java                               |   25 
 cnas-device/src/main/java/com/ruoyi/device/mqtt/MQConfig.java                                               |   64 
 cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceInspectionRecordServiceImpl.java              |  221 +
 cnas-personnel/src/main/resources/static/supervision-record.docx                                            |    0 
 cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonBasicInfoFileService.java                    |   16 
 ruoyi-system/src/main/java/com/ruoyi/system/mapper/DepartmentLimsMapper.java                                |   27 
 cnas-device/src/main/resources/mapper/DeviceAcceptanceMapper.xml                                            |   17 
 cnas-device/src/main/resources/static/word/examine-plan-detail.docx                                         |    0 
 cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonCommunicationAbilityService.java             |   25 
 cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceAcceptanceFileMapper.java                           |   16 
 cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceAccidentReport.java                                   |  120 
 cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceMetricsCopyMapper.java                              |   16 
 cnas-device/src/main/resources/static/word/device-document.docx                                             |    0 
 cnas-personnel/src/main/resources/static/person-basic-info.docx                                             |    0 
 cnas-device/src/main/resources/static/word/device-scrapped.docx                                             |    0 
 cnas-personnel/src/main/resources/static/supervision-control-sheet.docx                                     |    0 
 cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonJobResponsibilitiesController.java        |   60 
 cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonTraining.java                                   |   83 
 cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonTrainingRecordMapper.java                     |   67 
 cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonBasicInfo.java                                  |  156 
 cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonCommunicationAbility.java                       |   61 
 cnas-personnel/src/main/java/com/ruoyi/personnel/dto/TrainingRecordPersonDetailedDto.java                   |   26 
 cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceBorrow.java                                           |  133 
 cnas-device/src/main/resources/static/word/device-external-apply.docx                                       |    0 
 cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonRewardPunishmentRecordController.java     |  100 
 cnas-device/src/main/resources/static/word/device-inspection-record.docx                                    |    0 
 cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonJobResponsibilitiesServiceImpl.java     |  113 
 cnas-device/src/main/java/com/ruoyi/device/dto/DeviceBreakdownMaintenance.java                              |   90 
 cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonPostAuthorizationRecord.java                    |   74 
 cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceMaintenanceImpl.java                          |   86 
 cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceScrappedMapper.java                                 |   35 
 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-device/src/main/java/com/ruoyi/device/service/DeviceMaintenanceService.java                            |   24 
 pom.xml                                                                                                     |    8 
 cnas-device/src/main/resources/static/word/quipment-details.docx                                            |    0 
 cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceMetricsCopy.java                                      |   66 
 cnas-device/src/main/resources/static/word/traceability-management-details.docx                             |    0 
 cnas-device/src/main/resources/static/word/device-accident-report.docx                                      |    0 
 cnas-personnel/pom.xml                                                                                      |   46 
 cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonBasicInfoController.java                  |  229 +
 cnas-personnel/src/main/resources/static/credentials-deal.docx                                              |    0 
 cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceAcceptance.java                                       |   77 
 cnas-personnel/src/main/resources/mapper/PersonJobResponsibilitiesMapper.xml                                |   24 
 cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceAcceptanceMapper.java                               |   27 
 cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonRewardPunishmentRecordService.java           |   31 
 cnas-device/src/main/resources/static/word/use-record.docx                                                  |    0 
 cnas-device/src/main/java/com/ruoyi/device/mapper/OperationInstructionMapper.java                           |   20 
 cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonPostAuthorizationRecordServiceImpl.java |  132 
 cnas-device/src/main/java/com/ruoyi/device/service/CollectBridgeService.java                                |   21 
 cnas-device/src/main/resources/static/word/device-status.docx                                               |    0 
 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-personnel/src/main/resources/mapper/PersonRewardPunishmentRecordMapper.xml                             |   47 
 cnas-device/src/main/java/com/ruoyi/device/service/impl/CollectBridgeServiceImpl.java                       |  107 
 cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonTrainingDto.java                                 |   23 
 cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonRewardPunishmentRecordDto.java                   |   14 
 cnas-personnel/src/main/resources/static/person-training.docx                                               |    0 
 cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceBorrowServiceImpl.java                        |  116 
 cnas-personnel/src/main/resources/mapper/PersonPersonnelCapacityMapper.xml                                  |  118 
 cnas-personnel/src/main/java/com/ruoyi/personnel/excel/PersonRewardPunishmentRecordExcel.java               |   34 
 cnas-device/src/main/java/com/ruoyi/device/controller/DeviceTraceabilityManagementController.java           |    2 
 cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonPersonnelCapacityService.java                |   35 
 cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonRewardPunishmentRecordMapper.java             |   26 
 cnas-device/src/main/java/com/ruoyi/device/service/DeviceInstructionService.java                            |   23 
 cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonBasicInfoWork.java                              |   53 
 cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceInspectionRecordMapper.java                         |   28 
 cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonTrainingDetailedFile.java                       |   49 
 ruoyi-admin/src/main/java/com/ruoyi/web/MqttApplicationRunner.java                                          |   29 
 cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonTrainingRecordListDto.java                       |   37 
 cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonPostAuthorizationRecordController.java    |   66 
 cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonTrainingDetailedDto.java                         |   29 
 cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonBasicInfoWorkServiceImpl.java           |   20 
 cnas-personnel/src/main/resources/mapper/PersonPostAuthorizationRecordMapper.xml                            |   23 
 cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonTrainingMapper.java                           |   20 
 cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonPostAuthorizationRecordService.java          |   27 
 cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonTrainingServiceImpl.java                |  429 ++
 cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonTrainingDetailed.java                           |   99 
 cnas-device/src/main/java/com/ruoyi/device/mapper/InstructionMapper.java                                    |   23 
 cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceInspectionRecord.java                                 |   93 
 cnas-manage/src/main/java/com/ruoyi/manage/controller/ClientSatisfactionController.java                     |    4 
 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-personnel/src/main/java/com/ruoyi/personnel/dto/UserPageDto.java                                       |   24 
 cnas-device/src/main/java/com/ruoyi/device/controller/DeviceScrappedController.java                         |   82 
 cnas-device/src/main/resources/static/word/maintenance-plan.docx                                            |    0 
 cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceAcceptanceServiceImpl.java                    |  159 
 cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceState.java                                            |  107 
 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/static/word/maintenance-records.docx                                         |    0 
 cnas-device/src/main/java/com/ruoyi/device/controller/DeviceMaintenanceController.java                      |   98 
 cnas-personnel/src/main/resources/mapper/PersonCommunicationAbilityMapper.xml                               |   19 
 cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonPersonnelCapacity.java                          |  114 
 cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonPersonnelCapacityController.java          |   92 
 cnas-device/src/main/resources/static/word/device-calibration-plan.docx                                     |    0 
 cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonTrainingDetailedService.java                 |   29 
 cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonPostAuthorizationRecordMapper.java            |   20 
 ruoyi-admin/src/main/resources/application-druid.yml                                                        |   13 
 cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceAccidentReportServiceImpl.java                |  189 +
 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-personnel/src/main/java/com/ruoyi/personnel/service/impl/AnnexServiceImpl.java                         |   13 
 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-personnel/src/main/java/com/ruoyi/personnel/dto/PersonPersonnelCapacityExportDto.java                  |  101 
 cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonJobResponsibilities.java                        |   78 
 cnas-device/src/main/java/com/ruoyi/device/pojo/OperationInstruction.java                                   |   88 
 cnas-device/src/main/java/com/ruoyi/device/service/DeviceMetricRecordService.java                           |   16 
 cnas-personnel/src/main/resources/mapper/PersonTrainingRecordMapper.xml                                     |  126 
 cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceAcceptanceFile.java                                   |   58 
 cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonTrainingRecordServiceImpl.java          |  177 
 cnas-device/src/main/java/com/ruoyi/device/dto/DeviceOperationInstructionDto.java                           |   35 
 cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonPersonnelCapacityDto.java                        |   30 
 cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceInstructionServiceImpl.java                   |   67 
 cnas-personnel/src/main/resources/static/supervision-processing-sheet.docx                                  |    0 
 cnas-personnel/src/main/resources/static/communication-deal.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-device/src/main/resources/static/word/acceptance-certificate.docx                                      |    0 
 cnas-device/src/main/java/com/ruoyi/device/controller/DeviceMaintenancePlanController.java                  |    2 
 cnas-device/src/main/java/com/ruoyi/device/mqtt/MQCallback.java                                             |   93 
 cnas-personnel/src/main/java/com/ruoyi/personnel/dto/TrainingRecordExportDto.java                           |   32 
 cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonTrainingRecordDto.java                           |   23 
 cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceAcceptanceFileServiceImpl.java                |   20 
 cnas-device/src/main/java/com/ruoyi/device/service/DeviceBorrowService.java                                 |   28 
 cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonBasicInfoWorkMapper.java                      |   16 
 cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonBasicInfoService.java                        |   45 
 cnas-personnel/src/main/java/com/ruoyi/personnel/excel/PersonTrainingDetailedListener.java                  |   42 
 cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonTrainingDetailedMapper.java                   |   48 
 cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/AnnexMapper.java                                    |    9 
 cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonBasicInfoMapper.java                          |   42 
 cnas-device/src/main/java/com/ruoyi/device/service/DeviceAcceptanceService.java                             |   39 
 cnas-personnel/src/main/resources/static/explain-deal.docx                                                  |    0 
 cnas-device/src/main/java/com/ruoyi/device/mqtt/MQSubscribe.java                                            |   60 
 ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/DepartmentLims.java                          |   42 
 cnas-personnel/src/main/java/com/ruoyi/personnel/excel/PersonTrainingDetailedUpload.java                    |   35 
 cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/Annex.java                                            |   48 
 cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceInspectionRecordDetails.java                          |   63 
 cnas-device/src/main/java/com/ruoyi/device/controller/DeviceAccidentReportController.java                   |   84 
 cnas-device/src/main/java/com/ruoyi/device/service/DeviceInspectionRecordService.java                       |   69 
 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-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonTrainingRecord.java                             |   41 
 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/java/com/ruoyi/device/mapper/DeviceLogMapper.java                                      |    9 
 cnas-device/src/main/resources/mapper/DeviceAccidentReportMapper.xml                                        |   29 
 ruoyi-system/src/main/resources/mapper/system/DepartmentLimsMapper.xml                                      |   25 
 cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceInspectionRecordDetailsServiceImpl.java       |   20 
 cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceStateServiceImpl.java                         |  159 
 cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceScrappedServiceImpl.java                      |  179 
 cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceLog.java                                              |   29 
 cnas-device/src/main/resources/static/word/device-breakdown-maintenance.docx                                |    0 
 cnas-personnel/src/main/resources/static/person-training-record.docx                                        |    0 
 cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonBasicInfoFileServiceImpl.java           |   20 
 ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/DepartmentDto.java                           |   23 
 cnas-device/src/main/java/com/ruoyi/device/controller/DeviceMetricRecordController.java                     |   89 
 cnas-device/src/main/java/com/ruoyi/device/service/DeviceAcceptanceFileService.java                         |   17 
 cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceMetricRecordServiceImpl.java                  |   20 
 cnas-device/src/main/resources/mapper/OperationInstructionMapper.xml                                        |   13 
 cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonPostAuthorizationRecordDto.java                  |   14 
 ruoyi-common/src/main/java/com/ruoyi/common/utils/FileSaveUtil.java                                         |  179 
 cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonBasicInfoDetailsDto.java                         |   65 
 cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonJobResponsibilitiesMapper.java                |   20 
 cnas-personnel/src/main/resources/mapper/PersonBasicInfoMapper.xml                                          |   65 
 ruoyi-common/src/main/java/com/ruoyi/common/utils/MyUtil.java                                               |   17 
 cnas-personnel/src/main/resources/static/personnel-capacity.docx                                            |    0 
 cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonRewardPunishmentRecord.java                     |   61 
 cnas-device/src/main/java/com/ruoyi/device/dto/DeviceAccidentReportDto.java                                 |   31 
 cnas-device/src/main/resources/static/word/incident-report.docx                                             |    0 
 cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonRewardPunishmentRecordServiceImpl.java  |   36 
 cnas-device/src/main/java/com/ruoyi/device/dto/DeviceMetricRecordDto.java                                   |   13 
 cnas-device/src/main/resources/static/word/review-examine-record-contrast.docx                              |    0 
 cnas-device/src/main/java/com/ruoyi/device/mqtt/MQBean.java                                                 |   14 
 cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonPersonnelCapacityServiceImpl.java       |  158 
 cnas-device/src/main/java/com/ruoyi/device/task/DeviceRecordSchedule.java                                   |   65 
 cnas-device/src/main/resources/mapper/DeviceInspectionRecordMapper.xml                                      |   14 
 cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceScrapped.java                                         |  105 
 cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceInspectionRecordDetailsMapper.java                  |   16 
 cnas-device/src/main/java/com/ruoyi/device/mqtt/MQClient.java                                               |   97 
 cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceAccidentReportMapper.java                           |   35 
 cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceBorrowMapper.java                                   |   25 
 cnas-device/src/main/resources/mapper/InstructionMapper.xml                                                 |   19 
 cnas-device/pom.xml                                                                                         |   17 
 cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonPersonnelCapacityMapper.java                  |   29 
 cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonCommunicationAbilityServiceImpl.java    |  113 
 cnas-device/src/main/java/com/ruoyi/device/mqtt/MQPublic.java                                               |   69 
 cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonBasicInfoFile.java                              |   58 
 cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonTrainingRecordService.java                   |   59 
 cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonTrainingService.java                         |   63 
 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-device/src/main/resources/mapper/DeviceScrappedMapper.xml                                              |   27 
 cnas-personnel/src/main/resources/static/training-record.docx                                               |    0 
 cnas-device/src/main/java/com/ruoyi/device/service/DeviceAccidentReportService.java                         |   41 
 cnas-device/src/main/java/com/ruoyi/device/excel/DeviceStateExport.java                                     |   36 
 cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonBasicInfoWorkDto.java                            |   16 
 cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceInstruction.java                                      |   64 
 cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceBreakdownMaintenanceServiceImpl.java          |  152 
 cnas-personnel/src/main/java/com/ruoyi/personnel/service/AnnexService.java                                  |    7 
 cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonBasicInfoServiceImpl.java               |  340 +
 cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceBreakdownMaintenanceMapper.java                     |   27 
 cnas-personnel/src/main/resources/static/super-vise-plan.docx                                               |    0 
 cnas-device/src/main/java/com/ruoyi/device/controller/DeviceBorrowController.java                           |   73 
 cnas-device/src/main/java/com/ruoyi/device/dto/DeviceStateDto.java                                          |   32 
 ruoyi-admin/pom.xml                                                                                         |    7 
 cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonBasicInfoFileMapper.java                      |   16 
 cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceStateMapper.java                                    |   20 
 cnas-device/src/main/java/com/ruoyi/device/controller/DeviceInspectionRecordController.java                 |   99 
 cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonCommunicationAbilityController.java       |   61 
 cnas-device/src/main/java/com/ruoyi/device/controller/DeviceInstructionController.java                      |  103 
 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/resources/mapper/DeviceStateMapper.xml                                                 |   19 
 cnas-device/src/main/java/com/ruoyi/device/service/DeviceBreakdownMaintenanceService.java                   |   41 
 cnas-device/src/main/java/com/ruoyi/device/service/DeviceOperationInstructionService.java                   |   20 
 221 files changed, 10,974 insertions(+), 4 deletions(-)

diff --git a/cnas-device/pom.xml b/cnas-device/pom.xml
index 4aee7af..74dbc21 100644
--- a/cnas-device/pom.xml
+++ b/cnas-device/pom.xml
@@ -18,6 +18,23 @@
             <groupId>com.ruoyi</groupId>
             <artifactId>inspect-server</artifactId>
         </dependency>
+
+        <!--mqtt jar鍖�-->
+        <!-- https://mvnrepository.com/artifact/org.springframework.integration/spring-integration-mqtt -->
+        <dependency>
+            <groupId>org.springframework.integration</groupId>
+            <artifactId>spring-integration-mqtt</artifactId>
+        </dependency>
+        <!--mqtt闇�瑕佺殑jar鍖�-->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-integration</artifactId>
+        </dependency>
+        <!--mqtt闇�瑕佺殑jar鍖�-->
+        <dependency>
+            <groupId>org.springframework.integration</groupId>
+            <artifactId>spring-integration-stream</artifactId>
+        </dependency>
     </dependencies>
 
     <properties>
diff --git a/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceAcceptanceController.java b/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceAcceptanceController.java
new file mode 100644
index 0000000..d77575d
--- /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.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 璁惧楠屾敹(瑁呭) 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-20 01:45:14
+ */
+@Api(tags = "璁惧楠屾敹(瑁呭)")
+@AllArgsConstructor
+@RestController
+@RequestMapping("/deviceAcceptance")
+public class DeviceAcceptanceController {
+
+    private DeviceAcceptanceService deviceAcceptanceService;
+    private DeviceAcceptanceFileService deviceAcceptanceFileService;
+
+    /**
+     * 璁惧楠屾敹鍒楄〃
+     * @return
+     */
+    @ApiOperation(value = "璁惧楠屾敹鍒楄〃")
+    @GetMapping("/pageDeviceAcceptance")
+    public Result<IPage<DeviceAcceptance>> pageDeviceAcceptance(Page page, DeviceAcceptance deviceAcceptance) {
+        return Result.success(deviceAcceptanceService.pageDeviceAcceptance(page, deviceAcceptance));
+    }
+
+    /**
+     * 鏌ヨ璁惧楠屾敹
+     * @return
+     */
+    @ApiOperation(value = "鏌ヨ璁惧楠屾敹")
+    @GetMapping("/getDeviceAcceptance")
+    public Result getDeviceAcceptance(Integer acceptanceId){
+        return Result.success(deviceAcceptanceService.getById(acceptanceId));
+    }
+
+    /**
+     * 鍒犻櫎璁惧楠屾敹
+     * @return
+     */
+    @ApiOperation(value = "鍒犻櫎璁惧楠屾敹")
+    @DeleteMapping("/delDeviceAcceptance")
+    public Result delDeviceAcceptance(Integer acceptanceId){
+        return Result.success(deviceAcceptanceService.removeById(acceptanceId));
+    }
+
+    /**
+     * 鏂板璁惧楠屾敹
+     * @return
+     */
+    @ApiOperation(value = "鏂板璁惧楠屾敹")
+    @PostMapping("/addDeviceAcceptance")
+    public Result addDeviceAcceptance(@RequestBody DeviceAcceptance deviceAcceptance){
+        return Result.success(deviceAcceptanceService.save(deviceAcceptance));
+    }
+
+    /**
+     * 鏂板璁惧楠屾敹
+     * @return
+     */
+    @ApiOperation(value = "缂栬緫璁惧楠屾敹")
+    @PostMapping("/updateDeviceAcceptance")
+    public Result updateDeviceAcceptance(@RequestBody DeviceAcceptance deviceAcceptance){
+        return Result.success(deviceAcceptanceService.updateById(deviceAcceptance));
+    }
+
+    /**
+     * 璁惧楠屾敹瀵煎嚭
+     * @param acceptanceId  璁惧楠屾敹id
+     * @param response   鍝嶅簲浣�
+     * @return
+     */
+    @ApiOperation(value = "璁惧楠屾敹瀵煎嚭")
+    @GetMapping("/exportDeviceAcceptance")
+    public void exportDeviceAcceptance(Integer acceptanceId, HttpServletResponse response){
+        deviceAcceptanceService.exportDeviceAcceptance(acceptanceId, response);
+    }
+
+    /**
+     * 璁惧楠屾敹闄勪欢鏂板
+     * @param acceptanceId
+     * @param file
+     * @return
+     */
+    @ApiOperation(value = "璁惧楠屾敹闄勪欢鏂板")
+    @PostMapping("/uploadDeviceAcceptanceFile")
+    public Result<?> uploadDeviceAcceptanceFile(Integer acceptanceId, MultipartFile file) {
+        return Result.success(deviceAcceptanceService.uploadDeviceAcceptanceFile(acceptanceId, file));
+    }
+
+
+    /**
+     * 璁惧楠屾敹闄勪欢鍒楄〃
+     * @return
+     */
+    @ApiOperation(value = "璁惧楠屾敹闄勪欢鍒楄〃")
+    @GetMapping("/getDeviceAcceptanceFileList")
+    public Result<List<DeviceAcceptanceFile>> getVerifyMethodFileList(Integer acceptanceId){
+        return Result.success(deviceAcceptanceFileService.list(Wrappers.<DeviceAcceptanceFile>lambdaQuery()
+                .eq(DeviceAcceptanceFile::getAcceptanceId, acceptanceId)));
+    }
+
+    /**
+     * 璁惧楠屾敹闄勪欢鍒犻櫎
+     * @return
+     */
+    @ApiOperation(value = "璁惧楠屾敹闄勪欢鍒犻櫎")
+    @GetMapping("/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..22a216b
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceAccidentReportController.java
@@ -0,0 +1,84 @@
+package com.ruoyi.device.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.device.pojo.DeviceAccidentReport;
+import com.ruoyi.device.service.DeviceAccidentReportService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.Map;
+
+/**
+ * <p>
+ * 璁惧浜嬫晠鎶ュ憡鍗� 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-17 06:31:12
+ */
+@Api(tags = "璁惧浜嬫晠鎶ュ憡鍗�")
+@AllArgsConstructor
+@RestController
+@RequestMapping("/deviceAccidentReport")
+public class DeviceAccidentReportController {
+
+    private DeviceAccidentReportService deviceAccidentReportService;
+
+
+    /**
+     * 璁惧浜嬫晠鎶ュ憡鍒楄〃
+     * @return
+     */
+    @ApiOperation(value = "璁惧浜嬫晠鎶ュ憡鍒楄〃")
+    @GetMapping("/pageDeviceAccidentReport")
+    public Result<IPage<DeviceAccidentReport>> pageDeviceAccidentReport(Page page, DeviceAccidentReport deviceAccidentReport){
+        return Result.success(deviceAccidentReportService.pageDeviceAccidentReport(page, deviceAccidentReport));
+    }
+
+    /**
+     * 鏌ヨ璁惧浜嬫晠鎶ュ憡
+     * @return
+     */
+    @ApiOperation(value = "鏌ヨ璁惧浜嬫晠鎶ュ憡")
+    @GetMapping("/getDeviceAccidentReport")
+    public Result getDeviceAccidentReport(Integer accidentReportId){
+        return Result.success(deviceAccidentReportService.getById(accidentReportId));
+    }
+
+    /**
+     * 鍒犻櫎璁惧浜嬫晠鎶ュ憡
+     * @return
+     */
+    @ApiOperation(value = "鍒犻櫎璁惧浜嬫晠鎶ュ憡")
+    @DeleteMapping("/delDeviceAccidentReport")
+    public Result delDeviceAccidentReport(Integer accidentReportId){
+        return Result.success(deviceAccidentReportService.removeById(accidentReportId));
+    }
+
+    /**
+     * 鏂板璁惧浜嬫晠鎶ュ憡
+     * @return
+     */
+    @ApiOperation(value = "鏂板璁惧浜嬫晠鎶ュ憡")
+    @PostMapping("/addDeviceAccidentReport")
+    public Result addDeviceAccidentReport(@RequestBody DeviceAccidentReport deviceAccidentReport){
+        return Result.success(deviceAccidentReportService.addDeviceAccidentReport(deviceAccidentReport));
+    }
+
+    /**
+     * 瀵煎嚭璁惧浜嬫晠鎶ュ憡
+     * @param accidentReportId 璁惧浜嬫晠鎶ュ憡id
+     * @param response 鍝嶅簲
+     */
+    @ApiOperation(value = "瀵煎嚭璁惧浜嬫晠鎶ュ憡")
+    @GetMapping("/exportDeviceAccidentReport")
+    public Result exportDeviceAccidentReport(Integer accidentReportId, HttpServletResponse response) {
+        deviceAccidentReportService.exportDeviceAccidentReport(accidentReportId, response);
+        return Result.success();
+    }
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceBorrowController.java b/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceBorrowController.java
new file mode 100644
index 0000000..6be1b18
--- /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 javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ *  鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-09-21 10:53:51
+ */
+@RestController
+@RequestMapping("/deviceBorrow")
+public class DeviceBorrowController {
+
+    @Resource
+    private DeviceBorrowService deviceBorrowService;
+
+
+    //鍒嗛〉
+    @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..f86dd9c
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceBreakdownMaintenanceController.java
@@ -0,0 +1,85 @@
+package com.ruoyi.device.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.device.dto.DeviceBreakdownMaintenance;
+import com.ruoyi.device.service.DeviceBreakdownMaintenanceService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.Map;
+
+/**
+ * <p>
+ * 璁惧鏁呴殰缁翠慨琛� 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-17 04:50:57
+ */
+@Api(tags = "璁惧鏁呴殰缁翠慨琛�")
+@AllArgsConstructor
+@RestController
+@RequestMapping("/deviceBreakdownMaintenance")
+public class DeviceBreakdownMaintenanceController {
+
+    private DeviceBreakdownMaintenanceService deviceBreakdownMaintenanceService;
+
+
+    /**
+     * 璁惧鏁呴殰缁翠慨鍒楄〃
+     * @return
+     */
+    @ApiOperation(value = "璁惧鏁呴殰缁翠慨鍒楄〃")
+    @GetMapping("/pageDeviceBreakdownMaintenance")
+    public Result<IPage<DeviceBreakdownMaintenance>> pageDeviceBreakdownMaintenance(Page page, DeviceBreakdownMaintenance deviceBreakdownMaintenance) {
+        return Result.success(deviceBreakdownMaintenanceService.pageDeviceBreakdownMaintenance(page, deviceBreakdownMaintenance));
+    }
+
+    /**
+     * 鏌ヨ璁惧鏁呴殰缁翠慨
+     * @return
+     */
+    @ApiOperation(value = "鏌ヨ璁惧鏁呴殰缁翠慨")
+    @GetMapping("/getDeviceBreakdownMaintenance")
+    public Result getDeviceBreakdownMaintenance(Integer maintenanceId){
+        return Result.success(deviceBreakdownMaintenanceService.getById(maintenanceId));
+    }
+
+    /**
+     * 鍒犻櫎璁惧鏁呴殰缁翠慨
+     * @return
+     */
+    @ApiOperation(value = "鍒犻櫎璁惧鏁呴殰缁翠慨")
+    @DeleteMapping("/delDeviceBreakdownMaintenance")
+    public Result delDeviceBreakdownMaintenance(Integer maintenanceId){
+        return Result.success(deviceBreakdownMaintenanceService.removeById(maintenanceId));
+    }
+
+    /**
+     * 鏂板璁惧鏁呴殰缁翠慨
+     * @return
+     */
+    @ApiOperation(value = "鏂板璁惧鏁呴殰缁翠慨")
+    @PostMapping("/addDeviceBreakdownMaintenance")
+    public Result addDeviceBreakdownMaintenance(@RequestBody DeviceBreakdownMaintenance deviceBreakdownMaintenance){
+        return Result.success(deviceBreakdownMaintenanceService.addDeviceBreakdownMaintenance(deviceBreakdownMaintenance));
+    }
+
+    /**
+     * 瀵煎嚭璁惧鏁呴殰缁翠慨
+     * @param maintenanceId 璁惧鏁呴殰缁翠慨id
+     * @param response 鍝嶅簲
+     * @return
+     */
+    @ApiOperation(value = "瀵煎嚭璁惧鏁呴殰缁翠慨")
+    @GetMapping("/exportDeviceBreakdownMaintenance")
+    public Result exportDeviceBreakdownMaintenance(Integer maintenanceId, HttpServletResponse response){
+        deviceBreakdownMaintenanceService.exportDeviceBreakdownMaintenance(maintenanceId, response);
+        return Result.success();
+    }
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceInspectionRecordController.java b/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceInspectionRecordController.java
new file mode 100644
index 0000000..9db6182
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceInspectionRecordController.java
@@ -0,0 +1,99 @@
+package com.ruoyi.device.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.device.dto.DeviceInspectionRecordDto;
+import com.ruoyi.device.pojo.DeviceInspectionRecord;
+import com.ruoyi.device.service.DeviceInspectionRecordService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.SneakyThrows;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import java.util.Map;
+
+/**
+ * <p>
+ *  璁惧鐐规璁板綍琛�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-16 04:25:14
+ */
+@Api(tags = "璁惧鐐规璁板綍")
+@RestController
+@RequestMapping("/deviceInspectionRecord")
+public class DeviceInspectionRecordController {
+    @Resource
+    private DeviceInspectionRecordService deviceInspectionRecordService;
+
+    /**
+     * 鍒嗛〉鏌ヨ璁惧鐐规璁板綍
+     */
+    @ApiOperation("鍒嗛〉鏌ヨ璁惧鐐规璁板綍")
+    @GetMapping("/getDeviceInspectionRecordByPage")
+    public Result<IPage<DeviceInspectionRecord>> getDeviceInspectionRecordByPage(IPage page, DeviceInspectionRecordDto itemParameter) {
+        return deviceInspectionRecordService.getDeviceInspectionRecordByPage(page, itemParameter);
+    }
+
+    /**
+     * 鏌ヨ鐐规璇︽儏
+     */
+    @ApiOperation("鏌ヨ鐐规璇︽儏")
+    @GetMapping("/getDeviceInspectionRecord")
+    public Result getDeviceInspectionRecord(Integer inspectionRecordId) {
+        return deviceInspectionRecordService.getDeviceInspectionRecord(inspectionRecordId);
+    }
+
+    /**
+     * 鏂板璁惧鐐规璁板綍
+     * @param deviceInspectionRecord  璁惧鐐规璁板綍
+     */
+    @ApiOperation("鏂板璁惧鐐规璁板綍")
+    @PostMapping("/addDeviceInspectionRecord")
+    public Result addDeviceInspectionRecord(@RequestBody DeviceInspectionRecordDto deviceInspectionRecord) {
+        return deviceInspectionRecordService.addDeviceInspectionRecord(deviceInspectionRecord);
+    }
+
+    /**
+     * 淇敼璁惧鐐规璁板綍
+     */
+    @ApiOperation("淇敼璁惧鐐规璁板綍")
+    @PostMapping("/updateDeviceInspectionRecord")
+    public Result updateDeviceInspectionRecord(@RequestBody DeviceInspectionRecordDto deviceInspectionRecord) {
+        return deviceInspectionRecordService.updateInspectionRecordAndDetails(deviceInspectionRecord);
+    }
+
+    /**
+     * 鍒犻櫎璁惧鐐规璁板綍
+     */
+    @ApiOperation("鍒犻櫎璁惧鐐规璁板綍")
+    @DeleteMapping("/deleteDeviceInspectionRecord")
+    public Result deleteDeviceInspectionRecord(DeviceInspectionRecordDto deviceInspectionRecord) {
+        return deviceInspectionRecordService.deleteDeviceInspectionRecordOrDetails(deviceInspectionRecord);
+    }
+
+
+    /**
+     * 澶嶆牳鐐规璁板綍
+     * @return
+     */
+    @ApiOperation(value = "澶嶆牳鏍告煡璁板綍")
+    @PostMapping("/reviewDeviceInspectionRecord")
+    public Result reviewDeviceInspectionRecord(@RequestBody DeviceInspectionRecordDto deviceExamineRecordDto){
+        return deviceInspectionRecordService.reviewDeviceInspectionRecord(deviceExamineRecordDto);
+    }
+
+
+    /**
+     * 瀵煎嚭璁惧鐐规璁板綍
+     */
+    @ApiOperation("瀵煎嚭璁惧鐐规璁板綍")
+    @GetMapping("/exportDeviceInspectionRecord")
+    public Result exportDeviceInspectionRecord(@RequestParam("inspectionRecordId") Integer inspectionRecordId, HttpServletResponse response) {
+        return deviceInspectionRecordService.exportDeviceInspectionRecord(inspectionRecordId, response);
+    }
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceInstructionController.java b/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceInstructionController.java
new file mode 100644
index 0000000..a4af938
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceInstructionController.java
@@ -0,0 +1,103 @@
+package com.ruoyi.device.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.device.dto.DeviceInstructionDto;
+import com.ruoyi.device.dto.DeviceOperationInstructionDto;
+import com.ruoyi.device.pojo.DeviceInstruction;
+import com.ruoyi.device.pojo.OperationInstruction;
+import com.ruoyi.device.service.DeviceInstructionService;
+import com.ruoyi.device.service.DeviceOperationInstructionService;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.time.LocalDateTime;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 浣滀笟鎸囧涔︽坊鍔犲彈鎺ф枃浠惰〃 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-12-04 10:29:18
+ */
+@RestController
+@RequestMapping("/deviceInstruction")
+public class DeviceInstructionController {
+
+    @Autowired
+    private DeviceInstructionService deviceInstructionService;
+
+    @Autowired
+    private DeviceOperationInstructionService deviceOperationInstructionService;
+
+
+    @ApiOperation(value = "浣滀笟鎸囧涔� 鍒嗛〉")
+    @GetMapping("/pageByPageQueryOfHomeworkInstructions")
+    public Result<IPage<DeviceInstruction>> pageByPageQueryOfHomeworkInstructions(Page page, DeviceOperationInstructionDto operationInstructionDto){
+        return Result.success(deviceInstructionService.pageByPageQueryOfHomeworkInstructions(page, operationInstructionDto));
+    }
+
+    @ApiOperation(value = "浣滀笟鎸囧涔︽柊澧�")
+    @PostMapping("/newHomeworkGuidebookAdded")
+    public Result newHomeworkGuidebookAdded(@RequestBody DeviceInstructionDto instructionDto){
+        deviceInstructionService.newHomeworkGuidebookAdded(instructionDto);
+        return Result.success();
+    }
+
+    @ApiOperation(value = "浣滀笟鎸囧涔︾紪杈�")
+    @GetMapping("/homeworkGuidebookEditor")
+    public Result<Map<String, Object>> homeworkGuidebookEditor(Integer instructionId){
+        DeviceInstruction instruction = deviceInstructionService.getById(instructionId);
+        List<DeviceOperationInstructionDto> list = deviceOperationInstructionService.homeworkGuidebookEditor(instructionId);
+        HashMap<String, Object> map = new HashMap<>();
+        map.put("list", list);
+        map.put("instruction", instruction);
+        return Result.success(map);
+    }
+
+    @ApiOperation(value = "浣滀笟鎸囧涔﹀彈鎺ф枃浠跺垹闄�")
+    @GetMapping("/deleteHomeworkGuidebook")
+    public Result deleteHomeworkGuidebook(String ids){
+        if (ObjectUtils.isNotEmpty(ids)) {
+            String[] idArray = ids.split(",");
+            deviceOperationInstructionService.removeBatchByIds(Arrays.asList(idArray));
+        }
+        return Result.success();
+    }
+
+    @ApiOperation(value = "浣滀笟鎸囧涔﹀垹闄�")
+    @GetMapping("/homeworkGuidebook")
+    public Result homeworkGuidebook(String id, String instructionId){
+        // 鍒犻櫎瀛愯〃鏁版嵁
+        deviceOperationInstructionService.removeById(id);
+        // 濡傛灉瀛愯〃鏁版嵁涓虹┖
+        long count = deviceOperationInstructionService.count(Wrappers.<OperationInstruction>lambdaQuery()
+                .eq(OperationInstruction::getInstructionId, instructionId));
+        // 閭d箞灏卞垹闄ょ埗琛ㄦ暟鎹�
+        if (count < 1) {
+            deviceInstructionService.removeById(id);
+        }
+        return Result.success();
+    }
+
+    @ApiOperation(value = "浣滀笟鎸囧涔﹀鎵�")
+    @GetMapping("/approvalOfHomeworkInstructionManual")
+    public Result approvalOfHomeworkInstructionManual(String id, Boolean status){
+        deviceOperationInstructionService.update(Wrappers.<OperationInstruction>lambdaUpdate()
+                .eq(OperationInstruction::getId, id)
+                .set(OperationInstruction::getStatus, status)
+                .set(OperationInstruction::getApproverId, SecurityUtils.getUserId().intValue())
+                .set(OperationInstruction::getEntryIntoForceTime, LocalDateTime.now()));
+        return Result.success();
+    }
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceMaintenanceController.java b/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceMaintenanceController.java
new file mode 100644
index 0000000..9420f41
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceMaintenanceController.java
@@ -0,0 +1,98 @@
+package com.ruoyi.device.controller;
+
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.write.metadata.style.WriteCellStyle;
+import com.alibaba.excel.write.style.HorizontalCellStyleStrategy;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.common.numgen.NumberGenerator;
+import com.ruoyi.device.excel.DeviceMaintenanceExport;
+import com.ruoyi.device.pojo.DeviceMaintenance;
+import com.ruoyi.device.service.DeviceMaintenanceService;
+import io.swagger.annotations.ApiOperation;
+import org.apache.poi.ss.usermodel.HorizontalAlignment;
+import org.apache.poi.ss.usermodel.VerticalAlignment;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.List;
+import java.util.Locale;
+
+/**
+ * todo: 瀛欐渤婊�
+ */
+@RestController
+@RequestMapping("/device-maintain")
+public class DeviceMaintenanceController {
+
+    @Autowired
+    private DeviceMaintenanceService deviceMaintenanceService;
+
+    @Autowired
+    private NumberGenerator<DeviceMaintenance> numberGenerator;
+    //澧�
+    @PostMapping()
+    public Result create(@RequestBody DeviceMaintenance deviceMaintenance){
+        String year = new SimpleDateFormat("yy", Locale.CHINESE).format(new Date());
+        String month = new SimpleDateFormat("MM", Locale.CHINESE).format(new Date());
+        String processNumber = numberGenerator.generateNumberWithPrefix(3, "DG-TC-23FM " + month + "-" + year + month, DeviceMaintenance::getDeviceNumber);
+        deviceMaintenance.setDeviceNumber(processNumber);
+        return Result.success(deviceMaintenanceService.save(deviceMaintenance));
+    }
+
+    //閫氳繃deviceId鏌ヨ缁存姢鏁版嵁
+    @GetMapping("/getDeviceMaintenancePage")
+    public Result getDeviceMaintenancePage(@RequestParam("deviceId") Integer deviceId, Page page, String deviceNumber){
+        return Result.success(deviceMaintenanceService.getDeviceMaintenancePage(page, deviceId, deviceNumber));
+    }
+
+    //鍒�
+    @DeleteMapping("/delete/{id}")
+    public void deleteDeviceFault(@PathVariable Integer id) {
+        deviceMaintenanceService.removeById(id);
+    }
+
+    @GetMapping("/deviceMaintenanceExport")
+    public Result deviceMaintenanceExport(@RequestParam("deviceId") Integer deviceId, HttpServletResponse response) throws IOException {
+        List<DeviceMaintenanceExport> list = deviceMaintenanceService.deviceMaintenanceExport(deviceId);
+        response.setHeader("requestType","excel");
+        response.setHeader("Access-Control-Expose-Headers", "requestType");
+        // 璁剧疆鍗曞厓鏍兼牱寮�
+        // 淇濆瓨鍒扮涓�涓猻heet涓�
+        EasyExcel.write(response.getOutputStream())
+                .head(DeviceMaintenanceExport.class)
+                .registerWriteHandler(getHorizontalCellStyleStrategy((short) 12))
+                .sheet()
+                .doWrite(list);
+        return Result.success();
+    }
+
+    @ApiOperation(value = "璁惧缁存姢璁板綍瀵煎嚭")
+    @GetMapping("/exportMaintenanceRecord")
+    public void exportMaintenanceRecord(@RequestParam("deviceId") Integer deviceId, HttpServletResponse response) throws Exception {
+        deviceMaintenanceService.exportMaintenanceRecord(deviceId, response);
+    }
+
+    /**
+     * 鍗曞厓鏍兼牱寮忕瓥鐣�
+     */
+    public static HorizontalCellStyleStrategy getHorizontalCellStyleStrategy(Short fontHeightInPoints) {
+        // 鍐呭鐨勭瓥鐣�
+        WriteCellStyle contentWriteCellStyle = new WriteCellStyle();
+
+        // 銆愭按骞冲眳涓渶瑕佷娇鐢ㄤ互涓嬩袱琛屻��
+        // 璁剧疆鏂囧瓧宸﹀彸灞呬腑
+        contentWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);
+        // 璁剧疆鏂囧瓧涓婁笅灞呬腑
+        contentWriteCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
+        // 璁剧疆 鑷姩鎹㈣
+        contentWriteCellStyle.setWrapped(true);
+
+        // 鏍峰紡绛栫暐
+        return new HorizontalCellStyleStrategy(null, contentWriteCellStyle);
+    }
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceMaintenancePlanController.java b/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceMaintenancePlanController.java
index 9ee8ffe..4052858 100644
--- a/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceMaintenancePlanController.java
+++ b/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceMaintenancePlanController.java
@@ -65,7 +65,7 @@
      * @param deviceMaintenancePlanDto 璁惧淇濆吇璁″垝
      */
     @ApiOperation("鍒犻櫎璁惧淇濆吇璁″垝")
-    @GetMapping("/deleteMaintenancePlan")
+    @DeleteMapping("/deleteMaintenancePlan")
     public Result deleteMaintenancePlan(DeviceMaintenancePlanDto deviceMaintenancePlanDto) {
         return deviceMaintenancePlanService.deleteMaintenancePlan(deviceMaintenancePlanDto);
     }
diff --git a/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceMetricRecordController.java b/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceMetricRecordController.java
new file mode 100644
index 0000000..67ce760
--- /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.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.Locale;
+
+/**
+ * <p>
+ * 璁惧鏍″噯 - 鏍″噯璁板綍 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-09-27 10:20:01
+ */
+@Api(tags = "璁惧 - 璁惧鏍″噯")
+@RestController
+@RequestMapping("/deviceMetricRecord")
+public class DeviceMetricRecordController {
+
+    @Autowired
+    private DeviceMetricRecordService deviceMetricRecordService;
+
+    @Autowired
+    private DeviceMetricsCopyService deviceMetricsCopyService;
+
+    @Autowired
+    private NumberGenerator<DeviceMetricRecord> numberGenerator;
+
+    @ApiOperation("璁惧鏍″噯鍒嗛〉鏌ヨ")
+    @GetMapping("/deviceMetricRecordPage")
+    public Result deviceMetricRecordPage(@RequestParam("deviceId") Integer deviceId, Page page, @RequestParam("type") String type) {
+        return Result.success(deviceMetricRecordService.page(page, Wrappers.<DeviceMetricRecord>lambdaQuery()
+                .eq(DeviceMetricRecord::getDeviceId, deviceId)
+                .eq(DeviceMetricRecord::getType, type)));
+    }
+
+    @ApiOperation("璁惧鏍″噯 鏂板 鏇存柊")
+    @PostMapping("/addOrUpdateDeviceMetricRecord")
+    public Result addOrUpdateDeviceMetricRecord(@RequestBody DeviceMetricRecordDto deviceMetricRecordDto) {
+        if (ObjectUtils.isEmpty(deviceMetricRecordDto.getProcessNumber())) {
+            String year = new SimpleDateFormat("yy", Locale.CHINESE).format(new Date());
+            String month = new SimpleDateFormat("MM", Locale.CHINESE).format(new Date());
+            String processNumber = numberGenerator.generateNumberWithPrefix(5, "SBJZ" + year + month, DeviceMetricRecord::getProcessNumber);
+            deviceMetricRecordDto.setProcessNumber(processNumber);
+        }
+        deviceMetricRecordService.saveOrUpdate(deviceMetricRecordDto);
+        if (CollectionUtils.isNotEmpty(deviceMetricRecordDto.getDeviceMetricsCopyList())) {
+            deviceMetricRecordDto.getDeviceMetricsCopyList().forEach(i -> i.setDeviceMetricsId(deviceMetricRecordDto.getId()));
+            deviceMetricsCopyService.saveOrUpdateBatch(deviceMetricRecordDto.getDeviceMetricsCopyList());
+        }
+        return Result.success();
+    }
+
+    @ApiOperation("璁惧鏍″噯 鍒犻櫎")
+    @DeleteMapping("/deleteDeviceMetricRecord")
+    public Result deleteDeviceMetricRecord(@RequestParam("id") Integer id) {
+        DeviceMetricRecord deviceMetricRecord = deviceMetricRecordService.getById(id);
+        deviceMetricsCopyService.remove(Wrappers.<DeviceMetricsCopy>lambdaQuery()
+                .eq(DeviceMetricsCopy::getDeviceMetricsId, id));
+        // 鍒犻櫎鏂囦欢
+        FileSaveUtil.DeleteFile(deviceMetricRecord.getSystemFileName());
+        return Result.success(deviceMetricRecordService.removeById(id));
+    }
+
+    @ApiOperation("璁惧鏍″噯 鏍″噯鏉$洰鏌ヨ")
+    @GetMapping("/showDeviceMetricsCopy")
+    public Result showDeviceMetricsCopy(@RequestParam("id") Integer id, @RequestParam("type") String type) {
+        return Result.success(deviceMetricsCopyService.list(Wrappers.<DeviceMetricsCopy>lambdaQuery()
+                .eq(DeviceMetricsCopy::getDeviceMetricsId, id)
+                .eq(DeviceMetricsCopy::getType, type)));
+    }
+}
diff --git a/cnas-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..95794eb
--- /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.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.Map;
+
+/**
+ * <p>
+ * 璁惧鎶ュ簾鐢宠琛� 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-17 01:53:47
+ */
+@Api(tags = "璁惧鎶ュ簾鐢宠琛�")
+@AllArgsConstructor
+@RestController
+@RequestMapping("/deviceScrapped")
+public class DeviceScrappedController {
+
+    private DeviceScrappedService deviceScrappedService;
+
+
+    /**
+     * 璁惧鎶ュ簾鐢宠鍒楄〃
+     * @return
+     */
+    @ApiOperation(value = "璁惧鎶ュ簾鐢宠鍒楄〃")
+    @GetMapping("/pageDeviceScrapped")
+    public Result<IPage<DeviceScrapped>> pageDeviceScrapped(Page page, DeviceScrapped deviceScrapped) {
+        return Result.success(deviceScrappedService.pageDeviceScrapped(page, deviceScrapped));
+    }
+
+    /**
+     * 鏌ヨ璁惧鎶ュ簾鐢宠
+     * @return
+     */
+    @ApiOperation(value = "鏌ヨ璁惧鎶ュ簾鐢宠")
+    @GetMapping("/getDeviceScrapped")
+    public Result getDeviceScrapped(Integer scrappedId){
+        return Result.success(deviceScrappedService.getById(scrappedId));
+    }
+
+    /**
+     * 鍒犻櫎璁惧鏍告煡璁″垝璇︽儏
+     * @return
+     */
+    @ApiOperation(value = "鍒犻櫎璁惧鎶ュ簾鐢宠")
+    @DeleteMapping("/delDeviceScrapped")
+    public Result delDeviceScrapped(Integer scrappedId){
+        return Result.success(deviceScrappedService.removeById(scrappedId));
+    }
+
+    /**
+     * 鏂板璁惧鎶ュ簾鐢宠
+     * @return
+     */
+    @ApiOperation(value = "鏂板璁惧鎶ュ簾鐢宠")
+    @PostMapping("/addDeviceScrapped")
+    public Result addDeviceScrapped(@RequestBody DeviceScrapped deviceScrapped){
+        return Result.success(deviceScrappedService.addDeviceScrapped(deviceScrapped));
+    }
+
+    /**
+     * 瀵煎嚭璁惧鎶ュ簾鐢宠
+     */
+    @ApiOperation("瀵煎嚭璁惧鎶ュ簾鐢宠")
+    @GetMapping("/exportDeviceScrapped")
+    public Result exportDeviceScrapped(Integer scrappedId, HttpServletResponse response) {
+        return deviceScrappedService.exportDeviceScrapped(scrappedId, response);
+    }
+
+}
diff --git a/cnas-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..4c73996
--- /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.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.List;
+import java.util.Locale;
+
+/**
+ * <p>
+ * 璁惧鍋滅敤/鍚敤 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-09-26 09:51:40
+ */
+@RestController
+@RequestMapping("/deviceState")
+public class DeviceStateController {
+
+    @Autowired
+    private DeviceStateService deviceStateService;
+
+    @Autowired
+    private NumberGenerator<DeviceState> numberGenerator;
+
+    @PostMapping("saveDeviceState")
+    public Result saveIncidentReportData(@RequestBody DeviceState deviceState) {
+        if (ObjectUtils.isEmpty(deviceState.getProcessNumber())) {
+            String year = new SimpleDateFormat("yy", Locale.CHINESE).format(new Date());
+            String month = new SimpleDateFormat("MM", Locale.CHINESE).format(new Date());
+            String processNumber = numberGenerator.generateNumberWithPrefix(3, "DG-TC-23FM " + month + "-" + year + month, DeviceState::getProcessNumber);
+            deviceState.setProcessNumber(processNumber);
+        }
+        deviceStateService.saveOrUpdate(deviceState);
+        return Result.success();
+    }
+
+    @GetMapping("/getDeviceStatePage")
+    public Result getDeviceStatePage(@RequestParam("deviceId") Integer deviceId, Page page, String processNumber){
+        return Result.success(deviceStateService.getDeviceStatePage(deviceId, page, processNumber));
+    }
+
+    @DeleteMapping("/deleteDeviceState")
+    public Result deleteDeviceState(@RequestParam("stateId") Integer stateId){
+        return Result.success(deviceStateService.removeById(stateId));
+    }
+
+    @PostMapping("/deviceStateExport")
+    public Result deviceStateExport(@RequestParam("deviceId") Integer deviceId, String processNumber, HttpServletResponse response) throws Exception {
+        IPage<DeviceStateDto> deviceBorrows = deviceStateService.getDeviceStatePage(deviceId, new Page<>(1, -1), processNumber);
+        List<DeviceStateExport> studentList  = JSONObject.parseArray(JSON.toJSONString(deviceBorrows.getRecords()), DeviceStateExport.class);
+        response.setHeader("requestType", "excel");
+        response.setHeader("Access-Control-Expose-Headers", "requestType");
+        // 璁剧疆鍗曞厓鏍兼牱寮�
+        // 淇濆瓨鍒扮涓�涓猻heet涓�
+        EasyExcel.write(response.getOutputStream())
+                .head(DeviceStateExport.class)
+                .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()) // 鑷�傚簲鍒楀
+                .sheet("sheet")
+                .doWrite(studentList);
+        return Result.success();
+    }
+
+    @ApiOperation(value = "璁惧鍚姩/鍋滄瀵煎嚭")
+    @GetMapping("/exportDeviceStatus")
+    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
index d1036ac..b506a92 100644
--- a/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceTraceabilityManagementController.java
+++ b/cnas-device/src/main/java/com/ruoyi/device/controller/DeviceTraceabilityManagementController.java
@@ -62,7 +62,7 @@
      * @param deviceTraceabilityManagementDto 閲忓�兼函婧愯鍒�
      */
     @ApiOperation("鍒犻櫎閲忓�兼函婧愯鍒�")
-    @GetMapping("/deleteTraceabilityManagement")
+    @DeleteMapping("/deleteTraceabilityManagement")
     public Result deleteTraceabilityManagement(DeviceTraceabilityManagementDto deviceTraceabilityManagementDto) {
         return deviceTraceabilityManagementService.deleteTraceabilityManagement(deviceTraceabilityManagementDto);
     }
diff --git a/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceAccidentReportDto.java b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceAccidentReportDto.java
new file mode 100644
index 0000000..41fa6e3
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceAccidentReportDto.java
@@ -0,0 +1,31 @@
+package com.ruoyi.device.dto;
+
+import com.ruoyi.device.pojo.DeviceAccidentReport;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * Author: yuan
+ * Date: 2024-12-18 鏄熸湡涓� 10:00:48
+ * Description:
+ */
+@Data
+public class DeviceAccidentReportDto extends DeviceAccidentReport {
+    @ApiModelProperty("鏃堕棿")
+    private String accidentDateStr;
+
+    @ApiModelProperty("鎶ュ憡浜哄~鍐欐椂闂�")
+    private String reportDateStr;
+
+    @ApiModelProperty("璇勪及浜哄~鍐欐椂闂�")
+    private String assessorDateStr;
+
+    @ApiModelProperty("閮ㄩ棬璐熻矗浜哄~鍐欐椂闂�")
+    private String departmentHeadDateStr;
+
+    @ApiModelProperty("鎶�鏈礋璐d汉濉啓鏃堕棿")
+    private String technicalDirectorDateStr;
+
+    @ApiModelProperty("涓讳换濉啓鏃堕棿")
+    private String directorHeadDateStr;
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceBreakdownMaintenance.java b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceBreakdownMaintenance.java
new file mode 100644
index 0000000..3d5ba22
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceBreakdownMaintenance.java
@@ -0,0 +1,90 @@
+package com.ruoyi.device.dto;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 璁惧鏁呴殰缁翠慨琛�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-17 04:50:57
+ */
+@Getter
+@Setter
+@TableName("device_breakdown_maintenance")
+@ApiModel(value = "DeviceBreakdownMaintenance瀵硅薄", description = "璁惧鏁呴殰缁翠慨琛�")
+public class DeviceBreakdownMaintenance {
+
+    @TableId(value = "maintenance_id", type = IdType.AUTO)
+    private Integer maintenanceId;
+
+    @ApiModelProperty("璁惧id")
+    private Integer deviceId;
+
+    @ApiModelProperty("瀹夎鍦板潃")
+    private String location;
+
+    @ApiModelProperty("鎹熷潖鎴栨晠闅滄儏鍐�")
+    private String damageOrMalfunction;
+
+    @ApiModelProperty("鐢宠浜篿d")
+    private Integer applicantUserId;
+
+    @ApiModelProperty("鐢宠浜�")
+    private String applicantUser;
+
+    @ApiModelProperty("瑕佹眰淇鏃堕棿")
+    private LocalDate repairDate;
+
+    @ApiModelProperty("閮ㄩ棬璐熻矗浜烘剰瑙�")
+    private String departmentHeadOpinion;
+
+    @ApiModelProperty("閮ㄩ棬璐熻矗浜篿d")
+    private Integer departmentHeadUserId;
+
+    @ApiModelProperty("閮ㄩ棬璐熻矗浜�")
+    private String departmentHeadUser;
+
+    @ApiModelProperty("閮ㄩ棬璐熻矗浜哄~鍐欐椂闂�")
+    private LocalDate departmentHeadDate;
+
+    @ApiModelProperty("缁翠慨璁颁簨")
+    private String maintenanceRecord;
+
+    @ApiModelProperty("缁翠慨浜�")
+    private String maintenanceUser;
+
+    @ApiModelProperty("缁翠慨鏃堕棿")
+    private LocalDate maintenanceDate;
+
+    @ApiModelProperty("鏄惁缁撴潫,0 鏈粨鏉�, 1缁撴潫")
+    private Integer isFinish;
+
+    @ApiModelProperty("鍒涘缓浜�")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @ApiModelProperty("鍒涘缓鏃堕棿")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @ApiModelProperty("淇敼浜�")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    @ApiModelProperty("淇敼鏃堕棿")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+
+    @TableField(exist = false,select = false)
+    @ApiModelProperty("娴佺▼, 0:鐢宠, 1鐢宠閮ㄩ棬璐熻矗浜烘剰瑙�, 2:缁翠慨璁颁簨")
+    private Integer flowType;
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceInspectionRecordDto.java b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceInspectionRecordDto.java
new file mode 100644
index 0000000..f71386a
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceInspectionRecordDto.java
@@ -0,0 +1,25 @@
+package com.ruoyi.device.dto;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.ruoyi.device.pojo.DeviceInspectionRecord;
+import com.ruoyi.device.pojo.DeviceInspectionRecordDetails;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * Author: yuan
+ * Date: 2024-12-16 鏄熸湡涓� 17:23:22
+ * Description:
+ */
+@Data
+public class DeviceInspectionRecordDto extends DeviceInspectionRecord {
+
+    @TableField(exist = false)
+    @ApiModelProperty("娴嬭瘯璇︽儏鍐呭")
+    private List<DeviceInspectionRecordDetails> details;
+
+    @ApiModelProperty("娴嬭瘯鏃堕棿")
+    private String testDateString;
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceInstructionDto.java b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceInstructionDto.java
new file mode 100644
index 0000000..11244b4
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceInstructionDto.java
@@ -0,0 +1,13 @@
+package com.ruoyi.device.dto;
+
+import com.ruoyi.device.pojo.DeviceInstruction;
+import com.ruoyi.device.pojo.OperationInstruction;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class DeviceInstructionDto extends DeviceInstruction {
+
+    private List<OperationInstruction> feTempHumRecordList;
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/dto/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..89ebd4c
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceOperationInstructionDto.java
@@ -0,0 +1,35 @@
+package com.ruoyi.device.dto;
+
+import com.ruoyi.device.pojo.OperationInstruction;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class DeviceOperationInstructionDto extends OperationInstruction {
+    @ApiModelProperty("鐢宠缂栧彿")
+    private String applicationNumber;
+
+    @ApiModelProperty("鐢宠閮ㄩ棬")
+    private String applicationDepartment;
+
+    @ApiModelProperty("璐d换浜�")
+    private String personLiable;
+
+    @ApiModelProperty("鍙楁帶鐢宠璇存槑")
+    private String controlledApplicationDescription;
+
+    @ApiModelProperty("绠$悊缂栧彿")
+    private String deviceNumber;
+
+    @ApiModelProperty("鍨嬪彿")
+    private String deviceModel;
+
+    @ApiModelProperty("璁惧鍚嶇О")
+    private String deviceName;
+
+    @ApiModelProperty("涓婁紶浜�")
+    private String uploaderName;
+
+    @ApiModelProperty("瀹℃壒浜�")
+    private String approverName;
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceScrappedDto.java b/cnas-device/src/main/java/com/ruoyi/device/dto/DeviceScrappedDto.java
new file mode 100644
index 0000000..4cac0ce
--- /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.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * Author: yuan
+ * Date: 2024-12-17 鏄熸湡浜� 18:34:17
+ * Description:
+ */
+@Data
+public class DeviceScrappedDto extends DeviceScrapped {
+
+    @ApiModelProperty("鐢宠鏃堕棿")
+    private String applicantDateStr;
+
+    @ApiModelProperty("閮ㄩ棬璐熻矗浜哄~鍐欐椂闂�")
+    private String departmentHeadDateStr;
+
+    @ApiModelProperty("璁¢噺瀹や汉濉啓鏃堕棿")
+    private String meteringRoomDateStr;
+
+    @ApiModelProperty("鎵瑰噯浜哄~鍐欐椂闂�")
+    private String approverDateStr;
+}
diff --git a/cnas-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..6e45eee
--- /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.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class DeviceStateDto extends DeviceState {
+    @ApiModelProperty(value = "璁惧鍚嶇О")
+    private String deviceName;
+
+    @ApiModelProperty(value = "瑙勬牸鍨嬪彿")
+    private String specificationModel;
+
+    @ApiModelProperty(value = "绠$悊缂栧彿")
+    private String managementNumber;
+
+    @ApiModelProperty(value = "鎿嶄綔鏃ユ湡 yyyy-MM-dd")
+    private String submitDateString;
+
+    @ApiModelProperty("璐熻矗浜哄鎵规棩鏈� yyyy-MM-dd")
+    private String departmentDateString;
+
+    @ApiModelProperty("璁¢噺瀹ゅ鎵规棩鏈� yyyy-MM-dd")
+    private String measuringRoomDateString;
+
+    @ApiModelProperty("鎵瑰噯鏃ユ湡 yyyy-MM-dd")
+    private String approvalDateString;
+
+    @ApiModelProperty(value = "璁惧绫诲瀷")
+    private String largeCategory;
+}
diff --git a/cnas-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/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/DeviceInspectionRecordDetailsMapper.java b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceInspectionRecordDetailsMapper.java
new file mode 100644
index 0000000..66d10cd
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceInspectionRecordDetailsMapper.java
@@ -0,0 +1,16 @@
+package com.ruoyi.device.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.device.pojo.DeviceInspectionRecordDetails;
+
+/**
+ * <p>
+ *  Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-16 04:27:32
+ */
+public interface DeviceInspectionRecordDetailsMapper extends BaseMapper<DeviceInspectionRecordDetails> {
+
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceInspectionRecordMapper.java b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceInspectionRecordMapper.java
new file mode 100644
index 0000000..5cb34ee
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceInspectionRecordMapper.java
@@ -0,0 +1,28 @@
+package com.ruoyi.device.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.ruoyi.device.dto.DeviceInspectionRecordDto;
+import com.ruoyi.device.pojo.DeviceInspectionRecord;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * <p>
+ *  Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-16 04:25:14
+ */
+public interface DeviceInspectionRecordMapper extends BaseMapper<DeviceInspectionRecord> {
+
+    /**
+     * 鍒嗛〉鏌ヨ璁惧鐐规璁板綍
+     * @param page
+     * @param queryWrappers
+     * @return
+     */
+    IPage<DeviceInspectionRecord> selectDeviceParameterPage(IPage page, @Param("ew") QueryWrapper<DeviceInspectionRecordDto> queryWrappers);
+
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/mapper/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/DeviceMetricsCopyMapper.java b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceMetricsCopyMapper.java
new file mode 100644
index 0000000..4c1824a
--- /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/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..db96d63
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceStateMapper.java
@@ -0,0 +1,20 @@
+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;
+
+/**
+ * <p>
+ * 璁惧鍋滅敤/鍚敤 Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-09-26 09:51:40
+ */
+public interface DeviceStateMapper extends BaseMapper<DeviceState> {
+
+    IPage<DeviceStateDto> getDeviceStatePage(Integer deviceId, Page page, String processNumber);
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/mapper/InstructionMapper.java b/cnas-device/src/main/java/com/ruoyi/device/mapper/InstructionMapper.java
new file mode 100644
index 0000000..12fd129
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/mapper/InstructionMapper.java
@@ -0,0 +1,23 @@
+package com.ruoyi.device.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.device.dto.DeviceOperationInstructionDto;
+import com.ruoyi.device.pojo.DeviceInstruction;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * <p>
+ * 浣滀笟鎸囧涔︽坊鍔犲彈鎺ф枃浠惰〃 Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-12-04 10:29:18
+ */
+public interface InstructionMapper extends BaseMapper<DeviceInstruction> {
+
+
+    IPage<DeviceInstruction> pageByPageQueryOfHomeworkInstructions(Page page, @Param("ew") QueryWrapper<DeviceOperationInstructionDto> ew);
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/mapper/OperationInstructionMapper.java b/cnas-device/src/main/java/com/ruoyi/device/mapper/OperationInstructionMapper.java
new file mode 100644
index 0000000..f034e12
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/mapper/OperationInstructionMapper.java
@@ -0,0 +1,20 @@
+package com.ruoyi.device.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.device.dto.DeviceOperationInstructionDto;
+import com.ruoyi.device.pojo.OperationInstruction;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 璁惧 - 浣滀笟鎸囧涔� 娣诲姞鍙楁帶鏂囦欢 瀛� Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-12-04 10:43:32
+ */
+public interface OperationInstructionMapper extends BaseMapper<OperationInstruction> {
+
+    List<DeviceOperationInstructionDto> homeworkGuidebookEditor(Integer instructionId);
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/mqtt/MQBean.java b/cnas-device/src/main/java/com/ruoyi/device/mqtt/MQBean.java
new file mode 100644
index 0000000..d429673
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/mqtt/MQBean.java
@@ -0,0 +1,14 @@
+package com.ruoyi.device.mqtt;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.stereotype.Component;
+
+@Component
+public class MQBean {
+
+	@Bean("mqClient") // 鍚姩WEB鏈嶅姟鍣ㄧ殑鏃跺�欒皟鐢ㄦ鏂规硶鍒濆鍖�
+	public MQClient myMQTTClient(){
+		MQClient mqClient = new MQClient();
+		return mqClient;
+	}
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/mqtt/MQCallback.java b/cnas-device/src/main/java/com/ruoyi/device/mqtt/MQCallback.java
new file mode 100644
index 0000000..51fb42a
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/mqtt/MQCallback.java
@@ -0,0 +1,93 @@
+package com.ruoyi.device.mqtt;
+
+import com.alibaba.fastjson.JSONObject;
+import com.ruoyi.device.service.CollectBridgeService;
+import lombok.SneakyThrows;
+import lombok.extern.slf4j.Slf4j;
+import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
+import org.eclipse.paho.client.mqttv3.MqttCallback;
+import org.eclipse.paho.client.mqttv3.MqttMessage;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.PostConstruct;
+import javax.annotation.Resource;
+
+@Component
+@Slf4j
+public class MQCallback<component> implements MqttCallback {
+
+    private MQClient mqClient; // MQTT杩炴帴鏁版嵁
+
+    private MQConfig mqConfig; // yml閰嶇疆鏁版嵁
+
+    private static MQCallback mqCallback;
+
+    @Resource
+    private CollectBridgeService collectBridgeService;
+
+    @PostConstruct
+    public void init() {
+		mqCallback = this;
+         // 鍒濅娇鍖栨椂灏嗗凡闈欐�佸寲鐨刢onfigParam瀹炰緥鍖�
+		mqCallback.collectBridgeService = this.collectBridgeService;
+    }
+
+    public MQCallback(MQClient mqClient, MQConfig mqConfig) {
+        this.mqClient = mqClient;
+        this.mqConfig = mqConfig;
+    }
+
+    /** 杩炴帴涓㈠け鍚庯紝涓�鑸湪杩欓噷闈㈣繘琛岄噸杩� **/
+    @SneakyThrows
+    @Override
+    public void connectionLost(Throwable cause) {
+        /** 杩炴帴涓㈠け鍚庯紝涓�鑸湪杩欓噷闈㈣繘琛岄噸杩� **/
+        if (mqClient != null) {
+            while (true) {
+                try {
+                    log.info("==============銆嬨�嬨�媅MQTT] 杩炴帴涓㈠け锛屽皾璇曢噸杩�...");
+                    MQClient mqttPushClient = new MQClient();
+                    mqttPushClient.connect(mqConfig);
+                    if (mqClient.getClient().isConnected()) {
+                        log.info("=============>>閲嶈繛鎴愬姛");
+                    }
+                    break;
+                } catch (Exception e) {
+                    log.error("=============>>>[MQTT] 杩炴帴鏂紑锛岄噸杩炲け璐ワ紒<<=============");
+                    continue;
+                }
+            }
+        }
+        log.info(cause.getMessage());
+    }
+
+    /**
+     * MQTT鏈嶅姟鍣ㄥ悜WEB鏈嶅姟鍣ㄥ彂閫佺殑鏁版嵁浼氭墽琛屽埌杩欓噷闈紝瀹樻柟璇濈О涓猴細璁㈤槄鍚庣殑娑堟伅
+     * @param topic 涓婚锛氫篃绉颁负搴曞眰缃戝叧鍞竴鏍囪瘑
+     * @param message 淇℃伅
+     * @throws Exception 鎶ラ敊
+     */
+    @Override
+    public void messageArrived(String topic, MqttMessage message) throws Exception {
+        try {
+            String parse = new String(message.getPayload());
+            JSONObject jsonObject = JSONObject.parseObject(parse);
+            // 濉厖閲囬泦鏁版嵁
+            mqCallback.collectBridgeService.addBridgeValue(jsonObject);
+
+        } catch (Exception e) {
+            e.printStackTrace();
+            log.info("============銆嬨�嬫帴鏀舵秷鎭富棰樺紓甯� : " + e.getMessage());
+        }
+    }
+
+    /**
+     * WEB鏈嶅姟鍣ㄥ悜MQTT鏈嶅姟鍣ㄥ彂閫佺殑鏁版嵁浼氭墽琛屽埌杩欓噷闈�
+     * 瀹樻柟璇濈О涓猴細鍙戝竷鍚庝細鎵ц鍒拌繖閲�
+     * @param token 杩炴帴token
+     */
+    @Override
+    public void deliveryComplete(IMqttDeliveryToken token) {
+//        log.info("==========鍙戝竷淇℃伅={}==========", token.isComplete());
+    }
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/mqtt/MQClient.java b/cnas-device/src/main/java/com/ruoyi/device/mqtt/MQClient.java
new file mode 100644
index 0000000..1c3c548
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/mqtt/MQClient.java
@@ -0,0 +1,97 @@
+package com.ruoyi.device.mqtt;
+
+import lombok.SneakyThrows;
+import lombok.extern.slf4j.Slf4j;
+import org.eclipse.paho.client.mqttv3.MqttClient;
+import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
+import org.eclipse.paho.client.mqttv3.MqttException;
+import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
+import org.springframework.stereotype.Component;
+
+@Component
+@Slf4j
+public class MQClient {
+
+	private static MqttClient client;
+	public static MqttClient getClient() {
+		return client;
+	}
+	public static void setClient(MqttClient client) {
+		MQClient.client = client;
+	}
+
+	/**
+	 * WEB鏈嶅姟鍣ㄨ繛鎺QTT鏈嶅姟鍣ㄧ殑閰嶇疆
+	 * @param userName 璐﹀彿
+	 * @param password 瀵嗙爜
+	 * @param outTime 瓒呮椂鏃堕棿
+	 * @param KeepAlive 蹇冭烦妫�娴嬫椂闂�
+	 * @return
+	 */
+	private MqttConnectOptions getOption(String userName, String password, int outTime, int KeepAlive) {
+		MqttConnectOptions option = new MqttConnectOptions();
+		// 璁剧疆鏄惁娓呯┖session,false琛ㄧず鏈嶅姟鍣ㄤ細淇濈暀瀹㈡埛绔殑杩炴帴璁板綍锛宼rue琛ㄧず姣忔杩炴帴鍒版湇鍔″櫒閮戒互鏂扮殑韬唤杩炴帴
+		option.setCleanSession(true);
+		// 璁剧疆杩炴帴鐨勭敤鎴峰悕
+		option.setUserName(userName);
+		// 璁剧疆杩炴帴鐨勫瘑鐮�
+		option.setPassword(password.toCharArray());
+		// 璁剧疆瓒呮椂鏃堕棿 鍗曚綅涓虹
+		option.setConnectionTimeout(outTime);
+		// 璁剧疆浼氳瘽蹇冭烦鏃堕棿 鍗曚綅涓虹 鏈嶅姟鍣ㄤ細姣忛殧(1.5*keepTime)绉掔殑鏃堕棿鍚戝鎴风鍙戦�佷釜娑堟伅鍒ゆ柇瀹㈡埛绔槸鍚﹀湪绾匡紝浣嗚繖涓柟娉曞苟娌℃湁閲嶈繛鐨勬満鍒�
+		option.setKeepAliveInterval(KeepAlive);
+		// setWill鏂规硶锛屽鏋滈」鐩腑闇�瑕佺煡閬撳鎴风鏄惁鎺夌嚎鍙互璋冪敤璇ユ柟娉曘�傝缃渶缁堢鍙g殑閫氱煡娑堟伅
+		// option.setWill(topic, "close".getBytes(), 2, true);
+		//璁剧疆鏈�澶ч�熷害
+		option.setMaxInflight(1000);
+		log.info("================>>>MQTT杩炴帴璁よ瘉鎴愬姛<<======================");
+		return option;
+	}
+
+	/**
+	 * WEB鏈嶅姟鍣ㄨ繛鎺QTT鏈嶅姟鍣ㄥ嚱鏁�
+	 * @param mqttConfig yml涓璏QTT鐨勯厤缃�
+	 */
+	public void connect(MQConfig mqttConfig) throws MqttException {
+		client = new MqttClient(mqttConfig.getUrl(), mqttConfig.getClientId(), new MemoryPersistence());
+		MqttConnectOptions options = getOption(mqttConfig.getUsername(), mqttConfig.getPassword(),
+				mqttConfig.getTimeout(), mqttConfig.getKeepAlive());
+		MQClient.setClient(client);
+		//杩炴帴澶辫触璋冪敤鍥炶皟鍑芥暟锛岄噸鏂拌繛鎺�
+		client.setCallback(new MQCallback<Object>(this, mqttConfig));
+		if (!client.isConnected()) {
+			client.connect(options);
+			// 璁㈤槄涓婚
+			MQSubscribe.subscribe_0(mqttConfig.getSubscribe());
+			log.info("================>>>MQTT杩炴帴鎴愬姛<<======================");
+		} else {// 杩欓噷鐨勯�昏緫鏄鏋滆繛鎺ヤ笉鎴愬姛灏遍噸鏂拌繛鎺�
+			client.disconnect();
+			client.connect(options);
+		}
+	}
+
+	/**
+	 * WEB鏈嶅姟鍣ㄤ笌MQTT鏈嶅姟鍣ㄧ殑鏂嚎閲嶈繛
+	 * @throws Exception
+	 */
+	public Boolean reConnect() throws Exception {
+		Boolean isConnected = false;
+		if (null != client) {
+			client.connect();
+			if (client.isConnected()) {
+				isConnected = true;
+			}
+		}
+		return isConnected;
+	}
+
+	/**
+	 * 寮傚父鍏抽棴鏈嶅姟锛學EB鏈嶅姟鍣ㄤ笌MQTT鏈嶅姟鍣ㄧ殑鏂紑杩炴帴鍑芥暟
+	 */
+	@SneakyThrows
+	public void close(){
+		client.close();
+		client.disconnect();
+		log.info("================>>寮傚父鍏抽棴涓巑qtt鏈嶅姟鍣ㄧ殑杩炴帴<<======================");
+	}
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/mqtt/MQConfig.java b/cnas-device/src/main/java/com/ruoyi/device/mqtt/MQConfig.java
new file mode 100644
index 0000000..a88b29c
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/mqtt/MQConfig.java
@@ -0,0 +1,64 @@
+package com.ruoyi.device.mqtt;
+
+import lombok.Data;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+@Component
+@Data
+public class MQConfig {
+
+	/**
+	 * MQTT-鏈嶅姟绔�-IP
+	 */
+	@Value("${mqtt.url}")
+	private String url;
+
+	/**
+	 * MQTT-鏈嶅姟绔�-鐢ㄦ埛鍚�
+	 */
+	@Value("${mqtt.username}")
+	private String username;
+
+	/**
+	 * MQTT-鏈嶅姟绔�-瀵嗙爜
+	 */
+	@Value("${mqtt.password}")
+	private String password;
+
+	/**
+	 * 瓒呮椂鏃堕棿
+	 */
+	@Value("${mqtt.timeout}")
+	private int timeout;
+
+	/**
+	 * 蹇冭烦妫�娴嬫椂闂�
+	 */
+	@Value("${mqtt.keepalive}")
+	private int keepAlive;
+
+	/**
+	 * 蹇冭烦鍖呯骇鍒�
+	 */
+	@Value("${mqtt.qos}")
+	private int qos;
+
+	/**
+	 * 鏈嶅姟绔繛鎺ヨ秴鏃舵椂闂�
+	 */
+	@Value("${mqtt.completion-timeout}")
+	private int completionTimeout;
+
+	/**
+	 * clientId
+	 */
+	@Value("${mqtt.clientId}")
+	private String clientId;
+
+	/**
+	 * 璁㈤槄涓婚
+	 */
+	@Value("${mqtt.subscribe}")
+	private String subscribe;
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/mqtt/MQPublic.java b/cnas-device/src/main/java/com/ruoyi/device/mqtt/MQPublic.java
new file mode 100644
index 0000000..78c26d7
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/mqtt/MQPublic.java
@@ -0,0 +1,69 @@
+package com.ruoyi.device.mqtt;
+
+import lombok.extern.slf4j.Slf4j;
+import org.eclipse.paho.client.mqttv3.*;
+import org.springframework.stereotype.Component;
+
+@Component
+@Slf4j
+public class MQPublic {
+
+	/**
+	 * 閫氫俊璐ㄩ噺qos涓�0锛氳〃绀篧EB鏈嶅姟鍣ㄥ悜MQTT鏈嶅姟鍣ㄥ彧鍙戦�佷竴娆★紝涓嶇MQTT鏈嶅姟鍣ㄦ湁娌℃湁鏀跺埌
+	 * WEB鏈嶅姟鍣ㄥ悜MQTT鏈嶅姟鍣ㄥ彂甯冩暟鎹紝姝ゆ柟娉曞皝瑁呬簡publish鍑芥暟
+	 * @param topic 鍚戝簳灞傜綉鍏冲彂閫佹暟鎹紝瀹樻柟璇濓細绉版涓轰富棰橈紝鍚戦偅涓富棰樺彂閫佹暟鎹� 缃戝叧锛氬嵆涓婚锛岃澶囧敮涓�鏍囪瘑
+	 * @param pushMessage WEB鏈嶅姟鍣ㄥ悜MQTT鏈嶅姟鍣ㄥ彂閫佺殑鏁版嵁
+	 */
+	public void publish_0(int qos, String topic, byte[] pushMessage) {
+		publish(0, false, topic, pushMessage);
+	}
+
+	/**
+	 * 閫氫俊璐ㄩ噺qos涓�1锛氳〃绀篧EB鏈嶅姟鍣ㄥ悜MQTT鏈嶅姟鍣ㄥ彂閫佹暟鎹紝MQTT鏈嶅姟鍣ㄤ竴瀹氫細鏀跺埌涓�娆℃暟鎹紝濡傛灉MQTT鏈嶅姟鍣ㄦ病鏈夊搷搴斺�滄敹鍒版暟鎹�濓紝閭d箞WEB鏈嶅姟鍣ㄥ氨浼氫竴鐩村彂閫佹暟鎹�
+	 * WEB鏈嶅姟鍣ㄥ悜MQTT鏈嶅姟鍣ㄥ彂甯冩暟鎹紝璋冪敤姝ゅ嚱鏁帮紝姝ゆ柟娉曞皝瑁呬簡publish鍑芥暟锛岄�氫俊璐ㄩ噺qos涓�1
+	 * @param topic 鍚戝簳灞傜綉鍏冲彂閫佹暟鎹紝瀹樻柟璇濓細绉版涓轰富棰橈紝鍚戦偅涓富棰樺彂閫佹暟鎹� 缃戝叧锛氬嵆涓婚锛岃澶囧敮涓�鏍囪瘑
+	 * @param pushMessage WEB鏈嶅姟鍣ㄥ悜MQTT鏈嶅姟鍣ㄥ彂閫佺殑鏁版嵁
+	 */
+	public void publish_1(String topic, byte[] pushMessage) {
+		publish(1, false, topic, pushMessage);
+	}
+
+	/**
+	 *閫氫俊璐ㄩ噺qos涓�2锛氳〃绀篧EB鏈嶅姟鍣ㄥ悜MQTT鏈嶅姟鍣ㄥ彂閫佹暟鎹紝涓よ�呬細杩涜鑷冲皯涓ゆ璇锋眰/鍝嶅簲娴佺▼锛岄伩鍏嶆暟鎹湪浼犺緭涓殑涓㈠け锛屼絾鏄浉搴旂殑涔熶細娑堣�楄绠楁満涓殑璧勬簮
+	 * WEB鏈嶅姟鍣ㄥ悜MQTT鏈嶅姟鍣ㄥ彂甯冩暟鎹紝姝ゆ柟娉曞皝瑁呬簡publish鍑芥暟锛岄�氫俊璐ㄩ噺锛�2
+	 * @param topic 鍚戝簳灞傜綉鍏冲彂閫佹暟鎹紝瀹樻柟璇濓細绉版涓轰富棰橈紝鍚戦偅涓富棰樺彂閫佹暟鎹� 缃戝叧锛氬嵆涓婚锛岃澶囧敮涓�鏍囪瘑
+	 * @param pushMessage WEB鏈嶅姟鍣ㄥ悜MQTT鏈嶅姟鍣ㄥ彂閫佺殑鏁版嵁
+	 */
+	public void publish_2(String topic, byte[] pushMessage) {
+		publish(2,false, topic, pushMessage);
+	}
+
+	/**
+	 * 鍙戝竷鍑芥暟锛歐EB鏈嶅姟鍣ㄥ悜MQTT鏈嶅姟鍣ㄥ彂閫佹暟鎹�
+	 *
+	 * @param qos 閫氫俊璐ㄩ噺
+	 * @param retained 榛樿锛歠alse-闈炴寔涔呭寲锛堟槸鎸囦竴鏉℃秷鎭秷璐瑰畬锛屽氨浼氳鍒犻櫎锛涙寔涔呭寲锛屾秷璐瑰畬锛岃繕浼氫繚瀛樺湪鏈嶅姟鍣ㄤ腑锛屽綋鏂扮殑璁㈤槄鑰呭嚭鐜帮紝缁х画缁欐柊璁㈤槄鑰呮秷璐癸級
+	 * @param topic 鍚戝簳灞傜綉鍏冲彂閫佹暟鎹紝瀹樻柟璇濓細绉版涓轰富棰橈紝鍚戦偅涓富棰樺彂閫佹暟鎹� 缃戝叧锛氬嵆涓婚锛岃澶囧敮涓�鏍囪瘑
+	 * @param pushMessage WEB鏈嶅姟鍣ㄥ悜MQTT鏈嶅姟鍣ㄥ彂閫佺殑鏁版嵁
+	 */
+	public void publish(int qos, boolean retained, String topic, byte[] pushMessage) {
+		MqttMessage message = new MqttMessage();
+		message.setQos(qos);
+		message.setRetained(retained);
+		// 灏哠tring[]鏁扮粍杞崲涓篵yte鏁扮粍鍙戦��
+		message.setPayload(pushMessage);
+		MqttTopic mTopic = MQClient.getClient().getTopic(topic);
+		if (null == mTopic) {
+			log.error("===============>>>MQTT {} 涓嶅瓨鍦�<<=======================",topic);
+		}
+		MqttDeliveryToken token;
+		try {
+			token = mTopic.publish(message);
+			token.waitForCompletion();
+		} catch (MqttPersistenceException e) {
+			e.printStackTrace();
+		} catch (MqttException e) {
+			e.printStackTrace();
+		}
+	}
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/mqtt/MQSubscribe.java b/cnas-device/src/main/java/com/ruoyi/device/mqtt/MQSubscribe.java
new file mode 100644
index 0000000..0541e3f
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/mqtt/MQSubscribe.java
@@ -0,0 +1,60 @@
+package com.ruoyi.device.mqtt;
+
+import org.eclipse.paho.client.mqttv3.MqttException;
+import org.springframework.stereotype.Component;
+
+@Component
+public class MQSubscribe {
+
+	/**
+	 * 璁㈤槄鏌愪釜涓婚锛歁QTT鏈嶅姟鍣ㄥ悜WEB鏈嶅姟鍣ㄥ彂閫佹暟鎹�
+	 *涓婚锛氫篃绉颁负搴曞眰缃戝叧鍞竴鏍囪瘑
+	 * @param topic 璁惧缂栧彿锛屼笌搴曞眰浜や簰鐨勫敮涓�鏍囪瘑
+	 * @param qos MQTT鏈嶅姟鍣ㄥ悜WEB鏈嶅姟鍣ㄥ彂閫佹暟鎹�
+	 *            qos涓�0锛氬彧鍚慦EB鏈嶅姟鍣ㄥ彂閫佷竴娆★紱
+	 *            qos涓�1锛氳嚦灏戝悜WEB鏈嶅姟鍣ㄥ彂閫佷竴娆★紝鎺ユ敹鏂逛細鍝嶅簲涓�涓姤鏂囷紱
+	 *            qos涓�2锛氫袱鑰呬細杩涜鑷冲皯涓ゆ璇锋眰/鍝嶅簲娴佺▼锛岄伩鍏嶆暟鎹湪浼犺緭涓殑涓㈠け
+	 */
+	private static void subscribe(String topic, int qos) {
+		try {
+			MQClient.getClient().subscribe(topic,qos);
+		} catch (MqttException e) {
+			e.printStackTrace();
+		}
+	}
+
+	/**
+	 * 璁㈤槄鏌愪釜涓婚锛岄�氫俊璐ㄩ噺锛歲os榛樿涓�0
+	 * 涓婚锛氫篃绉颁负搴曞眰缃戝叧鍞竴鏍囪瘑
+	 * @param topic 璁惧缂栧彿锛屼笌搴曞眰浜や簰鐨勫敮涓�鏍囪瘑
+	 */
+	public static void subscribe_0(String topic) {
+		subscribe(topic, 0);
+	}
+
+	/**
+	 * 璁㈤槄鏌愪釜涓婚锛岄�氫俊璐ㄩ噺锛歲os榛樿涓�1
+	 * 涓婚锛氫篃绉颁负搴曞眰缃戝叧鍞竴鏍囪瘑
+	 * @param topic 璁惧缂栧彿锛屼笌搴曞眰浜や簰鐨勫敮涓�鏍囪瘑
+	 */
+	public void subscribe_1(String topic) {
+		subscribe(topic, 1);
+	}
+
+	/**
+	 * 璁㈤槄鏌愪釜涓婚锛岄�氫俊璐ㄩ噺锛歲os榛樿涓�2
+	 * 涓婚锛氫篃绉颁负搴曞眰缃戝叧鍞竴鏍囪瘑
+	 * @param topic 璁惧缂栧彿锛屼笌搴曞眰浜や簰鐨勫敮涓�鏍囪瘑
+	 */
+	public void subscribe_2(String topic) {
+		subscribe(topic, 2);
+	}
+
+	public void OffSubscribe(String topic) {
+		try {
+			MQClient.getClient().unsubscribe(topic);
+		} catch (MqttException e) {
+			e.printStackTrace();
+		}
+	}
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceAcceptance.java b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceAcceptance.java
new file mode 100644
index 0000000..2c66be9
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceAcceptance.java
@@ -0,0 +1,77 @@
+package com.ruoyi.device.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 璁惧楠屾敹(瑁呭)
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-20 01:45:14
+ */
+@Getter
+@Setter
+@TableName("device_acceptance")
+@ApiModel(value = "DeviceAcceptance瀵硅薄", description = "璁惧楠屾敹(瑁呭)")
+public class DeviceAcceptance {
+
+    @TableId(value = "acceptance_id", type = IdType.AUTO)
+    private Integer acceptanceId;
+
+    @ApiModelProperty("璁惧id")
+    private Integer deviceId;
+
+    @ApiModelProperty("鍒拌揣鏃ユ湡")
+    private LocalDate arrivalDate;
+
+    @ApiModelProperty("閲戦")
+    private String goldAmount;
+
+    @ApiModelProperty("缁翠慨鍗曚綅")
+    private String maintenanceunit;
+
+    @ApiModelProperty("鏀惰澶囦富鏈哄拰澶囦唤鎯呭喌")
+    private String spareParts;
+
+    @ApiModelProperty("瀹夎鍜岃皟璇曟儏鍐�")
+    private String installationDebugging;
+
+    @ApiModelProperty("楠屾敹鎯呭喌")
+    private String checkSituation;
+
+    @ApiModelProperty("鎺ユ敹绛惧瓧")
+    private String receivingSignature;
+
+    @ApiModelProperty("鍘傚浠h〃")
+    private String producer;
+
+    @ApiModelProperty("鎺ユ敹浜�")
+    private String recipient;
+
+    @ApiModelProperty("鎺ユ敹鏃堕棿")
+    private String recipientDate;
+
+    @ApiModelProperty("鍒涘缓浜�")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @ApiModelProperty("鍒涘缓鏃堕棿")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @ApiModelProperty("淇敼浜�")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    @ApiModelProperty("淇敼鏃堕棿")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+}
diff --git a/cnas-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..914f15e
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceAcceptanceFile.java
@@ -0,0 +1,58 @@
+package com.ruoyi.device.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 璁惧楠屾敹(瑁呭)闄勪欢琛�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-20 01:45:26
+ */
+@Getter
+@Setter
+@TableName("device_acceptance_file")
+@ApiModel(value = "DeviceAcceptanceFile瀵硅薄", description = "璁惧楠屾敹(瑁呭)闄勪欢琛�")
+public class DeviceAcceptanceFile implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "acceptance_file_id", type = IdType.AUTO)
+    private Integer acceptanceFileId;
+
+    @ApiModelProperty("璁惧楠屾敹id")
+    private Integer acceptanceId;
+
+    @ApiModelProperty("绫诲瀷:1鍥剧墖/2鏂囦欢")
+    private Integer type;
+
+    @ApiModelProperty("闄勪欢璺緞")
+    private String fileUrl;
+
+    @ApiModelProperty("闄勪欢鍚嶇О")
+    private String fileName;
+
+    @ApiModelProperty("鍒涘缓浜�")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @ApiModelProperty("鍒涘缓鏃堕棿")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @ApiModelProperty("淇敼浜�")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    @ApiModelProperty("淇敼鏃堕棿")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceAccidentReport.java b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceAccidentReport.java
new file mode 100644
index 0000000..44558f3
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceAccidentReport.java
@@ -0,0 +1,120 @@
+package com.ruoyi.device.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 璁惧浜嬫晠鎶ュ憡鍗�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-17 06:31:12
+ */
+@Getter
+@Setter
+@TableName("device_accident_report")
+@ApiModel(value = "DeviceAccidentReport瀵硅薄", description = "璁惧浜嬫晠鎶ュ憡鍗�")
+public class DeviceAccidentReport {
+
+    @TableId(value = "accident_report_id", type = IdType.AUTO)
+    private Integer accidentReportId;
+
+    @ApiModelProperty("璁惧id")
+    private Integer deviceId;
+
+    @ApiModelProperty("鍦板潃")
+    private String address;
+
+    @ApiModelProperty("鏃堕棿")
+    private LocalDateTime accidentDate;
+
+    @ApiModelProperty("浜嬫晠鎯呭喌鎻忚堪")
+    private String descriptionOfAccident;
+
+    @ApiModelProperty("鎶ュ憡浜篿d")
+    private Integer reportUserId;
+
+    @ApiModelProperty("鎶ュ憡浜�")
+    private String reportUser;
+
+    @ApiModelProperty("鎶ュ憡浜哄~鍐欐椂闂�")
+    private LocalDate reportDate;
+
+    @ApiModelProperty("璇勪及浜烘剰瑙�")
+    private String assessorOpinion;
+
+    @ApiModelProperty("璇勪及浜篿d")
+    private Integer assessorUserId;
+
+    @ApiModelProperty("璇勪及浜�")
+    private String assessorUser;
+
+    @ApiModelProperty("璇勪及浜哄~鍐欐椂闂�")
+    private LocalDate assessorDate;
+
+    @ApiModelProperty("閮ㄩ棬璐熻矗浜烘剰瑙�")
+    private String departmentHeadOpinion;
+
+    @ApiModelProperty("閮ㄩ棬璐熻矗浜篿d")
+    private Integer departmentHeadUserId;
+
+    @ApiModelProperty("閮ㄩ棬璐熻矗浜�")
+    private String departmentHeadUser;
+
+    @ApiModelProperty("閮ㄩ棬璐熻矗浜哄~鍐欐椂闂�")
+    private LocalDate departmentHeadDate;
+
+    @ApiModelProperty("鎶�鏈礋璐d汉鎰忚")
+    private String technicalDirectorOpinion;
+
+    @ApiModelProperty("鎶�鏈礋璐d汉id")
+    private Integer technicalDirectorUserId;
+
+    @ApiModelProperty("鎶�鏈礋璐d汉")
+    private String technicalDirectorUser;
+
+    @ApiModelProperty("鎶�鏈礋璐d汉濉啓鏃堕棿")
+    private LocalDate technicalDirectorDate;
+
+    @ApiModelProperty("涓讳换鎰忚")
+    private String directorHeadOpinion;
+
+    @ApiModelProperty("涓讳换id")
+    private Integer directorHeadUserId;
+
+    @ApiModelProperty("涓讳换")
+    private String directorHeadUser;
+
+    @ApiModelProperty("涓讳换濉啓鏃堕棿")
+    private LocalDate directorHeadDate;
+
+    @ApiModelProperty("鏄惁缁撴潫,0 鏈粨鏉�, 1缁撴潫")
+    private Integer isFinish;
+
+    @ApiModelProperty("鍒涘缓浜�")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @ApiModelProperty("鍒涘缓鏃堕棿")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @ApiModelProperty("淇敼浜�")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    @ApiModelProperty("淇敼鏃堕棿")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+
+    @TableField(exist = false,select = false)
+    @ApiModelProperty("娴佺▼, 0:鎶ュ憡, 1璇勪及, 2:閮ㄩ棬璐熻矗浜烘剰瑙�, 3:鎶�鏈礋璐d汉鎰忚, 4:涓讳换鎰忚")
+    private Integer flowType;
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceBorrow.java b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceBorrow.java
new file mode 100644
index 0000000..da122b6
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceBorrow.java
@@ -0,0 +1,133 @@
+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.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-09-21 10:53:51
+ */
+@Getter
+@Setter
+@TableName("device_borrow")
+@ApiModel(value = "DeviceBorrow瀵硅薄", description = "璁惧鍊熺敤")
+@ExcelIgnoreUnannotated
+public class DeviceBorrow implements Serializable {
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty("娴佺▼缂栧彿")
+    @ExcelProperty(value = "娴佺▼缂栧彿")
+    private String processNumber;
+
+    @ApiModelProperty("璁惧id")
+    private Integer deviceId;
+
+    @ApiModelProperty("绠$悊缂栧彿")
+    @ExcelProperty(value = "绠$悊缂栧彿")
+    private String unifyNumber;
+
+    @ApiModelProperty("鍊熺敤浜�")
+    @ExcelProperty(value = "鍊熺敤浜�")
+    private String recipientUser;
+
+    @ExcelProperty(value = "鍊熺敤浜鸿仈绯绘柟寮�")
+    @ApiModelProperty("鍊熺敤浜鸿仈绯绘柟寮�")
+    private String borrowerContactInformation;
+
+    @ApiModelProperty("鍊熺敤鏃剁姸鎬�")
+    @ExcelProperty(value = "鍊熺敤鏃剁姸鎬�")
+    //0鍚堟牸;1缁翠慨;2鍋滅敤;3鎶ュ簾
+    private Integer recipientState;
+
+    @ApiModelProperty("鍊熺敤鏃ユ湡")
+    @ExcelProperty(value = "鎻愪氦鏃ユ湡")
+    private Date recipientTime;
+
+    @ApiModelProperty("鍊熷嚭浜�")
+    @ExcelProperty(value = "鍊熷嚭浜�")
+    private String submitUser;
+
+    @ApiModelProperty("鍊熷嚭鏃ユ湡")
+    @ExcelProperty(value = "鍊熷嚭鏃ユ湡")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @ApiModelProperty("褰撳墠鐘舵��")
+    @ExcelProperty(value = "褰撳墠鐘舵��")
+    private String nowState;
+
+    @ApiModelProperty("褰撳墠璐d换浜�")
+    @ExcelProperty(value = "褰撳墠璐d换浜�")
+    private String nowUser;
+
+    @ApiModelProperty("闄勪欢")
+    //璺緞
+    private String url;
+
+    @ApiModelProperty("闄勪欢")
+    @ExcelProperty(value = "闄勪欢")
+    //鏂囦欢鍚�
+    private String fileName;
+
+    @ApiModelProperty("涓嬬幆鑺傝矗浠讳汉")
+    private String nextUser;
+
+    @ApiModelProperty("鎻愪氦鎿嶄綔浜�")
+    private String submitOperationUser;
+
+    @ApiModelProperty("鎻愪氦鎿嶄綔鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime submitOperationTime;
+
+    @ApiModelProperty("褰掕繕浜�")
+    private String rebackUser;
+
+    @ApiModelProperty("褰掕繕鏃ユ湡")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime rebackTime;
+
+    @ApiModelProperty("鎺ュ彈鐘舵��0鍚堟牸;1缁翠慨;2鍋滅敤;3鎶ュ簾")
+    private Integer receiveState;
+
+    @ApiModelProperty("璁惧璐d换浜�")
+    private String deviceUser;
+
+    @ApiModelProperty("澶囨敞")
+    private String note;
+
+    @ApiModelProperty("鎺ユ敹鎿嶄綔浜�")
+    private String receiveOperationUser;
+
+    @ApiModelProperty("鎺ユ敹鎿嶄綔鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime receiveOperationTime;
+
+    @ApiModelProperty("璁惧鍚嶇О")
+    @TableField(select = false, exist = false)
+    @ExcelProperty(value = "璁惧鍚嶇О")
+    private String deviceName;
+
+
+    @ApiModelProperty("娴佺▼璺熻釜")
+    @TableField(select = false, exist = false)
+    private List<DeviceLog> deviceLogs;
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceInspectionRecord.java b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceInspectionRecord.java
new file mode 100644
index 0000000..e605cb3
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceInspectionRecord.java
@@ -0,0 +1,93 @@
+package com.ruoyi.device.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 璁惧鐐规璁板綍
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-16 04:25:14
+ */
+@Getter
+@Setter
+@TableName("device_inspection_record")
+@ApiModel(value = "DeviceInspectionRecord瀵硅薄", description = "")
+public class DeviceInspectionRecord implements Serializable {
+
+    @ApiModelProperty("璁惧鐐规璁板綍id")
+    @TableId(value = "inspection_record_id", type = IdType.AUTO)
+    private Integer inspectionRecordId;
+
+    @ApiModelProperty("璁惧id")
+    private Integer deviceId;
+
+    @ApiModelProperty("娴嬮噺鑼冨洿")
+    private String measurementScope;
+
+    @ApiModelProperty("鐐规浣跨敤鐗╄川鍚嶇О")
+    private String materialName;
+
+    @ApiModelProperty("鐐规浣跨敤鐗╄川瑙勬牸鍨嬪彿")
+    private String materialModel;
+
+    @ApiModelProperty("鐐规浣跨敤鐗╄川绠$悊缂栧彿")
+    private String materialManagementNumber;
+
+    @ApiModelProperty("鐐规浣跨敤鐗╄川绮惧害绛夌骇")
+    private String materialAccuracyGrade;
+
+    @ApiModelProperty("娓╁害")
+    private String temperature;
+
+    @ApiModelProperty("婀垮害")
+    private String humidity;
+
+    @ApiModelProperty("娴嬭瘯缁撹")
+    private String testConclusion;
+
+    @ApiModelProperty("澶囨敞")
+    private String remark;
+
+    @ApiModelProperty("鐘舵�侊紙鏄惁澶嶆牳锛�0鏈鏍革紝1澶嶆牳")
+    private Integer status;
+
+    @ApiModelProperty("娴嬭瘯浜�")
+    private String recorder;
+
+    @ApiModelProperty("娴嬭瘯浜篿d")
+    private Integer recorderId;
+
+    @ApiModelProperty("澶嶆牳浜�")
+    private String reviewer;
+
+    @ApiModelProperty("澶嶆牳浜篿d")
+    private Integer reviewerId;
+
+    @ApiModelProperty("澶嶆牳淇℃伅")
+    private String reviewerRemark;
+
+    @ApiModelProperty("娴嬭瘯鏃ユ湡")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private LocalDateTime testDate;
+
+    @ApiModelProperty("鍒涘缓鏃堕棿")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @ApiModelProperty("淇敼鏃堕棿")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+
+    @ApiModelProperty("淇敼浜篿d")
+    private Integer updateUserId;
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceInspectionRecordDetails.java b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceInspectionRecordDetails.java
new file mode 100644
index 0000000..feaed31
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceInspectionRecordDetails.java
@@ -0,0 +1,63 @@
+package com.ruoyi.device.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-16 04:27:32
+ */
+@Getter
+@Setter
+@TableName("device_inspection_record_details")
+@ApiModel(value = "DeviceInspectionRecordDetails瀵硅薄", description = "")
+public class DeviceInspectionRecordDetails implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("鐐规璇︽儏id")
+    @TableId(value = "inspection_record_detail_id", type = IdType.AUTO)
+    private Integer inspectionRecordDetailId;
+
+    @ApiModelProperty("鐐规id")
+    private Integer inspectionRecordId;
+
+    @ApiModelProperty("娴嬭瘯椤圭洰")
+    private String testItems;
+
+    @ApiModelProperty("鏍囧噯鍊�")
+    private String standardValue;
+
+    @ApiModelProperty("瀹炴祴鍊�")
+    private String measuredValue;
+
+    @ApiModelProperty("绀哄�艰宸�")
+    private String indicationError;
+
+    @ApiModelProperty("鍏佽璇樊")
+    private String allowableError;
+
+    @ApiModelProperty("鍗曢」缁撹")
+    private String singleItemConclusion;
+
+    @ApiModelProperty("鍒涘缓鏃堕棿")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @ApiModelProperty("淇敼鏃堕棿")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+
+    @ApiModelProperty("淇敼浜篿d")
+    private Integer updateUserId;
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceInstruction.java b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceInstruction.java
new file mode 100644
index 0000000..5a4f845
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceInstruction.java
@@ -0,0 +1,64 @@
+package com.ruoyi.device.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 浣滀笟鎸囧涔︽坊鍔犲彈鎺ф枃浠惰〃
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-12-04 10:29:18
+ */
+@Getter
+@Setter
+@TableName("device_instruction")
+@ApiModel(value = "Instruction瀵硅薄", description = "浣滀笟鎸囧涔︽坊鍔犲彈鎺ф枃浠惰〃")
+public class DeviceInstruction implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty("鐢宠缂栧彿")
+    private String applicationNumber;
+
+    @ApiModelProperty("鐢宠閮ㄩ棬")
+    private String applicationDepartment;
+
+    @ApiModelProperty("璐d换浜�")
+    private String personLiable;
+
+    @ApiModelProperty("鍙楁帶鐢宠璇存槑")
+    private String controlledApplicationDescription;
+
+    @ApiModelProperty("绯荤粺鐢熸垚鍚嶇О")
+    private String fileName;
+
+    @ApiModelProperty("绯荤粺鐢熸垚鍚嶇О")
+    private String fileSystemName;
+
+    @ApiModelProperty("鍒涘缓鏃堕棿")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @ApiModelProperty("鏇存柊鏃堕棿")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+
+    @ApiModelProperty("鍒涘缓浜�")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @ApiModelProperty("鏇存柊浜�")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/pojo/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/DeviceMetricsCopy.java b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceMetricsCopy.java
new file mode 100644
index 0000000..fb7d79b
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceMetricsCopy.java
@@ -0,0 +1,66 @@
+package com.ruoyi.device.pojo;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 璁惧鏍″噯 - 鏍″噯璁板綍 - 鏍″噯鏉$洰
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-09-27 10:20:11
+ */
+@Getter
+@Setter
+@TableName("device_metrics_copy")
+@ApiModel(value = "DeviceMetricsCopy瀵硅薄", description = "璁惧鏍″噯 - 鏍″噯璁板綍 - 鏍″噯鏉$洰")
+public class DeviceMetricsCopy implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("id")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty("璁惧鏍″噯 - 鏍″噯璁板綍id")
+    private Integer deviceMetricsId;
+
+    @ApiModelProperty("璁¢噺鍙傛暟")
+    private String measurementParameter;
+
+    @ApiModelProperty("閲忕▼鑼冨洿")
+    private String rangeOfMeasurement;
+
+    @ApiModelProperty("鏈�澶у厑璁歌宸�")
+    private String maxPermissibleError;
+
+    @ApiModelProperty("鍒ゅ畾鏍囧噯")
+    private String judgmentCriteria;
+
+    @ApiModelProperty("鍒涘缓浜�")
+    private String createdBy;
+
+    @ApiModelProperty("鍒涘缓鏃堕棿")
+    private LocalDateTime creationTime;
+
+    @ApiModelProperty("鏄惁鏍″噯")
+    private String isCalibration;
+
+    @ApiModelProperty("鍒ゅ畾缁撴灉")
+    private String result;
+
+    @ApiModelProperty("鍗曢」缁撴灉璇存槑")
+    private String singleResultStatement;
+
+    @ApiModelProperty("calibrate锛氭牎鍑嗭紱examine锛氭牳鏌�")
+    private String type;
+}
diff --git a/cnas-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..f60aefb
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceScrapped.java
@@ -0,0 +1,105 @@
+package com.ruoyi.device.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 璁惧鎶ュ簾鐢宠琛�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-17 01:53:47
+ */
+@Getter
+@Setter
+@TableName("device_scrapped")
+@ApiModel(value = "DeviceScrapped瀵硅薄", description = "璁惧鎶ュ簾鐢宠琛�")
+public class DeviceScrapped {
+
+    @TableId(value = "scrapped_id", type = IdType.AUTO)
+    private Integer scrappedId;
+
+    @ApiModelProperty("璁惧id")
+    private Integer deviceId;
+
+    @ApiModelProperty("閰嶄欢")
+    private String parts;
+
+    @ApiModelProperty("鎶ュ簾鐞嗙敱")
+    private String reasonsForScrap;
+
+    @ApiModelProperty("鐢宠浜篿d")
+    private Integer applicantUserId;
+
+    @ApiModelProperty("鐢宠浜�")
+    private String applicantUser;
+
+    @ApiModelProperty("鐢宠鏃堕棿")
+    private LocalDate applicantDate;
+
+    @ApiModelProperty("閮ㄩ棬璐熻矗浜烘剰瑙�")
+    private String departmentHeadOpinion;
+
+    @ApiModelProperty("閮ㄩ棬璐熻矗浜篿d")
+    private Integer departmentHeadUserId;
+
+    @ApiModelProperty("閮ㄩ棬璐熻矗浜�")
+    private String departmentHeadUser;
+
+    @ApiModelProperty("閮ㄩ棬璐熻矗浜哄~鍐欐椂闂�")
+    private LocalDate departmentHeadDate;
+
+    @ApiModelProperty("璁¢噺瀹ゆ剰瑙�")
+    private String meteringRoomOpinion;
+
+    @ApiModelProperty("璁¢噺瀹や汉id")
+    private Integer meteringRoomUserId;
+
+    @ApiModelProperty("璁¢噺瀹や汉")
+    private String meteringRoomUser;
+
+    @ApiModelProperty("璁¢噺瀹や汉濉啓鏃堕棿")
+    private LocalDate meteringRoomDate;
+
+    @ApiModelProperty("鎵瑰噯浜烘剰瑙�")
+    private String approverOpinion;
+
+    @ApiModelProperty("鎵瑰噯浜篿d")
+    private Integer approverUserId;
+
+    @ApiModelProperty("鎵瑰噯浜�")
+    private String approverUser;
+
+    @ApiModelProperty("鎵瑰噯浜哄~鍐欐椂闂�")
+    private LocalDate approverDate;
+
+    @ApiModelProperty("鏄惁缁撴潫,0: 鏈粨鏉�, 1:缁撴潫")
+    private Integer isFinish;
+
+    @ApiModelProperty("鍒涘缓浜�")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @ApiModelProperty("鍒涘缓鏃堕棿")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @ApiModelProperty("淇敼浜�")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    @ApiModelProperty("淇敼鏃堕棿")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+
+    @TableField(exist = false,select = false)
+    @ApiModelProperty("娴佺▼, 0:鎶ュ簾鐢宠, 1鐢宠閮ㄩ棬璐熻矗浜烘剰瑙�, 2:璁¢噺瀹ゆ剰瑙�, 3:鎵瑰噯浜�")
+    private Integer flowType;
+}
diff --git a/cnas-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..e212f3e
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceState.java
@@ -0,0 +1,107 @@
+package com.ruoyi.device.pojo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 璁惧鍋滅敤/鍚敤
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-09-26 09:51:40
+ */
+@Getter
+@Setter
+@TableName("device_state")
+@ApiModel(value = "DeviceState瀵硅薄", description = "璁惧鍋滅敤/鍚敤")
+public class DeviceState implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("璁惧鍋滅敤鍚敤id")
+    @TableId(value = "state_id", type = IdType.AUTO)
+    private Integer stateId;
+
+    @ApiModelProperty("娴佺▼缂栧彿")
+    private String processNumber;
+
+    @ApiModelProperty("0閰嶄欢")
+    private String accessoryPart;
+
+    @ApiModelProperty("0璁惧鐘舵��")
+    private String deviceStatus;
+
+    @ApiModelProperty("0鍋滅敤鍚敤鐞嗙敱")
+    private String reason;
+
+    @ApiModelProperty("0涓嬬幆鑺傝矗浠讳汉")
+    private String submitNextPesponsible;
+
+    @ApiModelProperty("0鎿嶄綔浜�")
+    private String submitOperatingPersonnel;
+
+    @ApiModelProperty("0鏃ユ湡")
+    private LocalDateTime submitDate;
+
+    @ApiModelProperty("1閮ㄩ棬璐熻矗浜烘剰瑙�")
+    private String departmentReviewOpinion;
+
+    @ApiModelProperty("1涓嬬幆鑺傝矗浠讳汉")
+    private String departmentNextPesponsible;
+
+    @ApiModelProperty("1鎿嶄綔浜�")
+    private String departmentOperatingPersonnel;
+
+    @ApiModelProperty("1鏃ユ湡")
+    private LocalDateTime departmentDate;
+
+    @ApiModelProperty("2璁¢噺瀹ゆ剰瑙�")
+    private String measuringRoomReviewOpinion;
+
+    @ApiModelProperty("2涓嬬幆鑺傝矗浠讳汉")
+    private String measuringRoomNextPesponsible;
+
+    @ApiModelProperty("2鎿嶄綔浜�")
+    private String measuringRoomOperatingPersonnel;
+
+    @ApiModelProperty("2鏃ユ湡")
+    private LocalDateTime measuringRoomDate;
+
+    @ApiModelProperty("3鎵瑰噯鎰忚")
+    private String approvalOpinion;
+
+    @ApiModelProperty("3涓嬬幆鑺傝矗浠讳汉")
+    private String approvalNextPesponsible;
+
+    @ApiModelProperty("3鎿嶄綔浜�")
+    private String approvalOperatingPersonnel;
+
+    @ApiModelProperty("3鏃ユ湡")
+    private LocalDateTime approvalDate;
+
+    @ApiModelProperty("褰撳墠鐘舵��")
+    private String currentState;
+
+    @ApiModelProperty("璁惧Id")
+    private Integer deviceId;
+
+    @ApiModelProperty("褰撳墠鐜妭璐熻矗浜�")
+    private String currentResponsible;
+
+    @ApiModelProperty("鎻愪氦浜�")
+    @ExcelProperty(value = "鎻愪氦浜�")
+    private String createUser;
+
+    @ApiModelProperty("鎻愪氦鏃ユ湡")
+    @ExcelProperty(value = "鎻愪氦鏃ユ湡")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/pojo/OperationInstruction.java b/cnas-device/src/main/java/com/ruoyi/device/pojo/OperationInstruction.java
new file mode 100644
index 0000000..7666be1
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/pojo/OperationInstruction.java
@@ -0,0 +1,88 @@
+package com.ruoyi.device.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 璁惧 - 浣滀笟鎸囧涔� 娣诲姞鍙楁帶鏂囦欢 瀛�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-12-04 10:43:32
+ */
+@Getter
+@Setter
+@TableName("device_operation_instruction")
+public class OperationInstruction {
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty("璁惧涓婚敭id")
+    private String deviceId;
+
+    @ApiModelProperty("鏂囦欢绫诲瀷")
+    private String documentType;
+
+    @ApiModelProperty("鏂囨。缂栧彿")
+    private String documentNumber;
+
+    @ApiModelProperty("鏂囦欢鐗堟湰")
+    private String documentVersion;
+
+    @ApiModelProperty("浣滆��")
+    private String author;
+
+    @ApiModelProperty("鎻愪氦鏃ユ湡")
+    private LocalDate submitDate;
+
+    @ApiModelProperty("鏂囨。璇存槑")
+    private String documentNote;
+
+    @ApiModelProperty("绯荤粺鐢熸垚鍚嶇О")
+    private String fileName;
+
+    @ApiModelProperty("绯荤粺鐢熸垚鍚嶇О")
+    private String fileSystemName;
+
+    @ApiModelProperty("浣滀笟鎸囧涔d")
+    private Integer instructionId;
+
+    @ApiModelProperty("涓婁紶浜篿d")
+    private Integer uploader;
+
+    @ApiModelProperty("瀹℃壒浜篿d")
+    private Integer approverId;
+
+    @ApiModelProperty("瀹℃壒鐘舵��")
+    private Boolean status;
+
+    @ApiModelProperty("鐢熸晥鏃堕棿")
+    private LocalDateTime entryIntoForceTime;
+
+    @ApiModelProperty("涓婁紶鏃堕棿")
+    private LocalDateTime uploadTime;
+
+    @ApiModelProperty("鏇存柊鏃堕棿")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+
+    @ApiModelProperty("鍒涘缓鏃堕棿")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @ApiModelProperty("鏇存柊浜篿d")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    @ApiModelProperty("鍒涘缓浜篿d")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/CollectBridgeService.java b/cnas-device/src/main/java/com/ruoyi/device/service/CollectBridgeService.java
new file mode 100644
index 0000000..3a6ce16
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/CollectBridgeService.java
@@ -0,0 +1,21 @@
+package com.ruoyi.device.service;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.device.pojo.CollectBridge;
+
+/**
+ * 鏁板瓧鐢垫ˉ閲囬泦
+ *
+ * @author zhuo
+ * @since 2025-02-19
+ */
+public interface CollectBridgeService extends IService<CollectBridge> {
+
+    /**
+     * 濉厖閲囬泦鏁版嵁
+     * @param jsonObject
+     */
+    void addBridgeValue(JSONObject jsonObject);
+}
+
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/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..3446429
--- /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 javax.servlet.http.HttpServletResponse;
+
+/**
+ * <p>
+ * 璁惧楠屾敹(瑁呭) 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-20 01:45:14
+ */
+public interface DeviceAcceptanceService extends IService<DeviceAcceptance> {
+
+    /**
+     * 璁惧楠屾敹鍒楄〃
+     * @param page
+     * @param deviceAcceptance
+     * @return
+     */
+    IPage<DeviceAcceptance> pageDeviceAcceptance(Page page, DeviceAcceptance deviceAcceptance);
+
+
+    boolean uploadDeviceAcceptanceFile(Integer acceptanceId, MultipartFile file);
+
+    /**
+     * 璁惧楠屾敹瀵煎嚭
+     * @param acceptanceId  璁惧楠屾敹id
+     * @param response   鍝嶅簲浣�
+     * @return
+     */
+    void exportDeviceAcceptance(Integer acceptanceId, HttpServletResponse response);
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/DeviceAccidentReportService.java b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceAccidentReportService.java
new file mode 100644
index 0000000..0b2ff31
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceAccidentReportService.java
@@ -0,0 +1,41 @@
+package com.ruoyi.device.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.device.pojo.DeviceAccidentReport;
+
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * <p>
+ * 璁惧浜嬫晠鎶ュ憡鍗� 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-17 06:31:12
+ */
+public interface DeviceAccidentReportService extends IService<DeviceAccidentReport> {
+
+    /**
+     * 璁惧浜嬫晠鎶ュ憡鍒楄〃
+     * @param page
+     * @param deviceAccidentReport
+     * @return
+     */
+    IPage<DeviceAccidentReport> pageDeviceAccidentReport(Page page, DeviceAccidentReport deviceAccidentReport);
+
+    /**
+     * 鏂板璁惧浜嬫晠鎶ュ憡
+     * @param deviceAccidentReport
+     * @return
+     */
+    boolean addDeviceAccidentReport(DeviceAccidentReport deviceAccidentReport);
+
+    /**
+     * 瀵煎嚭璁惧浜嬫晠鎶ュ憡
+     * @param accidentReportId 璁惧浜嬫晠鎶ュ憡id
+     * @param response 鍝嶅簲
+     */
+    void exportDeviceAccidentReport(Integer accidentReportId, HttpServletResponse response);
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/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..e244044
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceBreakdownMaintenanceService.java
@@ -0,0 +1,41 @@
+package com.ruoyi.device.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.device.dto.DeviceBreakdownMaintenance;
+
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * <p>
+ * 璁惧鏁呴殰缁翠慨琛� 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-17 04:50:57
+ */
+public interface DeviceBreakdownMaintenanceService extends IService<DeviceBreakdownMaintenance> {
+
+    /**
+     * 璁惧鏁呴殰缁翠慨鍒楄〃
+     * @param page
+     * @param deviceBreakdownMaintenance
+     * @return
+     */
+    IPage<DeviceBreakdownMaintenance> pageDeviceBreakdownMaintenance(Page page, DeviceBreakdownMaintenance deviceBreakdownMaintenance);
+
+    /**
+     * 鏂板璁惧鏁呴殰缁翠慨
+     * @param deviceBreakdownMaintenance
+     * @return
+     */
+    boolean addDeviceBreakdownMaintenance(DeviceBreakdownMaintenance deviceBreakdownMaintenance);
+
+    /**
+     * 瀵煎嚭璁惧鏁呴殰缁翠慨
+     * @param maintenanceId 璁惧鏁呴殰缁翠慨id
+     * @param response 鍝嶅簲
+     */
+    void exportDeviceBreakdownMaintenance(Integer maintenanceId, HttpServletResponse response);
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/DeviceInspectionRecordDetailsService.java b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceInspectionRecordDetailsService.java
new file mode 100644
index 0000000..4fd6270
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceInspectionRecordDetailsService.java
@@ -0,0 +1,16 @@
+package com.ruoyi.device.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.device.pojo.DeviceInspectionRecordDetails;
+
+/**
+ * <p>
+ *  鏈嶅姟绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-16 04:27:32
+ */
+public interface DeviceInspectionRecordDetailsService extends IService<DeviceInspectionRecordDetails> {
+
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/DeviceInspectionRecordService.java b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceInspectionRecordService.java
new file mode 100644
index 0000000..7278b3c
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceInspectionRecordService.java
@@ -0,0 +1,69 @@
+package com.ruoyi.device.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.device.dto.DeviceInspectionRecordDto;
+import com.ruoyi.device.pojo.DeviceInspectionRecord;
+
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * <p>
+ *  璁惧鐐规璁板綍琛� 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-16 04:25:14
+ */
+public interface DeviceInspectionRecordService extends IService<DeviceInspectionRecord> {
+
+    /**
+     * 鍒嗛〉鏌ヨ璁惧鐐规璁板綍
+     * @param page
+     */
+    Result<IPage<DeviceInspectionRecord>> getDeviceInspectionRecordByPage(IPage page, DeviceInspectionRecordDto deviceInspectionRecord);
+
+
+    /**
+     * 鏌ヨ鐐规璇︽儏
+     * @param inspectionRecordId
+     * @return
+     */
+    Result getDeviceInspectionRecord(Integer inspectionRecordId);
+
+    /**
+     * 鏂板璁惧鐐规璁板綍
+     *
+     * @param deviceInspectionRecord 璁惧鐐规璁板綍
+     */
+    Result addDeviceInspectionRecord(DeviceInspectionRecordDto deviceInspectionRecord);
+
+    /**
+     * 淇敼璁惧鐐规璁板綍
+     * @param deviceInspectionRecord 璁惧鐐规璁板綍
+     */
+    Result updateInspectionRecordAndDetails(DeviceInspectionRecordDto deviceInspectionRecord);
+
+    /**
+     * 鍒犻櫎璁惧鐐规璁板綍
+     * @param deviceInspectionRecord 璁惧鐐规璁板綍
+     */
+    Result deleteDeviceInspectionRecordOrDetails(DeviceInspectionRecordDto deviceInspectionRecord);
+
+    /**
+     * 澶嶆牳鐐规璁板綍
+     * @param deviceExamineRecordDto
+     * @return
+     */
+    Result reviewDeviceInspectionRecord(DeviceInspectionRecordDto deviceExamineRecordDto);
+
+    /**
+     * 瀵煎嚭璁惧鐐规璁板綍
+     *
+     * @param deviceInspectionRecordId 璁惧鐐规璁板綍id
+     * @param response
+     */
+    Result exportDeviceInspectionRecord(Integer deviceInspectionRecordId, HttpServletResponse response);
+
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/DeviceInstructionService.java b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceInstructionService.java
new file mode 100644
index 0000000..70e5f1c
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceInstructionService.java
@@ -0,0 +1,23 @@
+package com.ruoyi.device.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.device.dto.DeviceInstructionDto;
+import com.ruoyi.device.dto.DeviceOperationInstructionDto;
+import com.ruoyi.device.pojo.DeviceInstruction;
+
+/**
+ * <p>
+ * 浣滀笟鎸囧涔︽坊鍔犲彈鎺ф枃浠惰〃 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-12-04 10:29:18
+ */
+public interface DeviceInstructionService extends IService<DeviceInstruction> {
+
+    IPage<DeviceInstruction> pageByPageQueryOfHomeworkInstructions(Page page, DeviceOperationInstructionDto operationInstructionDto);
+
+    void newHomeworkGuidebookAdded(DeviceInstructionDto instructionDto);
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/DeviceMaintenanceService.java b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceMaintenanceService.java
new file mode 100644
index 0000000..4883178
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceMaintenanceService.java
@@ -0,0 +1,24 @@
+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.excel.DeviceMaintenanceExport;
+import com.ruoyi.device.pojo.DeviceMaintenance;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+
+public interface DeviceMaintenanceService extends IService<DeviceMaintenance> {
+    IPage<DeviceMaintenance> getDeviceMaintenancePage(Page page, Integer deviceId, String deviceNumber);
+
+    List<DeviceMaintenanceExport> deviceMaintenanceExport(Integer deviceId);
+
+    /**
+     * 瀵煎嚭Word璁惧缁存姢璁板綍
+     *
+     * @param deviceId
+     * @param response
+     */
+    void exportMaintenanceRecord(Integer deviceId, HttpServletResponse response);
+}
diff --git a/cnas-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..d55a281
--- /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..be7c8cc
--- /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..afc8bdd
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceOperationInstructionService.java
@@ -0,0 +1,20 @@
+package com.ruoyi.device.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.device.dto.DeviceOperationInstructionDto;
+import com.ruoyi.device.pojo.OperationInstruction;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 璁惧 - 浣滀笟鎸囧涔� 娣诲姞鍙楁帶鏂囦欢 瀛� 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-12-04 10:43:32
+ */
+public interface DeviceOperationInstructionService extends IService<OperationInstruction> {
+
+    List<DeviceOperationInstructionDto> homeworkGuidebookEditor(Integer instructionId);
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/DeviceScrappedService.java b/cnas-device/src/main/java/com/ruoyi/device/service/DeviceScrappedService.java
new file mode 100644
index 0000000..71cf704
--- /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 javax.servlet.http.HttpServletResponse;
+
+/**
+ * <p>
+ * 璁惧鎶ュ簾鐢宠琛� 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-17 01:53:47
+ */
+public interface DeviceScrappedService extends IService<DeviceScrapped> {
+
+    /**
+     * 璁惧鎶ュ簾鐢宠鍒楄〃
+     * @param page
+     * @param deviceScrapped
+     * @return
+     */
+    IPage<DeviceScrapped> pageDeviceScrapped(Page page, DeviceScrapped deviceScrapped);
+
+    /**
+     * 鏂板璁惧鎶ュ簾鐢宠
+     * @param deviceScrapped
+     * @return
+     */
+    boolean addDeviceScrapped(DeviceScrapped deviceScrapped);
+
+    /**
+     * 淇敼璁惧鎶ュ簾鐢宠
+     * @param scrappedId 璁惧鎶ュ簾鐢宠id
+     * @return
+     */
+    Result exportDeviceScrapped(Integer scrappedId, HttpServletResponse response);
+
+}
diff --git a/cnas-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..9a2b789
--- /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 javax.servlet.http.HttpServletResponse;
+
+/**
+ * <p>
+ * 璁惧鍋滅敤/鍚敤 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-09-26 09:51:40
+ */
+public interface DeviceStateService extends IService<DeviceState> {
+
+    IPage<DeviceStateDto> getDeviceStatePage(Integer deviceId, Page page, String processNumber);
+
+    /**
+     * 瀵煎嚭璁惧鐘舵��
+     *
+     * @param deviceId
+     * @param processNumber
+     * @param response
+     */
+    void exportDeviceStatus(Integer deviceId, String processNumber, HttpServletResponse response);
+}
diff --git a/cnas-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/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..911c0e5
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceAcceptanceServiceImpl.java
@@ -0,0 +1,159 @@
+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 javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import java.io.File;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URLEncoder;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.HashMap;
+
+/**
+ * <p>
+ * 璁惧楠屾敹(瑁呭) 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-20 01:45:14
+ */
+@Service
+public class DeviceAcceptanceServiceImpl extends ServiceImpl<DeviceAcceptanceMapper, DeviceAcceptance> implements DeviceAcceptanceService {
+
+    @Resource
+    private DeviceAcceptanceFileMapper deviceAcceptanceFileMapper;
+
+    @Resource
+    private DeviceMapper deviceMapper;
+
+    @Value("${file.path}")
+    private String imgUrl;
+
+    @Value("${wordUrl}")
+    private String wordUrl;
+
+    /**
+     * 璁惧楠屾敹鍒楄〃
+     * @param page
+     * @param deviceAcceptance
+     * @return
+     */
+    @Override
+    public IPage<DeviceAcceptance> pageDeviceAcceptance(Page page, DeviceAcceptance deviceAcceptance) {
+        return baseMapper.pageDeviceAcceptance(page, QueryWrappers.queryWrappers(deviceAcceptance));
+    }
+
+    /**
+     * 璁惧楠屾敹闄勪欢
+     * @param acceptanceId
+     * @param file
+     * @return
+     */
+    @Override
+    public boolean uploadDeviceAcceptanceFile(Integer acceptanceId, MultipartFile file) {
+        if (acceptanceId == null) {
+            throw new ErrorException("缂哄皯楠屾敹id");
+        }
+
+        String urlString;
+        String pathName;
+        String path;
+        String filename = file.getOriginalFilename();
+        String contentType = file.getContentType();
+        DeviceAcceptanceFile acceptanceFile = new DeviceAcceptanceFile();
+        acceptanceFile.setAcceptanceId(acceptanceId);
+        acceptanceFile.setFileName(filename);
+        if (contentType != null && contentType.startsWith("image/")) {
+            // 鏄浘鐗�
+            path = imgUrl;
+            acceptanceFile.setType(1);
+        } else {
+            // 鏄枃浠�
+            path = wordUrl;
+            acceptanceFile.setType(2);
+        }
+        try {
+            File realpath = new File(path);
+            if (!realpath.exists()) {
+                realpath.mkdirs();
+            }
+            pathName = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyMMddHHmmss")) + "_" + file.getOriginalFilename();
+            urlString = realpath + "/" + pathName;
+            file.transferTo(new File(urlString));
+            acceptanceFile.setFileUrl(pathName);
+            deviceAcceptanceFileMapper.insert(acceptanceFile);
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            System.err.println("闄勪欢涓婁紶閿欒");
+            return false;
+        }
+    }
+
+    /**
+     * 璁惧楠屾敹瀵煎嚭
+     * @param acceptanceId  璁惧楠屾敹id
+     * @param response   鍝嶅簲浣�
+     * @return
+     */
+    @Override
+    public void exportDeviceAcceptance(Integer acceptanceId, HttpServletResponse response) {
+        DeviceAcceptance deviceAcceptance = baseMapper.selectById(acceptanceId);
+        if (deviceAcceptance == null) {
+            throw new ErrorException("璁惧楠屾敹涓嶅瓨鍦�");
+        }
+        Device device = null;
+        if (deviceAcceptance.getDeviceId() != null) {
+            device = deviceMapper.selectById(deviceAcceptance.getDeviceId());
+        }
+
+
+        // 鑾峰彇璺緞
+        InputStream inputStream = this.getClass().getResourceAsStream("/static/word/acceptance-certificate.docx");
+        Configure configure = Configure.builder()
+                .bind("deviceInspectionRecordDetailsList", new HackLoopTableRenderPolicy())
+                .build();
+        Device finalDevice = device;
+        String deviceName = device.getDeviceName() == null ? "" : device.getDeviceName();
+        XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
+                new HashMap<String, Object>() {{
+                    put("deviceAcceptance", deviceAcceptance);
+                    put("device", finalDevice);
+                }});
+
+        try {
+            response.setContentType("application/msword");
+            String fileName = URLEncoder.encode(
+                    deviceName+ "楠屾敹鍗�", "UTF-8");
+            response.setHeader("Content-disposition",
+                    "attachment;filename=" + fileName + ".docx");
+            OutputStream os = response.getOutputStream();
+            template.write(os);
+            os.flush();
+            os.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException("瀵煎嚭澶辫触");
+        }
+    }
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceAccidentReportServiceImpl.java b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceAccidentReportServiceImpl.java
new file mode 100644
index 0000000..60d610e
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceAccidentReportServiceImpl.java
@@ -0,0 +1,189 @@
+package com.ruoyi.device.service.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.deepoove.poi.XWPFTemplate;
+import com.deepoove.poi.config.Configure;
+import com.ruoyi.common.core.domain.entity.User;
+import com.ruoyi.common.utils.QueryWrappers;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.device.dto.DeviceAccidentReportDto;
+import com.ruoyi.device.mapper.DeviceAccidentReportMapper;
+import com.ruoyi.device.mapper.DeviceMapper;
+import com.ruoyi.device.pojo.Device;
+import com.ruoyi.device.pojo.DeviceAccidentReport;
+import com.ruoyi.device.service.DeviceAccidentReportService;
+import com.ruoyi.inspect.util.UserUtils;
+import com.ruoyi.system.mapper.UserMapper;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URLEncoder;
+import java.time.LocalDate;
+import java.util.HashMap;
+
+/**
+ * <p>
+ * 璁惧浜嬫晠鎶ュ憡鍗� 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-17 06:31:12
+ */
+@Service
+public class DeviceAccidentReportServiceImpl extends ServiceImpl<DeviceAccidentReportMapper, DeviceAccidentReport> implements DeviceAccidentReportService {
+
+    @Resource
+    private UserMapper userMapper;
+
+
+    @Resource
+    private DeviceMapper deivceMapper;
+
+    /**
+     * 璁惧浜嬫晠鎶ュ憡鍒楄〃
+     * @param page
+     * @param deviceAccidentReport
+     * @return
+     */
+    @Override
+    public IPage<DeviceAccidentReport> pageDeviceAccidentReport(Page page, DeviceAccidentReport deviceAccidentReport) {
+        return baseMapper.pageDeviceAccidentReport(page, QueryWrappers.queryWrappers(deviceAccidentReport));
+    }
+
+    /**
+     * 鏂板璁惧浜嬫晠鎶ュ憡
+     * @param deviceAccidentReport
+     * @return
+     */
+    @Override
+    public boolean addDeviceAccidentReport(DeviceAccidentReport deviceAccidentReport) {
+        DeviceAccidentReport accidentReport = new DeviceAccidentReport();
+        User user = userMapper.selectById(SecurityUtils.getUserId().intValue());
+        switch (deviceAccidentReport.getFlowType()) {
+            case 0:
+                // 鎶ュ憡
+                BeanUtils.copyProperties(deviceAccidentReport, accidentReport);
+                accidentReport.setDescriptionOfAccident(deviceAccidentReport.getDescriptionOfAccident());
+                accidentReport.setReportUserId(user.getId());
+                accidentReport.setReportUser(user.getName());
+                accidentReport.setReportDate(LocalDate.now());
+
+                // 璇勪及浜轰俊鎭�
+                User assessorUser = userMapper.selectById(deviceAccidentReport.getAssessorUserId());
+                accidentReport.setAssessorUserId(assessorUser.getId());
+                accidentReport.setAssessorUser(assessorUser.getName());
+
+                baseMapper.insert(accidentReport);
+                break;
+            case 1:
+                accidentReport.setAccidentReportId(deviceAccidentReport.getAccidentReportId());
+                // 璇勪及
+                accidentReport.setAssessorOpinion(deviceAccidentReport.getAssessorOpinion());
+                accidentReport.setAssessorDate(LocalDate.now());
+
+                // 閮ㄩ棬璐熻矗浜�
+                User departmentHeadUser = userMapper.selectById(deviceAccidentReport.getDepartmentHeadUserId());
+                accidentReport.setDepartmentHeadUserId(departmentHeadUser.getId());
+                accidentReport.setDepartmentHeadUser(departmentHeadUser.getName());
+
+                baseMapper.updateById(accidentReport);
+
+                break;
+            case 2:
+                accidentReport.setAccidentReportId(deviceAccidentReport.getAccidentReportId());
+                // 閮ㄩ棬璐熻矗浜烘剰瑙�
+                accidentReport.setDepartmentHeadOpinion(deviceAccidentReport.getDepartmentHeadOpinion());
+                accidentReport.setDepartmentHeadDate(LocalDate.now());
+
+                // 鎶�鏈礋璐d汉淇℃伅
+                User technicalDirectorUser = userMapper.selectById(deviceAccidentReport.getTechnicalDirectorUserId());
+                accidentReport.setTechnicalDirectorUserId(technicalDirectorUser.getId());
+                accidentReport.setTechnicalDirectorUser(technicalDirectorUser.getName());
+
+                baseMapper.updateById(accidentReport);
+
+                break;
+            case 3:
+                accidentReport.setAccidentReportId(deviceAccidentReport.getAccidentReportId());
+                // 鎶�鏈礋璐d汉鎰忚
+                accidentReport.setTechnicalDirectorOpinion(deviceAccidentReport.getTechnicalDirectorOpinion());
+                accidentReport.setTechnicalDirectorDate(LocalDate.now());
+
+                // 涓讳换淇℃伅
+                User directorHeadUser = userMapper.selectById(deviceAccidentReport.getDirectorHeadUserId());
+                accidentReport.setDirectorHeadUserId(directorHeadUser.getId());
+                accidentReport.setDirectorHeadUser(directorHeadUser.getName());
+
+                baseMapper.updateById(accidentReport);
+
+                break;
+            case 4:
+                accidentReport.setAccidentReportId(deviceAccidentReport.getAccidentReportId());
+                // 涓讳换鎰忚
+                accidentReport.setDirectorHeadOpinion(deviceAccidentReport.getDirectorHeadOpinion());
+                accidentReport.setDirectorHeadDate(LocalDate.now());
+
+                accidentReport.setIsFinish(1);
+                baseMapper.updateById(accidentReport);
+                break;
+        }
+        return true;
+    }
+
+    /**
+     * 瀵煎嚭璁惧浜嬫晠鎶ュ憡
+     * @param accidentReportId 璁惧浜嬫晠鎶ュ憡id
+     * @param response 鍝嶅簲
+     */
+    @Override
+    public void exportDeviceAccidentReport(Integer accidentReportId, HttpServletResponse response) {
+        // 鏌ヨ浜嬫晠鎶ュ憡
+        DeviceAccidentReportDto deviceAccidentReport = baseMapper.selectDeviceAccidentReportById(accidentReportId);
+
+        Device device = deivceMapper.selectById(deviceAccidentReport.getDeviceId());
+        device = device == null ? new Device() : device;
+
+        // 鑾峰彇璺緞
+        InputStream inputStream = this.getClass().getResourceAsStream("/static/word/device-accident-report.docx");
+        Configure configure = Configure.builder()
+                .build();
+        Device finalDevice = device;
+        XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
+                new HashMap<String, Object>() {{
+                    put("deviceAccidentReport", deviceAccidentReport);
+                    put("device", finalDevice);
+                    // 鎶ュ憡浜虹鍚�
+                    put("reportUserUrl", UserUtils.getFinalUserSignatureUrl(deviceAccidentReport.getReportUserId()));
+                    // 璇勪及浜虹鍚�
+                    put("assessorUserUrl", UserUtils.getFinalUserSignatureUrl(deviceAccidentReport.getAssessorUserId()));
+                    // 閮ㄩ棬璐熻矗浜虹鍚�
+                    put("departmentHeadUserUrl", UserUtils.getFinalUserSignatureUrl(deviceAccidentReport.getDepartmentHeadUserId()));
+                    // 鎶�鏈礋璐d汉绛惧悕
+                    put("technicalDirectorUserUrl", UserUtils.getFinalUserSignatureUrl(deviceAccidentReport.getTechnicalDirectorUserId()));
+                    // 涓讳换绛惧悕
+                    put("directorHeadUserUrl", UserUtils.getFinalUserSignatureUrl(deviceAccidentReport.getDepartmentHeadUserId()));
+                }});
+
+        try {
+            response.setContentType("application/msword");
+            String deviceName = device.getDeviceName() == null ? "" : device.getDeviceName();
+            String fileName = URLEncoder.encode(
+                    deviceName + "璁惧浜嬫晠鎶ュ憡鍗�", "UTF-8");
+            response.setHeader("Content-disposition",
+                    "attachment;filename=" + fileName + ".docx");
+            OutputStream os = response.getOutputStream();
+            template.write(os);
+            os.flush();
+            os.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException("瀵煎嚭澶辫触");
+        }
+    }
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceBorrowServiceImpl.java b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceBorrowServiceImpl.java
new file mode 100644
index 0000000..72023fc
--- /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 javax.annotation.Resource;
+import java.text.SimpleDateFormat;
+import java.time.LocalDateTime;
+import java.util.*;
+
+/**
+ * <p>
+ * 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-09-21 10:53:51
+ */
+@Service
+@Transactional(rollbackFor = Exception.class)
+public class DeviceBorrowServiceImpl extends ServiceImpl<DeviceBorrowMapper, DeviceBorrow> implements DeviceBorrowService {
+
+    @Resource
+    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..8fb4089
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceBreakdownMaintenanceServiceImpl.java
@@ -0,0 +1,152 @@
+package com.ruoyi.device.service.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.deepoove.poi.XWPFTemplate;
+import com.deepoove.poi.config.Configure;
+import com.ruoyi.common.core.domain.entity.User;
+import com.ruoyi.common.utils.QueryWrappers;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.device.dto.DeviceBreakdownMaintenance;
+import com.ruoyi.device.mapper.DeviceBreakdownMaintenanceMapper;
+import com.ruoyi.device.mapper.DeviceMapper;
+import com.ruoyi.device.pojo.Device;
+import com.ruoyi.device.service.DeviceBreakdownMaintenanceService;
+import com.ruoyi.inspect.util.UserUtils;
+import com.ruoyi.system.mapper.UserMapper;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URLEncoder;
+import java.time.LocalDate;
+import java.util.HashMap;
+
+/**
+ * <p>
+ * 璁惧鏁呴殰缁翠慨琛� 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-17 04:50:57
+ */
+@Service
+public class DeviceBreakdownMaintenanceServiceImpl extends ServiceImpl<DeviceBreakdownMaintenanceMapper, DeviceBreakdownMaintenance> implements DeviceBreakdownMaintenanceService {
+
+    @Resource
+    private UserMapper userMapper;
+    @Resource
+    private DeviceMapper deivceMapper;
+
+    /**
+     * 璁惧鏁呴殰缁翠慨鍒楄〃
+     * @param page
+     * @param deviceBreakdownMaintenance
+     * @return
+     */
+    @Override
+    public IPage<DeviceBreakdownMaintenance> pageDeviceBreakdownMaintenance(Page page, DeviceBreakdownMaintenance deviceBreakdownMaintenance) {
+        return baseMapper.pageDeviceBreakdownMaintenance(page, QueryWrappers.queryWrappers(deviceBreakdownMaintenance));
+    }
+
+    /**
+     * 鏂板璁惧鏁呴殰缁翠慨
+     * @param deviceBreakdownMaintenance
+     * @return
+     */
+    @Override
+    public boolean addDeviceBreakdownMaintenance(DeviceBreakdownMaintenance deviceBreakdownMaintenance) {
+        DeviceBreakdownMaintenance breakdownMaintenance = new DeviceBreakdownMaintenance();
+        //褰撳墠鐧诲綍鐢ㄦ埛
+        User user = userMapper.selectById(SecurityUtils.getUserId().intValue());
+
+        switch (deviceBreakdownMaintenance.getFlowType()) {
+            case 0:
+                BeanUtils.copyProperties(deviceBreakdownMaintenance, breakdownMaintenance);
+                // 鐢宠
+                breakdownMaintenance.setDamageOrMalfunction(deviceBreakdownMaintenance.getDamageOrMalfunction());
+                breakdownMaintenance.setApplicantUserId(user.getId());
+                breakdownMaintenance.setApplicantUser(user.getName());
+                breakdownMaintenance.setRepairDate(deviceBreakdownMaintenance.getRepairDate());
+
+                // 澶勭悊浜轰俊鎭�
+                User departmentHeadUser = userMapper.selectById(deviceBreakdownMaintenance.getDepartmentHeadUserId());
+                breakdownMaintenance.setApplicantUserId(departmentHeadUser.getId());
+                breakdownMaintenance.setApplicantUser(departmentHeadUser.getName());
+
+                baseMapper.insert(breakdownMaintenance);
+                break;
+            case 1:
+                breakdownMaintenance.setMaintenanceId(deviceBreakdownMaintenance.getMaintenanceId());
+                // 鐢宠閮ㄩ棬璐熻矗浜烘剰瑙�
+                breakdownMaintenance.setDepartmentHeadOpinion(deviceBreakdownMaintenance.getDepartmentHeadOpinion());
+                breakdownMaintenance.setDepartmentHeadDate(LocalDate.now());
+
+                baseMapper.updateById(breakdownMaintenance);
+                break;
+            case 2:
+                breakdownMaintenance.setMaintenanceId(deviceBreakdownMaintenance.getMaintenanceId());
+                // 璁¢噺瀹ゆ剰瑙�
+                breakdownMaintenance.setMaintenanceRecord(deviceBreakdownMaintenance.getMaintenanceRecord());
+                breakdownMaintenance.setMaintenanceUser(deviceBreakdownMaintenance.getMaintenanceUser());
+                breakdownMaintenance.setMaintenanceDate(deviceBreakdownMaintenance.getMaintenanceDate());
+
+                breakdownMaintenance.setIsFinish(1);
+
+                baseMapper.updateById(breakdownMaintenance);
+                break;
+        }
+        return true;
+    }
+
+    /**
+     * 瀵煎嚭璁惧鏁呴殰缁翠慨
+     * @param maintenanceId 璁惧鏁呴殰缁翠慨id
+     * @param response 鍝嶅簲
+     */
+    @Override
+    public void exportDeviceBreakdownMaintenance(Integer maintenanceId, HttpServletResponse response) {
+        // 鏌ヨ澶栭儴璁惧鐢宠
+        DeviceBreakdownMaintenance deviceBreakdownMaintenance = baseMapper.selectById(maintenanceId);
+
+        Device device = null;
+        if (deviceBreakdownMaintenance.getDeviceId() != null) {
+            device = deivceMapper.selectById(deviceBreakdownMaintenance.getDeviceId());
+            device = device == null ? new Device() : device;
+        }
+        // 鑾峰彇璺緞
+        InputStream inputStream = this.getClass().getResourceAsStream("/static/word/device-breakdown-maintenance.docx");
+        Configure configure = Configure.builder()
+                .build();
+        Device finalDevice = device;
+        XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
+                new HashMap<String, Object>() {{
+                    put("deviceBreakdownMaintenance", deviceBreakdownMaintenance);
+                    put("device", finalDevice);
+                    // 鐢宠浜虹鍚�
+                    put("applicantUrl", UserUtils.getFinalUserSignatureUrl(deviceBreakdownMaintenance.getApplicantUserId()));
+                    // 閮ㄩ棬璐熻矗浜虹鍚�
+                    put("headUrl", UserUtils.getFinalUserSignatureUrl(deviceBreakdownMaintenance.getDepartmentHeadUserId()));
+                }});
+
+        try {
+            response.setContentType("application/msword");
+            String deviceName = device.getDeviceName() == null ? "" : device.getDeviceName();
+            String fileName = URLEncoder.encode(
+                    deviceName + "璁惧鏁呴殰缁翠慨鐢宠琛�", "UTF-8");
+            response.setHeader("Content-disposition",
+                    "attachment;filename=" + fileName + ".docx");
+            OutputStream os = response.getOutputStream();
+            template.write(os);
+            os.flush();
+            os.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException("瀵煎嚭澶辫触");
+        }
+    }
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceInspectionRecordDetailsServiceImpl.java b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceInspectionRecordDetailsServiceImpl.java
new file mode 100644
index 0000000..9058081
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceInspectionRecordDetailsServiceImpl.java
@@ -0,0 +1,20 @@
+package com.ruoyi.device.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.device.mapper.DeviceInspectionRecordDetailsMapper;
+import com.ruoyi.device.pojo.DeviceInspectionRecordDetails;
+import com.ruoyi.device.service.DeviceInspectionRecordDetailsService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-16 04:27:32
+ */
+@Service
+public class DeviceInspectionRecordDetailsServiceImpl extends ServiceImpl<DeviceInspectionRecordDetailsMapper, DeviceInspectionRecordDetails> implements DeviceInspectionRecordDetailsService {
+
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceInspectionRecordServiceImpl.java b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceInspectionRecordServiceImpl.java
new file mode 100644
index 0000000..2c8041d
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceInspectionRecordServiceImpl.java
@@ -0,0 +1,221 @@
+package com.ruoyi.device.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.deepoove.poi.XWPFTemplate;
+import com.deepoove.poi.config.Configure;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.common.core.domain.entity.User;
+import com.ruoyi.common.utils.QueryWrappers;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.device.dto.DeviceInspectionRecordDto;
+import com.ruoyi.device.mapper.DeviceInspectionRecordMapper;
+import com.ruoyi.device.mapper.DeviceMapper;
+import com.ruoyi.device.pojo.Device;
+import com.ruoyi.device.pojo.DeviceInspectionRecord;
+import com.ruoyi.device.pojo.DeviceInspectionRecordDetails;
+import com.ruoyi.device.service.DeviceInspectionRecordDetailsService;
+import com.ruoyi.device.service.DeviceInspectionRecordService;
+import com.ruoyi.inspect.util.HackLoopTableRenderPolicy;
+import com.ruoyi.inspect.util.UserUtils;
+import com.ruoyi.system.mapper.UserMapper;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URLEncoder;
+import java.time.format.DateTimeFormatter;
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * <p>
+ * 璁惧鐐规璁板綍琛� 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-16 04:25:14
+ */
+@Service
+@Transactional(rollbackFor = Exception.class)
+public class DeviceInspectionRecordServiceImpl extends ServiceImpl<DeviceInspectionRecordMapper, DeviceInspectionRecord> implements DeviceInspectionRecordService {
+    @Resource
+    private UserMapper userMapper;
+    @Resource
+    private DeviceMapper deviceMapper;
+    @Resource
+    private DeviceInspectionRecordDetailsService deviceInspectionRecordDetailsService;
+
+    /**
+     * 鍒嗛〉鏌ヨ璁惧鐐规璁板綍
+     *
+     * @param page 褰撳墠椤电爜
+     */
+    @Override
+    public Result<IPage<DeviceInspectionRecord>> getDeviceInspectionRecordByPage(IPage page, DeviceInspectionRecordDto deviceInspectionRecordDto) {
+        IPage<DeviceInspectionRecord> iPage = baseMapper.selectDeviceParameterPage(page, QueryWrappers.queryWrappers(deviceInspectionRecordDto));
+        return Result.success(iPage);
+    }
+
+
+    /**
+     * 鏌ヨ鐐规璇︽儏
+     * @param inspectionRecordId
+     * @return
+     */
+    @Override
+    public Result getDeviceInspectionRecord(Integer inspectionRecordId) {
+        DeviceInspectionRecord deviceInspectionRecord = baseMapper.selectById(inspectionRecordId);
+        DeviceInspectionRecordDto dto = new DeviceInspectionRecordDto();
+        BeanUtils.copyProperties(deviceInspectionRecord, dto);
+        List<DeviceInspectionRecordDetails> list = deviceInspectionRecordDetailsService.list(Wrappers.<DeviceInspectionRecordDetails>lambdaQuery().eq(DeviceInspectionRecordDetails::getInspectionRecordId, inspectionRecordId));
+        dto.setDetails(list);
+        return Result.success(dto);
+    }
+
+    /**
+     * 鏂板璁惧鐐规璁板綍
+     *
+     * @param deviceInspectionRecord 璁惧鐐规璁板綍
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Result addDeviceInspectionRecord(DeviceInspectionRecordDto deviceInspectionRecord) {
+
+        Integer userId = SecurityUtils.getUserId().intValue();
+        User user = userMapper.selectById(userId);
+        deviceInspectionRecord.setRecorderId(userId);
+        deviceInspectionRecord.setRecorder(user.getName());
+
+        // 鏌ヨ澶嶆牳浜篿d
+        if (deviceInspectionRecord.getReviewerId() != null) {
+            User reviewUser = userMapper.selectById(deviceInspectionRecord.getReviewerId());
+            deviceInspectionRecord.setReviewer(reviewUser.getName());
+        }
+        this.saveOrUpdate(deviceInspectionRecord);
+        if (CollectionUtils.isNotEmpty(deviceInspectionRecord.getDetails())) {
+            for (DeviceInspectionRecordDetails detail : deviceInspectionRecord.getDetails()) {
+                detail.setInspectionRecordId(deviceInspectionRecord.getInspectionRecordId());
+            }
+            deviceInspectionRecordDetailsService.saveBatch( deviceInspectionRecord.getDetails());
+        }
+
+        return Result.success();
+    }
+
+
+    /**
+     * 淇敼璁惧鐐规璁板綍
+     *
+     * @param deviceInspectionRecord 璁惧鐐规璁板綍
+     */
+    @Override
+    public Result updateInspectionRecordAndDetails(DeviceInspectionRecordDto deviceInspectionRecord) {
+        // 鏌ヨ澶嶆牳浜篿d
+        if (deviceInspectionRecord.getReviewerId() != null) {
+            User reviewUser = userMapper.selectById(deviceInspectionRecord.getReviewerId());
+            deviceInspectionRecord.setReviewer(reviewUser.getName());
+        }
+        this.saveOrUpdate(deviceInspectionRecord);
+        deviceInspectionRecordDetailsService.remove(Wrappers.<DeviceInspectionRecordDetails>lambdaQuery().eq(DeviceInspectionRecordDetails::getInspectionRecordId, deviceInspectionRecord.getInspectionRecordId()));
+        if (CollectionUtils.isNotEmpty(deviceInspectionRecord.getDetails())) {
+            for (DeviceInspectionRecordDetails detail : deviceInspectionRecord.getDetails()) {
+                detail.setInspectionRecordId(deviceInspectionRecord.getInspectionRecordId());
+            }
+            deviceInspectionRecordDetailsService.saveBatch( deviceInspectionRecord.getDetails());
+        }
+        return Result.success();
+    }
+
+    /**
+     * 鍒犻櫎璁惧鐐规璁板綍
+     *
+     * @param deviceInspectionRecord 璁惧鐐规璁板綍
+     */
+    @Override
+    public Result deleteDeviceInspectionRecordOrDetails(DeviceInspectionRecordDto deviceInspectionRecord) {
+        this.removeById(deviceInspectionRecord);
+        deviceInspectionRecordDetailsService.remove(Wrappers.<DeviceInspectionRecordDetails>lambdaQuery().eq(DeviceInspectionRecordDetails::getInspectionRecordId, deviceInspectionRecord.getInspectionRecordId()));
+        return Result.success();
+    }
+
+    /**
+     * 澶嶆牳鐐规璁板綍
+     * @param dto
+     * @return
+     */
+    @Override
+    public Result reviewDeviceInspectionRecord(DeviceInspectionRecordDto dto) {
+        LambdaUpdateWrapper<DeviceInspectionRecord> wrapper = Wrappers.<DeviceInspectionRecord>lambdaUpdate()
+                .eq(DeviceInspectionRecord::getInspectionRecordId, dto.getInspectionRecordId())
+                .set(DeviceInspectionRecord::getStatus, dto.getStatus())
+                .set(DeviceInspectionRecord::getReviewerRemark, dto.getReviewerRemark());
+
+        // 涓�0娓呴櫎瀹℃牳浜�
+        if (dto.getStatus().equals(0)) {
+            wrapper.set(DeviceInspectionRecord::getReviewerId, null)
+                    .set(DeviceInspectionRecord::getReviewer, null);
+        }
+        this.update(wrapper);
+
+        return Result.success();
+    }
+
+    /**
+     * 瀵煎嚭璁惧鐐规璁板綍
+     *
+     * @param deviceInspectionRecordId 璁惧鐐规璁板綍id
+     * @param response                 鍝嶅簲
+     */
+    @Override
+    public Result exportDeviceInspectionRecord(Integer deviceInspectionRecordId, HttpServletResponse response) {
+        DeviceInspectionRecord deviceInspectionRecord = baseMapper.selectById(deviceInspectionRecordId);
+        DeviceInspectionRecordDto deviceInspectionRecordDto = new DeviceInspectionRecordDto();
+        BeanUtils.copyProperties(deviceInspectionRecord, deviceInspectionRecordDto);
+        DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+        deviceInspectionRecordDto.setTestDateString(deviceInspectionRecord.getTestDate() == null ? null : deviceInspectionRecord.getTestDate().format(dateFormatter));
+
+        List<DeviceInspectionRecordDetails> deviceInspectionRecordDetailsList = deviceInspectionRecordDetailsService.list(Wrappers.<DeviceInspectionRecordDetails>lambdaQuery().eq(DeviceInspectionRecordDetails::getInspectionRecordId, deviceInspectionRecordId));
+
+        Integer deviceId = deviceInspectionRecord.getDeviceId();
+
+        Device device = deviceMapper.selectById(deviceId);
+
+        // 鑾峰彇璺緞
+        InputStream inputStream = this.getClass().getResourceAsStream("/static/word/device-inspection-record.docx");
+        Configure configure = Configure.builder()
+                .bind("deviceInspectionRecordDetailsList", new HackLoopTableRenderPolicy())
+                .build();
+        XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
+                new HashMap<String, Object>() {{
+                    put("deviceInspectionRecord", deviceInspectionRecordDto);
+                    put("deviceInspectionRecordDetailsList", deviceInspectionRecordDetailsList);
+                    put("device", device);
+                    put("recorderUrl", UserUtils.getFinalUserSignatureUrl(deviceInspectionRecordDto.getRecorderId()));
+                    put("reviewerUrl", UserUtils.getFinalUserSignatureUrl(deviceInspectionRecordDto.getReviewerId()));
+                }});
+
+        try {
+            response.setContentType("application/msword");
+            String fileName = URLEncoder.encode(
+                    device.getDeviceName() + "鐐规璁板綍", "UTF-8");
+            response.setHeader("Content-disposition",
+                    "attachment;filename=" + fileName + ".docx");
+            OutputStream os = response.getOutputStream();
+            template.write(os);
+            os.flush();
+            os.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException("瀵煎嚭澶辫触");
+        }
+        return Result.success();
+    }
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceInstructionServiceImpl.java b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceInstructionServiceImpl.java
new file mode 100644
index 0000000..6f5bb5b
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceInstructionServiceImpl.java
@@ -0,0 +1,67 @@
+package com.ruoyi.device.service.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.common.numgen.NumberGenerator;
+import com.ruoyi.common.utils.QueryWrappers;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.device.dto.DeviceInstructionDto;
+import com.ruoyi.device.dto.DeviceOperationInstructionDto;
+import com.ruoyi.device.mapper.InstructionMapper;
+import com.ruoyi.device.pojo.DeviceInstruction;
+import com.ruoyi.device.service.DeviceInstructionService;
+import com.ruoyi.device.service.DeviceOperationInstructionService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.text.SimpleDateFormat;
+import java.time.LocalDateTime;
+import java.util.Date;
+import java.util.Locale;
+
+/**
+ * <p>
+ * 浣滀笟鎸囧涔︽坊鍔犲彈鎺ф枃浠惰〃 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-12-04 10:29:18
+ */
+@Service
+@Transactional(rollbackFor = Exception.class)
+public class DeviceInstructionServiceImpl extends ServiceImpl<InstructionMapper, DeviceInstruction> implements DeviceInstructionService {
+
+    @Autowired
+    private DeviceOperationInstructionService operationInstructionService;
+
+    @Autowired
+    private NumberGenerator<DeviceInstruction> numberGenerator;
+
+    @Override
+    public IPage<DeviceInstruction> pageByPageQueryOfHomeworkInstructions(Page page, DeviceOperationInstructionDto operationInstructionDto) {
+        return baseMapper.pageByPageQueryOfHomeworkInstructions(page, QueryWrappers.queryWrappers(operationInstructionDto));
+    }
+
+    @Override
+    public void newHomeworkGuidebookAdded(DeviceInstructionDto instructionDto) {
+        if (ObjectUtils.isEmpty(instructionDto.getApplicationNumber())) {
+            String year = new SimpleDateFormat("yy", Locale.CHINESE).format(new Date());
+            String month = new SimpleDateFormat("MM", Locale.CHINESE).format(new Date());
+            String day = new SimpleDateFormat("dd", Locale.CHINESE).format(new Date());
+            String processNumber = numberGenerator.generateNumberWithPrefix(3, "WJSK" + year + month + day, DeviceInstruction::getApplicationNumber);
+            instructionDto.setApplicationNumber(processNumber);
+        }
+        saveOrUpdate(instructionDto);
+        if (ObjectUtils.isNotEmpty(instructionDto.getFeTempHumRecordList())) {
+            instructionDto.getFeTempHumRecordList().forEach(i -> {
+                i.setInstructionId(instructionDto.getId());
+                i.setUploader(SecurityUtils.getUserId().intValue());
+                i.setUpdateTime(LocalDateTime.now());
+            });
+            operationInstructionService.saveOrUpdateBatch(instructionDto.getFeTempHumRecordList());
+        }
+    }
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceMaintenanceImpl.java b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceMaintenanceImpl.java
new file mode 100644
index 0000000..3487fc2
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceMaintenanceImpl.java
@@ -0,0 +1,86 @@
+package com.ruoyi.device.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.device.excel.DeviceMaintenanceExport;
+import com.ruoyi.device.mapper.DeviceMaintenanceMapper;
+import com.ruoyi.device.mapper.DeviceMapper;
+import com.ruoyi.device.pojo.DeviceMaintenance;
+import com.ruoyi.device.service.DeviceMaintenanceService;
+import com.ruoyi.inspect.util.HackLoopTableRenderPolicy;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URLEncoder;
+import java.util.HashMap;
+import java.util.List;
+
+@Service
+public class DeviceMaintenanceImpl extends ServiceImpl<DeviceMaintenanceMapper, DeviceMaintenance> implements DeviceMaintenanceService {
+
+    @Override
+    public IPage<DeviceMaintenance> getDeviceMaintenancePage(Page page, Integer deviceId, String deviceNumber) {
+        return baseMapper.selectPage(page, Wrappers.<DeviceMaintenance>lambdaQuery()
+                .eq(DeviceMaintenance::getDeviceId, deviceId)
+                .like(DeviceMaintenance::getDeviceNumber, deviceNumber));
+    }
+
+    @Override
+    public List<DeviceMaintenanceExport> deviceMaintenanceExport(Integer deviceId) {
+        return baseMapper.deviceMaintenanceExport(deviceId);
+    }
+
+    @Override
+    public void exportMaintenanceRecord(Integer deviceId, HttpServletResponse response) {
+        // 鏌ヨcnas璁惧缁翠慨璁板綍
+        List<DeviceMaintenance> deviceMaintenanceList = baseMapper.selectList(Wrappers.<DeviceMaintenance>lambdaQuery()
+                .eq(DeviceMaintenance::getDeviceId, deviceId)
+                .select(DeviceMaintenance::getDate,
+                        DeviceMaintenance::getDeviceNumber,
+                        DeviceMaintenance::getDeviceName,
+                        DeviceMaintenance::getManagementNumber,
+                        DeviceMaintenance::getContent,
+                        DeviceMaintenance::getName,
+                        DeviceMaintenance::getComments));
+
+
+        // 鑾峰彇璺緞
+        InputStream inputStream = this.getClass().getResourceAsStream("/static/word/maintenance-records.docx");
+        Configure configure = Configure.builder()
+                .bind("deviceMaintenanceList", new HackLoopTableRenderPolicy())
+                .build();
+        // 鑾峰彇璁惧 鍚嶇О 鍜� 缂栧彿
+        DeviceMaintenance deviceMaintenance = deviceMaintenanceList.get(0);
+        String deviceName = deviceMaintenance.getDeviceName();
+        String managementNumber = deviceMaintenance.getManagementNumber();
+        XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
+                new HashMap<String, Object>() {{
+                    put("deviceMaintenanceList", deviceMaintenanceList);
+                    put("deviceName", deviceName);
+                    put("managementNumber", managementNumber);
+                }});
+
+        try {
+            response.setContentType("application/msword");
+            String fileName = URLEncoder.encode(
+                    "璁惧缁存姢淇濆吇璁板綍", "UTF-8");
+            response.setHeader("Content-disposition",
+                    "attachment;filename=" + fileName + ".docx");
+            OutputStream os = response.getOutputStream();
+            template.write(os);
+            os.flush();
+            os.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException("瀵煎嚭澶辫触");
+        }
+    }
+
+}
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..8ce075f
--- /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/DeviceMetricsCopyServiceImpl.java b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceMetricsCopyServiceImpl.java
new file mode 100644
index 0000000..22d1535
--- /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..273dd2c
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceOperationInstructionServiceImpl.java
@@ -0,0 +1,27 @@
+package com.ruoyi.device.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.device.dto.DeviceOperationInstructionDto;
+import com.ruoyi.device.mapper.OperationInstructionMapper;
+import com.ruoyi.device.pojo.OperationInstruction;
+import com.ruoyi.device.service.DeviceOperationInstructionService;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 璁惧 - 浣滀笟鎸囧涔� 娣诲姞鍙楁帶鏂囦欢 瀛� 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-12-04 10:43:32
+ */
+@Service
+public class DeviceOperationInstructionServiceImpl extends ServiceImpl<OperationInstructionMapper, OperationInstruction> implements DeviceOperationInstructionService {
+
+    @Override
+    public List<DeviceOperationInstructionDto> homeworkGuidebookEditor(Integer instructionId) {
+        return baseMapper.homeworkGuidebookEditor(instructionId);
+    }
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceScrappedServiceImpl.java b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceScrappedServiceImpl.java
new file mode 100644
index 0000000..910617a
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceScrappedServiceImpl.java
@@ -0,0 +1,179 @@
+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 javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URLEncoder;
+import java.time.LocalDate;
+import java.util.HashMap;
+
+/**
+ * <p>
+ * 璁惧鎶ュ簾鐢宠琛� 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-12-17 01:53:47
+ */
+@Service
+public class DeviceScrappedServiceImpl extends ServiceImpl<DeviceScrappedMapper, DeviceScrapped> implements DeviceScrappedService {
+
+    @Resource
+    private DeviceMapper deivceMapper;
+    @Resource
+    private UserMapper userMapper;
+
+
+    /**
+     * 璁惧鎶ュ簾鐢宠鍒楄〃
+     *
+     * @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();
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException("瀵煎嚭澶辫触");
+        }
+        return Result.success();
+    }
+}
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..f4f7c5a
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceStateServiceImpl.java
@@ -0,0 +1,159 @@
+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 javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URLEncoder;
+import java.time.format.DateTimeFormatter;
+import java.util.HashMap;
+
+/**
+ * <p>
+ * 璁惧鍋滅敤/鍚敤 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-09-26 09:51:40
+ */
+@Service
+public class DeviceStateServiceImpl extends ServiceImpl<DeviceStateMapper, DeviceState> implements DeviceStateService {
+
+    @Resource
+    private LaboratoryMapper laboratoryMapper;
+
+    @Resource
+    private UserMapper userMapper;
+
+    @Value("${file.path}")
+    private String imgUrl;
+
+    @Override
+    public IPage<DeviceStateDto> getDeviceStatePage(Integer deviceId, Page page, String processNumber) {
+        return baseMapper.getDeviceStatePage(deviceId, page, processNumber);
+    }
+
+    @Override
+    public void exportDeviceStatus(Integer deviceId, String processNumber, HttpServletResponse response) {
+        // 鏍规嵁娴佺▼缂栧彿 鏌ヨcnas璁惧鐘舵��
+        DeviceStateDto deviceStateDto = baseMapper.getDeviceStatePage(deviceId,new Page<DeviceStateDto>(1,1), processNumber).getRecords().get(0);
+
+        // 瀵规椂闂磋繘琛屼慨鏀�
+        DateTimeFormatter format = DateTimeFormatter.ofPattern("yyyy骞碝M鏈坉d鏃�");
+        deviceStateDto.setSubmitDateString(deviceStateDto.getSubmitDate() != null ? deviceStateDto.getSubmitDate().format(format) : "  骞� 鏈� 鏃�");
+        deviceStateDto.setDepartmentDateString(deviceStateDto.getDepartmentDate() != null? deviceStateDto.getDepartmentDate().format(format) : "  骞� 鏈� 鏃�");
+        deviceStateDto.setMeasuringRoomDateString(deviceStateDto.getMeasuringRoomDate() != null? deviceStateDto.getMeasuringRoomDate().format(format) : "  骞� 鏈� 鏃�");
+        deviceStateDto.setApprovalDateString(deviceStateDto.getApprovalDate() != null? deviceStateDto.getApprovalDate().format(format) : "  骞� 鏈� 鏃�");
+
+        // 鏌ヨ璁惧灞炰簬鍝釜瀹為獙瀹�
+        String laboratoryName;
+        String largeCategory = deviceStateDto.getLargeCategory();
+        if (StringUtils.isNotBlank(largeCategory)) {
+            largeCategory = largeCategory.substring(0, 1);
+            Laboratory laboratory = laboratoryMapper.selectOne(Wrappers.<Laboratory>lambdaQuery()
+                    .eq(Laboratory::getLaboratoryNumber, largeCategory)
+                    .select(Laboratory::getLaboratoryName));
+            laboratoryName = laboratory.getLaboratoryName();
+        } else {
+            laboratoryName = "";
+        }
+
+        //todo: 璁惧鐘舵�佹煡璇㈢鍚嶅湴鍧� 鏆傛椂浜哄悕鏌ヨ
+        //鑾峰彇鐢宠浜虹殑绛惧悕鍦板潃
+        String applicantUrl = null;
+        if (deviceStateDto.getSubmitOperatingPersonnel() != null) {
+            applicantUrl = userMapper.selectOne(Wrappers.<User>lambdaQuery()
+                            .eq(User::getName, deviceStateDto.getSubmitOperatingPersonnel()))
+                    .getSignatureUrl();
+            if (StringUtils.isBlank(applicantUrl)) {
+                throw new ErrorException("鎵句笉鍒扮敵璇蜂汉鐨勭鍚�");
+            }
+        }
+
+        //鑾峰彇閮ㄩ棬璐熻矗浜虹殑绛惧悕鍦板潃
+        String headOfDepartmentUrl = null;
+        if (deviceStateDto.getDepartmentNextPesponsible() != null) {
+            headOfDepartmentUrl = userMapper.selectOne(Wrappers.<User>lambdaQuery()
+                    .eq(User::getName, deviceStateDto.getDepartmentNextPesponsible()))
+                    .getSignatureUrl();
+            if (StringUtils.isBlank(headOfDepartmentUrl)) {
+                throw new ErrorException("鎵句笉鍒伴儴闂ㄨ礋璐d汉鐨勭鍚�");
+            }
+        }
+
+        //鑾峰彇璁¢噺瀹ゅ娴嬩汉鐨勭鍚嶅湴鍧�
+        String measurementRoomUrl = null;
+        if (deviceStateDto.getMeasuringRoomNextPesponsible() != null) {
+            measurementRoomUrl = userMapper.selectOne(Wrappers.<User>lambdaQuery()
+                            .eq(User::getName, deviceStateDto.getMeasuringRoomNextPesponsible()))
+                    .getSignatureUrl();
+            if (StringUtils.isBlank(measurementRoomUrl)) {
+                throw new ErrorException("鎵句笉鍒拌閲忓澶嶆祴浜虹殑绛惧悕");
+            }
+        }
+
+        //鑾峰彇鎵瑰噯浜虹殑绛惧悕鍦板潃
+        String approvedUrl = null;
+        if (deviceStateDto.getApprovalNextPesponsible() != null) {
+            approvedUrl = userMapper.selectOne(Wrappers.<User>lambdaQuery()
+                            .eq(User::getName, deviceStateDto.getApprovalNextPesponsible()))
+                    .getSignatureUrl();
+            if (StringUtils.isBlank(approvedUrl)) {
+                throw new ErrorException("鎵句笉鍒版壒鍑嗕汉鐨勭鍚�");
+            }
+        }
+
+        // 鑾峰彇璺緞
+        InputStream inputStream = this.getClass().getResourceAsStream("/static/word/device-status.docx");
+        Configure configure = Configure.builder()
+                .build();
+        String finalApplicantUrl = applicantUrl; // 鐢宠浜虹殑绛惧悕鍦板潃
+        String finalHeadOfDepartmentUrl = headOfDepartmentUrl; // 閮ㄩ棬璐熻矗浜虹殑绛惧悕鍦板潃
+        String finalMeasurementRoomUrl = measurementRoomUrl; // 璁¢噺瀹ゅ娴嬩汉鐨勭鍚嶅湴鍧�
+        String finalApprovedUrl = approvedUrl; // 鎵瑰噯浜虹殑绛惧悕鍦板潃
+        XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
+                new HashMap<String, Object>() {{
+                    put("deviceStateDto", deviceStateDto);
+                    put("submitOperatingPersonnelUrl", StringUtils.isNotBlank(finalApplicantUrl) ? Pictures.ofLocal(imgUrl + "/" + finalApplicantUrl).create() : null);
+                    put("departmentNextPesponsibleUrl", StringUtils.isNotBlank(finalHeadOfDepartmentUrl) ? Pictures.ofLocal(imgUrl + "/" + finalHeadOfDepartmentUrl).create() : null);
+                    put("measuringRoomNextPesponsibleUrl", StringUtils.isNotBlank(finalMeasurementRoomUrl) ? Pictures.ofLocal(imgUrl + "/" + finalMeasurementRoomUrl).create() : null);
+                    put("approvalNextPesponsibleUrl", StringUtils.isNotBlank(finalApprovedUrl) ? Pictures.ofLocal(imgUrl + "/" + finalApprovedUrl).create() : null);
+                    put("laboratory", laboratoryName);
+                }});
+
+        try {
+            response.setContentType("application/msword");
+            String fileName = URLEncoder.encode(
+                    "璁惧缁存姢淇濆吇璁板綍", "UTF-8");
+            response.setHeader("Content-disposition",
+                    "attachment;filename=" + fileName + ".docx");
+            OutputStream os = response.getOutputStream();
+            template.write(os);
+            os.flush();
+            os.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException("瀵煎嚭澶辫触");
+        }
+    }
+}
diff --git a/cnas-device/src/main/java/com/ruoyi/device/task/DeviceRecordSchedule.java b/cnas-device/src/main/java/com/ruoyi/device/task/DeviceRecordSchedule.java
new file mode 100644
index 0000000..7ead8cb
--- /dev/null
+++ b/cnas-device/src/main/java/com/ruoyi/device/task/DeviceRecordSchedule.java
@@ -0,0 +1,65 @@
+package com.ruoyi.device.task;
+
+import com.ruoyi.common.core.domain.entity.User;
+import com.ruoyi.common.utils.WxCpUtils;
+import com.ruoyi.device.dto.DeviceRecordDto;
+import com.ruoyi.device.mapper.DeviceRecordMapper;
+import com.ruoyi.device.pojo.DeviceRecord;
+import com.ruoyi.system.mapper.UserMapper;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * 璁惧浣跨敤璁板綍鎻愰啋
+ */
+@Component
+public class DeviceRecordSchedule {
+    @Resource
+    private DeviceRecordMapper deviceRecordMapper;
+    @Resource
+    private UserMapper userMapper;
+    @Resource
+    private ThreadPoolTaskExecutor threadPoolTaskExecutor;
+
+    /**
+     * 鎻愰啋濉啓璁惧浣跨敤璁板綍
+     */
+//    @Scheduled(cron = "0/5 * * * * *")
+    @Scheduled(cron = "0 0 9 * * 6") // 姣忓懆鍏墽琛屼竴娆�
+    public void task1() {
+        // 鏌ヨ鏈~鍐欑殑璁惧浣跨敤璁板綍
+        List<DeviceRecordDto> deviceRecords = deviceRecordMapper.selectNotFilled();
+        Map<Integer, List<DeviceRecordDto>> userPersonIdMap = deviceRecords.stream().collect(Collectors.groupingBy(DeviceRecord::getUsePersonId));
+        userPersonIdMap.forEach((userId, recordList) -> {
+            threadPoolTaskExecutor.execute(() -> {
+                // 浼佷笟寰俊閫氱煡濉啓璁惧浣跨敤璁板綍
+                User user = userMapper.selectById(userId);
+                String message = "";
+                message += "璁惧浣跨敤璁板綍鏈~鍐欐彁閱掗�氱煡";
+                for (DeviceRecordDto deviceRecord : recordList) {
+                    message += "\n璁惧鍚嶇О缂栧彿: " + deviceRecord.getDeviceName() + "-" + deviceRecord.getManagementNumber();
+                    message += "\n濮旀墭缂栧彿: " + deviceRecord.getSampleCode();
+                    message += "\n";
+                }
+                message += "\n璇峰幓濉啓璁惧浣跨敤璁板綍";
+
+                //鍙戦�佷紒涓氬井淇℃秷鎭�氱煡
+                try {
+                    WxCpUtils.inform(user.getAccount(), message, null);
+                } catch (Exception e) {
+                    throw new RuntimeException(e);
+                }
+
+            });
+        });
+
+
+    }
+
+}
diff --git a/cnas-device/src/main/resources/mapper/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..bb2454d
--- /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 `center-lims`.device on db.device_id=device.id
+        )a
+        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
+            ${ew.customSqlSegment}
+        </if>
+    </select>
+    <select id="getDeviceBorrowBydeviceId" resultType="com.ruoyi.device.pojo.DeviceBorrow">
+        select db.*,device_name
+        from device_borrow db
+                 left join `center-lims`.device on db.device_id=device.id
+        where device_id=#{deviceId}
+    </select>
+</mapper>
diff --git a/cnas-device/src/main/resources/mapper/DeviceBreakdownMaintenanceMapper.xml b/cnas-device/src/main/resources/mapper/DeviceBreakdownMaintenanceMapper.xml
new file mode 100644
index 0000000..4877ecf
--- /dev/null
+++ b/cnas-device/src/main/resources/mapper/DeviceBreakdownMaintenanceMapper.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.device.mapper.DeviceBreakdownMaintenanceMapper">
+
+    <!--璁惧鏁呴殰缁翠慨鍒楄〃-->
+    <select id="pageDeviceBreakdownMaintenance" resultType="com.ruoyi.device.dto.DeviceBreakdownMaintenance">
+        select * from (
+        select *
+        from device_breakdown_maintenance
+        order by create_time desc
+        ) a
+        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
+            ${ew.customSqlSegment}
+        </if>
+    </select>
+
+</mapper>
diff --git a/cnas-device/src/main/resources/mapper/DeviceInspectionRecordMapper.xml b/cnas-device/src/main/resources/mapper/DeviceInspectionRecordMapper.xml
new file mode 100644
index 0000000..af4ac42
--- /dev/null
+++ b/cnas-device/src/main/resources/mapper/DeviceInspectionRecordMapper.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.device.mapper.DeviceInspectionRecordMapper">
+
+
+    <select id="selectDeviceParameterPage" resultType="com.ruoyi.device.pojo.DeviceInspectionRecord">
+        SELECT
+            *
+        from device_inspection_record
+        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
+            ${ew.customSqlSegment}
+        </if>
+    </select>
+</mapper>
diff --git a/cnas-device/src/main/resources/mapper/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/InstructionMapper.xml b/cnas-device/src/main/resources/mapper/InstructionMapper.xml
new file mode 100644
index 0000000..2d1a823
--- /dev/null
+++ b/cnas-device/src/main/resources/mapper/InstructionMapper.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.device.mapper.InstructionMapper">
+
+
+    <select id="pageByPageQueryOfHomeworkInstructions" resultType="com.ruoyi.device.pojo.DeviceInstruction">
+        SELECT
+            doi.*,di.*,d.device_name, d.management_number device_number, d.specification_model device_model, u.name uploader_name, u1.name approver_name
+        FROM
+            device_operation_instruction doi
+                LEFT JOIN device_instruction di ON di.id = doi.instruction_id
+                left join device d on d.id = doi.device_id
+                left join user u on u.id = doi.uploader
+                left join user u1 on u1.id = doi.approver_id
+        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
+            ${ew.customSqlSegment}
+        </if>
+    </select>
+</mapper>
diff --git a/cnas-device/src/main/resources/mapper/OperationInstructionMapper.xml b/cnas-device/src/main/resources/mapper/OperationInstructionMapper.xml
new file mode 100644
index 0000000..5679e35
--- /dev/null
+++ b/cnas-device/src/main/resources/mapper/OperationInstructionMapper.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.device.mapper.OperationInstructionMapper">
+
+    <select id="homeworkGuidebookEditor" resultType="com.ruoyi.device.dto.DeviceOperationInstructionDto">
+        SELECT
+            doi.*,d.device_name, d.management_number device_number, d.specification_model device_model
+        FROM
+            device_operation_instruction doi
+                left join device d on d.id = doi.device_id
+        where doi.instruction_id = #{instructionId}
+    </select>
+</mapper>
diff --git a/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..4f4e6ff
--- /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-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-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..236e645
--- /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
index 0251cac..74f3ba3 100644
--- a/cnas-manage/src/main/java/com/ruoyi/manage/controller/ClientSatisfactionController.java
+++ b/cnas-manage/src/main/java/com/ruoyi/manage/controller/ClientSatisfactionController.java
@@ -71,7 +71,7 @@
      */
 
     @ApiOperation(value = "瀹㈡埛婊℃剰搴﹁皟鏌ユ柊澧�")
-    @GetMapping("/delClientSatisfaction")
+    @DeleteMapping("/delClientSatisfaction")
     public Result updateClientSatisfaction(Integer clientSatisfactionId){
         return Result.success(clientSatisfactionService.removeById(clientSatisfactionId));
     }
@@ -132,7 +132,7 @@
      */
 
     @ApiOperation(value = "鍒犻櫎鎴峰垎鏋愰檮浠�")
-    @GetMapping("/delAnalyseFile")
+    @DeleteMapping("/delAnalyseFile")
     public Result delAnalyseFile(Integer analyseFileId){
         return Result.success(clientSatisfactionAnalyseFileMapper.deleteById(analyseFileId));
     }
diff --git a/cnas-personnel/pom.xml b/cnas-personnel/pom.xml
new file mode 100644
index 0000000..689a7a9
--- /dev/null
+++ b/cnas-personnel/pom.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>com.ruoyi</groupId>
+        <artifactId>ruoyi</artifactId>
+        <version>3.8.9</version>
+    </parent>
+
+    <artifactId>cnas-personnel</artifactId>
+
+    <dependencies>
+        <!-- 閫氱敤宸ュ叿-->
+        <dependency>
+            <groupId>com.ruoyi</groupId>
+            <artifactId>ruoyi-common</artifactId>
+        </dependency>
+
+        <!-- 鏍稿績妯″潡-->
+        <dependency>
+            <groupId>com.ruoyi</groupId>
+            <artifactId>ruoyi-framework</artifactId>
+        </dependency>
+
+        <!-- 绯荤粺妯″潡-->
+        <dependency>
+            <groupId>com.ruoyi</groupId>
+            <artifactId>ruoyi-system</artifactId>
+        </dependency>
+
+        <!-- 绯荤粺妯″潡-->
+        <dependency>
+            <groupId>com.ruoyi</groupId>
+            <artifactId>inspect-server</artifactId>
+        </dependency>
+    </dependencies>
+
+    <properties>
+        <maven.compiler.source>8</maven.compiler.source>
+        <maven.compiler.target>8</maven.compiler.target>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    </properties>
+
+</project>
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..01b44d4
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonBasicInfoController.java
@@ -0,0 +1,229 @@
+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.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.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ *  鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-08-30 09:19:57
+ */
+@Api(tags = "浜哄憳-浜哄憳鍩烘湰淇℃伅")
+@RestController
+@RequestMapping("/personBasicInfo")
+public class PersonBasicInfoController {
+
+    @Resource
+    private PersonBasicInfoService personBasicInfoService;
+
+    @Resource
+    private PersonBasicInfoFileService personBasicInfoFileService;
+    @Resource
+    private PersonBasicInfoWorkService personBasicInfoWorkService;
+
+    @Resource
+    private AnnexService annexService;
+
+
+    @ApiOperation(value = "鏌ヨCNAS浜哄憳渚ц竟鏍�")
+    @GetMapping("/selectCNSAPersonTree")
+    public Result<List<DepartmentDto>> selectCNSAPersonTree() {
+        return Result.success(personBasicInfoService.selectCNSAPersonTree());
+    }
+
+    @ApiOperation(value = "鑾峰彇CNAS浜哄憳鍩烘湰淇℃伅")
+    @GetMapping("/getCNASPersonnelInfo")
+    public Result getCNASPersonnelInfo(Integer userId) {
+        return Result.success(personBasicInfoService.getCNASPersonnelInfo(userId));
+    }
+
+    @ApiOperation(value = "淇濆瓨CNAS浜哄憳鍩烘湰淇℃伅")
+    @PostMapping("/saveCNASPersonnelInfo")
+    public Result saveCNASPersonnelInfo(@RequestBody PersonBasicInfoDto personBasicInfoDto) {
+        personBasicInfoService.saveCNASPersonnelInfo(personBasicInfoDto);
+        return Result.success();
+    }
+
+    @ApiOperation(value = "浜哄憳鏄庣粏鍒嗛〉鏌ヨ")
+    @GetMapping("basicInformationOfPersonnelSelectPage")
+    public Result<IPage<Map<String, Object>>> basicInformationOfPersonnelSelectPage(Page<List<PersonBasicInfoDetailsDto>> page, String name, Integer departmentId) {
+        return Result.success(personBasicInfoService.basicInformationOfPersonnelSelectPage(page, name, departmentId));
+    }
+
+    // 涓婁紶鏂囦欢鎺ュ彛
+    @ApiOperation(value = "涓婁紶鏂囦欢鎺ュ彛")
+    @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();
+    }
+
+    @ApiOperation(value = "瀵煎嚭浜哄憳鍩烘湰淇℃伅")
+    @GetMapping("/exportPersonBasicInfo")
+    public void exportPersonBasicInfo(UserPageDto userPageDto, HttpServletResponse response) throws Exception {
+        personBasicInfoService.exportPersonBasicInfo(userPageDto,response);
+    }
+
+    @ApiOperation(value = "涓嬭浇浜哄憳妗f鍗�")
+    @GetMapping("/exportPersonBasicInfoById")
+    public Result exportPersonBasicInfoById(Integer id, HttpServletResponse response) {
+        return Result.success(personBasicInfoService.exportPersonBasicInfoById(id,response));
+    }
+
+    /**
+     * 浜哄憳鍩硅鍩烘湰淇℃伅闄勪欢鏂板
+     * @param userId
+     * @param file
+     * @return
+     */
+    @ApiOperation(value = "浜哄憳鍩硅鍩烘湰淇℃伅闄勪欢鏂板")
+    @PostMapping("/uploadBasicInfoFile")
+    public Result<?> uploadBasicInfoFile(Integer userId, MultipartFile file) {
+        return Result.success(personBasicInfoService.uploadBasicInfoFile(userId, file));
+    }
+
+
+    /**
+     * 浜哄憳鍩硅鍩烘湰淇℃伅闄勪欢鍒楄〃
+     * @return
+     */
+    @ApiOperation(value = "浜哄憳鍩硅鍩烘湰淇℃伅闄勪欢鍒楄〃")
+    @GetMapping("/getBasicInfoFileList")
+    public Result<List<PersonBasicInfoFile>> getBasicInfoFileList(Integer userId){
+        return Result.success(personBasicInfoFileService.list(Wrappers.<PersonBasicInfoFile>lambdaQuery()
+                .eq(PersonBasicInfoFile::getUserId, userId)));
+    }
+
+    /**
+     * 浜哄憳鍩硅鍩烘湰淇℃伅闄勪欢鍒犻櫎
+     * @return
+     */
+    @ApiOperation(value = "浜哄憳鍩硅鍩烘湰淇℃伅闄勪欢鍒犻櫎")
+    @GetMapping("/delBasicInfoFileList")
+    public Result delBasicInfoFileList(Integer basicInfoFileId){
+        return Result.success(personBasicInfoFileService.removeById(basicInfoFileId));
+    }
+
+    /**
+     * 浜哄憳鍩硅鍩烘湰淇℃伅宸ヤ綔缁忓巻鏂板
+     * @return
+     */
+    @ApiOperation(value = "浜哄憳鍩硅鍩烘湰淇℃伅宸ヤ綔缁忓巻鏂板")
+    @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
+     */
+    @ApiOperation(value = "浜哄憳宸ヤ綔缁忓巻鍒楄〃")
+    @GetMapping("/getBasicInfoWorkList")
+    public Result<List<PersonBasicInfoWork>> getBasicInfoWorkList(Integer userId){
+        return Result.success(personBasicInfoWorkService.list(Wrappers.<PersonBasicInfoWork>lambdaQuery()
+                .eq(PersonBasicInfoWork::getUserId, userId)));
+    }
+
+    /**
+     * 浜哄憳宸ヤ綔缁忓巻鍒犻櫎
+     * @return
+     */
+    @ApiOperation(value = "浜哄憳宸ヤ綔缁忓巻鍒犻櫎")
+    @GetMapping("/delBasicInfoWorkList")
+    public Result delBasicInfoWorkList(Integer basicInfoWorkId){
+        return Result.success(personBasicInfoWorkService.removeById(basicInfoWorkId));
+    }
+
+    /**
+     * 浜哄憳鍩烘湰淇℃伅闄勪欢鍒犻櫎
+     * @return
+     */
+    @ApiOperation(value = "浜哄憳宸ヤ綔缁忓巻淇敼")
+    @PostMapping("/updateBasicInfoWorkList")
+    public Result updateBasicInfoWorkList(@RequestBody PersonBasicInfoWork basicInfoWork){
+        return Result.success(personBasicInfoWorkService.updateById(basicInfoWork));
+    }
+}
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..3aef8b9
--- /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.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * <p>
+ * 娌熼�氳褰� 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-10-09 12:00:57
+ */
+@Api(tags = "浜哄憳 - 娌熼�氳褰�")
+@RestController
+@RequestMapping("/personCommunicationAbility")
+public class PersonCommunicationAbilityController {
+
+    @Autowired
+    private PersonCommunicationAbilityService personCommunicationAbilityService;
+
+    @ApiOperation(value = "鏂板/鏇存柊 娌熼�氳褰�")
+    @PostMapping("addOrUpdatePersonCommunicationAbility")
+    public Result<?> addOrUpdatePersonCommunicationAbility(@RequestBody PersonCommunicationAbility personCommunicationAbility) {
+        personCommunicationAbilityService.saveOrUpdate(personCommunicationAbility);
+        return Result.success();
+    }
+
+    @ApiOperation(value = "鍒犻櫎 娌熼�氳褰�")
+    @DeleteMapping("deletePersonCommunicationAbility")
+    public Result<?> deletePersonCommunicationAbility(@RequestParam("id") Integer id) {
+        personCommunicationAbilityService.removeById(id);
+        return Result.success();
+    }
+
+
+    @ApiOperation(value = "鏌ヨ 娌熼�氳褰�")
+    @GetMapping("personPersonCommunicationAbilityPage")
+    public Result<IPage<PersonCommunicationAbilityDto>> personPersonCommunicationAbilityPage(Page page,
+                                                                                             Integer departLimsId,
+                                                                                             Integer userId,
+                                                                                             String userName) {
+        return Result.success(personCommunicationAbilityService.personPersonCommunicationAbilityPage(page, departLimsId, userId, userName));
+    }
+
+    @ApiOperation(value = "瀵煎嚭娌熼�氳褰�")
+    @PostMapping("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..615af7b
--- /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.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * <p>
+ * 宀椾綅鑱岃矗 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-10-09 02:07:49
+ */
+@Api(tags = "浜哄憳 - 宀椾綅鑱岃矗")
+@RestController
+@RequestMapping("/personJobResponsibilities")
+public class PersonJobResponsibilitiesController {
+    @Autowired
+    private PersonJobResponsibilitiesService personJobResponsibilitiesService;
+
+    @ApiOperation(value = "鏂板/鏇存柊 宀椾綅鑱岃矗")
+    @PostMapping("/personJobResponsibilitiesSave")
+    public Result<?> personJobResponsibilitiesSave(@RequestBody PersonJobResponsibilities personJobResponsibilities) {
+        personJobResponsibilitiesService.saveOrUpdate(personJobResponsibilities);
+        return Result.success();
+    }
+
+
+    @ApiOperation(value = "鍒犻櫎 宀椾綅鑱岃矗")
+    @DeleteMapping("/personJobResponsibilitiesDelete")
+    public Result<?> personJobResponsibilitiesDelete(@RequestParam("id") Integer id) {
+        personJobResponsibilitiesService.removeById(id);
+        return Result.success();
+    }
+
+
+    @ApiOperation(value = "鏌ヨ 宀椾綅鑱岃矗")
+    @GetMapping("/personJobResponsibilitiesSelect")
+    public Result<IPage<PersonJobResponsibilitiesDto>> personJobResponsibilitiesSelect(Page page, String userId, String departmentId, String userName) {
+        IPage<PersonJobResponsibilitiesDto> iPage = personJobResponsibilitiesService.personJobResponsibilitiesSelect(page, userId, departmentId, userName);
+        return Result.success(iPage);
+    }
+
+
+    @ApiOperation(value = "瀵煎嚭浠昏亴宀椾綅璇存槑璇�")
+    @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..a066615
--- /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.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 浜哄憳鑳藉姏 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-10-10 11:26:18
+ */
+@Api(tags = "浜哄憳 - 浜哄憳鑳藉姏")
+@RestController
+@RequestMapping("/personPersonnelCapacity")
+public class PersonPersonnelCapacityController {
+
+    @Autowired
+    private PersonPersonnelCapacityService personPersonnelCapacityService;
+
+
+    @ApiOperation(value = "鏂板/鏇存柊 浜哄憳鑳藉姏")
+    @PostMapping("addOrUpdatePersonPersonnelCapacity")
+    public Result<?> addOrUpdatePersonPersonnelCapacity(@RequestBody PersonPersonnelCapacity personPersonnelCapacity) {
+        personPersonnelCapacityService.saveOrUpdate(personPersonnelCapacity);
+        return Result.success();
+    }
+
+    @ApiOperation(value = "鍒犻櫎 浜哄憳鑳藉姏")
+    @DeleteMapping("deletePersonPersonnelCapacity")
+    public Result<?> deletePersonPersonnelCapacity(@RequestParam("id") Integer id) {
+        // 鍒犻櫎鏁版嵁
+        personPersonnelCapacityService.removeById(id);
+        return Result.success();
+    }
+
+    @ApiOperation(value = "鏌ヨ 浜哄憳鑳藉姏")
+    @GetMapping("personPersonnelCapacityPage")
+    public Result<IPage<PersonPersonnelCapacityDto>> personPersonnelCapacityPage(Page page,
+                                                                                 Integer departmentId,
+                                                                                 Integer userId,
+                                                                                 String userName) {
+        return Result.success(personPersonnelCapacityService.personPersonnelCapacityPage(page, departmentId, userId, userName));
+    }
+
+    @ApiOperation(value = "纭 浜哄憳鑳藉姏")
+    @GetMapping("confirmPersonnelCapability")
+    public Result<?> confirmPersonnelCapability(@RequestParam("id") Integer id) {
+        Integer userId = SecurityUtils.getUserId().intValue();
+        personPersonnelCapacityService.update(Wrappers.<PersonPersonnelCapacity>lambdaUpdate()
+                .eq(PersonPersonnelCapacity::getId, id)
+                .set(PersonPersonnelCapacity::getConfirmOperatingPersonnelId, userId)
+                .set(PersonPersonnelCapacity::getConfirmDate, LocalDateTime.now()));
+        return Result.success();
+    }
+
+    /**
+     * 瀵煎嚭浜哄憳鑳藉姏
+     * @return
+     */
+    @ApiOperation(value = "瀵煎嚭浜哄憳鑳藉姏")
+    @GetMapping("/exportPersonnelCapacity")
+    public void exportPersonnelCapacity(Integer id, HttpServletResponse response){
+        personPersonnelCapacityService.exportPersonnelCapacity(id, response);
+    }
+
+    /**
+     * 鎻愪氦纭浜哄憳鑳藉姏
+     * @param personPersonnelCapacity
+     * @return
+     */
+    @ApiOperation(value = "鎻愪氦")
+    @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..c65f312
--- /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.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * <p>
+ * 浠昏亴鎺堟潈璁板綍 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-10-09 10:48:17
+ */
+@Api(tags = "浜哄憳 - 浠昏亴鎺堟潈璁板綍")
+@RestController
+@RequestMapping("/personPostAuthorizationRecord")
+public class PersonPostAuthorizationRecordController {
+
+    @Autowired
+    private PersonPostAuthorizationRecordService personPostAuthorizationRecordService;
+
+    @ApiOperation(value = "鏂板/鏇存柊 浠昏亴鎺堟潈璁板綍")
+    @PostMapping("/addOrUpdatePersonPostAuthorizationRecord")
+    public Result<?> addOrUpdatePersonPostAuthorizationRecord(@RequestBody PersonPostAuthorizationRecord personRewardPunishmentRecord) {
+        personPostAuthorizationRecordService.saveOrUpdate(personRewardPunishmentRecord);
+        return Result.success();
+    }
+
+    @ApiOperation(value = "鍒犻櫎 浠昏亴鎺堟潈璁板綍")
+    @DeleteMapping("/deletePersonPostAuthorizationRecord")
+    public Result<?> deletePersonPostAuthorizationRecord(@RequestParam("id") Integer id) {
+        // 鍒犻櫎鏂囦欢
+        PersonPostAuthorizationRecord postAuthorizationRecord = personPostAuthorizationRecordService.getById(id);
+        FileSaveUtil.DeleteFile(postAuthorizationRecord.getSystemFileName());
+        // 鍒犻櫎鏁版嵁
+        personPostAuthorizationRecordService.removeById(id);
+        return Result.success();
+    }
+
+
+    @ApiOperation(value = "鏌ヨ 浠昏亴鎺堟潈璁板綍")
+    @GetMapping("/PersonPostAuthorizationRecordPage")
+    public Result<IPage<PersonPostAuthorizationRecordDto>> PersonPostAuthorizationRecordPage(Page page,
+                                                                                             Integer departLimsId,
+                                                                                             Integer userId,
+                                                                                             String userName) {
+        return Result.success(personPostAuthorizationRecordService.personPostAuthorizationRecordPage(page, departLimsId, userId, userName));
+    }
+
+    @ApiOperation(value = "瀵煎嚭宀椾綅鑱屼笟璧勬牸璇佷功")
+    @PostMapping("/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..72f4e43
--- /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.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.SneakyThrows;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * <p>
+ * 濂栨儵璁板綍 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-10-08 11:25:02
+ */
+@Api(tags = "浜哄憳 - 濂栨儵璁板綍")
+@RestController
+@RequestMapping("/personRewardPunishmentRecord")
+public class PersonRewardPunishmentRecordController {
+
+    @Autowired
+    private PersonRewardPunishmentRecordService personRewardPunishmentRecordService;
+
+    @ApiOperation(value = "鏂板/鏇存柊 濂栨儵璁板綍")
+    @PostMapping("/addOrUpdateRewardPunishment")
+    public Result<?> PersonTrainingSave(@RequestBody PersonRewardPunishmentRecord personRewardPunishmentRecord) {
+        personRewardPunishmentRecordService.saveOrUpdate(personRewardPunishmentRecord);
+        return Result.success();
+    }
+
+    @ApiOperation(value = "鍒犻櫎濂栨儵璁板綍")
+    @DeleteMapping("/deleteRewardPunishment")
+    public Result<?> deleteRewardPunishment(@RequestParam("id") Integer id) {
+        personRewardPunishmentRecordService.removeById(id);
+        return Result.success();
+    }
+
+    @ApiOperation(value = "鏌ヨ 濂栨儵璁板綍")
+    @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));
+    }
+
+    @ApiOperation(value = "濂栨儵璁板綍瀵煎嚭")
+    @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..203d834
--- /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.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+
+/**
+ * <p>
+ * 鍩硅璁″垝 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-10-11 01:11:49
+ */
+@Api(tags = "浜哄憳 - 鍩硅璁″垝")
+@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;
+
+    @ApiOperation(value = "鍩硅璁″垝 瀵煎叆")
+    @PostMapping("personTrainingImport")
+    public Result<?> personTrainingImport(@RequestPart("file") MultipartFile file, PersonTraining training) {
+        personTrainingService.personTrainingImport(file, training);
+        return Result.success();
+    }
+
+    @ApiOperation(value = "鍩硅璁″垝 鍒犻櫎")
+    @DeleteMapping("personTrainingDelete")
+    public Result<?> personTrainingDelete(@RequestParam("id") Integer id) {
+        personTrainingService.personTrainingDelete(id);
+        return Result.success();
+    }
+
+    @ApiOperation(value = "鍩硅璁″垝 鏌ヨ")
+    @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);
+    }
+
+    @ApiOperation(value = "骞村害鍩硅璁″垝 瀹℃牳")
+    @PostMapping("reviewAnnualPersonnelTraining")
+    public Result<?> reviewAnnualPersonnelTraining(@RequestBody PersonTraining training) {
+        personTrainingService.reviewAnnualPersonnelTraining(training);
+        return Result.success();
+    }
+
+    @ApiOperation(value = "鍩硅璁″垝 鎵瑰噯")
+    @PostMapping("approveAnnualPersonnelTraining")
+    public Result<?> approveAnnualPersonnelTraining(@RequestBody PersonTraining training) {
+        personTrainingService.approveAnnualPersonnelTraining(training);
+        return Result.success();
+    }
+
+
+    @ApiOperation(value = "骞村害璁″垝鏄庣粏琛� 鏂板/缂栬緫")
+    @PostMapping("addOrUpdatePersonTrainingDetailed")
+    public Result<?> addOrUpdatePersonTrainingDetailed(@RequestBody PersonTrainingDetailed personTrainingDetailed) {
+        if (ObjectUtils.isEmpty(personTrainingDetailed.getId())) {
+            personTrainingDetailed.setState(3);
+        }
+        personTrainingDetailedService.saveOrUpdate(personTrainingDetailed);
+        return Result.success();
+    }
+
+
+    @ApiOperation(value = "骞村害璁″垝鏄庣粏琛� 鎵归噺鍒犻櫎")
+    @DeleteMapping("deleteAnnualPlanDetailTable")
+    public Result<?> deleteAnnualPlanDetailTable(String ids) {
+        personTrainingDetailedService.deleteAnnualPlanDetailTable(ids);
+        return Result.success();
+    }
+
+
+    @ApiOperation(value = "骞村害璁″垝鏄庣粏琛� 鏌ヨ")
+    @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);
+    }
+
+
+    @ApiOperation(value = "鍩硅涓庤�冩牳璁板綍 鏌ヨ")
+    @GetMapping("trainingAndAssessmentRecordsPage")
+    public Result<List<PersonTrainingRecordDto>> trainingAndAssessmentRecordsPage(Integer trainingDetailedId,
+                                                                                   String userName) {
+        List<PersonTrainingRecordDto> list = personTrainingRecordService.trainingAndAssessmentRecordsPage(trainingDetailedId, userName);
+        return Result.success(list);
+    }
+
+
+    @ApiOperation(value = "鍩硅涓庤�冩牳璁板綍 鏂板浜哄憳")
+    @PostMapping("newPersonnelAddedToTrainingRecords")
+    public Result<?> newPersonnelAddedToTrainingRecords(@RequestBody List<PersonTrainingRecord> personTrainingRecord) {
+        personTrainingRecordService.saveBatch(personTrainingRecord);
+        return Result.success();
+    }
+
+
+    @ApiOperation(value = "鍩硅涓庤�冩牳璁板綍 璁ら")
+    @PostMapping("claimOfTrainingAndAssessmentRecords")
+    public Result<?> claimOfTrainingAndAssessmentRecords(@RequestParam("claimAndClaim") Boolean claimAndClaim,
+                                                         @RequestParam("courseId") Integer courseId) {
+        personTrainingRecordService.claimOfTrainingAndAssessmentRecords(claimAndClaim, courseId);
+        return Result.success();
+    }
+
+
+    @ApiOperation(value = "鍩硅涓庤�冩牳璁板綍 鎻愪氦/鎾ら攢")
+    @PostMapping("trainingAndAssessmentRecordsAdded")
+    public Result<?> trainingAndAssessmentRecordsAdded(@RequestBody PersonTrainingRecordSubmitDto personTrainingRecordSubmitDto) {
+        personTrainingRecordService.trainingAndAssessmentRecordsAdded(personTrainingRecordSubmitDto);
+        return Result.success();
+    }
+
+    @ApiOperation(value = "鍩硅涓庤�冩牳璁板綍 璇勪环")
+    @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();
+    }
+
+
+    @ApiOperation(value = "鍩硅涓庤�冩牳璁板綍 鍒犻櫎")
+    @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
+     */
+
+    @ApiOperation(value = "瀵煎嚭浜哄憳鍩硅璁″垝")
+    @GetMapping("/exportPersonTraining")
+    public void exportPersonTraining(Integer id, HttpServletResponse response){
+        personTrainingService.exportPersonTraining(id, response);
+    }
+
+    /**
+     * 瀵煎嚭浜哄憳鍩硅涓庤�冩牳璁板綍
+     * @return
+     */
+    @ApiOperation(value = "瀵煎嚭浜哄憳鍩硅涓庤�冩牳璁板綍")
+    @GetMapping("/exportPersonTrainingRecord")
+    public void exportPersonTrainingRecord(Integer id, HttpServletResponse response){
+        personTrainingService.exportPersonTrainingRecord(id, response);
+    }
+
+    /**
+     * 浜哄憳鍩硅璇︽儏闄勪欢鏂板
+     * @param trainingDetailedId
+     * @param file
+     * @return
+     */
+    @ApiOperation(value = "浜哄憳鍩硅璇︽儏闄勪欢鏂板")
+    @PostMapping("/uploadTrainingDetailedFile")
+    public Result<?> uploadTrainingDetailedFile(Integer trainingDetailedId, MultipartFile file) {
+        return Result.success(personTrainingService.uploadTrainingDetailedFile(trainingDetailedId, file));
+    }
+
+
+    /**
+     * 浜哄憳鍩硅璇︽儏闄勪欢鍒楄〃
+     * @return
+     */
+    @ApiOperation(value = "浜哄憳鍩硅璇︽儏闄勪欢鍒楄〃")
+    @GetMapping("/getTrainingDetailedFileList")
+    public Result<List<PersonTrainingDetailedFile>> getTrainingDetailedFileList(Integer trainingDetailedId){
+        return Result.success(personTrainingDetailedFileMapper.selectList(Wrappers.<PersonTrainingDetailedFile>lambdaQuery()
+                .eq(PersonTrainingDetailedFile::getTrainingDetailedId, trainingDetailedId)));
+    }
+
+    /**
+     * 浜哄憳鍩硅璇︽儏闄勪欢鍒犻櫎
+     * @return
+     */
+    @ApiOperation(value = "浜哄憳鍩硅璇︽儏闄勪欢鍒犻櫎")
+    @DeleteMapping("/delTrainingDetailedFileList")
+    public Result delTrainingDetailedFileList(Integer detailedFileId){
+        return Result.success(personTrainingDetailedFileMapper.deleteById(detailedFileId));
+    }
+
+    /**
+     * 鏌ヨ浠婂勾浜哄憳鍩硅淇℃伅
+     * @return
+     */
+    @ApiOperation(value = "鏌ヨ浠婂勾浜哄憳鍩硅淇℃伅")
+    @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..5385869
--- /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.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * <p>
+ * 鍩硅璁″垝 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-10-11 01:11:49
+ */
+@Api(tags = "浜哄憳 - 鍩硅璁板綍")
+@RestController
+@RequestMapping("/personTrainingRecord")
+public class PersonTrainingRecordController {
+
+    @Autowired
+    private PersonTrainingRecordService personTrainingRecordService;
+
+    @ApiOperation(value = "鏌ヨ浜哄憳 鍩硅璁板綍")
+    @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);
+    }
+
+
+    @ApiOperation(value = "鏌ヨ浜哄憳鏄庣粏 鍩硅璁板綍")
+    @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
+     */
+    @ApiOperation(value = "瀵煎嚭浜哄憳鍩硅璁板綍")
+    @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..ffdbdcc
--- /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.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+/**
+ * Author: yuan
+ * Date: 2024-12-13 鏄熸湡浜� 13:52:52
+ * Description:
+ */
+@Data
+public class PersonBasicInfoDetailsDto {
+
+    @ApiModelProperty("鐢ㄦ埛id")
+    private Integer userId;
+
+    @ApiModelProperty("鐢ㄦ埛濮撳悕")
+    private String name;
+
+    @ApiModelProperty("鍏ヨ亴鏃堕棿")
+    private String entryTimeStr;
+
+    @ApiModelProperty("瀹為檯瀹炰範缁撴潫")
+    private String endPracticalPracticeStr;
+
+    @ApiModelProperty("绫嶈疮")
+    private String nativePlace;
+
+    @ApiModelProperty("韬唤璇佸彿")
+    private String identityCard;
+
+    @ApiModelProperty("韬唤璇佸湴鍧�")
+    private String idAddress;
+
+    @ApiModelProperty("鐢ㄦ埛鎵嬫満鍙�")
+    private String phone;
+
+    @ApiModelProperty("姣曚笟闄㈡牎")
+    private String graduatedInstitutions1;
+
+    @ApiModelProperty("涓撲笟")
+    private String major1;
+
+    @ApiModelProperty("姣曚笟鏃堕棿1")
+    private LocalDateTime graduationTime1;
+
+    @ApiModelProperty("鏈�楂樺鍘�")
+    private String officialAcademicRedentials;
+
+    @ApiModelProperty("鏈�楂樺浣�")
+    private String highestDegree;
+
+    @ApiModelProperty("鑱岀О")
+    private String professionalTitle;
+
+    // 鑱屼笟鑳藉姏
+
+    @ApiModelProperty("绱ф�ヨ仈绯讳汉")
+    private String emergencyContact;
+
+    @ApiModelProperty("绱ф�ヨ仈绯讳汉鐢佃瘽")
+    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..b5cd643
--- /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.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@JsonIgnoreProperties(ignoreUnknown = true)
+@ExcelIgnoreUnannotated
+public class PersonBasicInfoDto extends PersonBasicInfo {
+    @ApiModelProperty(value = "璐﹀彿")
+    @ExcelProperty("鍛樺伐缂栧彿")
+    private String account;
+
+    @ApiModelProperty(value = "濮撳悕")
+    @ExcelProperty("濮撳悕")
+    private String name;
+
+    @ApiModelProperty(value = "濮撳悕(鑻辨枃)")
+    private String nameEn;
+
+    @ApiModelProperty(value = "骞撮緞")
+    private Integer age;
+
+    @ApiModelProperty(value = "鐢佃瘽鍙风爜")
+    @ExcelProperty("鎵嬫満鍙�")
+    private String phone;
+
+    @ApiModelProperty(value = "閭")
+    private String email;
+
+    @ApiModelProperty(value = "閮ㄩ棬")
+    private String department;
+
+    @ApiModelProperty(value = "lims缁勭粐鏋舵瀯")
+    private String departLimsId;
+
+    @ApiModelProperty(value = "绛惧悕鐓х墖鍦板潃")
+    private String signatureUrl;
+
+    @ApiModelProperty(value = "鑷韩鐓х墖鍦板潃")
+    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..13cd08d
--- /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.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @Author zhuo
+ * @Date 2025/1/14
+ */
+@Data
+public class PersonBasicInfoWorkDto extends PersonBasicInfoWork {
+
+    @ApiModelProperty("濉厖浣跨敤")
+    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..5e77690
--- /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.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class PersonPersonnelCapacityDto extends PersonPersonnelCapacity {
+
+    @ApiModelProperty("鎿嶄綔浜哄鍚�")
+    private String confirmOperatingPersonnelName;
+
+    @ApiModelProperty("浜哄憳濮撳悕")
+    private String userName;
+
+    @ApiModelProperty("宀椾綅鍚嶇О")
+    private String postName;
+
+    @ApiModelProperty("宀椾綅鑱岃矗")
+    private String responsibilities;
+
+    @ApiModelProperty("宸ヤ綔缁忓巻")
+    private String placeWork;
+
+    @ApiModelProperty("涓撲笟")
+    private String major;
+
+    @ApiModelProperty(value = "鑱岀О")
+    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..20526b6
--- /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.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @Author zhuo
+ * @Date 2024/11/28
+ */
+@Data
+public class PersonPersonnelCapacityExportDto extends PersonPersonnelCapacity {
+
+    @ApiModelProperty("宀椾綅鍚嶇О")
+    private String postName;
+
+    @ApiModelProperty("浜哄憳濮撳悕")
+    private String userName;
+
+    @ApiModelProperty("瀛﹀巻")
+    private String officialAcademicRedentials;
+
+    @ApiModelProperty("涓撲笟")
+    private String major;
+
+    @ApiModelProperty("鑱岀О")
+    private String professionalTitle;
+
+    @ApiModelProperty("宸ヤ綔缁忓巻")
+    private String placeWork;
+
+    @ApiModelProperty("瀛﹀巻 绗﹀悎涓庡惁(1锛氱鍚�)")
+    private String academicConformNot1 = "鈻�";
+    @ApiModelProperty("瀛﹀巻 绗﹀悎涓庡惁(2锛氫笉绗﹀悎)")
+    private String academicConformNot2 = "鈻�";
+    @ApiModelProperty("瀛﹀巻 绗﹀悎涓庡惁(3锛氫笉閫傜敤)")
+    private String academicConformNot3 = "鈻�";
+
+    @ApiModelProperty("鐩稿叧骞撮檺  绗﹀悎涓庡惁(1锛氱鍚�)")
+    private String relatedYearsConformNot1 = "鈻�";
+    @ApiModelProperty("鐩稿叧骞撮檺  绗﹀悎涓庡惁(2锛氫笉绗﹀悎)")
+    private String relatedYearsConformNot2 = "鈻�";
+    @ApiModelProperty("鐩稿叧骞撮檺  绗﹀悎涓庡惁(3锛氫笉閫傜敤)")
+    private String relatedYearsConformNot3 = "鈻�";
+
+    @ApiModelProperty("鐩稿叧鍩硅 绗﹀悎涓庡惁(1锛氱鍚�)")
+    private String relatedTrainingConformNot1 = "鈻�";
+    @ApiModelProperty("鐩稿叧鍩硅 绗﹀悎涓庡惁(2锛氫笉绗﹀悎)")
+    private String relatedTrainingConformNot2 = "鈻�";
+    @ApiModelProperty("鐩稿叧鍩硅 绗﹀悎涓庡惁(3锛氫笉閫傜敤)")
+    private String relatedTrainingConformNot3 = "鈻�";
+
+    @ApiModelProperty("鐩稿叧缁忛獙 绗﹀悎涓庡惁(1锛氱鍚�)")
+    private String relevantExperienceConformNot1 = "鈻�";
+    @ApiModelProperty("鐩稿叧缁忛獙 绗﹀悎涓庡惁(2锛氫笉绗﹀悎)")
+    private String relevantExperienceConformNot2 = "鈻�";
+    @ApiModelProperty("鐩稿叧缁忛獙 绗﹀悎涓庡惁(3锛氫笉閫傜敤)")
+    private String relevantExperienceConformNot3 = "鈻�";
+
+    @ApiModelProperty("涓婂矖璇� 绗﹀悎涓庡惁(1锛氱鍚�)")
+    private String workLicenseConformNot1 = "鈻�";
+    @ApiModelProperty("涓婂矖璇� 绗﹀悎涓庡惁(2锛氫笉绗﹀悎)")
+    private String workLicenseConformNot2 = "鈻�";
+    @ApiModelProperty("涓婂矖璇� 绗﹀悎涓庡惁(3锛氫笉閫傜敤)")
+    private String workLicenseConformNot3 = "鈻�";
+
+    @ApiModelProperty("宀椾綅鑱岃矗1(鐔熸倝鏈矖浣嶇殑浜у搧妫�娴嬫牱鍝佸埗澶囧拰鐩稿叧浜у搧鍩虹鐭ヨ瘑)")
+    private String jobResponsibilities1 = "鈻�";
+    @ApiModelProperty("宀椾綅鑱岃矗2(鐔熸倝鏈矖浣嶆牱鍝佹娴嬫祦绋�)")
+    private String jobResponsibilities2 = "鈻�";
+    @ApiModelProperty("宀椾綅鑱岃矗3(姝g‘鐔熺粌鎿嶄綔鏈矖浣嶄华琛ㄨ澶�)")
+    private String jobResponsibilities3 = "鈻�";
+    @ApiModelProperty("宀椾綅鑱岃矗4(鐔熸倝鏈矖浣嶇浉鍏虫娴嬫爣鍑�)")
+    private String jobResponsibilities4 = "鈻�";
+    @ApiModelProperty("宀椾綅鑱岃矗5(鐔熸倝鏈矖浣嶄骇鍝佹�ц兘鍙婄粨鏋滃垽鏂�佸垎鏋�)")
+    private String jobResponsibilities5 = "鈻�";
+    @ApiModelProperty("宀椾綅鑱岃矗6(瀹屾垚鐩稿簲鐨勫巶楠屻�佽璇�)")
+    private String jobResponsibilities6 = "鈻�";
+    @ApiModelProperty("宀椾綅鑱岃矗7(缂栧啓鐩稿叧妫�娴嬫墜椤�)")
+    private String jobResponsibilities7 = "鈻�";
+    @ApiModelProperty("宀椾綅鑱岃矗8(浜嗚В浠櫒璁惧鍩烘湰缁撴瀯涓庣畝鍗曠淮鎶や繚鍏�)")
+    private String jobResponsibilities8 = "鈻�";
+    @ApiModelProperty("宀椾綅鑱岃矗9(鍏峰鎶�鑳藉煿璁殑鑳藉姏)")
+    private String jobResponsibilities9 = "鈻�";
+    @ApiModelProperty("宀椾綅鑱岃矗10(鍏峰妫�娴嬩华鍣ㄦ敼閫犺兘鍔�)")
+    private String jobResponsibilities10 = "鈻�";
+
+    @ApiModelProperty("宀椾綅鑱岃矗 绗﹀悎涓庡惁(1锛氱鍚�)")
+    private String jobResponsibilitiesConformNot1 = "鈻�";
+    @ApiModelProperty("宀椾綅鑱岃矗 绗﹀悎涓庡惁(2锛氫笉绗﹀悎)")
+    private String jobResponsibilitiesConformNot2 = "鈻�";
+    @ApiModelProperty("宀椾綅鑱岃矗 绗﹀悎涓庡惁(3锛氫笉閫傜敤)")
+    private String jobResponsibilitiesConformNot3 = "鈻�";
+
+    @ApiModelProperty("缁煎悎璇勪环1(鍙儨浠昏宀椾綅)")
+    private String comprehensiveAssessment1 = "鈻�";
+    @ApiModelProperty("缁煎悎璇勪环2(鍙竟鍩硅杈逛笂宀�)")
+    private String comprehensiveAssessment2 = "鈻�";
+    @ApiModelProperty("缁煎悎璇勪环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..2c6f9aa
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonTrainingDetailedDto.java
@@ -0,0 +1,29 @@
+package com.ruoyi.personnel.dto;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.ruoyi.personnel.pojo.PersonTrainingDetailed;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class PersonTrainingDetailedDto extends PersonTrainingDetailed {
+
+    @ApiModelProperty("涓惧姙閮ㄩ棬鍚嶇О")
+    private String holdingDepartmentName;
+
+    @ApiModelProperty("鍩硅璁插笀鍚嶇О")
+    private String trainingLecturerName;
+
+    @ApiModelProperty("褰撳墠鐧诲綍浜烘槸鍚﹁棰�")
+    private Boolean whetherClaim;
+
+
+    @ApiModelProperty("鍩硅鏃ユ湡")
+    private String trainingDateString;
+
+    // 瀵煎嚭浣跨敤
+    @TableField(select = false, exist = false)
+    @ApiModelProperty("搴忓彿(瀵煎嚭浣跨敤)")
+    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..c6ad50b
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonTrainingDto.java
@@ -0,0 +1,23 @@
+package com.ruoyi.personnel.dto;
+
+import com.ruoyi.personnel.pojo.PersonTraining;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel(value = "PersonTrainingDto瀵硅薄", description = "鍩硅璁″垝")
+public class PersonTrainingDto extends PersonTraining {
+
+    @ApiModelProperty("缂栧埗浜哄鍚�")
+    private String compilerName;
+
+    @ApiModelProperty("瀹℃牳浜哄鍚�")
+    private String reviewerName;
+
+    @ApiModelProperty("鎵瑰噯浜哄鍚�")
+    private String approverName;
+
+    @ApiModelProperty("鍒涘缓浜哄鍚�")
+    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..445bef7
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonTrainingRecordDto.java
@@ -0,0 +1,23 @@
+package com.ruoyi.personnel.dto;
+
+import com.ruoyi.personnel.pojo.PersonTrainingRecord;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class PersonTrainingRecordDto extends PersonTrainingRecord {
+    @ApiModelProperty(value = "濮撳悕")
+    private String userName;
+
+    @ApiModelProperty(value = "宸ュ彿")
+    private String account;
+
+    @ApiModelProperty(value = "瑙掕壊")
+    private String roleName;
+
+    @ApiModelProperty(value = "鐢佃瘽鍙风爜")
+    private String phone;
+
+    @ApiModelProperty(value = "閮ㄩ棬")
+    private String department;
+}
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..da61ed1
--- /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.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Data
+public class PersonTrainingRecordListDto {
+
+    @ApiModelProperty(value = "鐢ㄦ埛id")
+    private Integer userId;
+
+    @ApiModelProperty("鍛樺伐缂栧彿")
+    private String account;
+
+    @ApiModelProperty("鐢ㄦ埛濮撳悕")
+    private String name;
+
+    @ApiModelProperty("鎵�鍦ㄩ儴闂�")
+    private String departLimsName;
+
+    @ApiModelProperty("鑱岀О")
+    private String professionalTitle;
+
+    @ApiModelProperty("鏈�楂樺鍘�")
+    private String officialAcademicRedentials;
+
+    @ApiModelProperty("鍏ュ崟浣嶆椂闂�")
+    private LocalDateTime unitTime;
+
+    @ApiModelProperty("鍏ュ崟浣嶆椂闂�")
+    private String unitTimeSting;
+
+    @ApiModelProperty("涓撲笟")
+    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..e24f5d2
--- /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.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.time.LocalDate;
+
+@Data
+public class PersonTrainingRecordSubmitDto {
+
+    @ApiModelProperty("骞村害璁″垝鏄庣粏ID")
+    private Integer trainingDetailedId;
+
+    @ApiModelProperty("鍩硅鍦扮偣")
+    private String placeTraining;
+
+    @ApiModelProperty("鍩硅瀹屾垚鏃堕棿")
+    private LocalDate openingTime;
+
+    @ApiModelProperty("鑰冩牳鏂瑰紡")
+    private String assessmentMethod;
+
+    @ApiModelProperty("鏈鍩硅缁煎悎璇勪环")
+    private String comprehensiveAssessment;
+
+    @ApiModelProperty("璇勪环浜�")
+    private Integer assessmentUserId;
+
+    @ApiModelProperty("璇勪环鏃堕棿")
+    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..320af2a
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/TrainingRecordExportDto.java
@@ -0,0 +1,32 @@
+package com.ruoyi.personnel.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @Author zhuo
+ * @Date 2024/11/25
+ */
+@Data
+public class TrainingRecordExportDto {
+
+    @ApiModelProperty("鐢ㄦ埛鍚嶇О1")
+    private String userName1;
+
+    @ApiModelProperty("閮ㄩ棬1")
+    private String department1;
+
+    @ApiModelProperty("鑰冩牳缁撴灉1")
+    private String examinationResults1;
+
+    @ApiModelProperty("鐢ㄦ埛鍚嶇О2")
+    private String userName2;
+
+    @ApiModelProperty("閮ㄩ棬1")
+    private String department2;
+
+    @ApiModelProperty("鑰冩牳缁撴灉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..23f0a02
--- /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.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class TrainingRecordPersonDetailedDto {
+
+    @ApiModelProperty("鍩硅鏃ユ湡")
+    private String trainingDateString;
+
+    @ApiModelProperty("鍩硅鏃ユ湡")
+    private String trainingDate;
+
+    @ApiModelProperty("鍩硅鍐呭")
+    private String trainingContent;
+
+    @ApiModelProperty("璇炬椂")
+    private Integer classHour;
+
+    @ApiModelProperty("鑰冩牳缁撴灉")
+    private String examinationResults;
+
+    @ApiModelProperty("澶囨敞")
+    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..856b6f4
--- /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.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class UserPageDto extends User {
+
+    @ApiModelProperty(value = "鍒涘缓鐢ㄦ埛")
+    private String createUserName;
+
+    @ApiModelProperty(value = "鏇存柊鐢ㄦ埛")
+    private String updateUserName;
+
+    @ApiModelProperty(value = "瑙掕壊")
+    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..7bc5876
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/excel/PersonTrainingDetailedUpload.java
@@ -0,0 +1,35 @@
+package com.ruoyi.personnel.excel;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import lombok.Data;
+
+@Data
+public class PersonTrainingDetailedUpload {
+
+    @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..f23ba5f
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonBasicInfoMapper.java
@@ -0,0 +1,42 @@
+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 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, String name, 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..0888b35
--- /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..a46e3bf
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonJobResponsibilitiesMapper.java
@@ -0,0 +1,20 @@
+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;
+
+/**
+ * <p>
+ * 宀椾綅鑱岃矗 Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-10-09 02:07:49
+ */
+public interface PersonJobResponsibilitiesMapper extends BaseMapper<PersonJobResponsibilities> {
+
+    IPage<PersonJobResponsibilitiesDto> personJobResponsibilitiesSelect(Page page, String userId, String departmentId, 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..b2bb671
--- /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, Integer departLimsId, Integer userId, 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..1121811
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonPostAuthorizationRecordMapper.java
@@ -0,0 +1,20 @@
+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;
+
+/**
+ * <p>
+ * 浠昏亴鎺堟潈璁板綍 Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-10-09 10:48:17
+ */
+public interface PersonPostAuthorizationRecordMapper extends BaseMapper<PersonPostAuthorizationRecord> {
+
+    IPage<PersonPostAuthorizationRecordDto> personPostAuthorizationRecordPage(Page page, Integer departLimsId, Integer userId, 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..a77cb79
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonRewardPunishmentRecordMapper.java
@@ -0,0 +1,26 @@
+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 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, 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/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..47c397b
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonTrainingDetailedMapper.java
@@ -0,0 +1,48 @@
+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,
+                                                                    String trainingLecturerName,
+                                                                    String courseCode, String trainingDate,
+                                                                    Integer id,
+                                                                    Integer userId,
+                                                                    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..f5dd8a6
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonTrainingMapper.java
@@ -0,0 +1,20 @@
+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;
+
+/**
+ * <p>
+ * 鍩硅璁″垝 Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-10-11 01:11:49
+ */
+public interface PersonTrainingMapper extends BaseMapper<PersonTraining> {
+
+    IPage<PersonTrainingDto> personTrainingSelect(Page page, String compilerName, 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..a10ed81
--- /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(Integer trainingDetailedId, String userName);
+
+    IPage<PersonTrainingRecordListDto> personnelTrainingPersonnel(Page page, String userName, Integer userId, 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, Integer userId, Integer year);
+
+    /**
+     * 鏍规嵁鐢ㄦ埛id鍜屽勾浠芥煡璇汉鍛樻槑缁� 鍩硅璁板綍瀵煎嚭
+     * @param userId
+     * @param trainingDate
+     * @return
+     */
+    List<TrainingRecordPersonDetailedDto> selectPersonDetailedDtosByTrainingDate(Integer userId, 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..bbf2017
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/Annex.java
@@ -0,0 +1,48 @@
+package com.ruoyi.personnel.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+@Data
+@TableName("cnas_annex")
+@ApiModel("浜哄憳鍩烘湰淇℃伅闄勪欢琛�")
+public class Annex implements Serializable {
+
+    @TableId(type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty(value = "user琛╥d")
+    private Integer userId;
+
+    @ApiModelProperty(value = "璇佷欢鍙�")
+    private String idNumber;
+
+    @ApiModelProperty(value = "鍙戣瘉鍗曚綅")
+    private String issueUnit;
+
+    @ApiModelProperty(value = "鏂囦欢鍚嶇О")
+    private String fileName;
+
+    @ApiModelProperty(value = "绾у埆")
+    private String level;
+
+    @ApiModelProperty(value = "鏈夋晥鏈�")
+    private String periodValidity;
+
+    @ApiModelProperty(value = "娣诲姞鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @ApiModelProperty(value = "澶嶅嵃浠�")
+    private String copy;
+
+    @ApiModelProperty(value = "鍘熶欢")
+    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..abf3880
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonBasicInfo.java
@@ -0,0 +1,156 @@
+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.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-08-30 09:19:57
+ */
+@Getter
+@Setter
+@TableName("cnas_person_basic_info")
+@ApiModel(value = "PersonBasicInfo瀵硅薄", description = "")
+public class PersonBasicInfo implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("涓婚敭id")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty("褰撳墠鐘舵��")
+    private String currentState;
+
+    @ApiModelProperty("鑱岀О")
+    @ExcelProperty("鑱岀О")
+    private String professionalTitle;
+
+    @ApiModelProperty("鎬у埆")
+    private String sex;
+
+    @ApiModelProperty("浜哄憳鍒嗙被")
+    private String personnelClassification;
+
+    @ApiModelProperty("鍑虹敓鏃ユ湡")
+    @TableField(updateStrategy = FieldStrategy.IGNORED) // 涓虹┖鍙互鏇存柊
+    private LocalDateTime dateBirth;
+
+    @ApiModelProperty("韬唤璇佸彿")
+    @ExcelProperty("璇佷欢鍙风爜")
+    private String identityCard;
+
+    @ApiModelProperty("姘戞棌")
+    private String nation;
+
+    @ApiModelProperty("鏀挎不闈㈣矊")
+    private String politicalStatus;
+
+    @ApiModelProperty("鏈�楂樺鍘�")
+    @ExcelProperty("鏈�楂樺鍘�")
+    private String officialAcademicRedentials;
+
+    @ApiModelProperty("姣曚笟鏃堕棿1")
+    @ExcelProperty("姣曚笟鏃堕棿")
+    private LocalDateTime graduationTime1;
+
+    @ApiModelProperty("姣曚笟闄㈡牎1")
+    @ExcelProperty("姣曚笟闄㈡牎")
+    private String graduatedInstitutions1;
+
+    @ApiModelProperty("涓撲笟1")
+    @ExcelProperty("鎵�瀛︿笓涓�")
+    private String major1;
+
+    @ApiModelProperty("姣曚笟鏃堕棿2")
+    @TableField(updateStrategy = FieldStrategy.IGNORED) // 涓虹┖鍙互鏇存柊
+    private LocalDateTime graduationTime2;
+
+    @ApiModelProperty("姣曚笟闄㈡牎2")
+    private String graduatedInstitutions2;
+
+    @ApiModelProperty("涓撲笟2")
+    private String major2;
+
+    @ApiModelProperty("鎵嬫満鍙�")
+    private String telephone;
+
+    @ApiModelProperty("澶囨敞")
+    private String remarks;
+
+    @ApiModelProperty("鐢ㄦ埛琛紙user锛塱d")
+    private Integer userId;
+
+    @ApiModelProperty("鍏徃鍚嶇О")
+    private String corporateName;
+
+    @ApiModelProperty("宀椾綅鍚嶇О")
+    private String postName;
+
+    @ApiModelProperty("鍏ラ泦鍥㈡椂闂�")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
+    @TableField(updateStrategy = FieldStrategy.IGNORED) // 涓虹┖鍙互鏇存柊
+    @ExcelProperty("鍏ラ泦鍥㈡椂闂�")
+    private LocalDateTime groupTime;
+
+    @ApiModelProperty("鍔冲姩鍏崇郴")
+    private Integer laborRelations;
+
+    @ApiModelProperty("宸ヤ綔鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
+    @TableField(updateStrategy = FieldStrategy.IGNORED) // 涓虹┖鍙互鏇存柊
+    private LocalDateTime workingTime;
+
+    @ApiModelProperty("鍚堝悓鏈夋晥鏈�")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
+    @TableField(updateStrategy = FieldStrategy.IGNORED) // 涓虹┖鍙互鏇存柊
+    private LocalDateTime contractLifeTime;
+
+    @ApiModelProperty("绫嶈疮")
+    @ExcelProperty("绫嶈疮")
+    private String nativePlace;
+
+    @ApiModelProperty("璇佷欢鏈夋晥鏈�")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
+    @TableField(updateStrategy = FieldStrategy.IGNORED) // 涓虹┖鍙互鏇存柊
+    private LocalDateTime validityPeriod;
+
+    @ApiModelProperty("濠氬Щ鐘跺喌")
+    private Integer maritalStatus;
+
+    @ApiModelProperty("璇佷欢鍦板潃")
+    @ExcelProperty("璇佷欢鍦板潃")
+    private String idAddress;
+
+    @ApiModelProperty("璇佷欢璇︾粏鍦板潃")
+    private String idDetailAddress;
+
+    @ApiModelProperty("鍏ュ厷/鍥㈡椂闂�")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
+    @TableField(updateStrategy = FieldStrategy.IGNORED) // 涓虹┖鍙互鏇存柊
+    private LocalDateTime dumplingTime;
+
+    @ApiModelProperty("鏈�楂樺浣�")
+    @ExcelProperty("鏈�楂樺浣�")
+    private String highestDegree;
+
+    @ApiModelProperty("鏈�鍚庢洿鏂版椂闂�")
+    @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..0b366f8
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonBasicInfoFile.java
@@ -0,0 +1,58 @@
+package com.ruoyi.personnel.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 浜哄憳鍩烘湰淇℃伅闄勪欢
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2025-01-09 05:28:55
+ */
+@Getter
+@Setter
+@TableName("cnas_person_basic_info_file")
+@ApiModel(value = "PersonBasicInfoFile瀵硅薄", description = "浜哄憳鍩烘湰淇℃伅闄勪欢")
+public class PersonBasicInfoFile implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "basic_info_file_id", type = IdType.AUTO)
+    private Integer basicInfoFileId;
+
+    @ApiModelProperty("浜哄憳鍩烘湰淇℃伅id")
+    private Integer userId;
+
+    @ApiModelProperty("绫诲瀷:1鍥剧墖/2鏂囦欢")
+    private Integer type;
+
+    @ApiModelProperty("闄勪欢璺緞")
+    private String fileUrl;
+
+    @ApiModelProperty("闄勪欢鍚嶇О")
+    private String fileName;
+
+    @ApiModelProperty("鍒涘缓浜�")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @ApiModelProperty("鍒涘缓鏃堕棿")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @ApiModelProperty("淇敼浜�")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    @ApiModelProperty("淇敼鏃堕棿")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+}
diff --git a/cnas-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..2d15afa
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonBasicInfoWork.java
@@ -0,0 +1,53 @@
+package com.ruoyi.personnel.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 浜哄憳鍩烘湰淇℃伅
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2025-01-09 05:45:04
+ */
+@Getter
+@Setter
+@TableName("cnas_person_basic_info_work")
+@ApiModel(value = "PersonBasicInfoWork瀵硅薄", description = "浜哄憳鍩烘湰淇℃伅")
+public class PersonBasicInfoWork implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "basic_info_work_id", type = IdType.AUTO)
+    private Integer basicInfoWorkId;
+
+    @ApiModelProperty("浜哄憳id")
+    private Integer userId;
+
+    @ApiModelProperty("宸ヤ綔缁忓巻")
+    private String workExperience;
+
+    @ApiModelProperty("鍒涘缓浜�")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @ApiModelProperty("鍒涘缓鏃堕棿")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @ApiModelProperty("淇敼浜�")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    @ApiModelProperty("淇敼鏃堕棿")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+
+}
diff --git a/cnas-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..4df192d
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonCommunicationAbility.java
@@ -0,0 +1,61 @@
+package com.ruoyi.personnel.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 娌熼�氳褰�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-10-09 12:00:57
+ */
+@Getter
+@Setter
+@TableName("cnas_person_communication_ability")
+@ApiModel(value = "PersonCommunicationAbility瀵硅薄", description = "娌熼�氳褰�")
+public class PersonCommunicationAbility implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("涓婚敭id")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty("娌熼�氫汉id")
+    private String userId;
+
+    @ApiModelProperty("娌熼�氭椂闂�")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime communicationTime;
+
+    @ApiModelProperty("娌熼�氬湴鐐�")
+    private String communicationPlace;
+
+    @ApiModelProperty("娌熼�氬唴瀹�")
+    private String communicationContent;
+
+    @ApiModelProperty("鍒涘缓浜篿d")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @ApiModelProperty(value = "鏇存柊浜篿d", hidden = true)
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    @ApiModelProperty(value = "鍒涘缓鏃堕棿", hidden = true)
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @ApiModelProperty(value = "鏇存柊鏃堕棿", 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..55536fb
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonJobResponsibilities.java
@@ -0,0 +1,78 @@
+package com.ruoyi.personnel.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 宀椾綅鑱岃矗
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-10-09 02:07:49
+ */
+@Getter
+@Setter
+@TableName("cnas_person_job_responsibilities")
+@ApiModel(value = "PersonJobResponsibilities瀵硅薄", description = "宀椾綅鑱岃矗")
+public class PersonJobResponsibilities implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("涓婚敭id")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty("1宀椾綅鍚嶇О")
+    private String postName;
+
+    @ApiModelProperty("1宸ヤ綔鐩爣")
+    private String jobObjective;
+
+    @ApiModelProperty("1宀椾綅鑱岃矗")
+    private String jobResponsibilities;
+
+    @ApiModelProperty("1浠昏亴浜篿d")
+    private String incumbentId;
+
+    @ApiModelProperty("1 鎻愪氦鎿嶄綔浜�")
+    private String submittingOperator;
+
+    @ApiModelProperty("1鎻愪氦鏃ユ湡")
+    private LocalDateTime submittingDate;
+
+    @ApiModelProperty("2 浠昏亴浜� 涓荤id")
+    private Integer supervisorId;
+
+    @ApiModelProperty("2 浠昏亴浜� 鎿嶄綔浜�")
+    private String incumbentOperator;
+
+    @ApiModelProperty("2 浠昏亴浜� 鏃ユ湡")
+    private LocalDateTime incumbentDate;
+
+    @ApiModelProperty("3 涓荤 鎿嶄綔浜�")
+    private String supervisorOperator;
+
+    @ApiModelProperty("3 涓荤 鏃ユ湡")
+    private LocalDateTime supervisorDate;
+
+    @ApiModelProperty(value = "鍒涘缓浜篿d", hidden = true)
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @ApiModelProperty("褰撳墠鐘舵��")
+    private String currentState;
+
+    @ApiModelProperty(value = "鍒涘缓鏃ユ湡 / 鎻愪氦鏃ユ湡", hidden = true)
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @ApiModelProperty("褰撳墠璐熻矗浜�")
+    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..b7103f0
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonPersonnelCapacity.java
@@ -0,0 +1,114 @@
+package com.ruoyi.personnel.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 浜哄憳鑳藉姏
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-10-10 11:26:18
+ */
+@Getter
+@Setter
+@TableName("cnas_person_personnel_capacity")
+@ApiModel(value = "PersonPersonnelCapacity瀵硅薄", description = "浜哄憳鑳藉姏")
+public class PersonPersonnelCapacity implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("涓婚敭id")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty("瀛﹀巻")
+    private String academicDegree;
+
+    @ApiModelProperty("瀛﹀巻 绗﹀悎涓庡惁(1锛氱鍚堬紱2锛氫笉绗﹀悎锛�3锛氫笉閫傜敤)")
+    private Integer academicConformNot;
+
+    @ApiModelProperty("瀛﹀巻 澶囨敞")
+    private String academicRemarks;
+
+    @ApiModelProperty("鐩稿叧骞撮檺")
+    private String relatedYears;
+
+    @ApiModelProperty("鐩稿叧骞撮檺  绗﹀悎涓庡惁(1锛氱鍚堬紱2锛氫笉绗﹀悎锛�3锛氫笉閫傜敤)")
+    private Integer relatedYearsConformNot;
+
+    @ApiModelProperty("鐩稿叧骞撮檺 澶囨敞")
+    private String relatedYearsRemarks;
+
+    @ApiModelProperty("鐩稿叧鍩硅")
+    private String relatedTraining;
+
+    @ApiModelProperty("鐩稿叧鍩硅 绗﹀悎涓庡惁(1锛氱鍚堬紱2锛氫笉绗﹀悎锛�3锛氫笉閫傜敤)")
+    private Integer relatedTrainingConformNot;
+
+    @ApiModelProperty("鐩稿叧鍩硅 澶囨敞")
+    private String relatedTrainingRemarks;
+
+    @ApiModelProperty("鐩稿叧缁忛獙")
+    private String relevantExperience;
+
+    @ApiModelProperty("鐩稿叧缁忛獙 绗﹀悎涓庡惁(1锛氱鍚堬紱2锛氫笉绗﹀悎锛�3锛氫笉閫傜敤)")
+    private Integer relevantExperienceConformNot;
+
+    @ApiModelProperty("鐩稿叧缁忛獙 澶囨敞")
+    private String relevantExperienceRemarks;
+
+    @ApiModelProperty("涓婂矖璇�")
+    private String workLicense;
+
+    @ApiModelProperty("涓婂矖璇� 绗﹀悎涓庡惁(1锛氱鍚堬紱2锛氫笉绗﹀悎锛�3锛氫笉閫傜敤)")
+    private Integer workLicenseConformNot;
+
+    @ApiModelProperty("涓婂矖璇� 澶囨敞")
+    private String workLicenseRemarks;
+
+    @ApiModelProperty("宀椾綅鑱岃矗")
+    private String jobResponsibilities;
+
+    @ApiModelProperty("宀椾綅鑱岃矗 绗﹀悎涓庡惁(1锛氱鍚堬紱2锛氫笉绗﹀悎锛�3锛氫笉閫傜敤)")
+    private Integer jobResponsibilitiesConformNot;
+
+    @ApiModelProperty("宀椾綅鑱岃矗 澶囨敞")
+    private String jobResponsibilitiesRemarks;
+
+    @ApiModelProperty("缁煎悎璇勪环")
+    private String comprehensiveAssessment;
+
+    @ApiModelProperty("2 纭浜� userId涓婚敭")
+    private Integer confirmOperatingPersonnelId;
+
+    @ApiModelProperty("2 纭浜� 鏃ユ湡")
+    private LocalDateTime confirmDate;
+
+    @ApiModelProperty(value = "鍒涘缓鏃ユ湡", hidden = true)
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @ApiModelProperty(value = "鏇存柊鏃ユ湡", hidden = true)
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+
+    @ApiModelProperty(value = "鍒涘缓浜�", hidden = true)
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @ApiModelProperty(value = "鏇存柊浜�", hidden = true)
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    @ApiModelProperty(value = "浜哄憳濮撳悕 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..f341b83
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonPostAuthorizationRecord.java
@@ -0,0 +1,74 @@
+package com.ruoyi.personnel.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 浠昏亴鎺堟潈璁板綍
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-10-09 10:48:17
+ */
+@Getter
+@Setter
+@TableName("cnas_person_post_authorization_record")
+@ApiModel(value = "PersonPostAuthorizationRecord瀵硅薄", description = "浠昏亴鎺堟潈璁板綍")
+public class PersonPostAuthorizationRecord implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("涓婚敭id")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty("璇佷功缂栧彿")
+    private String certificateNumber;
+
+    @ApiModelProperty("琚换鑱屼汉鍛榠d")
+    private String userId;
+
+    @ApiModelProperty("浠昏亴宀椾綅")
+    private String post;
+
+    @ApiModelProperty("鎿嶄綔绫诲瀷")
+    private String operationType;
+
+    @ApiModelProperty("鍘熸枃浠跺悕绉�")
+    private String fileName;
+
+    @ApiModelProperty("绯荤粺鐢熸垚鏂囦欢鍚嶇О")
+    private String systemFileName;
+
+    @ApiModelProperty("澶囨敞")
+    private String remarks;
+
+    @ApiModelProperty(value = "鍒涘缓鏃堕棿", hidden = true)
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @ApiModelProperty(value = "鏇存柊鏃堕棿", hidden = true)
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+
+    @ApiModelProperty(value = "鏇存柊浜篿d",hidden = true)
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    @ApiModelProperty(value = "鍒涘缓浜篿d", hidden = true)
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @ApiModelProperty("鐞嗚鐭ヨ瘑鑰冭瘯鎴愮哗")
+    private String num1;
+
+    @ApiModelProperty("鎿嶄綔鎶�鑳借�冭瘯鎴愮哗")
+    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..ab8bea1
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonRewardPunishmentRecord.java
@@ -0,0 +1,61 @@
+package com.ruoyi.personnel.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 濂栨儵璁板綍
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-10-08 11:25:02
+ */
+@Getter
+@Setter
+@TableName("cnas_person_reward_punishment_record")
+@ApiModel(value = "PersonRewardPunishmentRecord瀵硅薄", description = "濂栨儵璁板綍")
+public class PersonRewardPunishmentRecord implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("涓婚敭id")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty("濂栨儵绾у埆")
+    private String rewardPunishLevel;
+
+    @ApiModelProperty("濂栨儵鍚嶇О")
+    private String rewardPunishName;
+
+    @ApiModelProperty("濂栨儵鏃堕棿")
+    private LocalDateTime rewardPunishTime;
+
+    @ApiModelProperty("濂栨儵鍗曚綅")
+    private String rewardPunishWorkUnit;
+
+    @ApiModelProperty("濂栨儵鍐呭")
+    private String rewardPunishContent;
+
+    @ApiModelProperty("鐢ㄦ埛id")
+    private Integer userId;
+
+    @ApiModelProperty(value = "鍒涘缓鏃堕棿", hidden = true)
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @ApiModelProperty(value = "鏇存柊鏃堕棿", hidden = true)
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime updateTime;
+
+    @ApiModelProperty(value = "鍒涘缓浜�", 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..526d947
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonTraining.java
@@ -0,0 +1,83 @@
+package com.ruoyi.personnel.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 鍩硅璁″垝
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-10-11 01:11:49
+ */
+@Getter
+@Setter
+@TableName("cnas_person_training")
+@ApiModel(value = "PersonTraining瀵硅薄", description = "鍩硅璁″垝")
+public class PersonTraining implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("涓婚敭id")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty("鏂囦欢鍚嶇О")
+    private String fileName;
+
+    @ApiModelProperty("璁″垝骞翠唤")
+    private String planYear;
+
+    @ApiModelProperty("缂栧埗浜篿d")
+    private Integer compilerId;
+
+    @ApiModelProperty("缂栧埗鏃ユ湡")
+    private LocalDateTime compilationDate;
+
+    @ApiModelProperty("瀹℃牳浜篿d")
+    private Integer reviewerId;
+
+    @ApiModelProperty("瀹℃牳鏃ユ湡")
+    private LocalDateTime auditDate;
+
+    @ApiModelProperty("瀹℃牳鐘舵��")
+    private Integer reviewerStatus;
+
+    @ApiModelProperty("瀹℃牳澶囨敞")
+    private String auditRemarks;
+
+    @ApiModelProperty("鎵瑰噯浜篿d")
+    private Integer approverId;
+
+    @ApiModelProperty("鎵瑰噯澶囨敞")
+    private String approvalRemarks;
+
+    @ApiModelProperty("鎵瑰噯鐘舵��(1锛氭壒鍑嗭紱2锛氫笉鎵瑰噯)")
+    private Integer approvalStatus;
+
+    @ApiModelProperty("鎵瑰噯鏃ユ湡")
+    private LocalDateTime approvalDate;
+
+    @ApiModelProperty("鍒涘缓鏃ユ湡")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @ApiModelProperty("鍒涘缓浜篿d")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @ApiModelProperty("鏇存柊鏃堕棿")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+
+    @ApiModelProperty("鏇存柊浜篿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..cac8233
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonTrainingDetailed.java
@@ -0,0 +1,99 @@
+package com.ruoyi.personnel.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 鍩硅璁″垝璇︽儏
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-10-11 01:46:27
+ */
+@Getter
+@Setter
+@TableName("cnas_person_training_detailed")
+@ApiModel(value = "PersonTrainingDetailed瀵硅薄", description = "鍩硅璁″垝璇︽儏")
+public class PersonTrainingDetailed implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("鍩硅璁″垝")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty("鍩硅鐩爣")
+    private String trainingObjectives;
+
+    @ApiModelProperty("鍩硅鍐呭")
+    private String trainingContent;
+
+    @ApiModelProperty("鍩硅鏂瑰紡")
+    private String trainingMode;
+
+    @ApiModelProperty("鐘舵��(1锛氬凡瀹屾垚锛�2锛氬緟璇勪环锛�3: 鏈紑濮�)")
+    private Integer state;
+
+    @ApiModelProperty("鍙傚姞瀵硅薄")
+    private String participants;
+
+    @ApiModelProperty("涓惧姙閮ㄩ棬")
+    private String holdingDepartment;
+
+    @ApiModelProperty("鍩硅鍦扮偣")
+    private String placeTraining;
+
+    @ApiModelProperty("鍩硅璁插笀_id")
+    private Integer trainingLecturerId;
+
+    @ApiModelProperty("璁″垝鍩硅鏃ユ湡")
+    private String trainingDate;
+
+    @ApiModelProperty("鍩硅瀹屾垚鏃堕棿")
+    private LocalDate openingTime;
+
+    @ApiModelProperty("璇炬椂")
+    private Integer classHour;
+
+    @ApiModelProperty("澶囨敞")
+    private String remarks;
+
+    @ApiModelProperty("鍩硅璁″垝id")
+    private Integer planId;
+
+    @ApiModelProperty(value = "鍒涘缓鏃堕棿", hidden = true)
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @ApiModelProperty(value = "鍒涘缓浜篿d", hidden = true)
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @ApiModelProperty(value = "鏇存柊浜篿d", hidden = true)
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    @ApiModelProperty(value = "鏇存柊鏃堕棿", hidden = true)
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+
+    @ApiModelProperty("鑰冩牳鏂瑰紡")
+    private String assessmentMethod;
+
+    @ApiModelProperty("鏈鍩硅缁煎悎璇勪环")
+    private String comprehensiveAssessment;
+
+    @ApiModelProperty("璇勪环浜�")
+    private Integer assessmentUserId;
+
+    @ApiModelProperty("璇勪环鏃堕棿")
+    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..cb17cdb
--- /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.annotations.ApiModelProperty;
+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;
+
+    @ApiModelProperty("浜哄憳浣犲煿璁鍒掕鎯卛d")
+    private Integer trainingDetailedId;
+
+    @ApiModelProperty("绫诲瀷:1鍥剧墖/2鏂囦欢")
+    private Integer type;
+
+    @ApiModelProperty("闄勪欢璺緞")
+    private String fileUrl;
+
+    @ApiModelProperty("闄勪欢鍚嶇О")
+    private String fileName;
+
+    @ApiModelProperty("鍒涘缓浜�")
+    private Integer createUser;
+
+    @ApiModelProperty("鍒涘缓鏃堕棿")
+    private Date createTime;
+
+    @ApiModelProperty("淇敼浜�")
+    private Integer updateUser;
+
+    @ApiModelProperty("淇敼鏃堕棿")
+    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..593941b
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonTrainingRecord.java
@@ -0,0 +1,41 @@
+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.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+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")
+@ApiModel(value = "PersonTrainingRecord瀵硅薄", description = "鍩硅璁板綍")
+public class PersonTrainingRecord implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("涓婚敭id")
+    @TableId(value = "training_record_id", type = IdType.AUTO)
+    private Integer trainingRecordId;
+
+    @ApiModelProperty("鐢ㄦ埛琛ㄦ牸锛坲ser锛変富閿�")
+    private Integer userId;
+
+    @ApiModelProperty("鍩硅璁″垝璇︽儏 - 瀛� id")
+    private Integer courseId;
+
+    @ApiModelProperty("鑰冩牳缁撴灉")
+    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..fcc4d69
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonBasicInfoService.java
@@ -0,0 +1,45 @@
+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.personnel.dto.PersonBasicInfoDto;
+import com.ruoyi.personnel.dto.UserPageDto;
+import com.ruoyi.personnel.pojo.PersonBasicInfo;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.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);
+}
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..a5186be
--- /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 javax.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..2afa074
--- /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 javax.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..dfff72a
--- /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 javax.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..3c23bfe
--- /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 javax.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..0f2dfdc
--- /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..f5f52dc
--- /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..265dca6
--- /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 javax.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..046cf24
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonTrainingService.java
@@ -0,0 +1,63 @@
+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.springframework.web.multipart.MultipartFile;
+
+import javax.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,
+                                                  String compilerName, 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..0ae552c
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonBasicInfoServiceImpl.java
@@ -0,0 +1,340 @@
+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 javax.annotation.Resource;
+import javax.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();
+        } 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 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..2c1a227
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonCommunicationAbilityServiceImpl.java
@@ -0,0 +1,113 @@
+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 javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URLEncoder;
+import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.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();
+        } 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..d55a3f0
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonJobResponsibilitiesServiceImpl.java
@@ -0,0 +1,113 @@
+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 javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URLEncoder;
+import java.time.format.DateTimeFormatter;
+import java.util.HashMap;
+
+/**
+ * <p>
+ * 宀椾綅鑱岃矗 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-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();
+        } 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..0c056f1
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonPersonnelCapacityServiceImpl.java
@@ -0,0 +1,158 @@
+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.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 javax.annotation.Resource;
+import javax.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();
+        } 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("a6-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..68f2961
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonPostAuthorizationRecordServiceImpl.java
@@ -0,0 +1,132 @@
+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 javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URLEncoder;
+import java.time.LocalDateTime;
+import java.util.HashMap;
+
+/**
+ * <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();
+        } 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..9393bbd
--- /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..3eaf942
--- /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..4b11bb5
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonTrainingRecordServiceImpl.java
@@ -0,0 +1,177 @@
+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.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 javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URLEncoder;
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * <p>
+ * 鍩硅璁板綍 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-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();
+        } 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("a6-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..3463126
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonTrainingServiceImpl.java
@@ -0,0 +1,429 @@
+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.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 javax.annotation.Resource;
+import javax.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("a6-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("a6-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();
+        } 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);
+
+        // 鏌ヨ鍩硅鐨勪汉鍛�
+        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.setUserName1(recordDto.getUserName());
+                    exportDto.setDepartment1(recordDto.getDepartment());
+                    exportDto.setExaminationResults1(recordDto.getExaminationResults());
+                    count ++;
+                    break;
+                case 1:
+                    exportDto.setUserName2(recordDto.getUserName());
+                    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();
+        } 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/resources/mapper/PersonBasicInfoMapper.xml b/cnas-personnel/src/main/resources/mapper/PersonBasicInfoMapper.xml
new file mode 100644
index 0000000..206013d
--- /dev/null
+++ b/cnas-personnel/src/main/resources/mapper/PersonBasicInfoMapper.xml
@@ -0,0 +1,65 @@
+<?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
+                 left join user u1 on u1.id = u.create_user
+        <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..96e0358
--- /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.label) responsibilities, cppc.id
+        from cnas_person_personnel_capacity cppc
+        left join enums e on FIND_IN_SET(e.value, cppc.job_responsibilities)
+        where e.category = '宀椾綅鑱岃矗'
+        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/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..c57dd3d
--- /dev/null
+++ b/cnas-personnel/src/main/resources/mapper/PersonTrainingRecordMapper.xml
@@ -0,0 +1,126 @@
+<?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, r.name role_name
+        from cnas_person_training_record cptr
+                 left join user u on u.id = cptr.user_id
+                 left join role r on r.id = u.role_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
+        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.unit_time,
+               cpbi.major1,
+               u.id                                       user_id,
+               DATE_FORMAT(cpbi.unit_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 YEAR(cptd.training_date) = ${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 YEAR(cptd.training_date) = ${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,
+        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 YEAR(cptd.training_date) = ${year}
+            </if>
+        </where>
+    </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..3bbf0bc
--- /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..0a6bf24
--- /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/pom.xml b/pom.xml
index 9d36e98..0dbf825 100644
--- a/pom.xml
+++ b/pom.xml
@@ -278,6 +278,13 @@
                 <version>${ruoyi.version}</version>
             </dependency>
 
+            <!--cnas浜哄憳-->
+            <dependency>
+                <groupId>com.ruoyi</groupId>
+                <artifactId>cnas-personnel</artifactId>
+                <version>${ruoyi.version}</version>
+            </dependency>
+
             <!-- minio -->
             <dependency>
                 <groupId>io.minio</groupId>
@@ -392,6 +399,7 @@
         <module>cnas-manage</module>
         <module>cnas-device</module>
         <module>cnas-process</module>
+        <module>cnas-personnel</module>
     </modules>
     <packaging>pom</packaging>
 
diff --git a/ruoyi-admin/pom.xml b/ruoyi-admin/pom.xml
index 751aec5..485e28d 100644
--- a/ruoyi-admin/pom.xml
+++ b/ruoyi-admin/pom.xml
@@ -103,6 +103,13 @@
             <artifactId>cnas-process</artifactId>
         </dependency>
 
+        <!--cnas浜哄憳-->
+        <dependency>
+            <groupId>com.ruoyi</groupId>
+            <artifactId>cnas-personnel</artifactId>
+        </dependency>
+
+
     </dependencies>
 
     <build>
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/MqttApplicationRunner.java b/ruoyi-admin/src/main/java/com/ruoyi/web/MqttApplicationRunner.java
new file mode 100644
index 0000000..854d84a
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/MqttApplicationRunner.java
@@ -0,0 +1,29 @@
+package com.ruoyi.web;
+
+import com.ruoyi.device.mqtt.MQClient;
+import com.ruoyi.device.mqtt.MQConfig;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.ApplicationArguments;
+import org.springframework.boot.ApplicationRunner;
+import org.springframework.stereotype.Component;
+
+@Component
+@Slf4j
+public class MqttApplicationRunner implements ApplicationRunner {
+
+	@Autowired
+	private MQConfig mqConfig;
+
+	@Value("${mqtt.client}")
+	private Boolean client;
+
+	@Override
+	public void run(ApplicationArguments args) throws Exception {
+		if (client) {
+			MQClient mqttPushClient = new MQClient();
+			mqttPushClient.connect(mqConfig);
+		}
+	}
+}
diff --git a/ruoyi-admin/src/main/resources/application-druid.yml b/ruoyi-admin/src/main/resources/application-druid.yml
index f32dbe2..33a491d 100644
--- a/ruoyi-admin/src/main/resources/application-druid.yml
+++ b/ruoyi-admin/src/main/resources/application-druid.yml
@@ -98,3 +98,16 @@
   custorder: http://192.168.20.47/PurchService.ashx?
   custorder-port: http://192.168.20.47:8008/PurchService.ashx?
   erp-services: http://192.168.20.47:8081
+
+# 澶囨敞 18083瀵嗙爜锛歾ttZTT123!@
+mqtt:
+  url: tcp://mqtt-ztt.zttiot.com:1883 # 鏈嶅姟鍣╥p
+  username: forwarder # MQTT-鏈嶅姟绔�-鐢ㄦ埛鍚�,鍚庢湡浼氫慨鏀逛负鐢ㄦ埛鐧诲綍鍚�
+  password: ZTlink12345 # MQTT-鏈嶅姟绔�-瀵嗙爜锛�,鍚庢湡浼氫慨鏀逛负鐢ㄦ埛鐧诲綍瀵嗙爜
+  timeout: 100 # 瓒呮椂鏃堕棿 锛堝崟浣嶏細绉掞級
+  keepalive: 60 # 蹇冭烦 锛堝崟浣嶏細绉掞級
+  qos: 1 # 蹇冭烦鍖呯骇鍒�
+  completion-timeout: 3000 # 杩炴帴瓒呮椂鏃堕棿锛堝崟浣嶏細绉掞級
+  clientId: javaPublish # clientId
+  subscribe: /ztt/v3/2443521/publish # 璁㈤槄涓婚
+  client: false # 濡傛灉寮�鍙戦渶瑕佸惎鍔ㄦ祴璇曪紝闇�瑕佹敼涓篺alse涓嶇劧浼氫竴鐩存姤閿�
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/DepartmentDto.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/DepartmentDto.java
new file mode 100644
index 0000000..9fa947a
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/DepartmentDto.java
@@ -0,0 +1,23 @@
+package com.ruoyi.common.core.domain.entity;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class DepartmentDto {
+
+    private Integer id;
+
+    private String name;
+
+    private Integer userId;
+
+    private Integer fatherId;
+
+    private List<DepartmentDto> children;
+}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/DepartmentLims.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/DepartmentLims.java
new file mode 100644
index 0000000..4ec52e2
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/DepartmentLims.java
@@ -0,0 +1,42 @@
+package com.ruoyi.common.core.domain.entity;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import java.util.List;
+
+/**
+ * 閮ㄩ棬鏄庣粏
+ * @TableName department_lims
+ */
+@TableName(value ="department_lims")
+@Data
+public class DepartmentLims implements Serializable {
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty("鍚嶇О")
+    private String name;
+
+    @ApiModelProperty("鐖剁骇id")
+    private Integer fatherId;
+
+    @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;
+
+    @TableField(exist = false)
+    private List<DepartmentLims> children;
+}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/FileSaveUtil.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/FileSaveUtil.java
new file mode 100644
index 0000000..da4ca5f
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/FileSaveUtil.java
@@ -0,0 +1,179 @@
+package com.ruoyi.common.utils;
+
+import com.alibaba.excel.util.IoUtils;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+import org.springframework.util.FileSystemUtils;
+import org.springframework.util.ObjectUtils;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.PostConstruct;
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.Random;
+
+/**
+ * 淇濆瓨鏂囦欢宸ュ叿
+ */
+@Slf4j
+@Component
+public class FileSaveUtil {
+
+    // 鍙杫ml涓殑璺緞 + /
+    private static String FILE_PATH;
+
+    private static String WORD_URL_PATH;
+
+    private static String[] ALLOWED;
+
+    @Value("${file.path}")
+    private String file;
+
+    @Value("${wordUrl}")
+    private String wordUrl;
+
+    @Value("${file.allowed}")
+    private String[] allowed;
+
+    @PostConstruct
+    public void getFile() {
+        FILE_PATH = this.file;
+    }
+
+    @PostConstruct
+    public void getWordUrl(){
+        WORD_URL_PATH = this.wordUrl;
+    }
+
+    @PostConstruct
+    public void getAllowed(){
+        ALLOWED = this.allowed;
+    }
+
+    /**
+     * 瀛樺偍鏂囦欢涓诲嚱鏁�
+     * @param file 鏂囦欢浜岃繘鍒舵祦
+     * @return 杩斿洖鏂囦欢鍚嶇О鐢ㄤ簬瀛樺偍鏁版嵁搴�
+     */
+    public static String StoreFile(MultipartFile file) {
+        String originalFilename = file.getOriginalFilename();
+        // 鐢熸垚闅忔満鍚嶇О锛氭椂闂確闅忔満6浣嶆暟瀛�
+        String FileName = System.currentTimeMillis() + "_" + getNumber(6);
+        String suffix = null;
+        if (originalFilename != null) {
+            suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
+            // 濡傛灉鍚庣紑鍚嶄笉閫氳繃鎶涘嚭寮傚父
+            if (!isFileAllowed(suffix)){
+                throw new RuntimeException(suffix);
+            }
+        }
+        // 鍚嶇О鎷兼帴
+        String fileName = FileName + suffix;
+        // 杩涜瀛樺偍
+        try {
+            storeFileWithFileName(file.getBytes(), fileName);
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+        return fileName;
+    }
+
+    public static Boolean DeleteFile(String fileName) {
+        if (ObjectUtils.isEmpty(fileName)) {
+            return false;
+        }
+        return FileSystemUtils.deleteRecursively(new File(FILE_PATH + "/" + fileName));
+    }
+    /**
+     * 瀛樺偍鏂囦欢鍑芥暟
+     * @param content 鏂囦欢浜岃繘鍒舵祦
+     * @param fileName 鏂囦欢鍚嶇О
+     */
+    private static void storeFileWithFileName(byte[] content, String fileName) {
+        // 瀛樺偍璺緞
+        String path = FILE_PATH + File.separatorChar;
+        // 鐩綍涓嶅瓨鍦ㄥ垯鍒涘缓
+        File file = new File(path);
+        if (!file.exists()) {
+            file.mkdirs();
+        }
+        // 寮�濮嬪瓨鍌�
+        try (FileOutputStream os = new FileOutputStream(path + fileName);
+             ByteArrayInputStream is = new ByteArrayInputStream(content)) {
+             IoUtils.copy(is, os);
+        } catch (IOException e) {
+            throw new RuntimeException("鏂囦欢瀛樺偍鏍煎紡寮傚父");
+        }
+    }
+
+    /**
+     * 鍒ゆ柇鏂囦欢鏄惁琚厑璁镐笂浼�
+     *
+     * @param fileName 鏂囦欢鍚�
+     * @return 鍏佽true, 鍚﹀垯false
+     */
+    private static boolean isFileAllowed(String fileName) {
+        // 鑾峰彇鍚庣紑鍚�
+        String suffixName = fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase();
+        for (String allow : ALLOWED) {
+            if (allow.equals(suffixName)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /**
+     * 淇濆瓨鏂囦欢鍒皐ord鏂囦欢澶归噷
+     * @param file
+     * @return
+     */
+    public static String uploadWordFile(MultipartFile file) {
+        String urlString;
+        String pathName;
+        String path;
+        try {
+            String contentType = file.getContentType();
+            if (contentType != null && contentType.startsWith("image/")) {
+                // 鏄浘鐗�
+                path = FILE_PATH;
+            } else {
+                // 鏄枃浠�
+                path = WORD_URL_PATH;
+            }
+            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));
+            return pathName;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+
+
+    /**
+     * 鑾峰彇闅忔満鏁板瓧
+     * @param n 浣嶆暟
+     * @return 杩斿洖闅忔満鍊�
+     */
+    public static String getNumber(int n) {
+        char[] chars = "1234567890".toCharArray();
+        StringBuilder sb = new StringBuilder();
+        for (int i = 0; i < n; i++) {
+            char c = chars[new Random().nextInt(chars.length)];
+            sb.append(c);
+        }
+        return sb.toString();
+    }
+}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/MyUtil.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/MyUtil.java
new file mode 100644
index 0000000..bbf9da3
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/MyUtil.java
@@ -0,0 +1,17 @@
+package com.ruoyi.common.utils;
+
+import org.springframework.stereotype.Component;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.Random;
+
+@Component
+public class MyUtil<T> {
+
+
+
+
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/DepartmentLimsMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/DepartmentLimsMapper.java
new file mode 100644
index 0000000..3e2a51e
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/DepartmentLimsMapper.java
@@ -0,0 +1,27 @@
+package com.ruoyi.system.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.common.core.domain.entity.DepartmentDto;
+import com.ruoyi.common.core.domain.entity.DepartmentLims;
+
+import java.util.List;
+
+/**
+* @author z1292
+* @description 閽堝琛ㄣ�恉epartment_lims(閮ㄩ棬鏄庣粏)銆戠殑鏁版嵁搴撴搷浣淢apper
+* @createDate 2024-05-22 14:08:17
+* @Entity com.yuanchu.mom.pojo.DepartmentLims
+*/
+public interface DepartmentLimsMapper extends BaseMapper<DepartmentLims> {
+
+    //鑾峰彇閮ㄩ棬鏍�
+    List<DepartmentDto> selectDepartment();
+
+    //鏍规嵁閮ㄩ棬id,鏌ヨ浠栫殑鎵�鏈夊瓙绫籭d
+    List<Integer> selectSonById(Integer id);
+
+}
+
+
+
+
diff --git a/ruoyi-system/src/main/resources/mapper/system/DepartmentLimsMapper.xml b/ruoyi-system/src/main/resources/mapper/system/DepartmentLimsMapper.xml
new file mode 100644
index 0000000..48c7d39
--- /dev/null
+++ b/ruoyi-system/src/main/resources/mapper/system/DepartmentLimsMapper.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.system.mapper.DepartmentLimsMapper">
+
+
+    <select id="selectDepartment" resultType="com.ruoyi.common.core.domain.entity.DepartmentDto">
+        SELECT id, name, father_id
+        FROM department_lims
+    </select>
+
+    <select id="selectSonById" resultType="java.lang.Integer">
+        SELECT au.id
+        FROM (SELECT * FROM department_lims WHERE father_id IS NOT NULL) au,
+             (SELECT @father_id := #{id}) pd
+        WHERE FIND_IN_SET(father_id, @father_id) > 0
+                  AND @father_id := concat(@father_id, ',', id)
+        UNION
+        SELECT id
+        FROM department_lims
+        WHERE id = #{id}
+        ORDER BY id
+    </select>
+</mapper>

--
Gitblit v1.9.3