From 12291480d592402398c3ba76e8de6006da5c2612 Mon Sep 17 00:00:00 2001
From: zss <zss@example.com>
Date: 星期五, 07 三月 2025 11:16:00 +0800
Subject: [PATCH] 搬迁人员

---
 cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonJobResponsibilitiesService.java                  |   27 
 cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonSupervisePlanDetails.java                           |   73 
 cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/FileGeneralServiceImpl.java                       |  162 +
 cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/AnnexServiceImpl.java                             |   13 
 cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonJobResponsibilitiesDto.java                          |   16 
 cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonTrainingFileServiceImpl.java                |   14 
 cnas-personnel/src/main/java/com/ruoyi/personnel/excel/PersonSupervisePlanDetailsUpload.java                    |   28 
 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-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonSupervisionRecordServiceImpl.java           |  125 
 cnas-personnel/src/main/resources/mapper/PersonTrainingRecordMapper.xml                                         |  135 
 ruoyi-framework/src/main/java/com/ruoyi/framework/util/TestApi.java                                             |   25 
 cnas-personnel/src/main/resources/static/supervision-record.docx                                                |    0 
 cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonTrainingRecordServiceImpl.java              |  338 ++
 ruoyi-system/src/main/java/com/ruoyi/system/mapper/DepartmentLimsMapper.java                                    |   27 
 cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonSupervisionProcessingSheet.java                     |   99 
 cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonSupervisePlanDetailsServiceImpl.java        |   43 
 ruoyi-framework/src/main/java/com/ruoyi/framework/util/HeaderToken.java                                         |    5 
 cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonPersonnelCapacityDto.java                            |   30 
 cnas-personnel/src/main/resources/static/supervision-processing-sheet.docx                                      |    0 
 cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonCommunicationAbilityService.java                 |   25 
 cnas-personnel/src/main/resources/mapper/PersonSupervisionProcessingSheetMapper.xml                             |   28 
 cnas-personnel/src/main/resources/static/communication-deal.docx                                                |    0 
 cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonSupervisionControlSheetMapper.java                |   25 
 ruoyi-common/src/main/java/com/ruoyi/common/core/dto/UserPageDto.java                                           |   24 
 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-personnel/src/main/resources/static/supervision-control-sheet.docx                                         |    0 
 cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonTraining.java                                       |   83 
 cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonSupervisePlanServiceImpl.java               |  327 ++
 cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonSupervisionProcessingSheetDto.java                   |   40 
 cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonTrainingRecordMapper.java                         |   67 
 cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonBasicInfo.java                                      |  271 +
 cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonCommunicationAbility.java                           |   61 
 cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonBasicInfoService.java                            |   50 
 cnas-personnel/src/main/java/com/ruoyi/personnel/dto/TrainingRecordPersonDetailedDto.java                       |   28 
 cnas-personnel/src/main/java/com/ruoyi/personnel/excel/PersonTrainingDetailedListener.java                      |   81 
 cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonTrainingDetailedMapper.java                       |   43 
 cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonSupervisionProcessingSheetServiceImpl.java  |  119 
 cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/AnnexMapper.java                                        |    9 
 cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonBasicInfoMapper.java                              |   37 
 cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonSupervisePlanDto.java                                |   21 
 cnas-personnel/src/main/java/com/ruoyi/personnel/service/FileGeneralService.java                                |   19 
 cnas-personnel/src/main/resources/static/explain-deal.docx                                                      |    0 
 cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonJobResponsibilitiesServiceImpl.java         |  114 
 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                        |   44 
 cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/Annex.java                                                |   48 
 cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonPostAuthorizationRecord.java                        |   74 
 cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonSupervisePlanMapper.java                          |   21 
 performance-server/src/main/java/com/ruoyi/performance/service/impl/AuxiliaryOutputWorkingHoursServiceImpl.java |    2 
 cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonTrackRecordService.java                          |   23 
 cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonTrainingDetailedServiceImpl.java            |  363 ++
 cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonSupervisionRecordMapper.java                      |   27 
 cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonTrainingRecord.java                                 |   41 
 cnas-personnel/src/main/resources/mapper/PersonTrainingMapper.xml                                               |   72 
 cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonTrackRecordServiceImpl.java                 |   33 
 cnas-personnel/src/main/resources/mapper/PersonSupervisionRecordMapper.xml                                      |   78 
 ruoyi-system/src/main/resources/mapper/system/DepartmentLimsMapper.xml                                          |   34 
 cnas-personnel/pom.xml                                                                                          |   11 
 performance-server/src/main/java/com/ruoyi/performance/pojo/AuxiliaryWorkingHoursDay.java                       |   93 
 ruoyi-system/pom.xml                                                                                            |    2 
 cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonSupervisionControlSheet.java                        |  113 
 cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonSupervisePlanService.java                        |   32 
 cnas-personnel/src/main/resources/static/credentials-deal.docx                                                  |    0 
 cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonSupervisionControlSheetExportDto.java                |   74 
 cnas-personnel/src/main/resources/static/person-training-record.docx                                            |    0 
 cnas-personnel/src/main/resources/mapper/PersonJobResponsibilitiesMapper.xml                                    |   39 
 cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonRewardPunishmentRecordService.java               |   31 
 ruoyi-system/src/main/java/com/ruoyi/system/domain/AuthApi.java                                                 |    4 
 cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonSupervisePlanDetailsDto.java                         |   14 
 cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonPostAuthorizationRecordDto.java                      |   14 
 cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonPostAuthorizationRecordServiceImpl.java     |  136 
 cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonSupervisionRecord.java                              |  107 
 cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonBasicInfoDetailsDto.java                             |   66 
 cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonJobResponsibilitiesMapper.java                    |   20 
 cnas-personnel/src/main/resources/mapper/PersonBasicInfoMapper.xml                                              |  101 
 cnas-personnel/src/main/resources/mapper/PersonTrainingDetailedMapper.xml                                       |   98 
 cnas-personnel/src/main/resources/static/personnel-capacity.docx                                                |    0 
 cnas-personnel/src/main/resources/mapper/PersonRewardPunishmentRecordMapper.xml                                 |   58 
 cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonRewardPunishmentRecord.java                         |   61 
 cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonTrainingDto.java                                     |   26 
 cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonRewardPunishmentRecordDto.java                       |   14 
 cnas-personnel/src/main/java/com/ruoyi/personnel/enumeration/AttachmentType.java                                |   46 
 ruoyi-common/src/main/java/com/ruoyi/common/utils/DateImageUtil.java                                            |   38 
 cnas-personnel/src/main/resources/static/person-training.docx                                                   |    0 
 cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonTrackRecord.java                                    |   83 
 cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonRewardPunishmentRecordServiceImpl.java      |   36 
 cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonTrainingFile.java                                   |   41 
 cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonPersonnelCapacityServiceImpl.java           |  121 
 cnas-personnel/src/main/resources/mapper/PersonPersonnelCapacityMapper.xml                                      |  168 +
 cnas-personnel/src/main/java/com/ruoyi/personnel/excel/PersonRewardPunishmentRecordExcel.java                   |   34 
 cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonSupervisionRecordDto.java                            |   33 
 ruoyi-system/src/main/java/com/ruoyi/system/service/DepartmentLimsService.java                                  |   25 
 cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonPersonnelCapacityService.java                    |   37 
 cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonRewardPunishmentRecordMapper.java                 |   26 
 cnas-personnel/src/main/resources/static/person-deal.docx                                                       |    0 
 cnas-personnel/src/main/java/com/ruoyi/personnel/schedule/PersonSchedule.java                                   |   54 
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/UserController.java                                   |    2 
 cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonTrainingRecordListDto.java                           |   37 
 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-personnel/src/main/java/com/ruoyi/personnel/dto/PersonTrainingDetailedDto.java                             |   35 
 cnas-personnel/src/main/resources/mapper/PersonSupervisePlanMapper.xml                                          |   36 
 cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonTrackRecordMapper.java                            |   24 
 cnas-personnel/src/main/resources/mapper/PersonPostAuthorizationRecordMapper.xml                                |   40 
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/DepartmentLimsServiceImpl.java                         |   86 
 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/resources/mapper/PersonTrackRecordMapper.xml                                            |   47 
 cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonTrainingRecordService.java                       |   60 
 cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonTrainingService.java                             |   48 
 cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonTrainingServiceImpl.java                    |  376 ++
 cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonSupervisionProcessingSheetService.java           |   24 
 cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonTrainingFileService.java                         |    7 
 cnas-personnel/src/main/resources/static/training-record.docx                                                   |    0 
 cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonTrainingDetailed.java                               |  124 
 cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonSupervisionControlSheetService.java              |   24 
 ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/User.java                                        |    3 
 cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonBasicInfoDto.java                                    |   47 
 cnas-personnel/src/main/java/com/ruoyi/personnel/service/AnnexService.java                                      |    7 
 cnas-personnel/src/main/resources/mapper/PersonSupervisePlanDetailsMapper.xml                                   |   42 
 cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonSupervisePlan.java                                  |   66 
 cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonBasicInfoServiceImpl.java                   | 1081 +++++++
 cnas-personnel/src/main/java/com/ruoyi/personnel/excel/PersonSupervisePlanDetailsListener.java                  |   42 
 cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonSupervisionProcessingSheetMapper.java             |   24 
 cnas-personnel/src/main/resources/mapper/PersonSupervisionControlSheetMapper.xml                                |   41 
 cnas-personnel/src/main/resources/static/super-vise-plan.docx                                                   |    0 
 cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonTrainingRecordSubmitDto.java                         |   34 
 cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonCommunicationAbilityDto.java                         |   14 
 cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonSupervisionControlSheetServiceImpl.java     |  155 +
 cnas-personnel/src/main/resources/mapper/PersonCommunicationAbilityMapper.xml                                   |   31 
 cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonPersonnelCapacity.java                              |  122 
 cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonSupervisionRecordService.java                    |   33 
 cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonTrainingDetailedService.java                     |   47 
 cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonPostAuthorizationRecordMapper.java                |   20 
 cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonTrainingUpdateDto.java                               |   17 
 ruoyi-common/src/main/java/com/ruoyi/common/core/dto/DepartmentDto.java                                         |   23 
 cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonSupervisePlanDetailsMapper.java                   |   21 
 cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonTrainingFileMapper.java                           |    9 
 cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonCommunicationAbilityMapper.java                   |   21 
 cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonSupervisePlanDetailsService.java                 |   26 
 142 files changed, 8,660 insertions(+), 49 deletions(-)

diff --git a/cnas-personnel/pom.xml b/cnas-personnel/pom.xml
index 6b94b71..3a630d5 100644
--- a/cnas-personnel/pom.xml
+++ b/cnas-personnel/pom.xml
@@ -40,6 +40,17 @@
             <groupId>com.ruoyi</groupId>
             <artifactId>inspect-server</artifactId>
         </dependency>
+
+        <dependency>
+            <groupId>com.ruoyi</groupId>
+            <artifactId>cnas-process</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.belerweb</groupId>
+            <artifactId>pinyin4j</artifactId>
+            <version>2.5.1</version>
+        </dependency>
     </dependencies>
 
 </project>
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..29bbc78
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonBasicInfoDetailsDto.java
@@ -0,0 +1,66 @@
+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/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..39ef429
--- /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 submitOperatingPersonnelName;
+
+    @ApiModelProperty("鎿嶄綔浜哄鍚�")
+    private String confirmOperatingPersonnelName;
+
+    @ApiModelProperty("浜哄憳濮撳悕")
+    private String userName;
+
+    @ApiModelProperty("宀椾綅鍚嶇О")
+    private String postName;
+
+    @ApiModelProperty("宀椾綅鑱岃矗")
+    private String responsibilities;
+
+    @ApiModelProperty("宸ヤ綔缁忓巻")
+    private String placeWork;
+
+    @ApiModelProperty("涓撲笟")
+    private String major;
+}
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/PersonSupervisePlanDetailsDto.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonSupervisePlanDetailsDto.java
new file mode 100644
index 0000000..7399b6d
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonSupervisePlanDetailsDto.java
@@ -0,0 +1,14 @@
+package com.ruoyi.personnel.dto;
+
+import com.ruoyi.personnel.pojo.PersonSupervisePlanDetails;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class PersonSupervisePlanDetailsDto extends PersonSupervisePlanDetails {
+
+    @ApiModelProperty(value = "鍒涘缓浜�")
+    private String createBy;
+
+
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonSupervisePlanDto.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonSupervisePlanDto.java
new file mode 100644
index 0000000..b80fedb
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonSupervisePlanDto.java
@@ -0,0 +1,21 @@
+package com.ruoyi.personnel.dto;
+
+import com.ruoyi.personnel.pojo.PersonSupervisePlan;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class PersonSupervisePlanDto extends PersonSupervisePlan {
+
+    @ApiModelProperty(value = "瀹℃牳浜�")
+    private String approvalName;
+
+    @ApiModelProperty(value = "缂栧埗浜�")
+    private String organizationPersonName;
+
+    @ApiModelProperty(value = "缂栧埗浜�")
+    private String createName;
+
+    @ApiModelProperty("褰撳墠鐧诲綍浜�")
+    private Integer currentId;
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonSupervisionControlSheetExportDto.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonSupervisionControlSheetExportDto.java
new file mode 100644
index 0000000..c830632
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonSupervisionControlSheetExportDto.java
@@ -0,0 +1,74 @@
+package com.ruoyi.personnel.dto;
+
+import com.ruoyi.personnel.pojo.PersonSupervisionControlSheet;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @Author zhuo
+ * @Date 2024/11/26
+ */
+@Data
+public class PersonSupervisionControlSheetExportDto extends PersonSupervisionControlSheet {
+
+    @ApiModelProperty("1鍙戠敓閮ㄩ棬")
+    private String occurrenceDepartmentString;
+
+    @ApiModelProperty("1閮ㄩ棬璐熻矗浜�")
+    private String departmentHead;
+
+    @ApiModelProperty("1鍙戠幇閮ㄩ棬")
+    private String discovererDepartment;
+
+    @ApiModelProperty("1鍙戠幇閮ㄩ棬-鏃ユ湡")
+    private String discovererDateString;
+
+    @ApiModelProperty("2琚洃鐫d汉")
+    private String supervisedPerson;
+
+    @ApiModelProperty("3璐d换閮ㄩ棬")
+    private String responsibleDepartment;
+
+    @ApiModelProperty("3璐d换閮ㄩ棬 鏃ユ湡")
+    private String responsibleDepartmentDateString;
+
+    @ApiModelProperty("4绾犳鎺柦 鏃ユ湡")
+    private String correctiveMeasureDateString;
+
+    @ApiModelProperty("5璐ㄩ噺璐熻矗浜烘棩鏈�")
+    private String qualitySupervisorDateString;
+
+    @ApiModelProperty("4绾犳鎺柦澶勭悊鍗曡窡韪�(鏄�)")
+    private String correctiveMeasureFollowTracksYes = "鈻�";
+    @ApiModelProperty("4绾犳鎺柦澶勭悊鍗曡窡韪�(鍚�)")
+    private String correctiveMeasureFollowTracksNo = "鈻�";
+
+
+    @ApiModelProperty("5鏄惁閫氱煡瀹㈡埛(鏄�)")
+    private String whetherInformCustomerYes = "鈻�";
+    @ApiModelProperty("5鏄惁閫氱煡瀹㈡埛(鍚�)")
+    private String whetherInformCustomerNo = "鈻�";
+
+
+    @ApiModelProperty("5鏄惁鎭㈠宸ヤ綔(1锛氭槸锛�2锛氬惁)")
+    private String whetherResumeWorkYes = "鈻�";
+    @ApiModelProperty("5鏄惁鎭㈠宸ヤ綔(1锛氭槸锛�2锛氬惁)")
+    private String whetherResumeWorkNo = "鈻�";
+
+    @ApiModelProperty("1涓嶇鍚堝伐浣滃彂鐜伴�斿緞0(绠$悊璇勫)")
+    private String discoveryApproach0 = "鈻�";
+    @ApiModelProperty("1涓嶇鍚堝伐浣滃彂鐜伴�斿緞1(鍐呴儴瀹℃牳)")
+    private String discoveryApproach1 = "鈻�";
+    @ApiModelProperty("1涓嶇鍚堝伐浣滃彂鐜伴�斿緞2(妫�娴嬭繃绋嬫帶鍒�)")
+    private String discoveryApproach2 = "鈻�";
+    @ApiModelProperty("1涓嶇鍚堝伐浣滃彂鐜伴�斿緞3(鍐呴儴璐ㄩ噺鎺у埗)")
+    private String discoveryApproach3 = "鈻�";
+    @ApiModelProperty("1涓嶇鍚堝伐浣滃彂鐜伴�斿緞4(鍐呴儴鐩戠潱)")
+    private String discoveryApproach4 = "鈻�";
+    @ApiModelProperty("1涓嶇鍚堝伐浣滃彂鐜伴�斿緞5(澶栭儴璇勫/妫�鏌�)")
+    private String discoveryApproach5 = "鈻�";
+    @ApiModelProperty("1涓嶇鍚堝伐浣滃彂鐜伴�斿緞6(椤惧鎶曡瘔/鎰忚鍙嶉)")
+    private String discoveryApproach6 = "鈻�";
+    @ApiModelProperty("1涓嶇鍚堝伐浣滃彂鐜伴�斿緞7(鍏朵粬)")
+    private String discoveryApproach7 = "鈻�";
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonSupervisionProcessingSheetDto.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonSupervisionProcessingSheetDto.java
new file mode 100644
index 0000000..a616071
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonSupervisionProcessingSheetDto.java
@@ -0,0 +1,40 @@
+package com.ruoyi.personnel.dto;
+
+import com.ruoyi.personnel.pojo.PersonSupervisionProcessingSheet;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @Author zhuo
+ * @Date 2024/11/26
+ */
+@Data
+public class PersonSupervisionProcessingSheetDto extends PersonSupervisionProcessingSheet {
+
+    @ApiModelProperty("1 鎻愬嚭閮ㄩ棬")
+    private String proposingDepartment;
+
+    @ApiModelProperty("1 鎻愬嚭閮ㄩ棬 鏃ユ湡")
+    private String proposingDepartmentDateString;
+
+    @ApiModelProperty("2 鍘熷洜鍒嗘瀽 閮ㄩ棬")
+    private String causeAnalysis;
+
+    @ApiModelProperty("2 鍘熷洜鍒嗘瀽 閮ㄩ棬")
+    private String causeAnalysisDepartment;
+
+    @ApiModelProperty("2 鍘熷洜鍒嗘瀽 鏃ユ湡")
+    private String causeAnalysisDateString;
+
+    @ApiModelProperty("3 绾犳鎺柦")
+    private String correctiveAction;
+
+    @ApiModelProperty("3 绾犳鎺柦 鏃ユ湡")
+    private String correctiveActionDateString;
+
+    @ApiModelProperty("4 楠岃瘉閮ㄩ棬")
+    private String verificationDepartment;
+
+    @ApiModelProperty("4 楠岃瘉閮ㄩ棬 鏃ユ湡")
+    private String verificationDepartmentDateString;
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonSupervisionRecordDto.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonSupervisionRecordDto.java
new file mode 100644
index 0000000..2fd3e97
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonSupervisionRecordDto.java
@@ -0,0 +1,33 @@
+package com.ruoyi.personnel.dto;
+
+import com.ruoyi.personnel.pojo.PersonSupervisionRecord;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class PersonSupervisionRecordDto extends PersonSupervisionRecord {
+
+    @ApiModelProperty("妫�娴嬩汉鍛樺鍚�")
+    private String testerName;
+
+    @ApiModelProperty("鐩戠潱鍛樺鍚�")
+    private String supervisorName;
+
+    @ApiModelProperty("浜哄憳list 濮撳悕id")
+    private String personnelName;
+
+    @ApiModelProperty("鎶�鏈礋璐d汉濮撳悕")
+    private String technicalDirectorName;
+
+    @ApiModelProperty("鎺у埗鍗曠姸鎬�")
+    private String currentStateControl;
+
+    @ApiModelProperty("澶勭悊鍗曠姸鎬�")
+    private String currentStateProcessing;
+
+    @ApiModelProperty("妫�娴嬫棩鏈�")
+    private String detectionDateString;
+
+    @ApiModelProperty("鏄惁闇�瑕佺籂姝f帾鏂� 1闇�瑕� ")
+    private String correctiveMeasure;
+}
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..666db0a
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonTrainingDetailedDto.java
@@ -0,0 +1,35 @@
+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;
+
+    @ApiModelProperty("鎶ュ悕浜烘暟")
+    private Integer enrollment;
+
+    // 瀵煎嚭浣跨敤
+    @TableField(select = false, exist = false)
+    @ApiModelProperty("搴忓彿(瀵煎嚭浣跨敤)")
+    private Integer index;
+
+    private Integer departId;
+
+    private Integer isDisabled;
+}
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..3fd6e42
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonTrainingDto.java
@@ -0,0 +1,26 @@
+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;
+
+    @ApiModelProperty("褰撳墠鐧诲綍浜篿d")
+    private Integer currentId;
+}
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..9f9a24f
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonTrainingRecordSubmitDto.java
@@ -0,0 +1,34 @@
+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 assessmentMethod;
+
+    @ApiModelProperty("鏈鍩硅缁煎悎璇勪环")
+    private String comprehensiveAssessment;
+
+    @ApiModelProperty("璇勪环浜�")
+    private Integer assessmentUserId;
+
+    @ApiModelProperty("璇勪环鏃堕棿")
+    private LocalDate assessmentDate;
+
+    private String state;
+
+    @ApiModelProperty("璇炬椂")
+    private Integer classHour;
+
+    private String trainingAbstract;
+
+
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonTrainingUpdateDto.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonTrainingUpdateDto.java
new file mode 100644
index 0000000..cbf6383
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonTrainingUpdateDto.java
@@ -0,0 +1,17 @@
+package com.ruoyi.personnel.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class PersonTrainingUpdateDto {
+
+    @ApiModelProperty("涓婚敭id")
+    private Integer id;
+
+    @ApiModelProperty("瀹℃牳/鎵瑰噯 澶囨敞")
+    private String remarks;
+
+    @ApiModelProperty("瀹℃牳/鎵瑰噯 鐘舵��")
+    private Integer status;
+}
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..3a593a0
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/TrainingRecordPersonDetailedDto.java
@@ -0,0 +1,28 @@
+package com.ruoyi.personnel.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class TrainingRecordPersonDetailedDto {
+
+    @ApiModelProperty("鍩硅鏃ユ湡")
+    private String trainingDateString;
+
+    @ApiModelProperty("鍩硅鏃ユ湡")
+    private Date 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/enumeration/AttachmentType.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/enumeration/AttachmentType.java
new file mode 100644
index 0000000..54feb00
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/enumeration/AttachmentType.java
@@ -0,0 +1,46 @@
+package com.ruoyi.personnel.enumeration;
+
+public enum AttachmentType {
+    // 璁惧鏍″噯琛ㄥ悕
+    SBJZ(1,"device_metric_record"),
+     // 鍩硅璁″垝 鏄庣粏琛�
+    PXJH(2,"cnas_person_training_detailed"),
+    // 鍏ヨ亴鎺堟潈璁板綍
+    RZSQ(3,"cnas_person_post_authorization_record"),
+    ;
+
+    private Integer type;
+    private String value;
+
+     AttachmentType(Integer type, String value) {
+        this.type = type;
+        this.value = value;
+    }
+
+    public Integer getType() {
+        return type;
+    }
+
+    public void setType(Integer type) {
+        this.type = type;
+    }
+
+    public String getValue() {
+        return value;
+    }
+
+    public void setValue(String value) {
+        this.value = value;
+    }
+
+    public static String getTypeValue(Integer type) {
+        AttachmentType.values();
+        for(AttachmentType attachmentType : AttachmentType.values()) {
+            if(attachmentType.getType().equals(type)) return attachmentType.getValue();
+        }
+        return "";
+    }
+
+
+
+}
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/PersonSupervisePlanDetailsListener.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/excel/PersonSupervisePlanDetailsListener.java
new file mode 100644
index 0000000..65da2a1
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/excel/PersonSupervisePlanDetailsListener.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.PersonSupervisePlanDetailsService;
+import lombok.Data;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Data
+public class PersonSupervisePlanDetailsListener extends AnalysisEventListener<PersonSupervisePlanDetailsUpload> {
+
+    private Integer planId;
+
+    private static final int BATCH_COUNT = 1000;
+    List<PersonSupervisePlanDetailsUpload> list = new ArrayList<>();
+
+    private PersonSupervisePlanDetailsService personSupervisePlanDetailsService;
+
+    public PersonSupervisePlanDetailsListener(PersonSupervisePlanDetailsService personSupervisePlanDetailsService) {
+        this.personSupervisePlanDetailsService = personSupervisePlanDetailsService;
+    }
+
+    @Override
+    public void invoke(PersonSupervisePlanDetailsUpload data, AnalysisContext context) {
+        list.add(data);
+        if (list.size() >= BATCH_COUNT) {
+            save();
+            list.clear();
+        }
+    }
+
+    @Override
+    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
+        save();
+    }
+
+    private void save() {
+        personSupervisePlanDetailsService.importExcel(list, this.planId);
+    }
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/excel/PersonSupervisePlanDetailsUpload.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/excel/PersonSupervisePlanDetailsUpload.java
new file mode 100644
index 0000000..2a4bc2e
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/excel/PersonSupervisePlanDetailsUpload.java
@@ -0,0 +1,28 @@
+package com.ruoyi.personnel.excel;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Data
+public class PersonSupervisePlanDetailsUpload {
+
+    @ExcelProperty("鐩戠潱鏃ユ湡")
+    private LocalDateTime superviseDate;
+
+    @ExcelProperty("鐩戠潱鐩殑")
+    private String superviseDes;
+
+    @ExcelProperty("琚洃鐫d汉鍛�")
+    private String supervisePerson;
+
+    @ExcelProperty("澶囨敞")
+    private String remarks;
+
+    @ExcelProperty("鐩戠潱椤圭洰")
+    private String superviseProject;
+
+    @ExcelProperty("鐩戠潱鍘熷洜")
+    private String superviseReason;
+}
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..8bbba20
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/excel/PersonTrainingDetailedListener.java
@@ -0,0 +1,81 @@
+package com.ruoyi.personnel.excel;
+
+import com.alibaba.excel.context.AnalysisContext;
+import com.alibaba.excel.event.AnalysisEventListener;
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.ruoyi.personnel.service.PersonTrainingDetailedService;
+import lombok.Data;
+import lombok.extern.slf4j.Slf4j;
+
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+
+@Data
+@Slf4j
+public class PersonTrainingDetailedListener extends AnalysisEventListener<PersonTrainingDetailedUpload> {
+
+    private Integer planId;
+
+    private static Boolean FLAG = true;
+
+    private static final int BATCH_COUNT = 1000;
+
+    List<PersonTrainingDetailedUpload> list = new ArrayList<>();
+
+    private PersonTrainingDetailedService personTrainingDetailedService;
+
+    public PersonTrainingDetailedListener(PersonTrainingDetailedService personTrainingDetailedService,Integer planId) {
+        this.personTrainingDetailedService = personTrainingDetailedService;
+        this.planId = planId;
+    }
+
+    @Override
+    public void invoke(PersonTrainingDetailedUpload data, AnalysisContext context) {
+        log.info("瑙f瀽鍒颁竴鏉℃暟鎹畕}", JSON.toJSONString(data));
+        int count = 0;
+        int count1 = 0;
+        // 濡傛灉鏁版嵁鍏ㄤ负绌� 閭d箞灏变笉鍦ㄧ户缁坊鍔�
+        Field[] fields = data.getClass().getDeclaredFields();
+        for (Field field : fields) {
+            count1++;
+            field.setAccessible(true);
+            try {
+                Object o = field.get(data); // 鑾峰彇瀛楁鍊�
+                if(Objects.isNull(o) || StringUtils.isEmpty(o.toString())) {
+                    count++;
+                }
+            } catch (IllegalAccessException e) {
+                throw new RuntimeException(e);
+            }
+        }
+        if(count == count1) {
+            FLAG = false;
+        }
+        if(FLAG) {
+            list.add(data);
+        }
+        if (list.size() >= BATCH_COUNT) {
+            save();
+            list.clear();
+        }
+
+
+    }
+
+    @Override
+    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
+        log.info("鎵�鏈夋暟鎹В鏋愬畬鎴恵}",list.size());
+        save();
+        // 鎵�鏈夋暟鎹В鏋愬畬鎴� 灏咶LAG鏇存柊涓簍rue
+        if(!FLAG) {
+            FLAG = true;
+        }
+    }
+
+    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..cff7e22
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/excel/PersonTrainingDetailedUpload.java
@@ -0,0 +1,44 @@
+package com.ruoyi.personnel.excel;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import lombok.Data;
+
+@Data
+public class PersonTrainingDetailedUpload {
+
+//    @ExcelProperty("鍩硅鐩爣")
+    @ExcelProperty(index = 1)
+    private String trainingObjectives;
+
+//    @ExcelProperty("鍩硅鍐呭")
+    @ExcelProperty(index = 2)
+    private String trainingContent;
+
+//    @ExcelProperty("鍩硅鏂瑰紡")
+    @ExcelProperty(index = 3)
+    private String trainingMode;
+
+//    @ExcelProperty("鍙傚姞瀵硅薄")
+    @ExcelProperty(index = 4)
+    private String participants;
+
+//    @ExcelProperty("涓惧姙閮ㄩ棬")
+    @ExcelProperty(index = 5)
+    private String holdingDepartment;
+
+//    @ExcelProperty("鍩硅璁插笀")
+    @ExcelProperty(index = 6)
+    private String trainingLecturerName;
+
+//    @ExcelProperty("鍩硅鏃堕棿")
+    @ExcelProperty(index = 7)
+    private String trainingDate;
+
+//    @ExcelProperty("璇炬椂")
+    @ExcelProperty(index = 8)
+    private String classHour;
+
+//    @ExcelProperty("澶囨敞")
+    @ExcelProperty(index = 9)
+    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/PersonBasicInfoMapper.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonBasicInfoMapper.java
new file mode 100644
index 0000000..adb5fb7
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonBasicInfoMapper.java
@@ -0,0 +1,37 @@
+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.dto.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);
+
+    IPage<Map<String, Object>> basicInformationOfPersonnelSelectPage(Page page, Integer departmentId);
+
+    /**
+     * 浜哄憳鍩烘湰淇℃伅鍒嗛〉鏌ヨ
+     * @param page
+     * @param name
+     * @param departmentId
+     * @return
+     */
+    IPage<Map<String, Object>> selectPersonBasecInfoAndUser(Page page, String name, Integer departmentId);
+}
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/PersonSupervisePlanDetailsMapper.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonSupervisePlanDetailsMapper.java
new file mode 100644
index 0000000..67fd119
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonSupervisePlanDetailsMapper.java
@@ -0,0 +1,21 @@
+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.PersonSupervisePlanDetailsDto;
+import com.ruoyi.personnel.pojo.PersonSupervisePlanDetails;
+
+/**
+ * <p>
+ * 鐩戠潱璁″垝 - 瀛� Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-10-09 04:17:02
+ */
+public interface PersonSupervisePlanDetailsMapper extends MyBaseMapper<PersonSupervisePlanDetails> {
+
+    IPage<PersonSupervisePlanDetailsDto> pageByDate(Page page, String date, String project, Integer planId);
+
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonSupervisePlanMapper.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonSupervisePlanMapper.java
new file mode 100644
index 0000000..801e00a
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonSupervisePlanMapper.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.PersonSupervisePlanDto;
+import com.ruoyi.personnel.pojo.PersonSupervisePlan;
+
+/**
+ * <p>
+ * 鐩戠潱璁″垝 - 鐖� Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-10-09 04:14:45
+ */
+public interface PersonSupervisePlanMapper extends BaseMapper<PersonSupervisePlan> {
+
+    IPage<PersonSupervisePlanDto> pageByPerson(Page page, String organizationPerson,Integer departId);
+
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonSupervisionControlSheetMapper.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonSupervisionControlSheetMapper.java
new file mode 100644
index 0000000..b5b3c4e
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonSupervisionControlSheetMapper.java
@@ -0,0 +1,25 @@
+package com.ruoyi.personnel.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.personnel.dto.PersonSupervisionControlSheetExportDto;
+import com.ruoyi.personnel.pojo.PersonSupervisionControlSheet;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * <p>
+ * 鐩戠潱璁板綍 - 鎺у埗鍗� Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-10-10 05:18:57
+ */
+public interface PersonSupervisionControlSheetMapper extends BaseMapper<PersonSupervisionControlSheet> {
+
+    /**
+     * 鏌ヨ鐩戠潱璁板綍鎺у埗鍗�
+     * @param supervisionRecordId
+     */
+    PersonSupervisionControlSheetExportDto selectSupervisionControl(@Param("supervisionRecordId") Integer supervisionRecordId);
+
+
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonSupervisionProcessingSheetMapper.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonSupervisionProcessingSheetMapper.java
new file mode 100644
index 0000000..50e78ba
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonSupervisionProcessingSheetMapper.java
@@ -0,0 +1,24 @@
+package com.ruoyi.personnel.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.personnel.dto.PersonSupervisionProcessingSheetDto;
+import com.ruoyi.personnel.pojo.PersonSupervisionProcessingSheet;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * <p>
+ * 鐩戠潱璁板綍 - 澶勭悊鍗� Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-10-10 05:35:58
+ */
+public interface PersonSupervisionProcessingSheetMapper extends BaseMapper<PersonSupervisionProcessingSheet> {
+
+    /**
+     * 鏌ヨ浜哄憳鐩戠潱璁板綍澶勭悊鍗�
+     * @param supervisionRecordId
+     * @return
+     */
+    PersonSupervisionProcessingSheetDto selectProcessingSheet(@Param("supervisionRecordId") Integer supervisionRecordId);
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonSupervisionRecordMapper.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonSupervisionRecordMapper.java
new file mode 100644
index 0000000..d49cbd0
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonSupervisionRecordMapper.java
@@ -0,0 +1,27 @@
+package com.ruoyi.personnel.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.personnel.dto.PersonSupervisionRecordDto;
+import com.ruoyi.personnel.pojo.PersonSupervisionRecord;
+
+/**
+ * <p>
+ * 鐩戠潱璁板綍 Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-10-10 04:16:49
+ */
+public interface PersonSupervisionRecordMapper extends BaseMapper<PersonSupervisionRecord> {
+
+    IPage<PersonSupervisionRecordDto> personSupervisionRecordPage(Page page, Integer userId, Integer departLimsId, String userName);
+
+    /**
+     * 鏌ヨ鐩戠潱璁板綍璇︽儏
+     * @param id
+     * @return
+     */
+    PersonSupervisionRecordDto selectPersonSupervisionRecord(Integer id);
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonTrackRecordMapper.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonTrackRecordMapper.java
new file mode 100644
index 0000000..d631e0c
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonTrackRecordMapper.java
@@ -0,0 +1,24 @@
+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.pojo.PersonTrackRecord;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 宸ヤ綔灞ュ巻 Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-09-02 03:13:03
+ */
+public interface PersonTrackRecordMapper extends BaseMapper<PersonTrackRecord> {
+
+    IPage<PersonTrackRecord> personTrackRecordSelect(Page page, String userId, String departLimsId);
+
+    List<PersonTrackRecord> personTrackRecordExport(String userId, String departLimsId);
+
+}
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..1319c16
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonTrainingDetailedMapper.java
@@ -0,0 +1,43 @@
+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,
+                                                                    Integer state);
+
+    /**
+     * 鏍规嵁涓昏〃id鏌ヨ璇︽儏
+     * @param trainingId
+     * @return
+     */
+    List<PersonTrainingDetailedDto> selectTrainingList(@Param("trainingId") Integer trainingId);
+
+    /**
+     * 鏌ヨ璇︾粏
+     * @param id
+     * @return
+     */
+    PersonTrainingDetailedDto selectTrainingDetail(@Param("id") Integer id);
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonTrainingFileMapper.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonTrainingFileMapper.java
new file mode 100644
index 0000000..29f94cf
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonTrainingFileMapper.java
@@ -0,0 +1,9 @@
+package com.ruoyi.personnel.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.personnel.pojo.PersonTrainingFile;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface PersonTrainingFileMapper extends BaseMapper<PersonTrainingFile> {
+}
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..9563357
--- /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, Integer 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..98f92b1
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonBasicInfo.java
@@ -0,0 +1,271 @@
+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.LocalDate;
+
+/**
+ * <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("鍏ヨ亴鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8")
+    @TableField(updateStrategy = FieldStrategy.IGNORED) // 涓虹┖鍙互鏇存柊
+    private LocalDate entryTime;
+
+    @ApiModelProperty("褰撳墠鑱屽姟")
+    private String currentPosition;
+
+    @ApiModelProperty("宀椾綅")
+    private String post;
+
+    @ApiModelProperty("閮ㄩ棬缂栧彿")
+    private String departmentCode;
+    @ApiModelProperty("鑱岀О")
+    @ExcelProperty("鑱岀О")
+    private String professionalTitle;
+
+    @ApiModelProperty("鎬у埆")
+    private String sex;
+
+    @ApiModelProperty("浜哄憳鍒嗙被")
+    private String personnelClassification;
+
+    @ApiModelProperty("鍑虹敓鏃ユ湡")
+    @TableField(updateStrategy = FieldStrategy.IGNORED) // 涓虹┖鍙互鏇存柊
+    @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8")
+    private LocalDate dateBirth;
+
+    @ApiModelProperty("韬唤璇佸彿")
+    @ExcelProperty("璇佷欢鍙风爜")
+    private String identityCard;
+
+    @ApiModelProperty("姘戞棌")
+    private String nation;
+
+    @ApiModelProperty("鏀挎不闈㈣矊")
+    private String politicalStatus;
+
+    @ApiModelProperty("鏈�楂樺鍘�")
+    @ExcelProperty("鏈�楂樺鍘�")
+    private String officialAcademicRedentials;
+
+    @ApiModelProperty("姣曚笟鏃堕棿1")
+    @ExcelProperty("姣曚笟鏃堕棿")
+    @TableField(updateStrategy = FieldStrategy.IGNORED) // 涓虹┖鍙互鏇存柊
+    @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8")
+    private LocalDate graduationTime1;
+
+    @ApiModelProperty("姣曚笟闄㈡牎1")
+    @ExcelProperty("姣曚笟闄㈡牎")
+    private String graduatedInstitutions1;
+
+    @ApiModelProperty("涓撲笟1")
+    @ExcelProperty("鎵�瀛︿笓涓�")
+    private String major1;
+
+    @ApiModelProperty("姣曚笟鏃堕棿2")
+    @TableField(updateStrategy = FieldStrategy.IGNORED) // 涓虹┖鍙互鏇存柊
+    @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8")
+    private LocalDate graduationTime2;
+
+    @ApiModelProperty("姣曚笟闄㈡牎2")
+    private String graduatedInstitutions2;
+
+    @ApiModelProperty("涓撲笟2")
+    private String major2;
+
+    @ApiModelProperty("鎵嬫満鍙�")
+    private String telephone;
+
+    @ApiModelProperty("璁″垝瀹炰範缁撴潫")
+    @TableField(updateStrategy = FieldStrategy.IGNORED) // 涓虹┖鍙互鏇存柊
+    @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8")
+    private LocalDate endPlannedInternship;
+
+    @ApiModelProperty("瀹為檯瀹炰範缁撴潫")
+    @TableField(updateStrategy = FieldStrategy.IGNORED) // 涓虹┖鍙互鏇存柊
+    @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8")
+    private LocalDate endPracticalPractice;
+
+    @ApiModelProperty("绂昏亴鏃ユ湡")
+    @TableField(updateStrategy = FieldStrategy.IGNORED) // 涓虹┖鍙互鏇存柊
+    @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8")
+    private LocalDate dateDeparture;
+
+    @ApiModelProperty("妗岄潰鍥剧墖")
+    private String desktopPicture;
+
+    @ApiModelProperty("闄勪欢璧勬枡")
+    private String attachmentInformation;
+
+    @ApiModelProperty("澶囨敞")
+    private String remarks;
+
+    @ApiModelProperty("鐢ㄦ埛琛紙user锛塱d")
+    private Integer userId;
+//
+    @ApiModelProperty("宸ュ彿")
+    private String jobNumber;
+
+    @ApiModelProperty("鍛樺伐瀛愮紪鍙�")
+    private String subordinateNumber;
+
+    @ApiModelProperty("鍏徃鍚嶇О")
+    private String corporateName;
+
+    @ApiModelProperty("宀椾綅绫诲埆")
+    private String postType;
+
+    @ApiModelProperty("宀椾綅缂栧彿")
+    private String postCode;
+
+    @ApiModelProperty("宀椾綅鍚嶇О")
+    private String postName;
+
+    @ApiModelProperty("鍏ラ泦鍥㈡椂闂�")
+    @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8")
+    @TableField(updateStrategy = FieldStrategy.IGNORED) // 涓虹┖鍙互鏇存柊
+    @ExcelProperty("鍏ラ泦鍥㈡椂闂�")
+    private LocalDate groupTime;
+
+    @ApiModelProperty("鍏ュ崟浣嶆椂闂�")
+    @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8")
+    @TableField(updateStrategy = FieldStrategy.IGNORED) // 涓虹┖鍙互鏇存柊
+    @ExcelProperty("鍏ュ崟浣嶆椂闂�")
+    private LocalDate unitTime;
+
+    @ApiModelProperty("骞撮緞")
+    private Integer personBasicInfoAge;
+
+
+    @ApiModelProperty("鐩存帴涓婄骇")
+    private String reportingTo;
+
+
+    @ApiModelProperty("鍔冲姩鍏崇郴")
+    private String laborRelations;
+
+    @ApiModelProperty("璇曠敤寮�濮嬫椂闂�")
+    @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8")
+    @TableField(updateStrategy = FieldStrategy.IGNORED) // 涓虹┖鍙互鏇存柊
+    private LocalDate trialStartTime;
+
+    @ApiModelProperty("璇曠敤缁撴潫鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8")
+    @TableField(updateStrategy = FieldStrategy.IGNORED) // 涓虹┖鍙互鏇存柊
+    private LocalDate trialEndTime;
+
+    @ApiModelProperty("绫嶈疮")
+    @ExcelProperty("绫嶈疮")
+    private String nativePlace;
+
+    @ApiModelProperty("璇佷欢绫诲瀷")
+    private String idType;
+
+    @ApiModelProperty("璇佷欢鏈夋晥鏈�")
+    @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8")
+    @TableField(updateStrategy = FieldStrategy.IGNORED) // 涓虹┖鍙互鏇存柊
+    private LocalDate validityPeriod;
+
+    @ApiModelProperty("濠氬Щ鐘跺喌")
+    private String maritalStatus;
+
+    @ApiModelProperty("璇佷欢鍦板潃")
+    @ExcelProperty("璇佷欢鍦板潃")
+    private String idAddress;
+
+    @ApiModelProperty("璇佷欢璇︾粏鍦板潃")
+    private String idDetailAddress;
+
+    @ApiModelProperty("鐜板眳鍦板潃")
+    private String currentAddress;
+
+    @ApiModelProperty("鐜板眳璇︾粏鍦板潃")
+    private String currentDetailAddress;
+
+    @ApiModelProperty("閫佽揪鍦板潃")
+    private String serviceAddress;
+
+    @ApiModelProperty("閫佽揪璇︾粏鍦板潃")
+    private String serviceDetailAddress;
+
+    @ApiModelProperty("鏄惁閫�浼嶅啗浜�")
+    private String retiredSoldiers;
+
+    @ApiModelProperty("鍏ュ厷/鍥㈡椂闂�")
+    @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8")
+    @TableField(updateStrategy = FieldStrategy.IGNORED) // 涓虹┖鍙互鏇存柊
+    private LocalDate dumplingTime;
+
+    @ApiModelProperty("鐭彿")
+    private String cornet;
+
+    @ApiModelProperty("鍔炲叕鐢佃瘽")
+    private String officePhone;
+
+    @ApiModelProperty("璁$畻鏈虹瓑绾�")
+    private String ncre;
+
+    @ApiModelProperty("鏈�楂樺浣�")
+    @ExcelProperty("鏈�楂樺浣�")
+    private String highestDegree;
+
+    @ApiModelProperty("鏄惁鍏ㄦ棩鍒�")
+    private Integer fullTime;
+
+    @ApiModelProperty("鏄惁灞炰簬涓ぉ")
+    private Integer enroll;
+
+    @ApiModelProperty("XX灞婂ぇ瀛︾敓")
+    private String collegeStudents;
+
+    @ApiModelProperty("绱ф�ヨ仈绯讳汉")
+    @ExcelProperty("绱ф�ヨ仈绯讳汉")
+    private String emergencyContact;
+
+    @ApiModelProperty("绱ф�ヨ仈绯讳汉鐢佃瘽")
+    @ExcelProperty("绱ф�ヨ仈绯讳汉鐢佃瘽")
+    private String emergencyContactPhone;
+
+
+    @ApiModelProperty("鍏徃閭")
+    private String companyEmail;
+
+    @ApiModelProperty("鏈�鍚庢洿鏂版椂闂�")
+    @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDate lastUpdateTime;
+
+    @ApiModelProperty("璇曢獙瀹�")
+    private String sonLaboratory;
+
+
+
+}
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..89790fb
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonPersonnelCapacity.java
@@ -0,0 +1,122 @@
+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("1 鎻愪氦id 鎿嶄綔浜�")
+    private Integer submitOperatingPersonnelId;
+
+    @ApiModelProperty("1 鎻愪氦 鏃ユ湡")
+    private LocalDateTime submitDate;
+
+    @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;
+
+    @ApiModelProperty(value = "鑱岀О")
+    private String technicalPost;
+}
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/PersonSupervisePlan.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonSupervisePlan.java
new file mode 100644
index 0000000..b00cdce
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonSupervisePlan.java
@@ -0,0 +1,66 @@
+package com.ruoyi.personnel.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 鐩戠潱璁″垝 - 鐖�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-10-09 04:14:45
+ */
+@Data
+@TableName("cnas_person_supervise_plan")
+@ApiModel(value = "PersonSupervisePlan瀵硅薄", description = "鐩戠潱璁″垝 - 鐖�")
+public class PersonSupervisePlan implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("涓婚敭id")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty("鏂囦欢鍚嶇О")
+    private String fileName;
+
+    @ApiModelProperty("缂栧埗浜篿d")
+    private Integer organizationPersonId;
+
+    @ApiModelProperty("缂栧埗鏃ユ湡")
+    private LocalDateTime organizationDate;
+
+    @ApiModelProperty("鎵瑰噯浜篿d")
+    private Integer approvalId;
+
+    @ApiModelProperty("鎵瑰噯浜烘棩鏈�")
+    private LocalDateTime approvalDate;
+
+    @ApiModelProperty("鎵瑰噯鐘舵��(1閫氳繃/0涓嶉�氳繃)")
+    private Integer approvalStatus;
+
+    @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 = "鏇存柊鏃堕棿", hidden = true)
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+
+    @ApiModelProperty(value = "鏇存柊浜篿d",hidden = true)
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    @ApiModelProperty("閮ㄩ棬id")
+    private Integer departId;
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonSupervisePlanDetails.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonSupervisePlanDetails.java
new file mode 100644
index 0000000..94bc93b
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonSupervisePlanDetails.java
@@ -0,0 +1,73 @@
+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.LocalDate;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 鐩戠潱璁″垝 - 瀛�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-10-09 04:17:02
+ */
+@Getter
+@Setter
+@TableName("cnas_person_supervise_plan_details")
+@ApiModel(value = "PersonSupervisePlanDetails瀵硅薄", description = "鐩戠潱璁″垝 - 瀛�")
+public class PersonSupervisePlanDetails implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("涓婚敭id")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8")
+    @ApiModelProperty("鐩戠潱鏃ユ湡")
+    private LocalDate superviseDate;
+
+    @ApiModelProperty("鐩戠潱鐩殑")
+    private String superviseDes;
+
+    @ApiModelProperty("琚洃鐫d汉鍛�")
+    private String supervisePerson;
+
+    @ApiModelProperty("澶囨敞")
+    private String remarks;
+
+    @ApiModelProperty("鐩戠潱椤圭洰")
+    private String superviseProject;
+
+    @ApiModelProperty("鐩戠潱鍘熷洜")
+    private String superviseReason;
+
+    @ApiModelProperty(value = "鍒涘缓鏃堕棿", hidden = true)
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @ApiModelProperty(value = "鍒涘缓浜�", hidden = true)
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @ApiModelProperty("鐩戠潱璁″垝 - 鐖� id")
+    private Integer planId;
+
+    //搴忓彿, 瀵煎嚭浣跨敤
+    @TableField(select = false, exist = false)
+    private Integer index;
+
+    // 瀵煎嚭浣跨敤
+    @TableField(select = false, exist = false)
+    @ApiModelProperty("鐩戠潱鏃ユ湡")
+    private String superviseDateString;
+
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonSupervisionControlSheet.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonSupervisionControlSheet.java
new file mode 100644
index 0000000..c8ec2fc
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonSupervisionControlSheet.java
@@ -0,0 +1,113 @@
+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-10 05:18:57
+ */
+@Getter
+@Setter
+@TableName("cnas_person_supervision_control_sheet")
+@ApiModel(value = "PersonSupervisionControlSheet瀵硅薄", description = "鐩戠潱璁板綍 - 鎺у埗鍗�")
+public class PersonSupervisionControlSheet implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("涓婚敭id")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty("1鍙戠敓閮ㄩ棬id")
+    private Integer occurrenceDepartment;
+
+    @ApiModelProperty("1閮ㄩ棬璐熻矗浜篿d")
+    private Integer departmentHeadId;
+
+    @ApiModelProperty("1涓嶇鍚堝伐浣滃彂鐜伴�斿緞瀛楀吀id")
+    private String discoveryApproach;
+
+    @ApiModelProperty("1涓嶇鍚堝伐浣滅殑璇︾粏璁板綍")
+    private String notConformDetails;
+
+    @ApiModelProperty("1涓嶇鍚堢殑渚濇嵁鍙婃潯娆惧彿")
+    private String nonConformityClause;
+
+    @ApiModelProperty("1鍙戠幇閮ㄩ棬 璐熻矗浜篿d")
+    private Integer discovererId;
+
+    @ApiModelProperty("1鍙戠幇閮ㄩ棬 - 鏃ユ湡")
+    private LocalDateTime discovererDate;
+
+    @ApiModelProperty("2琚洃鐫d汉id")
+    private Integer supervisedPersonId;
+
+    @ApiModelProperty("2琚洃鐫d汉 - 鏃ユ湡")
+    private String supervisedPersonDate;
+
+    @ApiModelProperty("3娑堥櫎涓嶇鍚堝伐浣滄墍閲囧彇鐨勬帾鏂�")
+    private String treatmentMeasures;
+
+
+    @ApiModelProperty("3璐d换閮ㄩ棬")
+    private Integer responsibleDepartmentId;
+
+    @ApiModelProperty("3璐d换閮ㄩ棬 璐熻矗浜篿d")
+    private Integer responsibleDepartmentPersonId;
+
+    @ApiModelProperty("3璐d换閮ㄩ棬 鏃ユ湡")
+    private LocalDateTime responsibleDepartmentDate;
+
+    @ApiModelProperty("4鏄惁闇�瑕侀噰鍙栫籂姝f帾鏂�")
+    private Integer correctiveMeasure;
+
+    @ApiModelProperty("4绾犳鎺柦澶勭悊鍗曡窡韪�")
+    private Integer correctiveMeasureFollowTracks;
+
+    @ApiModelProperty("4绾犳鎺柦 鎶�鏈礋璐d汉id")
+    private Integer correctiveMeasurePersonId;
+
+    @ApiModelProperty("4绾犳鎺柦 鏃ユ湡")
+    private LocalDateTime correctiveMeasureDate;
+
+    @ApiModelProperty("5鏄惁閫氱煡瀹㈡埛(1锛氭槸锛�2锛氬惁)")
+    private Integer whetherInformCustomer;
+
+    @ApiModelProperty("5鏄惁鎭㈠宸ヤ綔(1锛氭槸锛�2锛氬惁)")
+    private Integer whetherResumeWork;
+
+    @ApiModelProperty("5璐ㄩ噺璐熻矗浜篿d")
+    private Integer qualitySupervisorId;
+
+    @ApiModelProperty("5璐ㄩ噺璐熻矗浜烘棩鏈�")
+    private LocalDateTime qualitySupervisorDate;
+
+    @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 LocalDate createTime;
+
+    @ApiModelProperty("褰撳墠璐熻矗浜�")
+    private String currentResponsible;
+
+    @ApiModelProperty("鐩戠潱璁板綍id")
+    private Integer supervisionRecordId;
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonSupervisionProcessingSheet.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonSupervisionProcessingSheet.java
new file mode 100644
index 0000000..78ea814
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonSupervisionProcessingSheet.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.LocalDateTime;
+
+/**
+ * <p>
+ * 鐩戠潱璁板綍 - 澶勭悊鍗�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-10-10 05:35:58
+ */
+@Getter
+@Setter
+@TableName("cnas_person_supervision_processing_sheet")
+@ApiModel(value = "PersonSupervisionProcessingSheet瀵硅薄", description = "鐩戠潱璁板綍 - 澶勭悊鍗�")
+public class PersonSupervisionProcessingSheet implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("涓婚敭id")
+    @TableId(value = "processing_id", type = IdType.AUTO)
+    private Integer processingId;
+
+    @ApiModelProperty("1 涓嶇鍚堟垨鍋忕浜嬪疄鐨勬弿杩�")
+    private String descriptionNonconformity;
+
+    @ApiModelProperty("1 鎻愬嚭閮ㄩ棬")
+    private String proposingDepartment;
+
+    @ApiModelProperty("1 鎻愬嚭閮ㄩ棬 浜哄憳 id")
+    private Integer proposingDepartmentPersonId;
+
+    @ApiModelProperty("1 鎻愬嚭閮ㄩ棬 鏃ユ湡")
+    private LocalDateTime proposingDepartmentDate;
+
+    @ApiModelProperty("2 鍘熷洜鍒嗘瀽")
+    private String causeAnalysis;
+
+    @ApiModelProperty("2 鍘熷洜鍒嗘瀽 閮ㄩ棬")
+    private Integer causeAnalysisId;
+
+    @ApiModelProperty("2 鍘熷洜鍒嗘瀽 閮ㄩ棬 浜哄憳 id")
+    private Integer causeAnalysisPersonId;
+
+    @ApiModelProperty("2 鍘熷洜鍒嗘瀽 鏃ユ湡")
+    private LocalDateTime causeAnalysisDate;
+
+    @ApiModelProperty("3 绾犳鎺柦")
+    private String correctiveMeasure;
+
+    @ApiModelProperty("3 绾犳鎺柦 鎻愬嚭瑕佹眰閮ㄩ棬纭")
+    private String requestDepartmentConfirmation;
+
+    @ApiModelProperty("3 绾犳鎺柦 閮ㄩ棬")
+    private Integer correctiveDepartId;
+
+    @ApiModelProperty("3 绾犳鎺柦 浜哄憳id")
+    private Integer correctiveActionId;
+
+    @ApiModelProperty("3 绾犳鎺柦 鏃ユ湡")
+    private LocalDateTime correctiveActionDate;
+
+    @ApiModelProperty("4 瀹炴柦楠岃瘉缁撴灉")
+    private String implementationVerificationResults;
+
+    @ApiModelProperty("4 楠岃瘉閮ㄩ棬")
+    private String verificationDepartment;
+
+    @ApiModelProperty("4 楠岃瘉閮ㄩ棬 浜哄憳id")
+    private Integer verificationDepartmentPersonId;
+
+    @ApiModelProperty("4 楠岃瘉閮ㄩ棬 鏃ユ湡")
+    private LocalDateTime verificationDepartmentDate;
+
+    @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;
+
+    @ApiModelProperty("鐩戠潱璁板綍id")
+    private Integer supervisionRecordId;
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonSupervisionRecord.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonSupervisionRecord.java
new file mode 100644
index 0000000..2afe658
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonSupervisionRecord.java
@@ -0,0 +1,107 @@
+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-10 04:16:49
+ */
+@Getter
+@Setter
+@TableName("cnas_person_supervision_record")
+@ApiModel(value = "PersonSupervisionRecord瀵硅薄", description = "鐩戠潱璁板綍")
+public class PersonSupervisionRecord implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("涓婚敭id")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty("妫�娴嬩汉鍛榠d")
+    private Integer testerId;
+
+    @ApiModelProperty("鐩戠潱鍛榠d")
+    private Integer supervisorId;
+
+    @ApiModelProperty("妫�娴嬮」鐩�")
+    private String testItem;
+
+    @ApiModelProperty("鏍峰搧缂栧彿")
+    private String sampleNumber;
+
+    @ApiModelProperty("妫�娴嬫柟娉�")
+    private String testMethod;
+
+    @ApiModelProperty("妫�娴嬭褰�")
+    private String testingRecords;
+
+    @ApiModelProperty("妫�娴嬫棩鏈�")
+    private LocalDate detectionDate;
+
+    @ApiModelProperty("浜哄憳id")
+    private String personnel;
+
+    @ApiModelProperty("浠櫒璁惧")
+    private String instrumentEquipment;
+
+    @ApiModelProperty("宸ヤ綔鐜")
+    private String workingEnvironment;
+
+    @ApiModelProperty("鏍峰搧閲囬泦")
+    private String sampleCollection;
+
+    @ApiModelProperty("鏍峰搧鐨勫噯澶�")
+    private String samplePreparation;
+
+    @ApiModelProperty("妫�娴嬫姤鍛�")
+    private String testReport;
+
+    @ApiModelProperty("鐩戠潱鎯呭喌璇勪环")
+    private String evaluationSupervisionSituation;
+
+    @ApiModelProperty("涓嶇鍚堝鐞嗘剰瑙�")
+    private String doNotMeetTheHandlingOpinions;
+
+    @ApiModelProperty("鎶�鏈礋璐d汉id")
+    private Integer technicalDirector;
+
+    @ApiModelProperty("鎶�鏈礋璐d汉瀹℃壒鏃ユ湡")
+    private LocalDateTime technicalDirectorDate;
+
+    @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)
+    private Integer createUser;
+
+    @ApiModelProperty(value = "鏇存柊浜篿d", hidden = true)
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    @ApiModelProperty("褰撳墠璐熻矗浜�")
+    private String currentResponsible;
+
+    @ApiModelProperty("褰撳墠鐘舵��")
+    private String currentState;
+
+    private Integer departLimsId;
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonTrackRecord.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonTrackRecord.java
new file mode 100644
index 0000000..7d3f8ad
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonTrackRecord.java
@@ -0,0 +1,83 @@
+package com.ruoyi.personnel.pojo;
+
+import com.alibaba.excel.annotation.ExcelIgnore;
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ColumnWidth;
+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-02 03:13:03
+ */
+@Getter
+@Setter
+@TableName("cnas_person_track_record")
+@ApiModel(value = "PersonTrackRecord瀵硅薄", description = "宸ヤ綔灞ュ巻")
+@ExcelIgnoreUnannotated
+public class PersonTrackRecord implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ExcelIgnore
+    @ApiModelProperty("涓婚敭id")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @ColumnWidth(value = 18)
+    @ExcelProperty(value = "璧峰鏃堕棿")
+    @ApiModelProperty("璧峰鏃堕棿")
+    private LocalDateTime startTime;
+
+    @ExcelProperty(value = "缁撴潫鏃堕棿")
+    @ColumnWidth(value = 18)
+    @ApiModelProperty("缁撴潫鏃堕棿")
+    private LocalDateTime endTime;
+
+    @ExcelProperty(value = "宸ヤ綔鍗曚綅")
+    @ApiModelProperty("宸ヤ綔鍗曚綅")
+    private String placeWork;
+
+    @ExcelProperty(value = "閮ㄩ棬")
+    @ApiModelProperty("閮ㄩ棬")
+    private String department;
+
+    @ExcelProperty(value = "鑱屽姟")
+    @ApiModelProperty("鑱屽姟")
+    private String post;
+
+    @ExcelProperty(value = "澶囨敞")
+    @ApiModelProperty("澶囨敞")
+    private String remarks;
+
+    @ColumnWidth(value = 18)
+    @ExcelProperty(value = "鍒涘缓鏃堕棿")
+    @ApiModelProperty("鍒涘缓鏃堕棿")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @ApiModelProperty("鍒涘缓浜�")
+    @TableField(fill = FieldFill.INSERT)
+    private String createUser;
+
+    @ApiModelProperty("鐢ㄦ埛琛紙user锛塱d")
+    private Integer userId;
+
+    private String fileName;
+
+    @TableField(exist = false,select = false)
+    @ExcelProperty(value = "鐢ㄦ埛鍚嶇О")
+    @ApiModelProperty("鐢ㄦ埛鍚嶇О")
+    private String name;
+}
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..e8df335
--- /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("缂栧埗浜篿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;
+
+    @ApiModelProperty("閮ㄩ棬id")
+    private Integer departId;
+}
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..0156f38
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonTrainingDetailed.java
@@ -0,0 +1,124 @@
+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 courseCode;
+
+    @ApiModelProperty("鍩硅鐩爣")
+    private String trainingObjectives;
+
+    @ApiModelProperty("鍩硅鍐呭")
+    private String trainingContent;
+
+    @ApiModelProperty("鍩硅鏂瑰紡")
+    private String trainingMode;
+
+    // 鏈紑濮� ==> 杩涜涓� ==> 宸茬粨鏉� ==> 宸插畬鎴�
+    @ApiModelProperty("鐘舵��(1锛氬凡瀹屾垚锛�2锛氳繘琛屼腑锛�3: 鏈紑濮嬶紱4锛氬凡缁撴潫)")
+    private Integer state;
+
+    @ApiModelProperty("鍙傚姞瀵硅薄")
+    private String participants;
+
+    @ApiModelProperty("涓惧姙閮ㄩ棬")
+    private Integer holdingDepartment;
+
+    @ApiModelProperty("鍩硅鍦扮偣")
+    private String placeTraining;
+
+    @ApiModelProperty("鍩硅璁插笀_id")
+    private String trainingLecturerId;
+
+    @ApiModelProperty("鍩硅鏃ユ湡")
+    private String trainingDate;
+
+    @ApiModelProperty("鍏蜂綋鏃ユ湡")
+    private String trainingDateTwo;
+
+    @ApiModelProperty("寮�濮嬫椂闂�")
+    private String openingTime;
+
+    @ApiModelProperty("缁撴潫鏃堕棿")
+    private String endTime;
+
+    @ApiModelProperty("璇鹃瀛﹀垎")
+    private String projectCredits;
+
+    @ApiModelProperty("璇炬椂")
+    private Double 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;
+
+    @ApiModelProperty("璺緞")
+    private String url;
+
+    @ApiModelProperty("鏂囦欢鍚嶇О")
+    private String imgName;
+
+    @ApiModelProperty("鍩硅鎽樿")
+    private String trainingAbstract;
+
+    @TableField(exist = false)
+    private String organizingDepartment;
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonTrainingFile.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonTrainingFile.java
new file mode 100644
index 0000000..c8a2cab
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonTrainingFile.java
@@ -0,0 +1,41 @@
+package com.ruoyi.personnel.pojo;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Data
+@TableName("cnas_person_training_file")
+public class PersonTrainingFile {
+
+    @TableId(type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty("骞村害璁″垝鏄庣粏琛╥d")
+    private Integer detailId;
+
+    @ApiModelProperty("鏂囦欢璺緞")
+    private String fileUrl;
+
+    @ApiModelProperty("鏂囦欢鍚嶇О")
+    private String fileName;
+
+    @ApiModelProperty("鍒涘缓浜�")
+    private Integer createUser;
+
+    @ApiModelProperty("鍒涘缓鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
+    private LocalDateTime createTime;
+
+    @ApiModelProperty("鏋氫妇琛ㄥ悕")
+    private String enumAttachmentType;
+
+    @TableField(exist = false)
+    private String mime;
+}
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/schedule/PersonSchedule.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/schedule/PersonSchedule.java
new file mode 100644
index 0000000..b3e66e9
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/schedule/PersonSchedule.java
@@ -0,0 +1,54 @@
+package com.ruoyi.personnel.schedule;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.ruoyi.personnel.pojo.PersonTrainingDetailed;
+import com.ruoyi.personnel.service.PersonTrainingDetailedService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.time.LocalDate;
+import java.time.ZoneId;
+import java.util.Date;
+import java.util.List;
+
+@Component
+public class PersonSchedule {
+
+    @Resource
+    private PersonTrainingDetailedService personTrainingDetailedService;
+
+    /**
+     * 褰撳墠璇剧▼灏忎簬褰撳墠鏃堕棿锛屽苟涓旂姸鎬佷负2锛氳繘琛屼腑锛�3: 鏈紑濮嬫洿鏂扮姸鎬佷负4锛氬凡缁撴潫
+     */
+     @Scheduled(cron = "0 0/15 * * * ?") //15鍒嗛挓鎵ц涓�娆�
+	//@Scheduled(cron = "0/10 * * * * ?") //姣�10绉掓墽琛屼竴娆�
+    public void testScheduleTask() {
+        // 鑾峰彇褰撳ぉ鐨勬墍鏈夊煿璁绋�
+        Date date = new Date();
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+        SimpleDateFormat sdfWithTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        String newDate = sdf.format(date);
+        List<PersonTrainingDetailed> list = personTrainingDetailedService.list(Wrappers.<PersonTrainingDetailed>lambdaQuery()
+                .eq(PersonTrainingDetailed::getState, 2)
+                .or().eq(PersonTrainingDetailed::getState, 3)
+                .le(PersonTrainingDetailed::getTrainingDateTwo, newDate));
+        list.forEach(i -> {
+            LocalDate parse = LocalDate.parse(i.getTrainingDateTwo());
+            Date date1 = Date.from(parse.atStartOfDay(ZoneId.systemDefault()).toInstant());
+            String trainingDate = sdf.format(date1);
+            String endTime = trainingDate + " " + i.getEndTime();
+            try {
+                Date endNewTime = sdfWithTime.parse(endTime);
+                // 鏃ユ湡瓒呭嚭
+                if (endNewTime.before(date)) {
+                    i.setState(4);
+                    personTrainingDetailedService.updateById(i);
+                }
+            } catch (ParseException e) {}
+        });
+    }
+}
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/FileGeneralService.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/FileGeneralService.java
new file mode 100644
index 0000000..0be0c42
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/FileGeneralService.java
@@ -0,0 +1,19 @@
+package com.ruoyi.personnel.service;
+
+
+import com.ruoyi.personnel.pojo.PersonTrainingFile;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+
+public interface FileGeneralService {
+
+    void fileUpload(MultipartFile file, String suffix, Integer id,Integer type);
+
+    List<PersonTrainingFile> selectFile(Integer id,Integer type);
+
+    void delFile(Integer id);
+
+    void fileDownLoad(Integer id, HttpServletResponse response);
+}
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..482aa69
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonBasicInfoService.java
@@ -0,0 +1,50 @@
+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.dto.DepartmentDto;
+import com.ruoyi.common.core.dto.UserPageDto;
+import com.ruoyi.personnel.dto.PersonBasicInfoDto;
+import com.ruoyi.personnel.pojo.PersonBasicInfo;
+import com.ruoyi.personnel.pojo.PersonTrainingFile;
+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);
+
+    void saveDeviceCalibrationFile(MultipartFile file, String suffix, Integer id);
+
+    List<PersonTrainingFile> getDeviceCalibrationFile(Integer id);
+
+    void delDeviceCalibrationFile(Integer id);
+
+    void downLoadDeviceCalibrationFile(Integer id ,HttpServletResponse response);
+
+    void getEmployees(Integer departId);
+
+    void getEmployee(Integer userId);
+}
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..1a7890e
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonPersonnelCapacityService.java
@@ -0,0 +1,37 @@
+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);
+
+
+    /**
+     * 浜哄憳鑳藉姏纭
+     * @param id
+     * @return
+     */
+    boolean confirmPersonnelCapacity(Integer id);
+}
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/PersonSupervisePlanDetailsService.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonSupervisePlanDetailsService.java
new file mode 100644
index 0000000..239243a
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonSupervisePlanDetailsService.java
@@ -0,0 +1,26 @@
+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.PersonSupervisePlanDetailsDto;
+import com.ruoyi.personnel.excel.PersonSupervisePlanDetailsUpload;
+import com.ruoyi.personnel.pojo.PersonSupervisePlanDetails;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 鐩戠潱璁″垝 - 瀛� 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-10-09 04:17:02
+ */
+public interface PersonSupervisePlanDetailsService extends IService<PersonSupervisePlanDetails> {
+
+    IPage<PersonSupervisePlanDetailsDto> yearPlanDetailPage(Page page,
+                                                            String date, String project, Integer planId);
+
+    void importExcel(List<PersonSupervisePlanDetailsUpload> list, Integer planId);
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonSupervisePlanService.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonSupervisePlanService.java
new file mode 100644
index 0000000..098cd8d
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonSupervisePlanService.java
@@ -0,0 +1,32 @@
+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.PersonSupervisePlanDto;
+import com.ruoyi.personnel.pojo.PersonSupervisePlan;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * <p>
+ * 鐩戠潱璁″垝 - 鐖� 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-10-09 04:14:45
+ */
+public interface PersonSupervisePlanService extends IService<PersonSupervisePlan> {
+
+    IPage<PersonSupervisePlanDto> yearPlanDtoIPage(Page page, String organizationPerson,Integer departId);
+
+    void yearPlanDetailImport(MultipartFile file,String suffix);
+
+    /**
+     * 瀵煎嚭浜哄憳鐩戠潱璁″垝
+     * @param id
+     * @param response
+     */
+    void exportSuperVisePlan(Integer id, HttpServletResponse response);
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonSupervisionControlSheetService.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonSupervisionControlSheetService.java
new file mode 100644
index 0000000..5f00710
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonSupervisionControlSheetService.java
@@ -0,0 +1,24 @@
+package com.ruoyi.personnel.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.personnel.pojo.PersonSupervisionControlSheet;
+
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * <p>
+ * 鐩戠潱璁板綍 - 鎺у埗鍗� 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-10-10 05:18:57
+ */
+public interface PersonSupervisionControlSheetService extends IService<PersonSupervisionControlSheet> {
+
+    /**
+     * 瀵煎嚭浜哄憳鐩戠潱璁板綍绾犳鎺у埗鍗�
+     * @param supervisionRecordId
+     * @param response
+     */
+    void exportSupervisionControlSheet(Integer supervisionRecordId, HttpServletResponse response);
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonSupervisionProcessingSheetService.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonSupervisionProcessingSheetService.java
new file mode 100644
index 0000000..d5fb023
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonSupervisionProcessingSheetService.java
@@ -0,0 +1,24 @@
+package com.ruoyi.personnel.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.personnel.pojo.PersonSupervisionProcessingSheet;
+
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * <p>
+ * 鐩戠潱璁板綍 - 澶勭悊鍗� 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-10-10 05:35:58
+ */
+public interface PersonSupervisionProcessingSheetService extends IService<PersonSupervisionProcessingSheet> {
+
+    /**
+     * 瀵煎嚭浜哄憳鐩戠潱璁板綍绾犳澶勭悊鍗�
+     * @param supervisionRecordId
+     * @param response
+     */
+    void exportSupervisionProcessingSheet(Integer supervisionRecordId, HttpServletResponse response);
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonSupervisionRecordService.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonSupervisionRecordService.java
new file mode 100644
index 0000000..23cf464
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonSupervisionRecordService.java
@@ -0,0 +1,33 @@
+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.PersonSupervisionRecordDto;
+import com.ruoyi.personnel.pojo.PersonSupervisionRecord;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+
+/**
+ * <p>
+ * 鐩戠潱璁板綍 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-10-10 04:16:49
+ */
+public interface PersonSupervisionRecordService extends IService<PersonSupervisionRecord> {
+
+    void deletePersonSupervisionRecord(List<Integer> ids);
+
+    IPage<PersonSupervisionRecordDto> personSupervisionRecordPage(Page page,
+                                                                  Integer userId, String userName, Integer departLimsId);
+
+    /**
+     * 瀵煎嚭浜哄憳鐩戠潱璁板綍
+     * @param id
+     * @param response
+     */
+    void exportPersonSupervisionRecord(Integer id, HttpServletResponse response);
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonTrackRecordService.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonTrackRecordService.java
new file mode 100644
index 0000000..3ba37b5
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonTrackRecordService.java
@@ -0,0 +1,23 @@
+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.pojo.PersonTrackRecord;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 宸ヤ綔灞ュ巻 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-09-02 03:13:03
+ */
+public interface PersonTrackRecordService extends IService<PersonTrackRecord> {
+
+    IPage<PersonTrackRecord> personTrackRecordSelect(Page page, String userId, String departmentId);
+
+    List<PersonTrackRecord> personTrackRecordExport(String userId, String departmentId);
+}
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..13d1799
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonTrainingDetailedService.java
@@ -0,0 +1,47 @@
+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.DepartmentLims;
+import com.ruoyi.personnel.dto.PersonTrainingDetailedDto;
+import com.ruoyi.personnel.excel.PersonTrainingDetailedUpload;
+import com.ruoyi.personnel.pojo.PersonTrainingDetailed;
+import com.ruoyi.personnel.pojo.PersonTrainingFile;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 鍩硅璁″垝璇︽儏 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-10-11 01:46:27
+ */
+public interface PersonTrainingDetailedService extends IService<PersonTrainingDetailed> {
+
+    Map<String,Object> fileUpload(MultipartFile file , Integer id);
+
+    List<DepartmentLims> selectDepartLims();
+
+    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,Integer departId,
+                                                                    Integer state);
+
+    List<PersonTrainingFile> getFileData(Integer detailedId);
+
+    void deleteFile(Integer id);
+
+    void fileDownLoad(Integer id, HttpServletResponse response);
+
+
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonTrainingFileService.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonTrainingFileService.java
new file mode 100644
index 0000000..9fc28a9
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonTrainingFileService.java
@@ -0,0 +1,7 @@
+package com.ruoyi.personnel.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.personnel.pojo.PersonTrainingFile;
+
+public interface PersonTrainingFileService extends IService<PersonTrainingFile> {
+}
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..10ed6f9
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonTrainingRecordService.java
@@ -0,0 +1,60 @@
+package com.ruoyi.personnel.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.personnel.dto.PersonTrainingRecordDto;
+import com.ruoyi.personnel.dto.PersonTrainingRecordListDto;
+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);
+
+    IPage<TrainingRecordPersonDetailedDto> queryPersonnelDetails(Page page, Integer userId);
+
+    void claimOfTrainingAndAssessmentRecords(Boolean claimAndClaim, Integer courseId);
+
+    /**
+     * 瀵煎嚭浜哄憳鍩硅璁板綍
+     * @param userId
+     * @param response
+     */
+    void exportTrainingRecord(Integer userId, HttpServletResponse response);
+
+    /**
+     * 鏍规嵁鐢ㄦ埛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);
+
+    void outOfFocusPreservation(PersonTrainingRecord personTrainingRecord);
+}
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..1059816
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonTrainingService.java
@@ -0,0 +1,48 @@
+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.dto.PersonTrainingUpdateDto;
+import com.ruoyi.personnel.pojo.PersonTraining;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * <p>
+ * 鍩硅璁″垝 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-10-11 01:11:49
+ */
+public interface PersonTrainingService extends IService<PersonTraining> {
+
+    IPage<PersonTrainingDto> personTrainingSelect(Page page,
+                                                  String compilerName, Integer departmentId);
+    void deleteDetail(Integer id);
+
+    void personTrainingImport(MultipartFile file);
+
+    void personTrainingDelete(Integer id);
+
+    void reviewAnnualPersonnelTraining(PersonTrainingUpdateDto personTrainingUpdateDto);
+
+    void approveAnnualPersonnelTraining(PersonTrainingUpdateDto personTrainingUpdateDto);
+
+    /**
+     * 瀵煎嚭浜哄憳鍩硅璁″垝
+     * @param id
+     * @param response
+     */
+    void exportPersonTraining(Integer id, HttpServletResponse response);
+
+    /**
+     * 瀵煎嚭浜哄憳鍩硅涓庤�冩牳璁板綍
+     * @param id
+     * @param response
+     */
+    void exportPersonTrainingRecord(Integer id, HttpServletResponse response);
+}
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/FileGeneralServiceImpl.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/FileGeneralServiceImpl.java
new file mode 100644
index 0000000..ac3304a
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/FileGeneralServiceImpl.java
@@ -0,0 +1,162 @@
+package com.ruoyi.personnel.service.impl;
+
+import cn.hutool.core.lang.UUID;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.personnel.enumeration.AttachmentType;
+import com.ruoyi.personnel.mapper.PersonTrainingFileMapper;
+import com.ruoyi.personnel.pojo.PersonTrainingFile;
+import com.ruoyi.personnel.service.FileGeneralService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServletResponse;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.time.LocalDateTime;
+import java.util.List;
+
+@Service
+
+public class FileGeneralServiceImpl implements FileGeneralService {
+
+    @Autowired
+    private PersonTrainingFileMapper fileMapper;
+
+    @Value("${wordUrl}")
+    private String wordUrl;
+
+    @Value("${file.path}")
+    private String imgUrl;
+
+    @Value("${excelUrl}")
+    private String excelUrl;
+
+    @Override
+    public void fileUpload(MultipartFile file, String suffix, Integer id,Integer type) {
+        String name = file.getOriginalFilename();
+        UUID uuid = UUID.randomUUID();
+        String fileName = uuid + name;
+        String path = "";
+        // 鏍规嵁鍚庣紑鍒ゆ柇灞炰簬浠�涔堢被鍨�
+        if(suffix.toLowerCase().contains("xls")) {
+            path = excelUrl;
+        } else if (suffix.toLowerCase().contains("doc") || suffix.toLowerCase().contains("pdf")) {
+            path = wordUrl;
+        } else {
+            path = imgUrl;
+        }
+        File file1 = new File(path);
+        if(!file1.exists()) {
+            file1.mkdir();
+        }
+        try {
+            File file2 = new File(file1, fileName);
+            file.transferTo(file2);
+            // 淇濆瓨鏁版嵁搴�
+            PersonTrainingFile personTrainingFile = new PersonTrainingFile();
+            personTrainingFile.setDetailId(id);
+            personTrainingFile.setFileUrl("/" + fileName);
+            personTrainingFile.setFileName(file.getOriginalFilename());
+            personTrainingFile.setCreateUser(SecurityUtils.getUserId().intValue());
+            personTrainingFile.setCreateTime(LocalDateTime.now());
+            personTrainingFile.setEnumAttachmentType(AttachmentType.getTypeValue(type));
+            fileMapper.insert(personTrainingFile);
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    @Override
+    public List<PersonTrainingFile> selectFile(Integer id, Integer type) {
+        List<PersonTrainingFile> personTrainingFileList = fileMapper.selectList(new LambdaQueryWrapper<PersonTrainingFile>()
+                .eq(PersonTrainingFile::getDetailId, id)
+                .eq(PersonTrainingFile::getEnumAttachmentType, AttachmentType.getTypeValue(type)));
+        if(CollectionUtils.isNotEmpty(personTrainingFileList)) {
+            for(PersonTrainingFile a : personTrainingFileList) {
+                // 璁剧疆mime
+                int i = a.getFileUrl().lastIndexOf(".");
+                String contentType = getContentType(a.getFileUrl().substring(i + 1));
+                a.setMime(contentType);
+            }
+        }
+        return personTrainingFileList;
+    }
+
+    @Override
+    public void delFile(Integer id) {
+        fileMapper.deleteById(id);
+    }
+
+    @Override
+    public void fileDownLoad(Integer id, HttpServletResponse response) {
+        PersonTrainingFile personTrainingFile = fileMapper.selectById(id);
+        // 鑾峰彇鏂囦欢鍚庣紑
+        String suffix = personTrainingFile.getFileName().substring(personTrainingFile.getFileName().lastIndexOf(".") + 1);
+        String path = "";
+        if(suffix.toLowerCase().contains("xls")) {
+            path = excelUrl;
+        } else if (suffix.toLowerCase().contains("doc") || suffix.toLowerCase().contains("pdf")) {
+            path = wordUrl;
+        } else {
+            path = imgUrl;
+        }
+        File file = new File(path + File.separator + personTrainingFile.getFileUrl());
+        if(!file.exists()) {
+            throw new RuntimeException("鏂囦欢涓嶅瓨鍦�");
+        }
+        try(FileInputStream fileInputStream = new FileInputStream(file);
+            ServletOutputStream stream = response.getOutputStream()) {
+            String contentType = getContentType(suffix);
+            response.setContentType(contentType);
+            response.setHeader("Content-disposition", "attachment;filename=" + personTrainingFile.getFileName());
+            byte[] bytes = new byte[1024];
+            int i;
+            while((i = fileInputStream.read(bytes)) != -1) {
+                stream.write(bytes, 0, i);
+                stream.flush();
+            }
+        }catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+
+
+
+
+
+
+
+    }
+    // 鏍规嵁鏂囦欢鎵╁睍鍚嶈幏鍙� MIME 绫诲瀷
+    private String getContentType(String fileExtension) {
+        switch (fileExtension) {
+            case "jpg":
+            case "jpeg":
+                return "image/jpeg";
+            case "png":
+                return "image/png";
+            case "gif":
+                return "image/gif";
+            case "pdf":
+                return "application/pdf";
+            case "doc":
+                return "application/msword";
+            case "docx":
+                return "application/vnd.openxmlformats-officedocument.wordprocessingml.document";
+            case "xls":
+                return "application/vnd.ms-excel";
+            case "xlsx":
+                return "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
+            case "ppt":
+            case "pptx":
+                return "application/vnd.ms-powerpoint";
+            default:
+                return "application/octet-stream"; // 榛樿浜岃繘鍒舵祦
+        }
+    }
+}
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..099b955
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonBasicInfoServiceImpl.java
@@ -0,0 +1,1081 @@
+package com.ruoyi.personnel.service.impl;
+
+import cn.hutool.core.lang.UUID;
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.ExcelWriter;
+import com.alibaba.excel.write.metadata.WriteSheet;
+import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
+import com.alibaba.fastjson2.JSON;
+import com.alibaba.fastjson2.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.deepoove.poi.XWPFTemplate;
+import com.deepoove.poi.config.Configure;
+import com.deepoove.poi.config.ConfigureBuilder;
+import com.deepoove.poi.data.*;
+import com.deepoove.poi.data.style.*;
+import com.ruoyi.common.core.domain.entity.DepartmentLims;
+import com.ruoyi.common.core.domain.entity.User;
+import com.ruoyi.common.core.dto.DepartmentDto;
+import com.ruoyi.common.core.dto.UserPageDto;
+import com.ruoyi.common.utils.QueryWrappers;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.framework.exception.ErrorException;
+import com.ruoyi.framework.util.HeaderToken;
+import com.ruoyi.personnel.dto.PersonBasicInfoDto;
+import com.ruoyi.personnel.mapper.*;
+import com.ruoyi.personnel.pojo.*;
+import com.ruoyi.personnel.service.PersonBasicInfoService;
+import com.ruoyi.system.mapper.DepartmentLimsMapper;
+import com.ruoyi.system.mapper.UserMapper;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.poi.openxml4j.util.ZipSecureFile;
+import org.apache.poi.xwpf.usermodel.*;
+import org.openxmlformats.schemas.wordprocessingml.x2006.main.STMerge;
+import org.springframework.beans.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.ServletOutputStream;
+import javax.servlet.http.HttpServletResponse;
+import java.io.*;
+import java.net.URLEncoder;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.Period;
+import java.time.format.DateTimeFormatter;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ *  鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-08-30 09:19:57
+ */
+
+@Service
+@Slf4j
+@Transactional(rollbackFor = Exception.class)
+public class PersonBasicInfoServiceImpl extends ServiceImpl<PersonBasicInfoMapper, PersonBasicInfo> implements PersonBasicInfoService {
+
+    @Resource
+    private DepartmentLimsMapper departmentMapper;
+
+    @Resource
+    private PersonTrainingFileMapper fileMapper;
+
+    @Resource
+    private HeaderToken headerToken;
+
+
+    @Value("${wordUrl}")
+    private String wordUrl;
+
+    @Value("${file.path}")
+    private String imgUrl;
+
+    @Value("${excelUrl}")
+    private String excelUrl;
+
+    @Resource
+    private UserMapper userMapper;
+
+
+    @Resource
+    private AnnexMapper annexMapper;
+    @Resource
+    private PersonTrackRecordMapper personTrackRecordMapper;
+
+    @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.setDepartment(personBasicInfoDto.getDepartment());
+        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 {
+            personBasicInfo.setId(one.getId());
+            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) {
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy骞碝M鏈坉d鏃�");
+        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, user.getId()));
+        //宸ヤ綔缁忓巻
+        List<PersonTrackRecord> personTrackRecordList = personTrackRecordMapper.selectList(Wrappers.<PersonTrackRecord>lambdaQuery().eq(PersonTrackRecord::getUserId, user.getId()));
+
+        List<RowRenderData> rows = new ArrayList<>();
+        //琛ㄦ牸琛屾暟
+        int hang = 10 + (Math.max(annexList.size() - 1, 0)) + (Math.max(personTrackRecordList.size()-1 , 0));
+        for (int i = 0; i < hang; i++) {
+            RowRenderData rowRenderData = new RowRenderData();
+            RowStyle rowStyle = new RowStyle();
+            rowStyle.setHeight(40);
+            rowRenderData.setRowStyle(rowStyle);
+            List<CellRenderData> cells = new ArrayList<>();
+            //琛ㄦ牸鍒楁暟
+            for (int j = 0; j < 6; j++) {
+                CellRenderData cellRenderData = new CellRenderData();
+                CellStyle cellStyle = new CellStyle();
+                cellStyle.setVertAlign(XWPFTableCell.XWPFVertAlign.CENTER);
+                cellRenderData.setCellStyle(cellStyle);
+                List<ParagraphRenderData> paragraphRenderDataList = new ArrayList<>();
+                ParagraphRenderData paragraphRenderData = new ParagraphRenderData();
+                ParagraphStyle paragraphStyle = new ParagraphStyle();
+                paragraphStyle.setAlign(ParagraphAlignment.CENTER);
+                paragraphRenderData.setParagraphStyle(paragraphStyle);
+                List<RenderData> renderData = new ArrayList<>();
+                TextRenderData textRenderData = new TextRenderData();
+                Style style = new Style();
+                style.setFontFamily("瀹嬩綋");
+                style.setColor("000000");
+                textRenderData.setStyle(style);
+                if (i==0) {
+                    //绗竴琛�
+                    if (j==0) {
+                        //绗竴鍒�
+                        textRenderData.setText("濮撳悕@Name");
+                        renderData.add(textRenderData);
+                        paragraphRenderData.setContents(renderData);
+                        paragraphRenderDataList.add(paragraphRenderData);
+                        cellRenderData.setParagraphs(paragraphRenderDataList);
+                        cells.add(cellRenderData);
+                    }
+                    else if (j==1) {
+                        //绗簩鍒�
+                        textRenderData.setText(user.getName());
+                        renderData.add(textRenderData);
+                        paragraphRenderData.setContents(renderData);
+                        paragraphRenderDataList.add(paragraphRenderData);
+                        cellRenderData.setParagraphs(paragraphRenderDataList);
+                        cells.add(cellRenderData);
+                    }
+                    else if (j==2 || j==3) {
+                        textRenderData.setText("鎬у埆@Gender 鈭�1");
+                        renderData.add(textRenderData);
+                        paragraphRenderData.setContents(renderData);
+                        paragraphRenderDataList.add(paragraphRenderData);
+                        cellRenderData.setParagraphs(paragraphRenderDataList);
+                        cells.add(cellRenderData);
+                    }
+                    else {
+                        textRenderData.setText((ObjectUtils.isNotEmpty(personBasicInfo.getSex())?personBasicInfo.getSex():" ")+"鈭�2");
+                        renderData.add(textRenderData);
+                        paragraphRenderData.setContents(renderData);
+                        paragraphRenderDataList.add(paragraphRenderData);
+                        cellRenderData.setParagraphs(paragraphRenderDataList);
+                        cells.add(cellRenderData);
+                    }
+                }
+                else if (i==1) {
+                    //绗簩琛�
+                    if (j==0) {
+                        //绗竴鍒�
+                        textRenderData.setText("骞撮緞@Age");
+                        renderData.add(textRenderData);
+                        paragraphRenderData.setContents(renderData);
+                        paragraphRenderDataList.add(paragraphRenderData);
+                        cellRenderData.setParagraphs(paragraphRenderDataList);
+                        cells.add(cellRenderData);
+                    }
+                    else if (j==1) {
+                        //绗簩鍒�
+                        textRenderData.setText(ObjectUtils.isNotEmpty(user.getAge())?user.getAge()+"":" ");
+                        renderData.add(textRenderData);
+                        paragraphRenderData.setContents(renderData);
+                        paragraphRenderDataList.add(paragraphRenderData);
+                        cellRenderData.setParagraphs(paragraphRenderDataList);
+                        cells.add(cellRenderData);
+                    }
+                    else if (j==2 || j==3) {
+                        textRenderData.setText("宸ヤ綔鏃堕棿@Working time 鈭�3");
+                        renderData.add(textRenderData);
+                        paragraphRenderData.setContents(renderData);
+                        paragraphRenderDataList.add(paragraphRenderData);
+                        cellRenderData.setParagraphs(paragraphRenderDataList);
+                        cells.add(cellRenderData);
+                    }
+                    else {
+                        textRenderData.setText((ObjectUtils.isNotEmpty(personBasicInfo.getEntryTime())?personBasicInfo.getEntryTime():" ")+"鈭�4");
+                        renderData.add(textRenderData);
+                        paragraphRenderData.setContents(renderData);
+                        paragraphRenderDataList.add(paragraphRenderData);
+                        cellRenderData.setParagraphs(paragraphRenderDataList);
+                        cells.add(cellRenderData);
+                    }
+                }
+                else if (i==2) {
+                    //绗笁琛�
+                    if (j==0) {
+                        //绗竴鍒�
+                        textRenderData.setText("鎵�瀛︿笓涓欯Majors studied");
+                        renderData.add(textRenderData);
+                        paragraphRenderData.setContents(renderData);
+                        paragraphRenderDataList.add(paragraphRenderData);
+                        cellRenderData.setParagraphs(paragraphRenderDataList);
+                        cells.add(cellRenderData);
+                    }
+                    else if (j==1) {
+                        //绗簩鍒�
+                        textRenderData.setText(ObjectUtils.isNotEmpty(personBasicInfo.getMajor1())?personBasicInfo.getMajor1():" ");
+                        renderData.add(textRenderData);
+                        paragraphRenderData.setContents(renderData);
+                        paragraphRenderDataList.add(paragraphRenderData);
+                        cellRenderData.setParagraphs(paragraphRenderDataList);
+                        cells.add(cellRenderData);
+                    }
+                    else if (j==2 || j==3) {
+                        textRenderData.setText("鏂囧寲绋嬪害@Education 鈭�5");
+                        renderData.add(textRenderData);
+                        paragraphRenderData.setContents(renderData);
+                        paragraphRenderDataList.add(paragraphRenderData);
+                        cellRenderData.setParagraphs(paragraphRenderDataList);
+                        cells.add(cellRenderData);
+                    }
+                    else {
+                        textRenderData.setText((ObjectUtils.isNotEmpty(personBasicInfo.getOfficialAcademicRedentials())?personBasicInfo.getOfficialAcademicRedentials():" ")+"鈭�6");
+                        renderData.add(textRenderData);
+                        paragraphRenderData.setContents(renderData);
+                        paragraphRenderDataList.add(paragraphRenderData);
+                        cellRenderData.setParagraphs(paragraphRenderDataList);
+                        cells.add(cellRenderData);
+                    }
+                }
+                else if (i==3) {
+                    //绗洓琛�
+                    if (j==0) {
+                        //绗竴鍒�
+                        textRenderData.setText("姣曚笟鏃堕棿@Graducation time");
+                        renderData.add(textRenderData);
+                        paragraphRenderData.setContents(renderData);
+                        paragraphRenderDataList.add(paragraphRenderData);
+                        cellRenderData.setParagraphs(paragraphRenderDataList);
+                        cells.add(cellRenderData);
+                    }
+                    else if (j==1) {
+                        //绗簩鍒�
+                        textRenderData.setText(ObjectUtils.isNotEmpty(personBasicInfo.getGraduationTime1())?personBasicInfo.getGraduationTime1()+"":" ");
+                        renderData.add(textRenderData);
+                        paragraphRenderData.setContents(renderData);
+                        paragraphRenderDataList.add(paragraphRenderData);
+                        cellRenderData.setParagraphs(paragraphRenderDataList);
+                        cells.add(cellRenderData);
+                    }
+                    else if (j==2 || j==3) {
+                        textRenderData.setText("姣曚笟瀛︽牎@Graduation school 鈭�7");
+                        renderData.add(textRenderData);
+                        paragraphRenderData.setContents(renderData);
+                        paragraphRenderDataList.add(paragraphRenderData);
+                        cellRenderData.setParagraphs(paragraphRenderDataList);
+                        cells.add(cellRenderData);
+                    }
+                    else {
+                        textRenderData.setText((ObjectUtils.isNotEmpty(personBasicInfo.getGraduatedInstitutions1())?personBasicInfo.getGraduatedInstitutions1():" ")+"鈭�8");
+                        renderData.add(textRenderData);
+                        paragraphRenderData.setContents(renderData);
+                        paragraphRenderDataList.add(paragraphRenderData);
+                        cellRenderData.setParagraphs(paragraphRenderDataList);
+                        cells.add(cellRenderData);
+                    }
+                }
+                else if (i==4){
+                    //绗簲琛�
+                    if (j==0){
+                        //绗竴鍒�
+                        textRenderData.setText("宀椾綅@Position");
+                        renderData.add(textRenderData);
+                        paragraphRenderData.setContents(renderData);
+                        paragraphRenderDataList.add(paragraphRenderData);
+                        cellRenderData.setParagraphs(paragraphRenderDataList);
+                        cells.add(cellRenderData);
+                    }
+                    else {
+                        textRenderData.setText((ObjectUtils.isNotEmpty(personBasicInfo.getPost())?personBasicInfo.getPost()+"":" " )+"鈭�9");
+                        renderData.add(textRenderData);
+                        paragraphRenderData.setContents(renderData);
+                        paragraphRenderDataList.add(paragraphRenderData);
+                        cellRenderData.setParagraphs(paragraphRenderDataList);
+                        cells.add(cellRenderData);
+                    }
+                }
+                else if (i==5){
+                    //绗叚琛�
+                    textRenderData.setText("瀛﹀巻銆佹娴嬩笓涓氳祫鏍笺�佽亴绉拌瘉涔︾櫥璁拌〃@Education, testing professional qualifications, professional title certificate registration form 鈭�10");
+                    renderData.add(textRenderData);
+                    paragraphRenderData.setContents(renderData);
+                    paragraphRenderDataList.add(paragraphRenderData);
+                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                    cells.add(cellRenderData);
+                }
+                else if (i==6){
+                    if (j==0){
+                        textRenderData.setText("璇佷欢鍙稝ID number");
+                        renderData.add(textRenderData);
+                        paragraphRenderData.setContents(renderData);
+                        paragraphRenderDataList.add(paragraphRenderData);
+                        cellRenderData.setParagraphs(paragraphRenderDataList);
+                        cells.add(cellRenderData);
+                    }
+                    else if (j==1){
+                        textRenderData.setText("鍙戣瘉鍗曚綅@Issuing unit");
+                        renderData.add(textRenderData);
+                        paragraphRenderData.setContents(renderData);
+                        paragraphRenderDataList.add(paragraphRenderData);
+                        cellRenderData.setParagraphs(paragraphRenderDataList);
+                        cells.add(cellRenderData);
+                    }
+                    else if (j==2){
+                        textRenderData.setText("绾у埆@Level");
+                        renderData.add(textRenderData);
+                        paragraphRenderData.setContents(renderData);
+                        paragraphRenderDataList.add(paragraphRenderData);
+                        cellRenderData.setParagraphs(paragraphRenderDataList);
+                        cells.add(cellRenderData);
+                    }
+                    else if (j==3){
+                        textRenderData.setText("鏈夋晥鏈烜Expiration date");
+                        renderData.add(textRenderData);
+                        paragraphRenderData.setContents(renderData);
+                        paragraphRenderDataList.add(paragraphRenderData);
+                        cellRenderData.setParagraphs(paragraphRenderDataList);
+                        cells.add(cellRenderData);
+                    }
+                    else if (j==4){
+                        textRenderData.setText("澶嶅嵃浠禓Copy");
+                        renderData.add(textRenderData);
+                        paragraphRenderData.setContents(renderData);
+                        paragraphRenderDataList.add(paragraphRenderData);
+                        cellRenderData.setParagraphs(paragraphRenderDataList);
+                        cells.add(cellRenderData);
+                    }
+                    else {
+                        textRenderData.setText("鍘熶欢@Original");
+                        renderData.add(textRenderData);
+                        paragraphRenderData.setContents(renderData);
+                        paragraphRenderDataList.add(paragraphRenderData);
+                        cellRenderData.setParagraphs(paragraphRenderDataList);
+                        cells.add(cellRenderData);
+                    }
+                }
+                else if (i==hang-1){
+                    //鏈�鍚庝竴琛�
+                    if (j==0){
+                            textRenderData.setText("澶囨敞@Remark");
+                            renderData.add(textRenderData);
+                            paragraphRenderData.setContents(renderData);
+                            paragraphRenderDataList.add(paragraphRenderData);
+                            cellRenderData.setParagraphs(paragraphRenderDataList);
+                            cells.add(cellRenderData);
+                    }
+                    else {
+                        textRenderData.setText((ObjectUtils.isNotEmpty(personBasicInfo.getRemarks())?personBasicInfo.getRemarks()+"":" " )+"鈭�11");
+                        renderData.add(textRenderData);
+                        paragraphRenderData.setContents(renderData);
+                        paragraphRenderDataList.add(paragraphRenderData);
+                        cellRenderData.setParagraphs(paragraphRenderDataList);
+                        cells.add(cellRenderData);
+                    }
+                }
+                else {
+                    if (annexList.size() == 0) {
+                        if (i == 7) {
+                            textRenderData.setText(" ");
+                            renderData.add(textRenderData);
+                            paragraphRenderData.setContents(renderData);
+                            paragraphRenderDataList.add(paragraphRenderData);
+                            cellRenderData.setParagraphs(paragraphRenderDataList);
+                            cells.add(cellRenderData);
+                        }
+                    } else {
+                        if (i >= 7 && i < 8 + (Math.max(annexList.size() - 1, 0))) {
+                            if (j == 0) {
+                                textRenderData.setText(ObjectUtils.isNotEmpty(annexList.get(i - 7).getIdNumber()) ? annexList.get(i - 7).getIdNumber() : " ");
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else if (j == 1) {
+                                textRenderData.setText(ObjectUtils.isNotEmpty(annexList.get(i - 7).getIssueUnit()) ? annexList.get(i - 7).getIssueUnit() : " ");
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else if (j == 2) {
+                                textRenderData.setText(ObjectUtils.isNotEmpty(annexList.get(i - 7).getLevel()) ? annexList.get(i - 7).getLevel() : " ");
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else if (j == 3) {
+                                textRenderData.setText(ObjectUtils.isNotEmpty(annexList.get(i - 7).getPeriodValidity()) ? annexList.get(i - 7).getPeriodValidity() : " ");
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else if (j == 4) {
+                                textRenderData.setText(ObjectUtils.isNotEmpty(annexList.get(i - 7).getCopy()) ? annexList.get(i - 7).getCopy() : " ");
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else {
+                                textRenderData.setText(ObjectUtils.isNotEmpty(annexList.get(i - 7).getOriginal()) ? annexList.get(i - 7).getOriginal() : " ");
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            }
+                        }
+                    }
+                    if (personTrackRecordList.size() == 0) {
+                        if (i == 8 + (Math.max(annexList.size() - 1, 0))) {
+                            if (j == 0) {
+                                textRenderData.setText("涓昏宸ヤ綔缁忓巻@Main work experience");
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else {
+                                textRenderData.setText(" 鈭�" + i + "5");
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            }
+                        }
+                    } else {
+                        if (i >= 8 + (Math.max(annexList.size() - 1, 0)) && i < hang - 1) {
+                            if (j == 0) {
+                                textRenderData.setText("涓昏宸ヤ綔缁忓巻@Main work experience 鈭�2"+j);
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else {
+                                String startTime = personTrackRecordList.get(i - (8 + (Math.max(annexList.size() - 1, 0)))).getStartTime().format(formatter);
+                                String endTime="/";
+                                try{
+                                     endTime = personTrackRecordList.get(i - (8 + (Math.max(annexList.size() - 1, 0)))).getEndTime().format(formatter);
+                                }catch (Exception e){
+                                }
+                                String placeWork = personTrackRecordList.get(i - (8 + (Math.max(annexList.size() - 1, 0)))).getPlaceWork();
+                                String department = personTrackRecordList.get(i - (8 + (Math.max(annexList.size() - 1, 0)))).getDepartment();
+                                String post = personTrackRecordList.get(i - (8 + (Math.max(annexList.size() - 1, 0)))).getPost();
+                                textRenderData.setText(startTime+"锛�"+endTime+"锛�"+placeWork+"锛�"+department+"锛�"+post+"鈭�" + i + "5");
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            }
+                        }
+                    }
+                }
+            }
+            rowRenderData.setCells(cells);
+            if (rowRenderData.getCells().size() != 0) {
+                rows.add(rowRenderData);
+            }
+        }
+        TableRenderData tableRenderData = new TableRenderData();
+        tableRenderData.setRows(rows);
+        int countSize = tableRenderData.getRows().get(0).getCells().size();
+        for (RowRenderData row : tableRenderData.getRows()) {
+            if (row.getCells().size() != countSize) {
+                throw new ErrorException("姣忚鍗曞厓鏍间笉鐩哥瓑");
+            }
+        }
+        TableStyle tableStyle = new TableStyle();
+        tableStyle.setWidth(XWPFTable.DEFAULT_PERCENTAGE_WIDTH);
+        tableStyle.setAlign(TableRowAlign.CENTER);
+        BorderStyle borderStyle = new BorderStyle();
+        borderStyle.setColor("000000");
+        borderStyle.setType(XWPFTable.XWPFBorderType.THICK);
+        borderStyle.setSize(14);
+        tableStyle.setLeftBorder(borderStyle);
+        tableStyle.setTopBorder(borderStyle);
+        tableStyle.setRightBorder(borderStyle);
+        tableStyle.setBottomBorder(borderStyle);
+        tableRenderData.setTableStyle(tableStyle);
+
+        InputStream inputStream = this.getClass().getResourceAsStream("/static/person-deal.docx");
+        ConfigureBuilder builder = Configure.builder();
+        builder.useSpringEL(true);
+        XWPFTemplate template = XWPFTemplate.compile(inputStream, builder.build()).render(
+                new HashMap<String, Object>() {{
+                    put("createTime", user.getCreateTime().format(formatter));
+                    put("person", tableRenderData);
+                }});
+        String name = UUID.randomUUID()+ user.getName()+ "_浜哄憳妗f鍗�" + ".docx";
+        try {
+            template.writeAndClose(Files.newOutputStream(Paths.get(wordUrl + "/" + name)));
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+        String path = wordUrl + "/" + name;
+        // 澶勭悊鍚堝苟鍗曞厓鏍肩殑闂
+        try {
+            ZipSecureFile.setMinInflateRatio(0.0001);
+            FileInputStream stream = new FileInputStream(path);
+            XWPFDocument document = new XWPFDocument(stream);
+            List<XWPFTable> xwpfTables = document.getTables();
+            for (int i = 0; i < xwpfTables.size(); i++) {
+                Set<String> set1 = new HashSet<>();
+                Map<String, Map<String, Integer>> maps = new HashMap<>();
+                for (int j = 0; j < xwpfTables.get(i).getRows().size(); j++) {
+                    for (int k = 0; k < xwpfTables.get(i).getRows().get(j).getTableCells().size(); k++) {
+                        if (xwpfTables.get(i).getRows().get(j).getTableCells().get(k).getText().indexOf("鈭�") > -1) {
+                            String[] split = xwpfTables.get(i).getRows().get(j).getTableCells().get(k).getText().split("鈭�");
+                            if (set1.add(split[1])) {
+                                Map<String, Integer> map = new HashMap<>();
+                                map.put("sr", j);
+                                map.put("sc", k);
+                                map.put("er", j + 0);
+                                map.put("ec", k + 0);
+                                maps.put(split[1], map);
+                            } else {
+                                Map<String, Integer> map1 = maps.get(split[1]);
+                                if (j == map1.get("sr")) {
+                                    map1.put("ec", map1.get("ec") + 1);
+                                } else if (k == map1.get("sc")) {
+                                    map1.put("er", map1.get("er") + 1);
+                                }
+                            }
+                            String str = xwpfTables.get(i).getRows().get(j).getTableCells().get(k).getText().split("鈭�")[0];
+                            xwpfTables.get(i).getRows().get(j).getTableCells().get(k).removeParagraph(0);
+                            xwpfTables.get(i).getRows().get(j).getTableCells().get(k).setText(str);
+                            xwpfTables.get(i).getRows().get(j).getTableCells().get(k).setVerticalAlignment(XWPFTableCell.XWPFVertAlign.CENTER);
+                            xwpfTables.get(i).getRows().get(j).getTableCells().get(k).getParagraphArray(0).setAlignment(ParagraphAlignment.CENTER);
+                        }
+                    }
+                }
+                // 鍗曞厓鏍兼帓搴�, 閬垮厤鏍煎紡閿欎贡
+                List<Map.Entry<String, Map<String, Integer>>> entries = new ArrayList<>(maps.entrySet());
+                entries.sort((o1, o2) -> o1.getValue().get("sc") - o2.getValue().get("sc"));
+                // 鎸夌収椤哄簭娣诲姞杩涢泦鍚�
+                List<String> list = new ArrayList<>();
+                for (Map.Entry<String, Map<String, Integer>> entry : entries) {
+                    list.add(entry.getKey());
+                }
+                for (int a = list.size() - 1; a >= 0; a--) {
+                    Map<String, Integer> v = maps.get(list.get(a));
+                    for (int j = 0; j < v.get("er") - v.get("sr") + 1; j++) {
+                        if (v.get("ec") > v.get("sc")) {
+                            try {
+                                mergeCellsHorizontally(xwpfTables.get(i), v.get("sr") + j, v.get("sc"), v.get("ec"));
+//                                TableTools.mergeCellsHorizonal(xwpfTables.get(i), v.get("sr") + j, v.get("sc"), v.get("ec"));
+                            } catch (Exception e) {
+                            }
+                        }
+                    }
+                    if (v.get("er") > v.get("sr")) {
+                        try {
+                            mergeCellsVertically(xwpfTables.get(i), v.get("sc"), v.get("sr"), v.get("er"));
+//                            TableTools.mergeCellsVertically(xwpfTables.get(i), v.get("sc"), v.get("sr"), v.get("er"));
+                        } catch (Exception e) {
+                        }
+                    }
+                }
+            }
+            FileOutputStream fileOutputStream = new FileOutputStream(path);
+            document.write(fileOutputStream);
+            fileOutputStream.close();
+        } catch (FileNotFoundException e) {
+            throw new RuntimeException(e);
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+        //澶勭悊涓嫳鏂囨崲琛岀殑闂
+        try {
+            FileInputStream stream1 = new FileInputStream(path);
+            XWPFDocument document1 = new XWPFDocument(stream1);
+            List<XWPFTable> xwpfTables1 = document1.getTables();
+            for (int i = 0; i < xwpfTables1.size(); i++) {
+                for (int j = 0; j < xwpfTables1.get(i).getRows().size(); j++) {
+                    for (int k = 0; k < xwpfTables1.get(i).getRows().get(j).getTableCells().size(); k++) {
+                        if (xwpfTables1.get(i).getRows().get(j).getTableCells().get(k).getText().contains("@")) {
+                            String text = xwpfTables1.get(i).getRows().get(j).getTableCells().get(k).getText();
+                            String[] split = text.split("@");
+                            xwpfTables1.get(i).getRows().get(j).getTableCells().get(k).removeParagraph(0);
+                            XWPFParagraph xwpfParagraph = xwpfTables1.get(i).getRows().get(j).getTableCells().get(k).addParagraph();
+                            XWPFRun run = xwpfParagraph.createRun();
+                            run.setText(split[0]);
+                            if (ObjectUtils.isNotNull(split[1])) {
+                                run.addBreak();
+                                run.setText(split[1]);
+                            }
+                            xwpfParagraph.setAlignment(ParagraphAlignment.CENTER);
+                        }
+                    }
+                }
+            }
+            FileOutputStream fileOutputStream1 = new FileOutputStream(path);
+            document1.write(fileOutputStream1);
+            fileOutputStream1.close();
+        } catch (FileNotFoundException e) {
+            throw new RuntimeException(e);
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+        return name;
+    }
+
+    /**
+     * 璁惧鏍″噯闄勪欢涓婁紶
+     * @param file
+     * @param suffix
+     * @param id
+     */
+
+    @Override
+    public void saveDeviceCalibrationFile(MultipartFile file, String suffix, Integer id) {
+        String name = file.getOriginalFilename();
+        UUID uuid = UUID.randomUUID();
+        String fileName = uuid + name;
+        String path = "";
+        // 鏍规嵁鍚庣紑鍒ゆ柇灞炰簬浠�涔堢被鍨�
+        if(suffix.toLowerCase().contains("xls")) {
+             path = excelUrl;
+        } else if (suffix.toLowerCase().contains("doc") || suffix.toLowerCase().contains("pdf")) {
+            path = wordUrl;
+        } else {
+            path = imgUrl;
+        }
+        File file1 = new File(path);
+        if(!file1.exists()) {
+            file1.mkdir();
+        }
+        try {
+            File file2 = new File(file1, fileName);
+            file.transferTo(file2);
+            // 淇濆瓨鏁版嵁搴�
+            PersonTrainingFile personTrainingFile = new PersonTrainingFile();
+            personTrainingFile.setDetailId(id);
+            personTrainingFile.setFileUrl("/" + fileName);
+            personTrainingFile.setFileName(file.getOriginalFilename());
+            personTrainingFile.setCreateUser(SecurityUtils.getUserId().intValue());
+            personTrainingFile.setCreateTime(LocalDateTime.now());
+            personTrainingFile.setEnumAttachmentType(com.ruoyi.personnel.enumeration.AttachmentType.getTypeValue(1));
+            fileMapper.insert(personTrainingFile);
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    /**
+     * 鏌ョ湅璁惧鏍″噯闄勪欢
+     * @param id
+     * @return
+     */
+
+
+    @Override
+    public List<PersonTrainingFile> getDeviceCalibrationFile(Integer id) {
+        List<PersonTrainingFile> personTrainingFiles = fileMapper.selectList(new LambdaQueryWrapper<PersonTrainingFile>()
+                .eq(PersonTrainingFile::getDetailId, id)
+                .eq(PersonTrainingFile::getEnumAttachmentType, com.ruoyi.personnel.enumeration.AttachmentType.getTypeValue(1)));
+        if(CollectionUtils.isNotEmpty(personTrainingFiles)) {
+            for(PersonTrainingFile a : personTrainingFiles) {
+                // 璁剧疆mime
+                int i = a.getFileUrl().lastIndexOf(".");
+                String contentType = getContentType(a.getFileUrl().substring(i + 1));
+                a.setMime(contentType);
+            }
+        }
+        return personTrainingFiles;
+    }
+
+    @Override
+    public void delDeviceCalibrationFile(Integer id) {
+        fileMapper.deleteById(id);
+    }
+
+    @Override
+    public void downLoadDeviceCalibrationFile(Integer id, HttpServletResponse response) {
+        PersonTrainingFile personTrainingFile = fileMapper.selectById(id);
+        String fileName = personTrainingFile.getFileName();
+        int i = fileName.lastIndexOf(".");
+        String suffix = fileName.substring(i);
+        String path = "";
+        // 鏍规嵁鍚庣紑鑾峰彇鐩稿簲鐨勮矾寰�
+        if(suffix.toLowerCase().contains("xls")) {
+            path = excelUrl;
+        } else if (suffix.toLowerCase().contains("doc") || suffix.toLowerCase().contains("pdf")) {
+            path = wordUrl;
+        } else {
+            path = imgUrl;
+        }
+        path = path + personTrainingFile.getFileUrl();
+        File file = new File(path);
+        try(FileInputStream fileInputStream = new FileInputStream(file);
+            ServletOutputStream outputStream = response.getOutputStream()) {
+            String contentType = getContentType(suffix);
+            // 璁剧疆鍝嶅簲澶�
+            response.setContentType(contentType);
+            response.setHeader("Content-disposition", "attachment;filename=" + fileName + suffix);
+            byte[] bytes = new byte[1024];
+            int len;
+            while ((len = fileInputStream.read(bytes)) != -1) {
+                outputStream.write(bytes,0,len);
+                outputStream.flush();
+            }
+        }catch (Exception e) {
+            throw new ErrorException("涓嬭浇澶辫触");
+        }
+    }
+
+    @Override
+    public void getEmployees(Integer departId) {
+        List<Map> employees = headerToken.getEmployees();
+        List<User> users = userMapper.selectList(new LambdaQueryWrapper<User>().eq(User::getStatus, 0)
+                .like(User::getDepartLimsId,String.valueOf(departId)));
+        if(CollectionUtils.isNotEmpty(users)) {
+            for (User user : users) {
+                if(CollectionUtils.isNotEmpty(employees)) {
+                    for (Map map : employees) {
+                        if(map.get("employeeID").toString().equals(user.getAccount())) {
+                            employeeAddOrUpdate(map,user.getId());
+                        }
+                    }
+                }
+            }
+        }
+
+
+    }
+
+    @Override
+    public void getEmployee(Integer userId) {
+        User user = userMapper.selectById(userId);
+        Map employee = headerToken.getEmployee(user.getAccount());
+        if(Objects.nonNull(user)) {
+            employeeAddOrUpdate(employee,user.getId());
+        }
+    }
+
+
+
+    public void  employeeAddOrUpdate(Map map,Integer userId) {
+        PersonBasicInfo personBasicInfo = baseMapper.selectOne(new LambdaQueryWrapper<PersonBasicInfo>()
+                .eq(PersonBasicInfo::getUserId, userId));
+        if(Objects.isNull(personBasicInfo)) {
+            personBasicInfo = new PersonBasicInfo();
+        }
+        // 灏嗕负null鐨勫�兼敼涓�""
+        map = updateMap(map);
+
+        // 浜轰簨绯荤粺鏈寘鍚瓧娈�
+//        personBasicInfo.setEmergencyContactPhone(null); // 绱ф�ヨ仈绯讳汉鐢佃瘽
+//        personBasicInfo.setLastUpdateTime(null); // 鏈�鍚庢洿鏂版椂闂�
+//        personBasicInfo.setCurrentState(""); // 褰撳墠鐘舵��
+//        personBasicInfo.setCurrentPosition(""); // 褰撳墠鑱屽姟
+//        personBasicInfo.setProfessionalTitle(""); //鑱岀О
+//        personBasicInfo.setPersonnelClassification(""); //浜哄憳鍒嗙被
+//        personBasicInfo.setOfficialAcademicRedentials(""); // 鏈�楂樺鍘�
+//        personBasicInfo.setGraduationTime1(null); // 姣曚笟鏃堕棿
+//        personBasicInfo.setGraduationTime2(null); // 姣曚笟鏃堕棿2
+//        personBasicInfo.setGraduatedInstitutions2(""); // 姣曚笟闄㈡牎2
+//        personBasicInfo.setMajor1(""); // 涓撲笟1
+//        personBasicInfo.setMajor2(""); // 涓撲笟2
+//        personBasicInfo.setEndPlannedInternship(null); // 璁″垝瀹炰範缁撴潫
+//        personBasicInfo.setDesktopPicture(""); // 妗岄潰鍥剧墖
+//        personBasicInfo.setAttachmentInformation(""); // 闄勪欢璧勬枡
+//        personBasicInfo.setRemarks(""); // 澶囨敞
+//        personBasicInfo.setPostType(""); // 宀椾綅绫诲埆
+//        personBasicInfo.setCurrentAddress(""); // 鐜板眳浣忓湴鍧�
+//        personBasicInfo.setCurrentDetailAddress(""); // 鐜板眳浣忚缁嗗湴鍧�
+//        personBasicInfo.setServiceAddress(""); // 閫佽揪鍦板潃
+//        personBasicInfo.setServiceDetailAddress(""); // 閫佽揪璇︾粏鍦板潃
+//        personBasicInfo.setNcre(""); // 璁$畻鏈虹瓑绾�
+//        personBasicInfo.setHighestDegree(""); // 鏈�楂樺浣�
+//        personBasicInfo.setFullTime(null); // 鏄惁灞炰簬鍏ㄦ棩鍒�
+//        personBasicInfo.setEnroll(null); // 鏄惁灞炰簬涓ぉ
+        // 杩涜涓�涓祴鍊�
+        personBasicInfo.setUserId(userId); // 鐢ㄦ埛id
+        if(StringUtils.isNotEmpty(map.get("dateOfJoiningTheCompany").toString())) {
+            LocalDate parse = LocalDate.parse(map.get("dateOfJoiningTheCompany").toString());
+            personBasicInfo.setEntryTime(parse); // 鍏ヨ亴鏃堕棿
+        }
+        if(StringUtils.isNotEmpty(map.get("dateOfBirth").toString())) {
+            LocalDate parse1 = LocalDate.parse(map.get("dateOfBirth").toString());
+            personBasicInfo.setDateBirth(parse1); //鍑虹敓鏃ユ湡
+        }
+        if(StringUtils.isNotEmpty(map.get("dateOfConversionToFullTime").toString())) {
+            personBasicInfo.setEndPracticalPractice(LocalDate.parse(map.get("dateOfConversionToFullTime").toString())); // 瀹為檯瀹炰範缁撴潫  (杞鏃ユ湡)
+        }
+        if(StringUtils.isNotEmpty(map.get("dateOfResignation").toString())) {
+            personBasicInfo.setDateDeparture(LocalDate.parse(map.get("dateOfResignation").toString())); // 绂昏亴鏃ユ湡
+
+        }
+        if(StringUtils.isNotEmpty(map.get("dateOfJoiningTheGroup").toString())) {
+            personBasicInfo.setGroupTime(LocalDate.parse(map.get("dateOfJoiningTheGroup").toString())); // 鍏ラ泦鍥㈡椂闂�
+        }
+
+        if(StringUtils.isNotEmpty(map.get("dateOfJoiningTheCompany").toString())) {
+            personBasicInfo.setTrialStartTime(LocalDate.parse(map.get("dateOfJoiningTheCompany").toString())); // 璇曠敤寮�濮嬫椂闂� 鍏ヨ亴鏃堕棿
+        }
+        if(StringUtils.isNotEmpty(map.get("dateOfConversionToFullTime").toString())) {
+            personBasicInfo.setTrialEndTime(LocalDate.parse(map.get("dateOfConversionToFullTime").toString())); //   璇曠敤缁撴潫鏃堕棿 杞鏃堕棿
+        }
+        if(StringUtils.isNotEmpty(map.get("idValidityPeriod").toString())) {
+            personBasicInfo.setValidityPeriod(LocalDate.parse(map.get("idValidityPeriod").toString())); // 璇佷欢鏈夋晥鏈�
+        }
+        if(StringUtils.isNotEmpty(map.get("dateOfJoiningTheCommunistPartyOrCommunistYouthLeague").toString())) {
+            personBasicInfo.setDumplingTime(LocalDate.parse(map.get("dateOfJoiningTheCommunistPartyOrCommunistYouthLeague").toString())); // 鍏ュ厷/鍥㈡椂闂�
+        }
+        if(StringUtils.isNotEmpty(map.get("dateOfJoiningTheCompany").toString())) {
+            personBasicInfo.setUnitTime(LocalDate.parse(map.get("dateOfJoiningTheCompany").toString())); // 鍏ュ崟浣嶆椂闂�
+        }
+
+        personBasicInfo.setDepartmentCode(map.get("departmentCode").toString()); // 閮ㄩ棬缂栧彿
+        personBasicInfo.setPost(map.get("position").toString()); // 宀椾綅
+        personBasicInfo.setSex(map.get("gender").toString()); //鎬у埆
+        personBasicInfo.setIdentityCard(map.get("idNumber").toString()); // 韬唤璇佸彿鐮�
+        personBasicInfo.setNation(map.get("nation").toString()); // 姘戞棌
+        personBasicInfo.setPoliticalStatus(map.get("politicalAffiliation").toString()); // 鏀挎不闈㈣矊
+        personBasicInfo.setGraduatedInstitutions1(""); // 姣曚笟闄㈡牎1
+        personBasicInfo.setTelephone(map.get("phoneNumber").toString()); // 鎵嬫満鍙风爜
+
+        personBasicInfo.setJobNumber(map.get("employeeID").toString()); // 宸ュ彿 浜哄憳缂栧彿
+        personBasicInfo.setSubordinateNumber(map.get("employeeSubID").toString()); // 鍛樺伐瀛愮紪鍙�
+        personBasicInfo.setCorporateName(map.get("companyId").toString()); // 鍏徃鍚嶇О 鎵�灞炵粍缁囩紪鐮�
+        personBasicInfo.setPostCode(map.get("positionCode").toString()); // 宀椾綅缂栧彿
+        personBasicInfo.setPostName(map.get("position").toString()); // 宀椾綅鍚嶇О
+        personBasicInfo.setReportingTo(map.get("directSupervisorID").toString()); // 鐩存帴涓婄骇
+        personBasicInfo.setLaborRelations(map.get("employmentStatus").toString()); // 鍔冲姩鍏崇郴
+
+        personBasicInfo.setNativePlace(map.get("hometown").toString()); // 绫嶈疮
+        personBasicInfo.setIdType(map.get("idType").toString()); // 璇佷欢绫诲瀷
+        personBasicInfo.setMaritalStatus(map.get("maritalStatus").toString()); // 濠氬Щ鐘跺喌
+        personBasicInfo.setIdAddress(map.get("idAddress").toString()); // 璇佷欢鍦板潃
+        personBasicInfo.setIdDetailAddress(map.get("detailedResidentialAddress").toString()); // 韬唤璇佽缁嗗湴鍧�
+        personBasicInfo.setRetiredSoldiers(map.get("militaryServiceStatus").toString()); // 鏄惁鏄��浼嶅啗浜�
+        personBasicInfo.setCornet(map.get("shortPhoneNumber").toString()); // 鐭彿
+        personBasicInfo.setOfficePhone(map.get("officePhone").toString()); // 鍔炲叕鐢佃瘽
+
+
+        personBasicInfo.setCollegeStudents(map.get("yearOfGraduation").toString()); // xxx灞婂ぇ瀛︾敓
+        personBasicInfo.setEmergencyContact(map.get("emergencyContactName").toString()); // 绱ф�ヨ仈绯讳汉
+        personBasicInfo.setCompanyEmail(map.get("companyEmail").toString()); // 鍏徃閭
+
+        if(Objects.nonNull(personBasicInfo.getDateBirth())) {
+            Period period = Period.between(personBasicInfo.getDateBirth(), LocalDate.now());
+            int years = period.getYears();
+            personBasicInfo.setPersonBasicInfoAge(years);
+        }
+
+
+        if(Objects.isNull(personBasicInfo.getId()) ) {
+            log.info("鏂板");
+            baseMapper.insert(personBasicInfo);
+        }else {
+            log.info("鏇存柊");
+            baseMapper.updateById(personBasicInfo);
+        }
+
+    }
+
+    public Map updateMap(Map<String,Object> map) {
+        Iterator<Map.Entry<String, Object>> iterator = map.entrySet().iterator();
+        while (iterator.hasNext()){
+            Map.Entry<String, Object> entry = iterator.next();
+            if(Objects.isNull(entry.getValue()) || entry.getValue().equals("null")) {
+                entry.setValue("");
+            }
+        }
+        return map;
+    }
+
+    /**
+     * 閫掑綊鏌ヨ瀛愯妭鐐�
+     * @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);
+            }
+        }
+    }
+    // 鏍规嵁鏂囦欢鎵╁睍鍚嶈幏鍙� MIME 绫诲瀷
+    private String getContentType(String fileExtension) {
+        switch (fileExtension) {
+            case "jpg":
+            case "jpeg":
+                return "image/jpeg";
+            case "png":
+                return "image/png";
+            case "gif":
+                return "image/gif";
+            case "pdf":
+                return "application/pdf";
+            case "doc":
+                return "application/msword";
+            case "docx":
+                return "application/vnd.openxmlformats-officedocument.wordprocessingml.document";
+            case "xls":
+                return "application/vnd.ms-excel";
+            case "xlsx":
+                return "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
+            case "ppt":
+            case "pptx":
+                return "application/vnd.ms-powerpoint";
+            default:
+                return "application/octet-stream"; // 榛樿浜岃繘鍒舵祦
+        }
+    }
+}
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..8593b42
--- /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
+    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..4fd2df2
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonJobResponsibilitiesServiceImpl.java
@@ -0,0 +1,114 @@
+package com.ruoyi.personnel.service.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.deepoove.poi.XWPFTemplate;
+import com.deepoove.poi.config.Configure;
+import com.deepoove.poi.config.ConfigureBuilder;
+import com.ruoyi.common.core.domain.entity.User;
+import com.ruoyi.personnel.dto.PersonJobResponsibilitiesDto;
+import com.ruoyi.personnel.mapper.PersonJobResponsibilitiesMapper;
+import com.ruoyi.personnel.pojo.PersonJobResponsibilities;
+import com.ruoyi.personnel.service.PersonJobResponsibilitiesService;
+import com.ruoyi.system.mapper.UserMapper;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+
+import 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
+    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..67c6f14
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonPersonnelCapacityServiceImpl.java
@@ -0,0 +1,121 @@
+package com.ruoyi.personnel.service.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.deepoove.poi.XWPFTemplate;
+import com.deepoove.poi.config.Configure;
+import com.deepoove.poi.config.ConfigureBuilder;
+import com.deepoove.poi.data.Pictures;
+import com.ruoyi.common.utils.DateImageUtil;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.framework.exception.ErrorException;
+import com.ruoyi.personnel.dto.PersonPersonnelCapacityDto;
+import com.ruoyi.personnel.dto.PersonPersonnelCapacityExportDto;
+import com.ruoyi.personnel.mapper.PersonPersonnelCapacityMapper;
+import com.ruoyi.personnel.pojo.PersonPersonnelCapacity;
+import com.ruoyi.personnel.service.PersonPersonnelCapacityService;
+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-10 11:26:18
+ */
+@Service
+public class PersonPersonnelCapacityServiceImpl extends ServiceImpl<PersonPersonnelCapacityMapper, PersonPersonnelCapacity> implements PersonPersonnelCapacityService {
+
+    @Resource
+    private UserMapper userMapper;
+
+    @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 id
+     * @return
+     */
+    @Override
+    public boolean confirmPersonnelCapacity(Integer id) {
+        // 鏌ヨ浜哄憳鑳藉姏
+        PersonPersonnelCapacity personPersonnelCapacity = baseMapper.selectById(id);
+        if (personPersonnelCapacity.getConfirmOperatingPersonnelId() != null) {
+            throw new ErrorException("璇ヤ汉鍛樿兘鍔涘凡纭杩�, 鏃犻渶閲嶅纭");
+        }
+        Integer userId = SecurityUtils.getUserId().intValue();
+        baseMapper.update(null, Wrappers.<PersonPersonnelCapacity>lambdaUpdate()
+                .eq(PersonPersonnelCapacity::getId, id)
+                .set(PersonPersonnelCapacity::getConfirmOperatingPersonnelId, userId)
+                .set(PersonPersonnelCapacity::getConfirmDate, LocalDateTime.now()));
+
+        return true;
+    }
+}
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..a12c813
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonPostAuthorizationRecordServiceImpl.java
@@ -0,0 +1,136 @@
+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 net.sourceforge.pinyin4j.PinyinHelper;
+import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType;
+import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
+import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;
+import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;
+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
+    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();
+        //濮撳悕鑻辨枃
+        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 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/PersonSupervisePlanDetailsServiceImpl.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonSupervisePlanDetailsServiceImpl.java
new file mode 100644
index 0000000..d164607
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonSupervisePlanDetailsServiceImpl.java
@@ -0,0 +1,43 @@
+package com.ruoyi.personnel.service.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.personnel.dto.PersonSupervisePlanDetailsDto;
+import com.ruoyi.personnel.excel.PersonSupervisePlanDetailsUpload;
+import com.ruoyi.personnel.mapper.PersonSupervisePlanDetailsMapper;
+import com.ruoyi.personnel.pojo.PersonSupervisePlanDetails;
+import com.ruoyi.personnel.service.PersonSupervisePlanDetailsService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 鐩戠潱璁″垝 - 瀛� 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-10-09 04:17:02
+ */
+@Service
+public class PersonSupervisePlanDetailsServiceImpl extends ServiceImpl<PersonSupervisePlanDetailsMapper, PersonSupervisePlanDetails> implements PersonSupervisePlanDetailsService {
+
+
+    public IPage<PersonSupervisePlanDetailsDto> yearPlanDetailPage(Page page, String date, String project, Integer planId) {
+        IPage<PersonSupervisePlanDetailsDto> personSupervisePlanDetailsDtoIPage = baseMapper.pageByDate(page, date, project, planId);
+        return personSupervisePlanDetailsDtoIPage;
+    }
+
+    @Override
+    public void importExcel(List<PersonSupervisePlanDetailsUpload> list, Integer planId) {
+        List<PersonSupervisePlanDetails> personSupervisePlanDetailsList = JSON.parseArray(JSON.toJSONString(list), PersonSupervisePlanDetails.class);
+        personSupervisePlanDetailsList.forEach(i -> i.setPlanId(planId));
+        if (CollectionUtils.isNotEmpty(personSupervisePlanDetailsList)) {
+            baseMapper.insertBatchSomeColumn(personSupervisePlanDetailsList);
+        }
+    }
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonSupervisePlanServiceImpl.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonSupervisePlanServiceImpl.java
new file mode 100644
index 0000000..21f2260
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonSupervisePlanServiceImpl.java
@@ -0,0 +1,327 @@
+package com.ruoyi.personnel.service.impl;
+
+import cn.hutool.core.util.NumberUtil;
+import com.alibaba.excel.EasyExcel;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+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.StringUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.deepoove.poi.XWPFTemplate;
+import com.deepoove.poi.config.Configure;
+import com.deepoove.poi.data.Pictures;
+import com.ruoyi.common.core.domain.entity.User;
+import com.ruoyi.common.utils.DateImageUtil;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.framework.exception.ErrorException;
+import com.ruoyi.inspect.util.HackLoopTableRenderPolicy;
+import com.ruoyi.personnel.dto.PersonSupervisePlanDto;
+import com.ruoyi.personnel.excel.PersonSupervisePlanDetailsListener;
+import com.ruoyi.personnel.excel.PersonSupervisePlanDetailsUpload;
+import com.ruoyi.personnel.mapper.PersonSupervisePlanDetailsMapper;
+import com.ruoyi.personnel.mapper.PersonSupervisePlanMapper;
+import com.ruoyi.personnel.mapper.PersonSupervisionRecordMapper;
+import com.ruoyi.personnel.pojo.PersonSupervisePlan;
+import com.ruoyi.personnel.pojo.PersonSupervisePlanDetails;
+import com.ruoyi.personnel.pojo.PersonSupervisionRecord;
+import com.ruoyi.personnel.service.PersonSupervisePlanDetailsService;
+import com.ruoyi.personnel.service.PersonSupervisePlanService;
+import com.ruoyi.system.mapper.UserMapper;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.poi.hwpf.HWPFDocument;
+import org.apache.poi.hwpf.usermodel.*;
+import org.apache.poi.xwpf.usermodel.XWPFDocument;
+import org.apache.poi.xwpf.usermodel.XWPFTable;
+import org.apache.poi.xwpf.usermodel.XWPFTableCell;
+import org.apache.poi.xwpf.usermodel.XWPFTableRow;
+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 org.apache.poi.xwpf.usermodel.XWPFDocument;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URLEncoder;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 鐩戠潱璁″垝 - 鐖� 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-10-09 04:14:45
+ */
+@Service
+@Slf4j
+@Transactional(rollbackFor = Exception.class)
+@AllArgsConstructor
+public class PersonSupervisePlanServiceImpl extends ServiceImpl<PersonSupervisePlanMapper, PersonSupervisePlan> implements PersonSupervisePlanService {
+
+    private PersonSupervisePlanDetailsService personSupervisePlanDetailsService;
+
+    private PersonSupervisePlanDetailsMapper personSupervisePlanDetailsMapper;
+
+    private PersonSupervisionRecordMapper personSupervisionRecordMapper;
+
+    @Value("${file.path}")
+    private String imgUrl;
+
+    @Autowired
+    private UserMapper userMapper;
+
+    public IPage<PersonSupervisePlanDto> yearPlanDtoIPage(Page page, String organizationPerson, Integer departId) {
+        IPage<PersonSupervisePlanDto> personSupervisePlanDtoIPage = baseMapper.pageByPerson(page, organizationPerson, departId);
+        List<PersonSupervisePlanDto> records = personSupervisePlanDtoIPage.getRecords();
+        for(PersonSupervisePlanDto a : records) {
+            a.setCurrentId(SecurityUtils.getUserId().intValue());
+        }
+        return personSupervisePlanDtoIPage;
+    }
+
+    @Override
+    public void yearPlanDetailImport(MultipartFile file ,String suffix) {
+        // 骞村害璁″垝鐖剁骇鏂板鏁版嵁
+        PersonSupervisePlan personSupervisePlan = new PersonSupervisePlan();
+        String fileName = file.getOriginalFilename().substring(0, file.getOriginalFilename().lastIndexOf("."));
+        personSupervisePlan.setFileName(fileName);
+        personSupervisePlan.setOrganizationPersonId(SecurityUtils.getUserId().intValue());
+        personSupervisePlan.setOrganizationDate(LocalDateTime.now());
+        baseMapper.insert(personSupervisePlan);
+        List<List<String>> tableData = new ArrayList<>();
+        String name = "";
+        // 骞村害璁″垝璇︽儏 鏂板
+        try {
+            if(suffix.toLowerCase().contains("xls")) {
+                PersonSupervisePlanDetailsListener personSupervisePlanDetailsListener = new PersonSupervisePlanDetailsListener(personSupervisePlanDetailsService);
+                personSupervisePlanDetailsListener.setPlanId(personSupervisePlan.getId());
+                EasyExcel.read(file.getInputStream(), PersonSupervisePlanDetailsUpload.class, personSupervisePlanDetailsListener).sheet().doRead();
+            }else if(suffix.toLowerCase().equals("doc"))  {
+                try(InputStream inputStream = file.getInputStream();
+                    HWPFDocument doc = new HWPFDocument(inputStream)) {
+                    // 鑾峰彇鏂囨。鐨� Range
+                    Range range = doc.getRange();
+                    // 閬嶅巻鎵�鏈夎〃鏍�
+                    TableIterator tableIterator = new TableIterator(range);
+                    while (tableIterator.hasNext()) {
+                        Table table = tableIterator.next();
+                        // 閬嶅巻琛ㄦ牸鐨勬瘡涓�琛�
+                        for (int rowIdx = 0; rowIdx < table.numRows(); rowIdx++) {
+                            TableRow row = table.getRow(rowIdx);
+                            List<String> rowData = new ArrayList<>();
+
+                            // 閬嶅巻琛屼腑鐨勬瘡涓崟鍏冩牸
+                            for (int cellIdx = 0; cellIdx < row.numCells(); cellIdx++) {
+                                TableCell cell = row.getCell(cellIdx);
+                                String text = cell.text().trim();
+                                rowData.add(text);
+                            }
+                            tableData.add(rowData);
+                        }
+                    }
+                    for (List<String> list : tableData) {
+                        // 杩涜娣诲姞
+                        addPersonSupervisePlanDetails(list,personSupervisePlan.getId());
+                        if(StringUtils.isEmpty(name) && NumberUtil.isInteger(list.get(0))) {
+                            String supervisePerson = list.get(4); // 琚洃鐫d汉鍛�
+                            name = supervisePerson;
+                        }
+                    }
+                    // 鏍规嵁娣诲姞鏁版嵁琚洃鐫d汉 鏉ュ垽鏂鏂囦欢鏄摢涓儴闂ㄧ殑
+                    String departLimsId = userMapper.selectList(new LambdaQueryWrapper<User>().eq(User::getName, name)).get(0).getDepartLimsId();
+                    if(StringUtils.isNotEmpty(departLimsId) && departLimsId.contains("18")) {
+                        baseMapper.update(null,new LambdaUpdateWrapper<PersonSupervisePlan>()
+                                .set(PersonSupervisePlan::getDepartId,18)
+                                .set(PersonSupervisePlan::getOrganizationPersonId,12) // 閫氫俊鐨勬槸鍒樻櫒 锛堢紪鍒朵汉锛�
+                                .eq(PersonSupervisePlan::getId,personSupervisePlan.getId()));
+                    } else if (StringUtils.isNotEmpty(departLimsId) && departLimsId.contains("19")) {
+                        baseMapper.update(null,new LambdaUpdateWrapper<PersonSupervisePlan>()
+                                .set(PersonSupervisePlan::getDepartId,19)
+                                .set(PersonSupervisePlan::getOrganizationPersonId,41) // 鐢靛姏鐨勬槸鍚存槑鍗� 锛堢紪鍒朵汉锛�
+                                .eq(PersonSupervisePlan::getId,personSupervisePlan.getId()));
+                    }
+
+                log.info("璇诲彇鏂囦欢锛� {}",tableData);
+                }catch (Exception e) {
+                    throw new ErrorException("瀵煎叆澶辫触"+ e);
+                }
+            }else if(suffix.toLowerCase().equals("docx")) {
+                try(InputStream fileInputStream = file.getInputStream();XWPFDocument xwpfDocument = new XWPFDocument(fileInputStream)) {
+
+                    // 閬嶅巻鎵�鏈夎〃鏍�
+                    for(XWPFTable table : xwpfDocument.getTables()) {
+                        // 閬嶅巻姣忎竴琛�
+                        for(XWPFTableRow row : table.getRows()) {
+                            List<String> list = new ArrayList<>();
+                            // 閬嶅巻姣忎竴涓崟鍏冩牸
+                            for(XWPFTableCell cell : row.getTableCells()) {
+                                String text = cell.getText();
+                                list.add(text);
+                            }
+                            log.info("璇诲彇姣忎竴琛岀殑鍐呭锛� {}",list);
+                            // 杩涜娣诲姞
+                            addPersonSupervisePlanDetails(list,personSupervisePlan.getId());
+                           if(StringUtils.isEmpty(name) && NumberUtil.isInteger(list.get(0))) {
+                               String supervisePerson = list.get(4); // 琚洃鐫d汉鍛�
+                               name = supervisePerson;
+                           }
+                        }
+                    }
+                    // 鏍规嵁娣诲姞鏁版嵁琚洃鐫d汉 鏉ュ垽鏂鏂囦欢鏄摢涓儴闂ㄧ殑
+                    String departLimsId = userMapper.selectList(new LambdaQueryWrapper<User>().eq(User::getName, name)).get(0).getDepartLimsId();
+                    if(StringUtils.isNotEmpty(departLimsId) && departLimsId.contains("18")) {
+                        baseMapper.update(null,new LambdaUpdateWrapper<PersonSupervisePlan>()
+                                .set(PersonSupervisePlan::getDepartId,18)
+                                .eq(PersonSupervisePlan::getId,personSupervisePlan.getId()));
+                    } else if (StringUtils.isNotEmpty(departLimsId) && departLimsId.contains("19")) {
+                        baseMapper.update(null,new LambdaUpdateWrapper<PersonSupervisePlan>()
+                                .set(PersonSupervisePlan::getDepartId,18)
+                                .eq(PersonSupervisePlan::getId,personSupervisePlan.getId()));
+                    }
+                }catch (Exception e){
+                    throw new ErrorException("瀵煎叆澶辫触"+e);
+                }
+            }
+
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+
+    public void  addPersonSupervisePlanDetails(List<String> list,Integer planId) {
+        if(NumberUtil.isInteger(list.get(0)) ) {
+            String superviseDate = list.get(1); // 鐩戠潱鏃ユ湡
+            String superviseDes = list.get(2); // 鐩戠潱鐩殑
+            String superviseProject = list.get(3); // 鐩戠潱椤圭洰
+            String supervisePerson = list.get(4); // 琚洃鐫d汉鍛�
+            String superviseReason = list.get(5); // 鐩戠潱鍘熷洜
+            String remarks = list.get(6); // 澶囨敞
+            PersonSupervisePlanDetails personSupervisePlanDetails = new PersonSupervisePlanDetails();
+            LocalDate localDate = null;
+            String[] parts = superviseDate.split("\\.");
+            if (parts.length == 2) {
+                try {
+                    // 鑾峰彇骞翠唤
+                    int year = Integer.parseInt(parts[0]);
+                    // 鑾峰彇鏈堜唤
+                    int month = Integer.parseInt(parts[1]);
+                    // 鍒涘缓 LocalDate 瀵硅薄锛屾棩鏈熻涓鸿鏈堢涓�澶�
+                    localDate = LocalDate.of(year, month, 1);
+                } catch (NumberFormatException e) {
+                   throw  new ErrorException("杈撳叆鐨勫瓧绗︿覆鏃犳硶杞崲涓烘湁鏁堢殑骞翠唤鎴栨湀浠�: " + e.getMessage());
+                }
+            }
+            personSupervisePlanDetails.setSuperviseDate(localDate);
+            personSupervisePlanDetails.setSuperviseDes(superviseDes);
+            personSupervisePlanDetails.setSuperviseProject(superviseProject);
+            personSupervisePlanDetails.setSupervisePerson(supervisePerson);
+            personSupervisePlanDetails.setSuperviseReason(superviseReason);
+            personSupervisePlanDetails.setRemarks(remarks);
+            personSupervisePlanDetails.setPlanId(planId); // 鐖秈d
+            personSupervisePlanDetailsMapper.insert(personSupervisePlanDetails);
+        }
+    }
+
+
+
+    /**
+     * 瀵煎嚭浜哄憳鐩戠潱璁″垝
+     * @param id
+     * @param response
+     */
+    @Override
+    public void exportSuperVisePlan(Integer id, HttpServletResponse response) {
+        Map<String, Object> data = new HashMap<>();
+        data.put("year","");
+        data.put("supervisor","");
+        // 鏌ヨ璇︽儏
+        PersonSupervisePlan personSupervisePlan = baseMapper.selectById(id);
+
+
+        //鑾峰彇鎻愪氦浜虹殑绛惧悕鍦板潃
+        String organizationUrl = userMapper.selectById(personSupervisePlan.getOrganizationPersonId()).getSignatureUrl();
+        if (StringUtils.isBlank(organizationUrl)) {
+            throw new ErrorException("鎵句笉鍒版楠屼汉鐨勭鍚�");
+        }
+
+        //鑾峰彇鎵瑰噯浜虹殑绛惧悕鍦板潃
+        String approvalUrl = null;
+        if (personSupervisePlan.getApprovalId() != null) {
+            approvalUrl = userMapper.selectById(personSupervisePlan.getApprovalId()).getSignatureUrl();
+            if (StringUtils.isBlank(approvalUrl)) {
+                throw new ErrorException("鎵句笉鍒版壒鍑嗕汉鐨勭鍚�");
+            }
+        }
+
+        // 鏌ヨ璇︽儏
+        List<PersonSupervisePlanDetails> detailedDtos = personSupervisePlanDetailsService.list(Wrappers.<PersonSupervisePlanDetails>lambdaQuery()
+                .eq(PersonSupervisePlanDetails::getPlanId, id));
+
+
+        // 鏌ヨ鐩戠潱璁板綍
+        List<PersonSupervisionRecord> personSupervisionRecords = personSupervisionRecordMapper.selectList(new LambdaQueryWrapper<PersonSupervisionRecord>()
+                .orderByAsc(PersonSupervisionRecord::getId));
+        if(CollectionUtils.isNotEmpty(personSupervisionRecords)) {
+            Integer supervisorId = personSupervisionRecords.get(0).getSupervisorId();
+            String name = userMapper.selectById(supervisorId).getName();
+            data.put("supervisor",name);
+        }
+
+
+        int index = 1;
+        for (PersonSupervisePlanDetails detailedDto : detailedDtos) {
+            detailedDto.setIndex(index);
+            index++;
+            DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+            String format = detailedDto.getSuperviseDate().format(dateTimeFormatter);
+            detailedDto.setSuperviseDateString(format);
+            int year = detailedDto.getSuperviseDate().getYear();
+            data.put("year",year);
+        }
+        System.out.println("data: " + data);
+        // 鑾峰彇璺緞
+        InputStream inputStream = this.getClass().getResourceAsStream("/static/super-vise-plan.docx");
+        Configure configure = Configure.builder()
+                .bind("supervisePlanDetailsList", new HackLoopTableRenderPolicy())
+                .build();
+        String finalApprovalUrl = approvalUrl;
+        XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
+                new HashMap<String, Object>() {{
+                    put("data",data);
+                    put("supervisePlanDetailsList", detailedDtos);
+                    put("organizationUrl", StringUtils.isNotBlank(organizationUrl) ? Pictures.ofLocal(imgUrl + "/" + organizationUrl).create() : null);
+                    put("approvalUrl", StringUtils.isNotBlank(finalApprovalUrl) ? Pictures.ofLocal(imgUrl + "/" + finalApprovalUrl).create() : null);
+                    put("writeDateUrl", personSupervisePlan.getOrganizationDate() != null ?
+                            Pictures.ofStream(DateImageUtil.createDateImage(personSupervisePlan.getOrganizationDate())).create() : null);
+                    put("ratifyDateUrl", personSupervisePlan.getApprovalDate() != null ?
+                            Pictures.ofStream(DateImageUtil.createDateImage(personSupervisePlan.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("瀵煎嚭澶辫触");
+        }
+    }
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonSupervisionControlSheetServiceImpl.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonSupervisionControlSheetServiceImpl.java
new file mode 100644
index 0000000..989f383
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonSupervisionControlSheetServiceImpl.java
@@ -0,0 +1,155 @@
+package com.ruoyi.personnel.service.impl;
+
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+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.framework.exception.ErrorException;
+import com.ruoyi.personnel.dto.PersonSupervisionControlSheetExportDto;
+import com.ruoyi.personnel.mapper.PersonSupervisionControlSheetMapper;
+import com.ruoyi.personnel.pojo.PersonSupervisionControlSheet;
+import com.ruoyi.personnel.service.PersonSupervisionControlSheetService;
+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.util.HashMap;
+import java.util.List;
+
+/**
+ * <p>
+ * 鐩戠潱璁板綍 - 鎺у埗鍗� 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-10-10 05:18:57
+ */
+@Service
+public class PersonSupervisionControlSheetServiceImpl extends ServiceImpl<PersonSupervisionControlSheetMapper, PersonSupervisionControlSheet> implements PersonSupervisionControlSheetService {
+
+    @Resource
+    private UserMapper userMapper;
+
+    @Value("${file.path}")
+    private String imgUrl;
+
+    /**
+     * 瀵煎嚭浜哄憳鐩戠潱璁板綍绾犳鎺у埗鍗�
+     * @param supervisionRecordId
+     * @param response
+     */
+    @Override
+    public void exportSupervisionControlSheet(Integer supervisionRecordId, HttpServletResponse response) {
+        PersonSupervisionControlSheetExportDto controlSheetExportDto = baseMapper.selectSupervisionControl(supervisionRecordId);
+
+        // 鍒ゆ柇涓嶇鍚堝伐浣滃彂鐜伴�斿緞鏄惁涓虹┖
+        if (StringUtils.isNotBlank(controlSheetExportDto.getDiscoveryApproach())) {
+            List<String> splitList = StrUtil.split(controlSheetExportDto.getDiscoveryApproach(), ',');
+            for (String s : splitList) {
+                switch (s) {
+                    case "0":
+                        controlSheetExportDto.setDiscoveryApproach0("鈽�");
+                        break;
+                    case "1":
+                        controlSheetExportDto.setDiscoveryApproach1("鈽�");
+                        break;
+                    case "2":
+                        controlSheetExportDto.setDiscoveryApproach2("鈽�");
+                        break;
+                    case "3":
+                        controlSheetExportDto.setDiscoveryApproach3("鈽�");
+                        break;
+                    case "4":
+                        controlSheetExportDto.setDiscoveryApproach4("鈽�");
+                        break;
+                    case "5":
+                        controlSheetExportDto.setDiscoveryApproach5("鈽�");
+                        break;
+                    case "6":
+                        controlSheetExportDto.setDiscoveryApproach6("鈽�");
+                        break;
+                    case "7":
+                        controlSheetExportDto.setDiscoveryApproach7("鈽�");
+                        break;
+                }
+            }
+        }
+        // 鍙戠幇閮ㄩ棬
+        String discovererUrl = null;
+        if (controlSheetExportDto.getDepartmentHeadId() != null) {
+            discovererUrl = userMapper.selectById(controlSheetExportDto.getDepartmentHeadId()).getSignatureUrl();
+            if (StringUtils.isBlank(discovererUrl)) {
+                throw new ErrorException("鎵句笉鍒板彂鐜伴儴闂ㄤ汉鐨勭鍚�");
+            }
+        }
+
+        // 澶勭悊鎺柦璐熻矗浜�
+        String responsibleUrl = null;
+        if (controlSheetExportDto.getResponsibleDepartmentPersonId() != null) {
+            responsibleUrl = userMapper.selectById(controlSheetExportDto.getResponsibleDepartmentPersonId()).getSignatureUrl();
+            if (StringUtils.isBlank(responsibleUrl)) {
+                throw new ErrorException("鎵句笉鍒板鐞嗘帾鏂借礋璐d汉鐨勭鍚�");
+            }
+        }
+
+        // 鎶�鏈礋璐d汉
+        String correctiveUrl = null;
+        if (controlSheetExportDto.getResponsibleDepartmentPersonId() != null) {
+            correctiveUrl = userMapper.selectById(controlSheetExportDto.getResponsibleDepartmentPersonId()).getSignatureUrl();
+            if (StringUtils.isBlank(correctiveUrl)) {
+                throw new ErrorException("鎵句笉鍒版妧鏈礋璐d汉鐨勭鍚�");
+            }
+        }
+
+        // 璐ㄩ噺璐熻矗浜�
+        String qualityUrl = null;
+        if (controlSheetExportDto.getQualitySupervisorId() != null) {
+            qualityUrl = userMapper.selectById(controlSheetExportDto.getQualitySupervisorId()).getSignatureUrl();
+            if (StringUtils.isBlank(qualityUrl)) {
+                throw new ErrorException("鎵句笉鍒拌川閲忚礋璐d汉鐨勭鍚�");
+            }
+        }
+
+        // 鑾峰彇璺緞
+        InputStream inputStream = this.getClass().getResourceAsStream("/static/supervision-control-sheet.docx");
+        ConfigureBuilder builder = Configure.builder();
+        builder.useSpringEL(true);
+        String finalDiscovererUrl = discovererUrl;
+        String finalResponsibleUrl = responsibleUrl;
+        String finalCorrectiveUrl = correctiveUrl;
+        String finalQualityUrl = qualityUrl;
+        XWPFTemplate template = XWPFTemplate.compile(inputStream, builder.build()).render(
+                new HashMap<String, Object>() {{
+                    put("control", controlSheetExportDto);
+                    put("discovererUrl", StringUtils.isNotBlank(finalDiscovererUrl) ? Pictures.ofLocal(imgUrl + "/" + finalDiscovererUrl).create() : null);
+                    put("responsibleUrl", StringUtils.isNotBlank(finalResponsibleUrl) ? Pictures.ofLocal(imgUrl + "/" + finalResponsibleUrl).create() : null);
+                    put("correctiveUrl", StringUtils.isNotBlank(finalCorrectiveUrl) ? Pictures.ofLocal(imgUrl + "/" + finalCorrectiveUrl).create() : null);
+                    put("qualityUrl", StringUtils.isNotBlank(finalQualityUrl) ? Pictures.ofLocal(imgUrl + "/" + finalQualityUrl).create() : null);
+                }});
+
+        try {
+            response.setContentType("application/msword");
+            String fileName = URLEncoder.encode(
+                    "浜哄憳鐩戠潱璁板綍鎺у埗鍗�", "UTF-8");
+            response.setHeader("Content-disposition",
+                    "attachment;filename=" + fileName + ".docx");
+            OutputStream os = response.getOutputStream();
+            template.write(os);
+            os.flush();
+            os.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException("瀵煎嚭澶辫触");
+        }
+
+
+    }
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonSupervisionProcessingSheetServiceImpl.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonSupervisionProcessingSheetServiceImpl.java
new file mode 100644
index 0000000..4d10d94
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonSupervisionProcessingSheetServiceImpl.java
@@ -0,0 +1,119 @@
+package com.ruoyi.personnel.service.impl;
+
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+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.framework.exception.ErrorException;
+import com.ruoyi.personnel.dto.PersonSupervisionProcessingSheetDto;
+import com.ruoyi.personnel.mapper.PersonSupervisionProcessingSheetMapper;
+import com.ruoyi.personnel.pojo.PersonSupervisionProcessingSheet;
+import com.ruoyi.personnel.service.PersonSupervisionProcessingSheetService;
+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.util.HashMap;
+
+/**
+ * <p>
+ * 鐩戠潱璁板綍 - 澶勭悊鍗� 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-10-10 05:35:58
+ */
+@Service
+public class PersonSupervisionProcessingSheetServiceImpl extends ServiceImpl<PersonSupervisionProcessingSheetMapper, PersonSupervisionProcessingSheet> implements PersonSupervisionProcessingSheetService {
+
+    @Resource
+    private UserMapper userMapper;
+
+    @Value("${file.path}")
+    private String imgUrl;
+
+    /**
+     * 瀵煎嚭浜哄憳鐩戠潱璁板綍绾犳澶勭悊鍗�
+     * @param supervisionRecordId
+     * @param response
+     */
+    @Override
+    public void exportSupervisionProcessingSheet(Integer supervisionRecordId, HttpServletResponse response) {
+        PersonSupervisionProcessingSheetDto processingSheetDto = baseMapper.selectProcessingSheet(supervisionRecordId);
+
+        // 鎻愬嚭浜虹鍚�
+        String raiseUrl = null;
+        if (processingSheetDto.getProposingDepartmentPersonId() != null) {
+            raiseUrl = userMapper.selectById(processingSheetDto.getProposingDepartmentPersonId()).getSignatureUrl();
+            if (StringUtils.isBlank(raiseUrl)) {
+                throw new ErrorException("鎵句笉鍒版彁鍑轰汉鐨勭鍚�");
+            }
+        }
+
+        // 鍘熷洜鍒嗘瀽浜�
+        String causeUrl = null;
+        if (processingSheetDto.getCauseAnalysisPersonId() != null) {
+            causeUrl = userMapper.selectById(processingSheetDto.getCauseAnalysisPersonId()).getSignatureUrl();
+            if (StringUtils.isBlank(causeUrl)) {
+                throw new ErrorException("鎵句笉鍒板師鍥犲垎鏋愪汉鐨勭鍚�");
+            }
+        }
+
+        // 绾犳浜�
+        String correctUrl = null;
+        if (processingSheetDto.getCorrectiveActionId() != null) {
+            correctUrl = userMapper.selectById(processingSheetDto.getCorrectiveActionId()).getSignatureUrl();
+            if (StringUtils.isBlank(correctUrl)) {
+                throw new ErrorException("鎵句笉鍒扮籂姝d汉鐨勭鍚�");
+            }
+        }
+
+        // 楠岃瘉浜�
+        String validationUrl = null;
+        if (processingSheetDto.getVerificationDepartmentPersonId() != null) {
+            validationUrl = userMapper.selectById(processingSheetDto.getVerificationDepartmentPersonId()).getSignatureUrl();
+            if (StringUtils.isBlank(validationUrl)) {
+                throw new ErrorException("鎵句笉鍒伴獙璇佷汉鐨勭鍚�");
+            }
+        }
+
+        // 鑾峰彇璺緞
+        InputStream inputStream = this.getClass().getResourceAsStream("/static/supervision-processing-sheet.docx");
+        ConfigureBuilder builder = Configure.builder();
+        builder.useSpringEL(true);
+        String finalRaiseUrl = raiseUrl;
+        String finalCauseUrl = causeUrl;
+        String finalCorrectUrl = correctUrl;
+        String finalValidationUrl = validationUrl;
+        XWPFTemplate template = XWPFTemplate.compile(inputStream, builder.build()).render(
+                new HashMap<String, Object>() {{
+                    put("processing", processingSheetDto);
+                    put("raiseUrl", StringUtils.isNotBlank(finalRaiseUrl) ? Pictures.ofLocal(imgUrl + "/" + finalRaiseUrl).create() : null);
+                    put("causeUrl", StringUtils.isNotBlank(finalCauseUrl) ? Pictures.ofLocal(imgUrl + "/" + finalCauseUrl).create() : null);
+                    put("correctUrl", StringUtils.isNotBlank(finalCorrectUrl) ? Pictures.ofLocal(imgUrl + "/" + finalCorrectUrl).create() : null);
+                    put("validationUrl", StringUtils.isNotBlank(finalValidationUrl) ? Pictures.ofLocal(imgUrl + "/" + finalValidationUrl).create() : null);
+                }});
+
+        try {
+            response.setContentType("application/msword");
+            String fileName = URLEncoder.encode(
+                    "浜哄憳鐩戠潱璁板綍绾犳澶勭悊鍗�", "UTF-8");
+            response.setHeader("Content-disposition",
+                    "attachment;filename=" + fileName + ".docx");
+            OutputStream os = response.getOutputStream();
+            template.write(os);
+            os.flush();
+            os.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException("瀵煎嚭澶辫触");
+        }
+    }
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonSupervisionRecordServiceImpl.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonSupervisionRecordServiceImpl.java
new file mode 100644
index 0000000..13d1916
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonSupervisionRecordServiceImpl.java
@@ -0,0 +1,125 @@
+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.StringUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.deepoove.poi.XWPFTemplate;
+import com.deepoove.poi.config.Configure;
+import com.deepoove.poi.config.ConfigureBuilder;
+import com.deepoove.poi.data.Pictures;
+import com.ruoyi.common.utils.DateImageUtil;
+import com.ruoyi.framework.exception.ErrorException;
+import com.ruoyi.personnel.dto.PersonSupervisionRecordDto;
+import com.ruoyi.personnel.mapper.PersonSupervisionRecordMapper;
+import com.ruoyi.personnel.pojo.PersonSupervisionControlSheet;
+import com.ruoyi.personnel.pojo.PersonSupervisionProcessingSheet;
+import com.ruoyi.personnel.pojo.PersonSupervisionRecord;
+import com.ruoyi.personnel.service.PersonSupervisionControlSheetService;
+import com.ruoyi.personnel.service.PersonSupervisionProcessingSheetService;
+import com.ruoyi.personnel.service.PersonSupervisionRecordService;
+import com.ruoyi.system.mapper.UserMapper;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+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-10 04:16:49
+ */
+@Service
+@Transactional(rollbackFor = Exception.class)
+public class PersonSupervisionRecordServiceImpl extends ServiceImpl<PersonSupervisionRecordMapper, PersonSupervisionRecord> implements PersonSupervisionRecordService {
+
+    @Autowired
+    private PersonSupervisionControlSheetService personSupervisionControlSheetService;
+
+    @Autowired
+    private PersonSupervisionProcessingSheetService personSupervisionProcessingSheetService;
+
+    @Autowired
+    private UserMapper userMapper;
+
+    @Value("${file.path}")
+    private String imgUrl;
+
+    @Override
+    public void deletePersonSupervisionRecord(List<Integer> ids) {
+        if (CollectionUtils.isNotEmpty(ids)) {
+            ids.forEach(id -> {
+                personSupervisionControlSheetService.remove(Wrappers.<PersonSupervisionControlSheet>lambdaQuery()
+                        .eq(PersonSupervisionControlSheet::getSupervisionRecordId, id));
+                personSupervisionProcessingSheetService.remove(Wrappers.<PersonSupervisionProcessingSheet>lambdaQuery()
+                        .eq(PersonSupervisionProcessingSheet::getSupervisionRecordId, id));
+                baseMapper.deleteById(id);
+            });
+        }
+    }
+
+    @Override
+    public IPage<PersonSupervisionRecordDto> personSupervisionRecordPage(Page page, Integer userId, String userName, Integer departLimsId) {
+        return baseMapper.personSupervisionRecordPage(page, userId, departLimsId, userName);
+    }
+
+    /**
+     * 瀵煎嚭浜哄憳鐩戠潱璁板綍
+     *
+     * @param id
+     * @param response
+     */
+    @Override
+    public void exportPersonSupervisionRecord(Integer id, HttpServletResponse response) {
+        PersonSupervisionRecordDto recordDto = baseMapper.selectPersonSupervisionRecord(id);
+        recordDto.setPersonnelName(recordDto.getPersonnel());
+        //鑾峰彇鎶�鏈礋璐d汉鐨勭鍚嶅湴鍧�
+        String ratifyUrl = null;
+        if (recordDto.getTechnicalDirector() != null) {
+            ratifyUrl = userMapper.selectById(recordDto.getTechnicalDirector()).getSignatureUrl();
+            if (StringUtils.isBlank(ratifyUrl)) {
+                throw new ErrorException("鎵句笉鍒版妧鏈礋璐d汉鐨勭鍚�");
+            }
+        }
+        // 鑾峰彇璺緞
+        InputStream inputStream = this.getClass().getResourceAsStream("/static/supervision-record.docx");
+        ConfigureBuilder builder = Configure.builder();
+        builder.useSpringEL(true);
+        String finalRatifyUrl = ratifyUrl;
+        XWPFTemplate template = XWPFTemplate.compile(inputStream, builder.build()).render(
+                new HashMap<String, Object>() {{
+                    put("supervision", recordDto);
+                    put("technicalDirectorUrl", StringUtils.isNotBlank(finalRatifyUrl) ? Pictures.ofLocal(imgUrl + "/" + finalRatifyUrl).create() : null);
+                    put("technicalDirectorDateUrl", recordDto.getTechnicalDirectorDate() != null ?
+                            Pictures.ofStream(DateImageUtil.createDateImage(recordDto.getTechnicalDirectorDate())).create() : null);
+                    put("testDateUrl", recordDto.getDetectionDate() != null ?
+                            Pictures.ofStream(DateImageUtil.createDateImage(recordDto.getDetectionDate())).create() : null);
+                }});
+        try {
+            response.setContentType("application/msword");
+            String fileName = URLEncoder.encode(
+                    "浜哄憳鐩戠潱璁板綍", "UTF-8");
+            response.setHeader("Content-disposition",
+                    "attachment;filename=" + fileName + ".docx");
+            OutputStream os = response.getOutputStream();
+            template.write(os);
+            os.flush();
+            os.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException("瀵煎嚭澶辫触");
+        }
+    }
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonTrackRecordServiceImpl.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonTrackRecordServiceImpl.java
new file mode 100644
index 0000000..8694e85
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonTrackRecordServiceImpl.java
@@ -0,0 +1,33 @@
+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.mapper.PersonTrackRecordMapper;
+import com.ruoyi.personnel.pojo.PersonTrackRecord;
+import com.ruoyi.personnel.service.PersonTrackRecordService;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 宸ヤ綔灞ュ巻 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-09-02 03:13:03
+ */
+@Service
+public class PersonTrackRecordServiceImpl extends ServiceImpl<PersonTrackRecordMapper, PersonTrackRecord> implements PersonTrackRecordService {
+
+    @Override
+    public IPage<PersonTrackRecord> personTrackRecordSelect(Page page, String userId, String departmentId) {
+        return baseMapper.personTrackRecordSelect(page, userId, departmentId);
+    }
+
+    @Override
+    public List<PersonTrackRecord> personTrackRecordExport(String userId, String departmentId) {
+        return baseMapper.personTrackRecordExport(userId, departmentId);
+    }
+}
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..e6f5e0b
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonTrainingDetailedServiceImpl.java
@@ -0,0 +1,363 @@
+package com.ruoyi.personnel.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.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.DepartmentLims;
+import com.ruoyi.common.core.domain.entity.User;
+import com.ruoyi.common.numgen.NumberGenerator;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.framework.exception.ErrorException;
+import com.ruoyi.personnel.dto.PersonTrainingDetailedDto;
+import com.ruoyi.personnel.enumeration.AttachmentType;
+import com.ruoyi.personnel.excel.PersonTrainingDetailedUpload;
+import com.ruoyi.personnel.mapper.*;
+import com.ruoyi.personnel.pojo.*;
+import com.ruoyi.personnel.service.PersonTrainingDetailedService;
+import com.ruoyi.system.mapper.DepartmentLimsMapper;
+import com.ruoyi.system.mapper.UserMapper;
+import com.ruoyi.system.service.DepartmentLimsService;
+import lombok.AllArgsConstructor;
+import org.apache.commons.math3.analysis.function.Power;
+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.ServletOutputStream;
+import javax.servlet.http.HttpServletResponse;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.net.URLEncoder;
+import java.text.SimpleDateFormat;
+import java.time.LocalDateTime;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ * 鍩硅璁″垝璇︽儏 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-10-11 01:46:27
+ */
+@Service
+@Transactional(rollbackFor = Exception.class)
+public class PersonTrainingDetailedServiceImpl extends ServiceImpl<PersonTrainingDetailedMapper, PersonTrainingDetailed> implements PersonTrainingDetailedService {
+
+    @Resource
+    private DepartmentLimsService departmentLimsService;
+
+    @Resource
+    private UserMapper userMapper;
+
+    @Resource
+    private PersonTrainingRecordMapper personTrainingRecordMapper;
+
+    @Resource
+    private PersonTrainingMapper personTrainingMapper;
+
+//    private PowerMapper powerMapper;
+
+    @Resource
+    private PersonTrainingFileMapper personTrainingFileMapper;
+
+    @Resource
+    private NumberGenerator<PersonTrainingDetailed> numberGenerator;
+
+    @Resource
+    private DepartmentLimsMapper departmentLimsMapper;
+
+    @Value("${file.path}")
+    private String imgUrl;
+
+    @Value("${excelUrl}")
+    private String excelUrl;
+
+    @Value("${wordUrl}")
+    private String wordUrl;
+
+    /**
+     *
+     * @param file
+     * @param id 骞村害璁″垝鏄庣粏琛╥d
+     */
+    @Override
+    public Map<String,Object> fileUpload(MultipartFile file, Integer id) {
+        HashMap<String, Object> map = new HashMap<>();
+        String fileName = file.getOriginalFilename();
+
+        try {
+            UUID uuid = UUID.randomUUID();
+            String uuidString = uuid.toString();
+            int i = fileName.indexOf(".");
+            String suffix = fileName.substring(i); //鏂囦欢鍚庣紑
+            String url = uuidString + suffix;
+            String OriginalFileName = fileName.substring(0,i); // 鏂囦欢鍘熷悕绉�
+            // 瀛樻斁璺緞
+            String path = "";
+            // 鏍规嵁涓嶅悓鐨勫悗缂�瀛樻斁鍦ㄤ笉鍚岀殑璺緞涓�
+            if(suffix.toLowerCase().contains("xls")) {
+                path = excelUrl;
+            } else if (suffix.toLowerCase().contains("doc") || suffix.toLowerCase().contains("pdf")) {
+                path = wordUrl;
+            }else {
+                path = imgUrl;
+            }
+            File uploadDir  = new File(path);
+            if(!uploadDir.exists()){
+                uploadDir.mkdir();
+            }
+            File destFile = new File(uploadDir , url);
+            file.transferTo(destFile);
+            // 灏嗘枃浠惰矾寰勫瓨鍌ㄥ埌鏁版嵁搴�
+            PersonTrainingFile personTrainingFile = new PersonTrainingFile();
+            personTrainingFile.setDetailId(id);
+            personTrainingFile.setFileName(OriginalFileName + suffix);
+            personTrainingFile.setFileUrl("/"+url);
+            personTrainingFile.setCreateUser(SecurityUtils.getUserId().intValue());
+            personTrainingFile.setCreateTime(LocalDateTime.now());
+            personTrainingFileMapper.insert(personTrainingFile);
+
+
+            map.put("fileName",OriginalFileName + suffix);
+            map.put("url","/"+url);
+        } catch (IOException e) {
+            throw new ErrorException("涓婁紶澶辫触");
+        }
+        return map;
+    }
+
+    @Override
+    public List<DepartmentLims> selectDepartLims() {
+        List<DepartmentLims> departmentLims = departmentLimsMapper.selectList(null);
+        return departmentLims;
+
+
+    }
+
+    @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);
+            personTrainingDetailed.setClassHour(Double.parseDouble( i.getClassHour()));
+            // 鍖归厤涓惧姙閮ㄩ棬
+            DepartmentLims departmentLims = departmentLimsService.getOne(Wrappers.<DepartmentLims>lambdaQuery()
+                    .eq(DepartmentLims::getName, i.getHoldingDepartment()));
+            if (ObjectUtils.isEmpty(departmentLims)) {
+                throw new ErrorException("鏈尮閰嶅埌涓惧姙閮ㄩ棬锛�" + i.getHoldingDepartment());
+            }
+            personTrainingDetailed.setHoldingDepartment(departmentLims.getId());
+
+//            // 鍖归厤璁插笀
+//            String[] names = i.getTrainingLecturerName().split("銆亅锛寍,|\\s+");
+//            ArrayList<Integer> ids = new ArrayList<>();
+//            for(String name : names) {
+//                if(StringUtils.isNotEmpty(name)) {
+//                    User user = userMapper.selectOne(Wrappers.<User>lambdaQuery()
+//                            .eq(User::getName, name));
+//                    if(Objects.isNull(user)) {
+//                        throw new ErrorException("鏈壘鍒拌璁插笀锛�" + name);
+//                    }
+//                    ids.add(user.getId());
+//                }
+//            }
+//            String collect = ids.stream().map(item -> item.toString()).collect(Collectors.joining(","));
+            personTrainingDetailed.setTrainingLecturerId(i.getTrainingLecturerName());
+            personTrainingDetailed.setPlanId(planId);
+            personTrainingDetailed.setState(3);
+
+            String year = new SimpleDateFormat("yy", Locale.CHINESE).format(new Date());
+            String month = new SimpleDateFormat("MM", Locale.CHINESE).format(new Date());
+            String processNumber = numberGenerator.generateNumberWithPrefix(4, "KC" + month + "-" + year + month, PersonTrainingDetailed::getCourseCode);
+            personTrainingDetailed.setCourseCode(processNumber);
+            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,Integer departId,Integer state) {
+        // 鍒ゆ柇褰撳墠浜烘槸鍚︽湁鏉冮檺鏌ョ湅骞村害璁″垝涓昏〃
+        Integer userId1 = SecurityUtils.getUserId().intValue();
+        User user = userMapper.selectById(userId1);
+        String name1 =  user.getName();
+        Integer currentUserId = user.getId();
+        //todo 鏉冮檺寰呭畬鎴�
+//        List<Power> powers = powerMapper.selectList(new LambdaQueryWrapper<Power>()
+//                .eq(Power::getRoleId, user.getRoleId())
+//                .eq(Power::getMenuMethod,"personTrainingSelect"));
+//        if(CollectionUtils.isEmpty(powers)) {
+//            if(Objects.isNull(departId) || departId == 1) {
+//                // 娌℃湁鏉冮檺 灏遍粯璁ゆ煡鐪嬭嚜宸遍儴闂ㄦ渶鏂扮殑骞村害璁″垝  18 閫氫俊浜у搧瀹為獙瀹�  19 鐢靛姏浜у搧瀹為獙瀹�
+//                if(user.getDepartLimsId().contains("18")) {
+//                    List<PersonTraining> personTrainings = personTrainingMapper.selectList(new LambdaQueryWrapper<PersonTraining>()
+//                            .eq(PersonTraining::getDepartId, 18)
+//                            .orderByDesc(PersonTraining::getId));
+//                    if(CollectionUtils.isNotEmpty(personTrainings)) {
+//                        id = personTrainings.get(0).getId();
+//                    }
+//                }else if(user.getDepartLimsId().contains("19")) {
+//                    List<PersonTraining> personTrainings = personTrainingMapper.selectList(new LambdaQueryWrapper<PersonTraining>()
+//                            .eq(PersonTraining::getDepartId, 19)
+//                            .orderByDesc(PersonTraining::getId));
+//                    if(CollectionUtils.isNotEmpty(personTrainings)) {
+//                        id = personTrainings.get(0).getId();
+//                    }
+//                }
+//            }else {
+//                List<PersonTraining> personTrainings = personTrainingMapper.selectList(new LambdaQueryWrapper<PersonTraining>()
+//                        .eq(PersonTraining::getDepartId, departId)
+//                        .orderByDesc(PersonTraining::getId));
+//                if(CollectionUtils.isNotEmpty(personTrainings)) {
+//                    id = personTrainings.get(0).getId();
+//                }
+//            }
+//        }
+        if(Objects.nonNull(state)) {
+            if(state == -1) {
+                state = null;
+            }
+        }
+        IPage<PersonTrainingDetailedDto> list = baseMapper.queryTheAnnualPlanDetailsTable(page, trainingLecturerName, courseCode, trainingDate, id, userId, userId1,state);
+        // 鎶ュ悕浜烘暟
+        List<PersonTrainingDetailedDto> records = list.getRecords();
+        for(PersonTrainingDetailedDto a : records) {
+            // 鎶ュ悕鐨勪汉鏁�
+            List<PersonTrainingRecord> personTrainingRecords = personTrainingRecordMapper.selectList(new LambdaQueryWrapper<PersonTrainingRecord>()
+                    .eq(PersonTrainingRecord::getCourseId, a.getId()));
+            a.setEnrollment(CollectionUtils.isNotEmpty(personTrainingRecords) ? personTrainingRecords.size() : 0);
+            List<Integer> collect = personTrainingRecords.stream().map(PersonTrainingRecord::getUserId).collect(Collectors.toList());
+            if(collect.contains(SecurityUtils.getUserId().intValue())) {
+                a.setWhetherClaim(true);
+            }else {
+                a.setWhetherClaim(false);
+            }
+            //鍓嶇鏉冮檺闇�瑕� 鏄惁鍙互鎿嶄綔鎸夐挳
+//            if(a.getTrainingLecturerId().contains(name1) || CollectionUtils.isNotEmpty(powers) ||
+//                    (Objects.nonNull(a.getAssessmentUserId()) && a.getAssessmentUserId().equals(currentUserId)) || Arrays.asList(16,36,35).contains(currentUserId)) {
+//                a.setIsDisabled(1); // 1涓嶇鐢�
+//            }else{
+//                a.setIsDisabled(0);
+//            }
+        }
+        return list;
+    }
+
+    @Override
+    public List<PersonTrainingFile> getFileData(Integer detailedId) {
+        List<PersonTrainingFile> personTrainingFiles = personTrainingFileMapper.selectList(new LambdaQueryWrapper<PersonTrainingFile>()
+                .eq(PersonTrainingFile::getDetailId, detailedId)
+                .eq(PersonTrainingFile::getEnumAttachmentType, AttachmentType.getTypeValue(2)));
+        if(CollectionUtils.isNotEmpty(personTrainingFiles)) {
+            for(PersonTrainingFile a : personTrainingFiles) {
+                // 璁剧疆mime
+                int i = a.getFileUrl().indexOf(".");
+                String contentType = getContentType(a.getFileUrl().substring(i + 1));
+                a.setMime(contentType);
+            }
+        }
+        return personTrainingFiles;
+    }
+
+    @Override
+    public void deleteFile(Integer id) {
+        personTrainingFileMapper.deleteById(id);
+    }
+
+    @Override
+    public void fileDownLoad(Integer id, HttpServletResponse response) {
+        // 鏍规嵁id鏌ヨ涓嬭浇鐨勬枃浠�
+        PersonTrainingFile personTrainingFile = personTrainingFileMapper.selectById(id);
+        if(Objects.nonNull(personTrainingFile)) {
+            // 鎷垮埌鏂囦欢璺緞
+            String fileUrl = personTrainingFile.getFileUrl();
+            int i = fileUrl.indexOf(".");
+            String suffix = fileUrl.substring(i); // 鏂囦欢鍚庣紑
+            String url = "";
+            if(suffix.toLowerCase().contains("xls")) {
+                 url = excelUrl + File.separator + fileUrl;
+            } else if (suffix.toLowerCase().contains("doc") || suffix.toLowerCase().contains("pdf")) {
+                url = wordUrl + File.separator + fileUrl;
+            }else {
+                url = imgUrl + File.separator + fileUrl;
+            }
+            File file = new File(url);
+            if(!file.exists()) {
+                throw new ErrorException("鏂囦欢涓嶅瓨鍦ㄦ垨鎹熷潖");
+            }
+            // 鑾峰彇鏂囦欢杈撳叆娴�
+            try(FileInputStream fileInputStream = new FileInputStream(file); ServletOutputStream outputStream = response.getOutputStream()) {
+                String contentType = getContentType(fileUrl.substring(i + 1));
+                // 璁剧疆鍝嶅簲澶�
+                response.setContentType(contentType);
+                int i1 = personTrainingFile.getFileName().indexOf(".");
+                String fileName = URLEncoder.encode(personTrainingFile.getFileName().substring(0, i1), "UTF-8");
+                response.setHeader("Content-disposition", "attachment;filename=" + fileName + suffix);
+                byte[] bytes = new byte[1024];
+                int bytesRead;
+                while ((bytesRead = fileInputStream.read(bytes)) != -1 ){
+                    outputStream.write(bytes,0,bytesRead);
+                }
+                outputStream.flush();
+            } catch (Exception e) {
+                throw new RuntimeException(e);
+            }
+        }
+    }
+    // 鏍规嵁鏂囦欢鎵╁睍鍚嶈幏鍙� MIME 绫诲瀷
+    private String getContentType(String fileExtension) {
+        switch (fileExtension) {
+            case "jpg":
+            case "jpeg":
+                return "image/jpeg";
+            case "png":
+                return "image/png";
+            case "gif":
+                return "image/gif";
+            case "pdf":
+                return "application/pdf";
+            case "doc":
+                return "application/msword";
+            case "docx":
+                return "application/vnd.openxmlformats-officedocument.wordprocessingml.document";
+            case "xls":
+                return "application/vnd.ms-excel";
+            case "xlsx":
+                return "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
+            case "ppt":
+            case "pptx":
+                return "application/vnd.ms-powerpoint";
+            default:
+                return "application/octet-stream"; // 榛樿浜岃繘鍒舵祦
+        }
+    }
+
+
+
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonTrainingFileServiceImpl.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonTrainingFileServiceImpl.java
new file mode 100644
index 0000000..00cebee
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonTrainingFileServiceImpl.java
@@ -0,0 +1,14 @@
+package com.ruoyi.personnel.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.personnel.mapper.PersonTrainingFileMapper;
+import com.ruoyi.personnel.pojo.PersonTrainingFile;
+import com.ruoyi.personnel.service.PersonTrainingFileService;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+
+@Service
+@AllArgsConstructor
+public class PersonTrainingFileServiceImpl extends ServiceImpl<PersonTrainingFileMapper,PersonTrainingFile>
+        implements PersonTrainingFileService {
+}
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..2148986
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonTrainingRecordServiceImpl.java
@@ -0,0 +1,338 @@
+package com.ruoyi.personnel.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.deepoove.poi.XWPFTemplate;
+import com.deepoove.poi.config.Configure;
+import com.ruoyi.common.core.domain.entity.User;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.framework.exception.ErrorException;
+import com.ruoyi.inspect.util.HackLoopTableRenderPolicy;
+import com.ruoyi.performance.mapper.AuxiliaryWorkingHoursDayMapper;
+import com.ruoyi.performance.mapper.PerformanceShiftMapper;
+import com.ruoyi.performance.pojo.AuxiliaryWorkingHoursDay;
+import com.ruoyi.performance.pojo.PerformanceShift;
+import com.ruoyi.performance.service.AuxiliaryWorkingHoursDayService;
+import com.ruoyi.personnel.dto.PersonTrainingRecordDto;
+import com.ruoyi.personnel.dto.PersonTrainingRecordListDto;
+import com.ruoyi.personnel.dto.TrainingRecordPersonDetailedDto;
+import com.ruoyi.personnel.mapper.*;
+import com.ruoyi.personnel.pojo.*;
+import com.ruoyi.personnel.service.PersonTrainingDetailedService;
+import com.ruoyi.personnel.service.PersonTrainingRecordService;
+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 javax.servlet.http.HttpServletResponse;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.net.URLEncoder;
+import java.text.SimpleDateFormat;
+import java.time.*;
+import java.time.temporal.TemporalField;
+import java.time.temporal.WeekFields;
+import java.util.*;
+
+/**
+ * <p>
+ * 鍩硅璁板綍 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-10-12 04:50:48
+ */
+@Transactional(rollbackFor = Exception.class)
+@Service
+public class PersonTrainingRecordServiceImpl extends ServiceImpl<PersonTrainingRecordMapper, PersonTrainingRecord> implements PersonTrainingRecordService {
+
+    @Resource
+    private UserMapper userMapper;
+
+    @Resource
+    private PersonTrainingDetailedService personTrainingDetailedService;
+
+    @Resource
+    private PersonTrainingDetailedMapper personTrainingDetailedMapper;
+
+    @Resource
+    private AuxiliaryWorkingHoursDayMapper auxiliaryWorkingHoursDayMapper;
+
+    @Resource
+    private PerformanceShiftMapper shiftMapper;
+
+    @Autowired
+    private AuxiliaryWorkingHoursDayService auxiliaryWorkingHoursDayService;
+
+
+    @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 IPage<TrainingRecordPersonDetailedDto> queryPersonnelDetails(Page page, Integer userId) {
+        return baseMapper.queryPersonnelDetails(page, userId);
+    }
+
+    @Override
+    public void claimOfTrainingAndAssessmentRecords(Boolean claimAndClaim, Integer courseId) {
+        int userId = SecurityUtils.getUserId().intValue();
+        // 1銆佹煡璇㈠煿璁绋嬶紝鍙栧煿璁棩鏈熶笌寮�濮嬫棩鏈燂紝涓庡綋鍓嶆椂闂存瘮杈冿紝鍒ゆ柇鏄惁瓒呭嚭锛屽鏋滆秴鍑轰笉鍏佽璁ら
+        Boolean doesItExceedState = doesItExceed(courseId);
+        if (!doesItExceedState) {
+            throw new ErrorException("褰撳墠璇剧▼鐘舵�佹棤娉曡棰嗭紒");
+        }
+        // 2銆佸垽鏂槸鍚﹂噸澶�
+        PersonTrainingRecord personTrainingRecord1 = baseMapper.selectOne(Wrappers.<PersonTrainingRecord>lambdaQuery()
+                .eq(PersonTrainingRecord::getCourseId, courseId)
+                .eq(PersonTrainingRecord::getUserId, userId));
+        if (ObjectUtils.isNotEmpty(personTrainingRecord1)) {
+            throw new ErrorException("璇峰嬁閲嶅璁ら锛�");
+        }
+        // 3銆佸鏋滄湭閲嶅鏂板鍩硅璁板綍
+        // true 璁ら
+        if (claimAndClaim) {
+            PersonTrainingRecord personTrainingRecord = new PersonTrainingRecord();
+            personTrainingRecord.setUserId(userId);
+            personTrainingRecord.setCourseId(courseId);
+            baseMapper.insert(personTrainingRecord);
+        // 鍙栨秷璁ら
+        } else {
+            baseMapper.delete(Wrappers.<PersonTrainingRecord>lambdaQuery()
+                    .eq(PersonTrainingRecord::getUserId, userId)
+                    .eq(PersonTrainingRecord::getCourseId, courseId));
+        }
+    }
+
+    /**
+     * 瀵煎嚭浜哄憳鍩硅璁板綍
+     * @param userId
+     * @param response
+     */
+    @Override
+    public void exportTrainingRecord(Integer userId, HttpServletResponse response) {
+        // 鏌ヨ浜哄憳浜轰俊鎭�
+        PersonTrainingRecordListDto trainingRecordListDto = baseMapper.selectUserTraining(userId);
+
+        // 鏌ヨ鍩硅璁板綍
+        List<TrainingRecordPersonDetailedDto> personDetailedDtos = baseMapper.selectPersonDetailedDtos(userId);
+
+
+        // 鑾峰彇璺緞
+        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("瀵煎嚭澶辫触");
+        }
+
+
+    }
+
+    @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("瀵煎嚭澶辫触");
+        }
+    }
+
+    @Override
+    public void outOfFocusPreservation(PersonTrainingRecord personTrainingRecord) {
+        int userId = SecurityUtils.getUserId().intValue();
+        // 鍩硅閫氳繃浜嗭紝鍩硅璇炬椂璁″叆鍒板綋澶╃殑杈呭姪宸ユ椂 (杈呭姪宸ユ椂 浠ュ強 鏍稿噯宸ユ椂閮芥坊鍔�)
+        baseMapper.updateById(personTrainingRecord);
+        PersonTrainingDetailed personTrainingDetailed = personTrainingDetailedMapper.selectById(personTrainingRecord.getCourseId());
+        if(Objects.nonNull(personTrainingDetailed)) {
+            Double classHour = personTrainingDetailed.getClassHour(); // 璇炬椂
+            String trainingDateTwo = personTrainingDetailed.getTrainingDateTwo(); // 鍩硅鏃ユ湡
+            if(StringUtils.isEmpty(trainingDateTwo)) {
+                throw new ErrorException("娌℃湁璁剧疆鍩硅鏃ユ湡鏃犳硶娣诲姞杈呭姪宸ユ椂");
+            }
+            // 鏄惁浠ュ強娣诲姞杩囦簡
+            List<AuxiliaryWorkingHoursDay> auxiliaryWorkingHoursDays = auxiliaryWorkingHoursDayMapper.selectList(new LambdaQueryWrapper<AuxiliaryWorkingHoursDay>()
+                    .eq(AuxiliaryWorkingHoursDay::getNameUser, personTrainingRecord.getUserId())
+                    .eq(AuxiliaryWorkingHoursDay::getAuxiliaryProject, personTrainingDetailed.getTrainingContent())
+                    .eq(AuxiliaryWorkingHoursDay::getCreateUser, userId)
+                    .eq(AuxiliaryWorkingHoursDay::getDateTime, trainingDateTwo + " 00:00:00"));
+            // 濡傛灉鏈夋暟鎹� 鍚堟牸灏变笉鍋氬鐞�   涓嶅悎鏍煎氨鍒犻櫎
+            if(CollectionUtils.isNotEmpty(auxiliaryWorkingHoursDays)) {
+                if(personTrainingRecord.getExaminationResults().equals("涓嶅悎鏍�")) {
+                    auxiliaryWorkingHoursDayMapper.delete(new LambdaQueryWrapper<AuxiliaryWorkingHoursDay>()
+                            .eq(AuxiliaryWorkingHoursDay::getNameUser, personTrainingRecord.getUserId())
+                            .eq(AuxiliaryWorkingHoursDay::getAuxiliaryProject, personTrainingDetailed.getTrainingContent())
+                            .eq(AuxiliaryWorkingHoursDay::getCreateUser, userId)
+                            .eq(AuxiliaryWorkingHoursDay::getDateTime, trainingDateTwo + " 00:00:00"));
+                }
+            }
+            // 鏄惁閫氳繃
+            if(personTrainingRecord.getExaminationResults().equals("鍚堟牸") && CollectionUtils.isEmpty(auxiliaryWorkingHoursDays)) {
+                // 濡傛灉鏄娴嬪姙鐨勪汉灏变笉鐢ㄥ姞
+                User user = userMapper.selectById(personTrainingRecord.getUserId());
+                if(user.getDepartLimsId().contains("22")) {
+                    return;
+                }
+                // 涓�鑺傝45鍒嗛挓 宸ユ椂60鍒嗛挓
+                BigDecimal minute = BigDecimal.valueOf(classHour).multiply(new BigDecimal("45")); // 鍏蜂綋鍒嗛挓
+                BigDecimal divide = minute.divide(new BigDecimal("60"),4, RoundingMode.HALF_UP); // 宸ユ椂
+                // 娣诲姞鏁版嵁
+                AuxiliaryWorkingHoursDay a = new AuxiliaryWorkingHoursDay();
+                a.setNameUser(personTrainingRecord.getUserId()); // 濮撳悕id
+                // 椤圭洰鍚嶇О
+                a.setRemarks(personTrainingDetailed.getTrainingContent()); //  杈呭姪璇存槑
+                a.setNumber("401"); // 缂栧彿
+                AuxiliaryWorkingHoursDay auxiliaryWorkingHoursDay = auxiliaryWorkingHoursDayService.selectAuxiliaryWorkingHoursByNumber("401");
+                a.setAuxiliaryProject(auxiliaryWorkingHoursDay.getAuxiliaryProject()); // 杈呭姪椤圭洰鍚嶇О
+                a.setNonproductiveTime(Double.parseDouble(divide.toString())); // 杈呭姪宸ユ椂
+                a.setApprovedWorkingHour(auxiliaryWorkingHoursDay.getApprovedWorkingHour()); // 鏍稿噯宸ユ椂
+                a.setAmount(Double.parseDouble(divide.toString())); // 鏁伴噺
+                String year = trainingDateTwo.split("-")[0];
+                a.setYear(year); // 骞�
+                a.setCreateTime(LocalDateTime.now());
+                a.setUpdateTime(LocalDateTime.now());
+                a.setCreateUser(userId); // 鍒涘缓浜篿d
+                a.setUpdateUser(userId); // 淇敼浜篿d
+                a.setState("宸叉彁浜�"); // 鐘舵��
+                a.setDateTime(trainingDateTwo + " 00:00:00"); // 鏃ユ湡
+                // 鑾峰彇褰撳墠鏃ユ湡
+                LocalDate today = LocalDate.now();
+                // 鑾峰彇褰撳墠鏃ユ湡鐨勫懆娆★紙涓�骞翠腑鐨勭鍑犲懆锛�
+                TemporalField weekOfYear = WeekFields.of(Locale.getDefault()).weekOfYear();
+                int weekNumber = today.get(weekOfYear);
+                // 鑾峰彇褰撳墠鏃ユ湡鐨勬槦鏈燂紙涓�鍛ㄤ腑鐨勭鍑犲ぉ锛�
+                DayOfWeek dayOfWeek = today.getDayOfWeek();
+                int dayOfWeekNumber = dayOfWeek.getValue();
+                LocalDate now = LocalDate.now();
+                LocalTime parse = LocalTime.parse("00:00:00");
+                LocalDateTime of = LocalDateTime.of(now, parse);
+                PerformanceShift performanceShift = shiftMapper.selectOne(new LambdaQueryWrapper<PerformanceShift>().eq(PerformanceShift::getWorkTime, of)
+                        .eq(PerformanceShift::getUserId, personTrainingRecord.getUserId()));
+                if(Objects.nonNull(performanceShift)) {
+                    a.setShift(performanceShift.getShift()); // 鐝
+                }
+                a.setWeek(weekNumber+""); // 鍛ㄦ
+                a.setWeekDay(dayOfWeekNumber == 7 ? 0+"" : dayOfWeekNumber+""); // 鏄熸湡
+                auxiliaryWorkingHoursDayMapper.insert(a);
+            }
+        }
+
+    }
+
+    /**
+     * 妫�楠岃鍩硅璇剧▼鏄惁鍏佽璁ら
+     * @param courseId 璇ヨ绋嬬殑id
+     * @return
+     */
+    public Boolean doesItExceed(Integer courseId) {
+        PersonTrainingDetailed personTrainingDetailed = personTrainingDetailedService.getById(courseId);
+        // 鍙湁鐘舵�佷负3鍙互璁ら
+        if (!personTrainingDetailed.getState().equals(3)) {
+            return false;
+        }
+        SimpleDateFormat sdfWithoutTime = new SimpleDateFormat("yyyy-MM-dd");
+        if(Objects.isNull(personTrainingDetailed.getTrainingDateTwo()) || StringUtils.isEmpty(personTrainingDetailed.getTrainingDateTwo())) {
+            throw  new ErrorException("鏈厤缃煿璁棩鏈�,鏃犳硶鎶ュ悕");
+        }
+        LocalDate parse = LocalDate.parse(personTrainingDetailed.getTrainingDateTwo());
+        Date from = Date.from(parse.atStartOfDay(ZoneId.systemDefault()).toInstant());
+        String originalDateStr = sdfWithoutTime.format(from);
+        SimpleDateFormat sdfWithTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        try {
+            if(Objects.isNull(personTrainingDetailed.getOpeningTime()) || StringUtils.isEmpty(personTrainingDetailed.getOpeningTime())) {
+                throw  new ErrorException("鏈厤缃叿浣撴椂闂�,鏃犳硶鎶ュ悕");
+            }
+            // 娣诲姞鏃跺垎绉掑悗鐨勬棩鏈�
+            Date addedDate = sdfWithTime.parse(originalDateStr + " " + personTrainingDetailed.getOpeningTime());
+            // 鑾峰彇褰撳墠鏃堕棿
+            Date currentDate = new Date();
+            // 鏃ユ湡鏈秴鍑哄綋鍓嶆椂闂淬��
+            if (addedDate.after(currentDate) || addedDate.equals(currentDate)) {
+                return true;
+            // 鏃ユ湡宸茶秴鍑哄綋鍓嶆椂闂�
+            } else {
+                // 濡傛灉鏃ユ湡瓒呭嚭 鏇存柊璇剧▼鐘舵�佷负宸茬粨鏉�
+                personTrainingDetailedService.update(Wrappers.<PersonTrainingDetailed>lambdaUpdate()
+                        .eq(PersonTrainingDetailed::getId, courseId)
+                        .set(PersonTrainingDetailed::getState, 2));
+                return false;
+            }
+        } catch (Exception e) {
+            throw new ErrorException("鏃堕棿鏍煎紡閿欒锛�");
+        }
+    }
+}
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..a28a1e6
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonTrainingServiceImpl.java
@@ -0,0 +1,376 @@
+package com.ruoyi.personnel.service.impl;
+
+import com.alibaba.excel.EasyExcel;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+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.DepartmentLims;
+import com.ruoyi.common.core.domain.entity.User;
+import com.ruoyi.common.utils.DateImageUtil;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.framework.exception.ErrorException;
+import com.ruoyi.inspect.util.HackLoopTableRenderPolicy;
+import com.ruoyi.personnel.dto.*;
+import com.ruoyi.personnel.excel.PersonTrainingDetailedListener;
+import com.ruoyi.personnel.excel.PersonTrainingDetailedUpload;
+import com.ruoyi.personnel.mapper.*;
+import com.ruoyi.personnel.pojo.*;
+import com.ruoyi.personnel.service.PersonTrainingDetailedService;
+import com.ruoyi.personnel.service.PersonTrainingService;
+import com.ruoyi.system.mapper.DepartmentLimsMapper;
+import com.ruoyi.system.mapper.UserMapper;
+import org.apache.poi.ss.usermodel.Workbook;
+import org.apache.poi.ss.usermodel.WorkbookFactory;
+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.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URLEncoder;
+import java.text.SimpleDateFormat;
+import java.time.LocalDateTime;
+import java.util.*;
+
+/**
+ * <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;
+
+
+    @Resource
+    private PersonTrainingDetailedMapper personTrainingDetailedMapper;
+
+    @Resource
+    private PersonTrainingRecordMapper personTrainingRecordMapper;
+
+
+    @Autowired
+    private DepartmentLimsMapper departmentLimsMapper;
+
+    @Value("${file.path}")
+    private String imgUrl;
+
+    @Override
+    public IPage<PersonTrainingDto> personTrainingSelect(Page page, String compilerName, Integer departmentId) {
+        // 褰撳墠鐧诲綍浜�
+        Integer userId = SecurityUtils.getUserId().intValue();
+//        User user = Optional.ofNullable(userMapper.selectById(userId)).orElse(new User());
+//        if(3==user.getRoleId()){
+//            departmentId=null;
+//        }
+        // 濡傛灉浼犲叆浜哾epartId 灏变互浼犲叆鐨勪负鍑嗐�� 濡傛灉娌℃湁浼犲叆灏变互褰撳墠浜烘墍鍦ㄩ儴闂ㄤ负鍑�
+        if(Objects.isNull(departmentId)) {
+            User user = userMapper.selectById(userId);
+            String[] split = user.getDepartLimsId().split(",");
+            for(String departId : split) {
+                if(departId != "1" && StringUtils.isNotEmpty(departId)) {
+                    departmentId = Integer.parseInt(departId);
+                }
+            }
+            //todo 寰呬慨鏀� 濡傛灉褰撳墠浜烘槸绠$悊鍛樺氨鍙煡鐪嬪叏閮�
+//            if(user.getRoleId() == 3) {
+//                departmentId = null;
+//            }
+        }else {
+            // 濡傛灉浼犲叆鐨刣epartId鏄�1锛堜腑澶╃鎶�锛� 涓嶅仛澶勭悊
+            if(departmentId == 1) {
+                departmentId = null;
+            }
+        }
+        IPage<PersonTrainingDto> personTrainingDtoIPage = baseMapper.personTrainingSelect(page, compilerName, departmentId);
+        List<PersonTrainingDto> records = personTrainingDtoIPage.getRecords();
+        for (PersonTrainingDto dto : records) {
+            dto.setCurrentId(userId);
+        }
+        return personTrainingDtoIPage;
+    }
+
+    /**
+     *
+     * @param id 鏄庣粏琛╥d
+     */
+    @Override
+    public void deleteDetail(Integer id) {
+         personTrainingDetailedMapper.deleteById(id);
+         personTrainingRecordMapper.delete(Wrappers.<PersonTrainingRecord>lambdaQuery().eq(PersonTrainingRecord::getCourseId,id));
+    }
+
+    @Override
+    public void personTrainingImport(MultipartFile file) {
+        int userId = SecurityUtils.getUserId().intValue();
+        // 骞村害璁″垝鐖剁骇鏂板鏁版嵁
+        PersonTraining personSupervisePlan = new PersonTraining();
+        String fileName = file.getOriginalFilename().substring(0, file.getOriginalFilename().lastIndexOf("."));
+        personSupervisePlan.setFileName(fileName);
+        personSupervisePlan.setCompilerId(userId); // 缂栧埗浜�
+        personSupervisePlan.setCompilationDate(LocalDateTime.now());
+        try(Workbook workbook  = WorkbookFactory.create(file.getInputStream())) {
+            // 澶氫釜sheet椤� 寰楀尯鍒嗕竴涓嬮�氫俊鍜岀數鍔�
+            for (int i = 0; i < workbook.getNumberOfSheets(); i++) {
+                String sheetName = workbook.getSheetName(i);
+                // 鏍规嵁sheet鍚嶇О鏉ュ垎鍒粰瀵瑰簲鐨勫疄楠屽璧嬪��
+                DepartmentLims departmentLims = departmentLimsMapper.selectOne(Wrappers.<DepartmentLims>lambdaQuery().like(DepartmentLims::getName, sheetName));
+                if(Objects.nonNull(departmentLims)) {
+                    personSupervisePlan.setDepartId(departmentLims.getId());
+                    // 缂栧埗浜虹數鍔涚殑鏄儭闆湠  閫氫俊鐨勬槸琚侀洦闇�
+                    if(departmentLims.getId().equals(18)) {
+                        personSupervisePlan.setCompilerId(userMapper.selectList(new LambdaQueryWrapper<User>().eq(User::getName,"琚侀洦闇�")).get(0).getId());
+                    } else if (departmentLims.getId().equals(19)) {
+                        personSupervisePlan.setCompilerId(userMapper.selectList(new LambdaQueryWrapper<User>().eq(User::getName,"鑳¢洩闇�")).get(0).getId());
+                    }
+                    baseMapper.insert(personSupervisePlan);
+                    // 骞村害璁″垝璇︽儏 鏂板
+                    PersonTrainingDetailedListener personSupervisePlanDetailsListener = new PersonTrainingDetailedListener(personTrainingDetailedService,personSupervisePlan.getId());
+                    personSupervisePlanDetailsListener.setPlanId(personSupervisePlan.getId());
+                    //EasyExcel.read(file.getInputStream(), PersonTrainingDetailedUpload.class, personSupervisePlanDetailsListener).sheet().doRead();
+                    EasyExcel.read(file.getInputStream(),PersonTrainingDetailedUpload.class,new PersonTrainingDetailedListener(personTrainingDetailedService,personSupervisePlan.getId()))
+                            .headRowNumber(3).ignoreEmptyRow(false).sheet(sheetName).doRead();
+                    // 娣诲姞涓�娆″悗 娓呯┖id 闃叉鍑虹幇閲嶅key
+                    personSupervisePlan.setId(null);
+
+                }
+            }
+
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+
+    @Override
+    public void personTrainingDelete(Integer id) {
+        personTrainingDetailedService.remove(new LambdaQueryWrapper<PersonTrainingDetailed>().eq(PersonTrainingDetailed::getPlanId,id));
+        baseMapper.deleteById(id);
+    }
+
+    @Override
+    public void reviewAnnualPersonnelTraining(PersonTrainingUpdateDto personTrainingUpdateDto) {
+        PersonTraining personTraining = new PersonTraining();
+        personTraining.setId(personTrainingUpdateDto.getId());
+        // 濡傛灉鏄�氫俊 瀹℃牳浜哄氨鏄瓩纾� 鐢靛姏鐨勫垯鏄垬寤哄痉
+        PersonTraining personTraining1 = baseMapper.selectById(personTrainingUpdateDto.getId());
+        if(personTraining1.getDepartId().equals(19)) {
+            personTraining.setReviewerId(userMapper.selectList(new LambdaQueryWrapper<User>().eq(User::getName,"鍒樺缓寰�")).get(0).getId());
+        }else {
+            personTraining.setReviewerId(userMapper.selectList(new LambdaQueryWrapper<User>().eq(User::getName,"瀛欑")).get(0).getId());
+        }
+        personTraining.setAuditDate(LocalDateTime.now());
+        personTraining.setAuditRemarks(personTrainingUpdateDto.getRemarks());
+        personTraining.setReviewerStatus(personTrainingUpdateDto.getStatus());
+        baseMapper.updateById(personTraining);
+    }
+
+    @Override
+    public void approveAnnualPersonnelTraining(PersonTrainingUpdateDto personTrainingUpdateDto) {
+        Integer id = userMapper.selectList(new LambdaQueryWrapper<User>().eq(User::getName, "璁稿啗")).get(0).getId();
+        LambdaUpdateWrapper<PersonTraining> wrapper = Wrappers.<PersonTraining>lambdaUpdate()
+                .eq(PersonTraining::getId, personTrainingUpdateDto.getId())
+                .set(PersonTraining::getApproverId, id) // 鍙兘鏄鍐�
+                .set(PersonTraining::getApprovalDate, LocalDateTime.now())
+                .set(PersonTraining::getApprovalRemarks, personTrainingUpdateDto.getRemarks())
+                .set(PersonTraining::getApprovalStatus, personTrainingUpdateDto.getStatus());
+        if (personTrainingUpdateDto.getStatus().equals(2)) {
+            wrapper.set(PersonTraining::getReviewerStatus, null);
+        }
+        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.setTrainingLecturerName(detailedDto.getTrainingLecturerId());
+            if (detailedDto.getTrainingDate() != null) {
+                SimpleDateFormat sdfWithoutTime = new SimpleDateFormat("yyyy-MM-dd");
+//                detailedDto.setTrainingDateString(sdfWithoutTime.format(detailedDto.getTrainingDate()));
+                detailedDto.setTrainingDateString(detailedDto.getTrainingDate());
+            }
+            DepartmentLims departmentLims = departmentLimsMapper.selectById(detailedDto.getHoldingDepartment());
+            if(Objects.nonNull(departmentLims)) {
+                detailedDto.setOrganizingDepartment(departmentLims.getName());
+            }
+            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.getCreateTime().getYear());
+                    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);
+        detailedDto.setTrainingContent(detailedDto.getTrainingAbstract());
+        detailedDto.setTrainingLecturerName(detailedDto.getTrainingLecturerId()); // 鍩硅璁插笀
+        detailedDto.setTrainingDateString(detailedDto.getTrainingDateTwo()); // 鍩硅鏃ユ湡
+        // 鏌ヨ鍩硅鐨勪汉鍛�
+        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("瀵煎嚭澶辫触");
+        }
+
+
+    }
+}
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..1cd7929
--- /dev/null
+++ b/cnas-personnel/src/main/resources/mapper/PersonBasicInfoMapper.xml
@@ -0,0 +1,101 @@
+<?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">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.ruoyi.personnel.pojo.PersonBasicInfo">
+        <id column="id" property="id" />
+        <result column="current_state" property="currentState" />
+        <result column="entry_time" property="entryTime" />
+        <result column="post" property="post" />
+        <result column="professional_title" property="professionalTitle" />
+        <result column="sex" property="sex" />
+        <result column="personnel_classification" property="personnelClassification" />
+        <result column="date_birth" property="dateBirth" />
+        <result column="identity_card" property="identityCard" />
+        <result column="nation" property="nation" />
+        <result column="political_status" property="politicalStatus" />
+        <result column="official_academic_redentials" property="officialAcademicRedentials" />
+        <result column="graduation_time1" property="graduationTime1" />
+        <result column="graduated_institutions1" property="graduatedInstitutions1" />
+        <result column="major1" property="major1" />
+        <result column="graduation_time2" property="graduationTime2" />
+        <result column="graduated_institutions2" property="graduatedInstitutions2" />
+        <result column="major2" property="major2" />
+        <result column="telephone" property="telephone" />
+        <result column="end_planned_internship" property="endPlannedInternship" />
+        <result column="end_practical_practice" property="endPracticalPractice" />
+        <result column="date_departure" property="dateDeparture" />
+        <result column="desktop_picture" property="desktopPicture" />
+        <result column="attachment_information" property="attachmentInformation" />
+        <result column="remarks" property="remarks" />
+        <result column="user_id" property="userId" />
+        <result column="current_position" property="currentPosition" />
+    </resultMap>
+
+    <select id="selectLimsUser" resultType="com.ruoyi.common.core.dto.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 cpbi.*,u.*
+        FROM user u
+                 left join cnas_person_basic_info cpbi on cpbi.user_id = u.id
+        where u.id = #{userId}
+    </select>
+
+    <select id="basicInformationOfPersonnelSelectPage" resultType="java.util.Map">
+        select
+            u.id,
+            u.name,
+            u.account,
+            cpbi.sex,
+            cpbi.date_birth,
+            u.age,
+            cpbi.entry_time,
+            cpbi.personnel_classification,
+            cpbi.official_academic_redentials,
+            cpbi.current_position,
+            u.phone,
+            cpbi.date_departure,
+            cpbi.current_state,
+            u1.name createUser
+        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_by
+        where FIND_IN_SET(#{departmentId},u.depart_lims_id)
+    </select>
+    <select id="selectPersonBasecInfoAndUser" resultType="java.util.Map">
+        select
+            u.id  userId,
+            u.`name`  name,
+            u.account account,
+            DATE_FORMAT(cpbi.entry_time, '%Y-%m-%d') groupTime,
+            DATE_FORMAT(cpbi.end_practical_practice, '%Y-%m-%d')  endPracticalPracticeStr,
+            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,
+            cpbi.emergency_contact emergencyContact,
+            cpbi.emergency_contact_phone emergencyContactPhone
+        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_by
+        <where>
+            FIND_IN_SET(#{departmentId},u.depart_lims_id)
+            <if test="name != null and name != ''">
+                and u.name like concat('%',#{name},'%')
+            </if>
+        </where>
+    </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..5699c09
--- /dev/null
+++ b/cnas-personnel/src/main/resources/mapper/PersonCommunicationAbilityMapper.xml
@@ -0,0 +1,31 @@
+<?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">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.ruoyi.personnel.pojo.PersonCommunicationAbility">
+        <id column="id" property="id" />
+        <result column="user_id" property="userId" />
+        <result column="communication_time" property="communicationTime" />
+        <result column="communication_place" property="communicationPlace" />
+        <result column="communication_content" property="communicationContent" />
+        <result column="create_user" property="createUser" />
+        <result column="update_user" property="updateUser" />
+        <result column="create_time" property="createTime" />
+        <result column="update_time" property="updateTime" />
+    </resultMap>
+
+    <select id="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..75f8147
--- /dev/null
+++ b/cnas-personnel/src/main/resources/mapper/PersonJobResponsibilitiesMapper.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.personnel.mapper.PersonJobResponsibilitiesMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.ruoyi.personnel.pojo.PersonJobResponsibilities">
+        <id column="id" property="id" />
+        <result column="post_name" property="postName" />
+        <result column="job_objective" property="jobObjective" />
+        <result column="job_responsibilities" property="jobResponsibilities" />
+        <result column="incumbent_id" property="incumbentId" />
+        <result column="submitting_operator" property="submittingOperator" />
+        <result column="submitting_date" property="submittingDate" />
+        <result column="supervisor_id" property="supervisorId" />
+        <result column="incumbent_operator" property="incumbentOperator" />
+        <result column="incumbent_date" property="incumbentDate" />
+        <result column="supervisor_operator" property="supervisorOperator" />
+        <result column="supervisor_date" property="supervisorDate" />
+    </resultMap>
+
+    <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..343b1b5
--- /dev/null
+++ b/cnas-personnel/src/main/resources/mapper/PersonPersonnelCapacityMapper.xml
@@ -0,0 +1,168 @@
+<?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">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.ruoyi.personnel.pojo.PersonPersonnelCapacity">
+        <id column="id" property="id" />
+        <result column="academic_degree" property="academicDegree" />
+        <result column="academic_conform_not" property="academicConformNot" />
+        <result column="academic_remarks" property="academicRemarks" />
+        <result column="related_years" property="relatedYears" />
+        <result column="related_years_conform_not" property="relatedYearsConformNot" />
+        <result column="related_years_remarks" property="relatedYearsRemarks" />
+        <result column="related_training" property="relatedTraining" />
+        <result column="related_training_conform_not" property="relatedTrainingConformNot" />
+        <result column="related_training_remarks" property="relatedTrainingRemarks" />
+        <result column="relevant_experience" property="relevantExperience" />
+        <result column="relevant_experience_conform_not" property="relevantExperienceConformNot" />
+        <result column="relevant_experience_remarks" property="relevantExperienceRemarks" />
+        <result column="work_license" property="workLicense" />
+        <result column="work_license_conform_not" property="workLicenseConformNot" />
+        <result column="work_license_remarks" property="workLicenseRemarks" />
+        <result column="job_responsibilities" property="jobResponsibilities" />
+        <result column="job_responsibilities_conform_not" property="jobResponsibilitiesConformNot" />
+        <result column="job_responsibilities_remarks" property="jobResponsibilitiesRemarks" />
+        <result column="comprehensive_assessment" property="comprehensiveAssessment" />
+        <result column="submit_operating_personnel_id" property="submitOperatingPersonnelId" />
+        <result column="submit_date" property="submitDate" />
+        <result column="confirm_operating_personnel_id" property="confirmOperatingPersonnelId" />
+        <result column="confirm_date" property="confirmDate" />
+        <result column="create_time" property="createTime" />
+        <result column="update_time" property="updateTime" />
+        <result column="create_user" property="createUser" />
+        <result column="update_user" property="updateUser" />
+        <result column="user_id" property="userId" />
+    </resultMap>
+
+    <resultMap id="BaseResultMapDto" type="com.ruoyi.personnel.dto.PersonPersonnelCapacityDto" extends="BaseResultMap">
+        <result column="submit_operating_personnel_name" property="submitOperatingPersonnelName" />
+        <result column="confirm_operating_personnel_name" property="confirmOperatingPersonnelName" />
+        <result column="user_name" property="userName" />
+        <result column="place_work" property="placeWork" />
+        <result column="post_name" property="postName" />
+        <result column="responsibilities" property="responsibilities" />
+        <result column="major" property="major" />
+    </resultMap>
+
+    <select id="personPersonnelCapacityPage" resultMap="BaseResultMapDto">
+        select cppc.*,
+        u1.name submit_operating_personnel_name,
+        u2.name confirm_operating_personnel_name,
+        u3.name user_name,
+        cpbi.post_name,
+        p.place_work,
+        ecp.responsibilities,
+        TRIM(',' FROM CONCAT(cpbi.major1, ',', cpbi.major2)) AS major
+        from cnas_person_personnel_capacity cppc
+        left join user u1 on cppc.submit_operating_personnel_id = u1.id
+        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(cptr.place_work) place_work, cptr.user_id from cnas_person_track_record cptr
+        where cptr.place_work like concat('%' ,'涓ぉ', '%')
+        GROUP BY cptr.user_id) p on u3.id = p.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 postName,
+               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.place_work) place_work, cptr.user_id
+                            from cnas_person_track_record cptr
+                            where cptr.place_work like concat('%', '涓ぉ', '%')
+                            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..5152820
--- /dev/null
+++ b/cnas-personnel/src/main/resources/mapper/PersonPostAuthorizationRecordMapper.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.personnel.mapper.PersonPostAuthorizationRecordMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.ruoyi.personnel.pojo.PersonPostAuthorizationRecord">
+        <id column="id" property="id" />
+        <result column="certificate_number" property="certificateNumber" />
+        <result column="user_id" property="userId" />
+        <result column="post" property="post" />
+        <result column="operation_type" property="operationType" />
+        <result column="file_name" property="fileName" />
+        <result column="system_file_name" property="systemFileName" />
+        <result column="remarks" property="remarks" />
+        <result column="create_time" property="createTime" />
+        <result column="update_time" property="updateTime" />
+        <result column="update_user" property="updateUser" />
+        <result column="create_user" property="createUser" />
+        <result column="num1" property="num1" />
+        <result column="num2" property="num2" />
+    </resultMap>
+
+    <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..f9ff542
--- /dev/null
+++ b/cnas-personnel/src/main/resources/mapper/PersonRewardPunishmentRecordMapper.xml
@@ -0,0 +1,58 @@
+<?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">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.ruoyi.personnel.pojo.PersonRewardPunishmentRecord">
+        <id column="id" property="id" />
+        <result column="reward_punish_level" property="rewardPunishLevel" />
+        <result column="reward_punish_name" property="rewardPunishName" />
+        <result column="reward_punish_time" property="rewardPunishTime" />
+        <result column="reward_punish_work_unit" property="rewardPunishWorkUnit" />
+        <result column="reward_punish_content" property="rewardPunishContent" />
+        <result column="user_id" property="userId" />
+        <result column="create_user" property="createUser" />
+    </resultMap>
+
+    <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/PersonSupervisePlanDetailsMapper.xml b/cnas-personnel/src/main/resources/mapper/PersonSupervisePlanDetailsMapper.xml
new file mode 100644
index 0000000..bf4039c
--- /dev/null
+++ b/cnas-personnel/src/main/resources/mapper/PersonSupervisePlanDetailsMapper.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.personnel.mapper.PersonSupervisePlanDetailsMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.ruoyi.personnel.pojo.PersonSupervisePlanDetails">
+        <id column="id" property="id" />
+        <result column="supervise_date" property="superviseDate" />
+        <result column="supervise_des" property="superviseDes" />
+        <result column="supervise_person" property="supervisePerson" />
+        <result column="remarks" property="remarks" />
+        <result column="create_time" property="createTime" />
+        <result column="create_user" property="createUser" />
+        <result column="supervise_project" property="superviseProject" />
+        <result column="supervise_reason" property="superviseReason" />
+    </resultMap>
+
+    <select id="pageByDate" resultType="com.ruoyi.personnel.dto.PersonSupervisePlanDetailsDto">
+        SELECT
+        cpspd.id,
+        DATE_FORMAT( cpspd.supervise_date, '%Y-%m-%d' ) supervise_date,
+        cpspd.supervise_des,
+        cpspd.supervise_person,
+        cpspd.remarks,
+        cpspd.create_time,
+        cpspd.create_user,
+        cpspd.supervise_project,
+        cpspd.supervise_reason,
+        cpspd.plan_id,
+        u.NAME create_by
+        from cnas_person_supervise_plan_details cpspd
+        left join user u on u.id = cpspd.create_user
+        where cpspd.plan_id = #{planId}
+        <if test="date != null and date != ''">
+            and date_format(cpspd.supervise_date,'%Y-%m-%d') = #{date}
+        </if>
+        <if test="project != null and project != ''">
+            and cpspd.supervise_project like concat('%', #{project}, '%')
+        </if>
+        order by cpspd.id ASC
+    </select>
+</mapper>
diff --git a/cnas-personnel/src/main/resources/mapper/PersonSupervisePlanMapper.xml b/cnas-personnel/src/main/resources/mapper/PersonSupervisePlanMapper.xml
new file mode 100644
index 0000000..f4e3bd6
--- /dev/null
+++ b/cnas-personnel/src/main/resources/mapper/PersonSupervisePlanMapper.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.personnel.mapper.PersonSupervisePlanMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.ruoyi.personnel.pojo.PersonSupervisePlan">
+        <id column="id" property="id" />
+        <result column="file_name" property="fileName" />
+        <result column="organization_person_id" property="organizationPersonId" />
+        <result column="organization_date" property="organizationDate" />
+        <result column="approval_id" property="approvalId" />
+        <result column="approval_date" property="approvalDate" />
+        <result column="approval_status" property="approvalStatus" />
+        <result column="create_time" property="createTime" />
+        <result column="create_user" property="createUser" />
+        <result column="update_time" property="updateTime" />
+        <result column="update_user" property="updateUser" />
+    </resultMap>
+
+    <select id="pageByPerson" resultType="com.ruoyi.personnel.dto.PersonSupervisePlanDto">
+        select cpsp.*, u1.name organization_person_name, u2.name approval_name, u3.name create_name
+        from cnas_person_supervise_plan cpsp
+        left join user u1 on cpsp.organization_person_id = u1.id
+        left join user u2 on cpsp.approval_id = u2.id
+        left join user u3 on cpsp.create_user = u3.id
+        <where>
+            <if test="organizationPerson != null and organizationPerson != ''">
+                and u1.name =#{organizationPerson}
+            </if>
+        <if test="departId !='' and departId != null">
+            and cpsp.depart_id = #{departId}
+        </if>
+        </where>
+        order by create_time desc
+    </select>
+</mapper>
diff --git a/cnas-personnel/src/main/resources/mapper/PersonSupervisionControlSheetMapper.xml b/cnas-personnel/src/main/resources/mapper/PersonSupervisionControlSheetMapper.xml
new file mode 100644
index 0000000..0aad671
--- /dev/null
+++ b/cnas-personnel/src/main/resources/mapper/PersonSupervisionControlSheetMapper.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.personnel.mapper.PersonSupervisionControlSheetMapper">
+
+    <!-- 鏌ヨ鐩戠潱璁板綍鎺у埗鍗� -->
+
+    <select id="selectSupervisionControl"
+            resultType="com.ruoyi.personnel.dto.PersonSupervisionControlSheetExportDto">
+        select scs.*,
+               dl1.name                                     occurrenceDepartmentString,
+               u1.name                                      departmentHead,
+               dl2.name                                     discovererDepartment,
+               DATE_FORMAT(scs.discoverer_date, '%Y-%m-%d') discovererDateString,
+               u3.name                                      supervisedPerson,
+               dl4.name                                      responsibleDepartment,
+               DATE_FORMAT(scs.responsible_department_date, '%Y-%m-%d') responsibleDepartmentDateString,
+               DATE_FORMAT(scs.corrective_measure_date, '%Y-%m-%d') correctiveMeasureDateString,
+               DATE_FORMAT(scs.quality_supervisor_date, '%Y-%m-%d') qualitySupervisorDateString,
+               case when scs.corrective_measure_follow_tracks = 1 then '鈽�'
+                    else '鈻�' end correctiveMeasureFollowTracksYes,
+               case when scs.corrective_measure_follow_tracks = 2 then '鈽�'
+                    else '鈻�' end correctiveMeasureFollowTracksNo,
+               case when scs.whether_inform_customer = 1 then '鈽�'
+                    else '鈻�' end whetherInformCustomerYes,
+               case when scs.whether_inform_customer = 2 then '鈽�'
+                    else '鈻�' end whetherInformCustomerNo,
+               case when scs.whether_resume_work = 1 then '鈽�'
+                    else '鈻�' end whetherResumeWorkYes,
+               case when scs.whether_resume_work = 2 then '鈽�'
+                    else '鈻�' end whetherResumeWorkNo
+        from cnas_person_supervision_control_sheet scs
+                 left join user u1 on u1.id = scs.department_head_id -- 閮ㄩ棬璐熻矗浜�
+                 left join department_lims dl1 on find_in_set(dl1.id, u1.depart_lims_id) and dl1.id != 1
+                 left join user u2 on u2.id = scs.discoverer_id -- 鍙戠幇閮ㄩ棬
+                 left join department_lims dl2 on find_in_set(dl2.id, u2.depart_lims_id) and dl2.id != 1
+                 left join user u3 on u3.id = scs.supervised_person_id -- 琚洃鐫d汉
+                 left join user u4 on u4.id = scs.responsible_department_person_id -- 璐d换閮ㄩ棬
+                 left join department_lims dl4 on find_in_set(dl4.id, u4.depart_lims_id) and dl4.id != 1
+        where scs.supervision_record_id = #{supervisionRecordId}
+    </select>
+</mapper>
diff --git a/cnas-personnel/src/main/resources/mapper/PersonSupervisionProcessingSheetMapper.xml b/cnas-personnel/src/main/resources/mapper/PersonSupervisionProcessingSheetMapper.xml
new file mode 100644
index 0000000..57f6aeb
--- /dev/null
+++ b/cnas-personnel/src/main/resources/mapper/PersonSupervisionProcessingSheetMapper.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.personnel.mapper.PersonSupervisionProcessingSheetMapper">
+
+    <!-- 鏌ヨ浜哄憳鐩戠潱璁板綍澶勭悊鍗� -->
+    <select id="selectProcessingSheet" resultType="com.ruoyi.personnel.dto.PersonSupervisionProcessingSheetDto">
+        select sps.*,
+               dl1.name                                                     proposing_department,
+               dl2.name                                                     cause_analysis_department,
+               dl3.name                                                     corrective_action,
+               dl4.name                                                     verification_department,
+               DATE_FORMAT(sps.proposing_department_date, '%Y-%m-%d')    AS proposing_department_date_string,
+               DATE_FORMAT(sps.cause_analysis_date, '%Y-%m-%d')          AS cause_analysis_date_string,
+               DATE_FORMAT(sps.corrective_action_date, '%Y-%m-%d')       AS corrective_action_date_string,
+               DATE_FORMAT(sps.verification_department_date, '%Y-%m-%d') AS verification_department_date_string
+        from cnas_person_supervision_processing_sheet sps
+                 left join user u1 on u1.id = sps.proposing_department_person_id
+                 left join user u2 on u2.id = sps.cause_analysis_person_id
+                 left join user u3 on u3.id = sps.corrective_action_id
+                 left join user u4 on u4.id = sps.verification_department_person_id
+                 left join department_lims dl1 on find_in_set(dl1.id, u1.depart_lims_id) and dl1.id != 1
+                 left join department_lims dl2 on find_in_set(dl2.id, u2.depart_lims_id) and dl2.id != 1
+                 left join department_lims dl3 on find_in_set(dl3.id, u3.depart_lims_id) and dl3.id != 1
+                 left join department_lims dl4 on find_in_set(dl4.id, u4.depart_lims_id) and dl4.id != 1
+        where sps.supervision_record_id = #{supervisionRecordId}
+    </select>
+
+</mapper>
diff --git a/cnas-personnel/src/main/resources/mapper/PersonSupervisionRecordMapper.xml b/cnas-personnel/src/main/resources/mapper/PersonSupervisionRecordMapper.xml
new file mode 100644
index 0000000..e27b243
--- /dev/null
+++ b/cnas-personnel/src/main/resources/mapper/PersonSupervisionRecordMapper.xml
@@ -0,0 +1,78 @@
+<?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.PersonSupervisionRecordMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.ruoyi.personnel.pojo.PersonSupervisionRecord">
+        <id column="id" property="id" />
+        <result column="tester_id" property="testerId" />
+        <result column="supervisor_id" property="supervisorId" />
+        <result column="test_item" property="testItem" />
+        <result column="sample_number" property="sampleNumber" />
+        <result column="detection_date" property="detectionDate" />
+        <result column="personnel" property="personnel" />
+        <result column="instrument_equipment" property="instrumentEquipment" />
+        <result column="working_environment" property="workingEnvironment" />
+        <result column="sample_collection" property="sampleCollection" />
+        <result column="sample_preparation" property="samplePreparation" />
+        <result column="test_method" property="testMethod" />
+        <result column="test_report" property="testReport" />
+        <result column="evaluation_supervision_situation" property="evaluationSupervisionSituation" />
+        <result column="do_not_meet_the_handling_opinions" property="doNotMeetTheHandlingOpinions" />
+        <result column="technical_director" property="technicalDirector" />
+        <result column="technical_director_date" property="technicalDirectorDate" />
+        <result column="create_time" property="createTime" />
+        <result column="update_time" property="updateTime" />
+        <result column="create_user" property="createUser" />
+        <result column="update_user" property="updateUser" />
+    </resultMap>
+
+    <select id="personSupervisionRecordPage" resultType="com.ruoyi.personnel.dto.PersonSupervisionRecordDto">
+        select cpsr.*, u1.name tester_name, u2.name supervisor_name, u3.name technical_director_name,
+        cp.personnel_name, cpscs.current_state current_state_control, cpscs.corrective_measure, cpsps.current_state current_state_processing,u2.depart_lims_id
+        from cnas_person_supervision_record cpsr
+        left join user u1 on cpsr.tester_id = u1.id
+        left join user u2 on cpsr.supervisor_id = u2.id
+        left join user u3 on cpsr.technical_director = u3.id
+        left join (
+        select GROUP_CONCAT(u.name) personnel_name, cp.id
+        from cnas_person_supervision_record cp
+        left join user u on FIND_IN_SET(u.id, cp.personnel)
+        GROUP BY cp.id
+        ) cp on cp.id = cpsr.id
+        left join cnas_person_supervision_control_sheet cpscs on cpscs.supervision_record_id = cpsr.id
+        left join cnas_person_supervision_processing_sheet cpsps on cpsps.supervision_record_id = cpsr.id
+        <where>
+            <if test="userId != null and userId != ''">
+                and cpsr.supervisor_id = #{userId}
+            </if>
+            <if test="departLimsId != null and departLimsId != ''">
+                <!--and FIND_IN_SET(#{departLimsId}, u2.depart_lims_id)-->
+                and cpsr.depart_lims_id = #{departLimsId}
+            </if>
+            <if test="userName != null and userName != ''">
+                and u2.name like concat('%', #{userName}, '%')
+            </if>
+        </where>
+        order by cpsr.id desc
+    </select>
+
+    <!-- 鏌ヨ鐩戠潱璁板綍璇︽儏 -->
+    <select id="selectPersonSupervisionRecord" resultType="com.ruoyi.personnel.dto.PersonSupervisionRecordDto">
+        select cpsr.*, u1.name tester_name, u2.name supervisor_name, u3.name technical_director_name,
+               cp.personnel_name, cpscs.current_state current_state_control, cpsps.current_state current_state_processing
+        from cnas_person_supervision_record cpsr
+                 left join user u1 on cpsr.tester_id = u1.id
+                 left join user u2 on cpsr.supervisor_id = u2.id
+                 left join user u3 on cpsr.technical_director = u3.id
+                 left join (
+            select GROUP_CONCAT(u.name) personnel_name, cp.id
+            from cnas_person_supervision_record cp
+                     left join user u on FIND_IN_SET(u.id, cp.personnel)
+            GROUP BY cp.id
+        ) cp on cp.id = cpsr.id
+                 left join cnas_person_supervision_control_sheet cpscs on cpscs.supervision_record_id = cpsr.id
+                 left join cnas_person_supervision_processing_sheet cpsps on cpsps.supervision_record_id = cpsr.id
+        where cpsr.id = #{id}
+    </select>
+</mapper>
diff --git a/cnas-personnel/src/main/resources/mapper/PersonTrackRecordMapper.xml b/cnas-personnel/src/main/resources/mapper/PersonTrackRecordMapper.xml
new file mode 100644
index 0000000..d86f987
--- /dev/null
+++ b/cnas-personnel/src/main/resources/mapper/PersonTrackRecordMapper.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.PersonTrackRecordMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.ruoyi.personnel.pojo.PersonTrackRecord">
+        <id column="id" property="id" />
+        <result column="start_time" property="startTime" />
+        <result column="end_time" property="endTime" />
+        <result column="place_work" property="placeWork" />
+        <result column="department" property="department" />
+        <result column="post" property="post" />
+        <result column="remarks" property="remarks" />
+        <result column="create_time" property="createTime" />
+        <result column="create_user" property="createUser" />
+        <result column="user_id" property="userId" />
+        <result column="file_name" property="fileName" />
+    </resultMap>
+
+    <select id="personTrackRecordSelect" resultType="com.ruoyi.personnel.pojo.PersonTrackRecord">
+        select cpt.*
+        from cnas_person_track_record cpt
+        left join user u on cpt.user_id = u.id
+        <where>
+            <if test="userId != null and userId != '' and userId != 'null'">
+                and cpt.user_id = #{userId}
+            </if>
+            <if test="departLimsId != null and departLimsId != '' and departLimsId != 'null'">
+                and FIND_IN_SET(#{departLimsId},u.depart_lims_id)
+            </if>
+        </where>
+    </select>
+
+    <select id="personTrackRecordExport" resultMap="BaseResultMap">
+        select *
+        from cnas_person_track_record cpt
+        left join user u on cpt.user_id = u.id
+        <where>
+            <if test="userId != null and userId != '' and userId != 'null'">
+                and cpt.user_id = #{userId}
+            </if>
+            <if test="departLimsId != null and departLimsId != '' and departLimsId != 'null'">
+                and FIND_IN_SET(#{departLimsId},u.depart_lims_id)
+            </if>
+        </where>
+    </select>
+</mapper>
diff --git a/cnas-personnel/src/main/resources/mapper/PersonTrainingDetailedMapper.xml b/cnas-personnel/src/main/resources/mapper/PersonTrainingDetailedMapper.xml
new file mode 100644
index 0000000..29b6de6
--- /dev/null
+++ b/cnas-personnel/src/main/resources/mapper/PersonTrainingDetailedMapper.xml
@@ -0,0 +1,98 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.personnel.mapper.PersonTrainingDetailedMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.ruoyi.personnel.pojo.PersonTrainingDetailed">
+        <id column="id" property="id" />
+        <result column="course_code" property="courseCode" />
+        <result column="training_objectives" property="trainingObjectives" />
+        <result column="training_content" property="trainingContent" />
+        <result column="training_mode" property="trainingMode" />
+        <result column="state" property="state" />
+        <result column="participants" property="participants" />
+        <result column="holding_department" property="holdingDepartment" />
+        <result column="place_training" property="placeTraining" />
+        <result column="training_lecturer_id" property="trainingLecturerId" />
+        <result column="training_date" property="trainingDate" />
+        <result column="opening_time" property="openingTime" />
+        <result column="class_hour" property="classHour" />
+        <result column="remarks" property="remarks" />
+        <result column="create_time" property="createTime" />
+        <result column="create_user" property="createUser" />
+        <result column="update_user" property="updateUser" />
+        <result column="update_time" property="updateTime" />
+    </resultMap>
+
+    <select id="queryTheAnnualPlanDetailsTable" resultType="com.ruoyi.personnel.dto.PersonTrainingDetailedDto">
+        SELECT cptd.*,
+        cpt.depart_id as departId,
+       <!-- u1.name training_lecturer_name,-->
+        dl.name holding_department_name, !isnull(cptr.training_record_id) whether_claim
+        FROM cnas_person_training_detailed cptd
+        <!-- left join user u1 on cptd.training_lecturer_id = u1.id-->
+        left join department_lims dl on dl.id = cptd.holding_department
+        left join cnas_person_training_record cptr on
+            <!--cptr.user_id = #{loginUserId} and -->
+            cptr.course_id = cptd.id
+        left join cnas_person_training cpt on cpt.id = cptd.plan_id
+        <where>
+            <if test="id != null">
+                and cptd.plan_id = #{id}
+            </if>
+            <if test="userId != null">
+                and cptr.user_id = #{userId}
+            </if>
+            <if test="courseCode != null and courseCode != ''">
+                and cptd.course_code like concat('%', #{courseCode}, '%')
+            </if>
+            <if test="trainingLecturerName != null and trainingLecturerName != ''">
+                and cptd.training_lecturer_id like concat('%', #{trainingLecturerName}, '%')
+            </if>
+            <if test="trainingDate != null and trainingDate != ''">
+                and cptd.training_date_two = #{trainingDate}
+            </if>
+            <if test="state != null and state != ''">
+                and cptd.state = 3
+            </if>
+            <if test="state == null || state == ''">
+                and cptd.state != 3
+            </if>
+
+        </where>
+        GROUP BY
+        cptd.id
+        order by
+        CASE
+        WHEN cptd.training_date_two IS NULL THEN '9999-12-31'
+        ELSE cptd.training_date_two
+        END ASC,
+        CASE
+        WHEN cptd.opening_time IS NULL THEN '23:59:59'
+        ELSE cptd.opening_time
+        END ASC,
+            cptd.id ASC
+    </select>
+
+    <!-- 鏍规嵁涓昏〃id鏌ヨ璇︽儏 -->
+    <select id="selectTrainingList" resultType="com.ruoyi.personnel.dto.PersonTrainingDetailedDto">
+        <!--SELECT cptd.*,
+               u1.name training_lecturer_name
+        FROM cnas_person_training_detailed cptd
+                 left join user u1 on cptd.training_lecturer_id = u1.id
+        where cptd.plan_id = #{trainingId}-->
+
+        SELECT cptd.*
+        FROM cnas_person_training_detailed cptd
+        where cptd.plan_id = #{trainingId}
+    </select>
+
+    <!-- 鏌ヨ璇︾粏 -->
+    <select id="selectTrainingDetail" resultType="com.ruoyi.personnel.dto.PersonTrainingDetailedDto">
+        SELECT cptd.*,
+               u1.name training_lecturer_name
+        FROM cnas_person_training_detailed cptd
+                 left join user u1 on cptd.training_lecturer_id = u1.id
+        where cptd.id = #{id}
+    </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..2833117
--- /dev/null
+++ b/cnas-personnel/src/main/resources/mapper/PersonTrainingMapper.xml
@@ -0,0 +1,72 @@
+<?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">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.ruoyi.personnel.pojo.PersonTraining">
+        <id column="id" property="id" />
+        <result column="file_name" property="fileName" />
+        <result column="compiler_id" property="compilerId" />
+        <result column="compilation_date" property="compilationDate" />
+        <result column="reviewer_id" property="reviewerId" />
+        <result column="audit_date" property="auditDate" />
+        <result column="audit_remarks" property="auditRemarks" />
+        <result column="approver_id" property="approverId" />
+        <result column="approval_remarks" property="approvalRemarks" />
+        <result column="approval_status" property="approvalStatus" />
+        <result column="approval_date" property="approvalDate" />
+        <result column="create_time" property="createTime" />
+        <result column="create_user" property="createUser" />
+        <result column="update_time" property="updateTime" />
+        <result column="update_user" property="updateUser" />
+    </resultMap>
+
+    <!-- 鏍规嵁鍒涘缓浜虹殑閮ㄩ棬绛涢�夋暟鎹紝鍙槸鍒涘缓浜哄彲鑳芥湭鍒嗛厤閮ㄩ棬涔熼渶瑕佹煡鐪� -->
+    <select id="personTrainingSelect" resultType="com.ruoyi.personnel.dto.PersonTrainingDto">
+        select * from(
+
+
+        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="departLimsId != null and departLimsId != ''">
+                and cpt.depart_id = #{departLimsId}
+            </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>
+        )a  order by id desc
+    </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..1748f8b
--- /dev/null
+++ b/cnas-personnel/src/main/resources/mapper/PersonTrainingRecordMapper.xml
@@ -0,0 +1,135 @@
+<?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">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.ruoyi.personnel.pojo.PersonTrainingRecord">
+        <id column="training_record_id" property="trainingRecordId" />
+        <result column="user_id" property="userId" />
+        <result column="course_id" property="courseId" />
+        <result column="examination_results" property="examinationResults" />
+    </resultMap>
+
+    <select id="trainingAndAssessmentRecordsPage" resultType="com.ruoyi.personnel.dto.PersonTrainingRecordDto">
+        select cptr.*, u.account, u.name user_name, u.phone, r.role_name role_name
+        from cnas_person_training_record cptr
+                 left join user u on u.id = cptr.user_id
+                 left join sys_user_role ur on ur.user_id = u.id
+        left join sys_role r on ur.role_id=r.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, cpbi.unit_time, 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..e755756
--- /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-deal.docx b/cnas-personnel/src/main/resources/static/person-deal.docx
new file mode 100644
index 0000000..ef69408
--- /dev/null
+++ b/cnas-personnel/src/main/resources/static/person-deal.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..2d7698b
--- /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..4304dc3
--- /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..82e7cfc
--- /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..411e306
--- /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..2300cb5
--- /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..052d7e4
--- /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..91baadd
--- /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..b72514f
--- /dev/null
+++ b/cnas-personnel/src/main/resources/static/training-record.docx
Binary files differ
diff --git a/performance-server/src/main/java/com/ruoyi/performance/pojo/AuxiliaryWorkingHoursDay.java b/performance-server/src/main/java/com/ruoyi/performance/pojo/AuxiliaryWorkingHoursDay.java
index a4fef6a..d95f8ff 100644
--- a/performance-server/src/main/java/com/ruoyi/performance/pojo/AuxiliaryWorkingHoursDay.java
+++ b/performance-server/src/main/java/com/ruoyi/performance/pojo/AuxiliaryWorkingHoursDay.java
@@ -1,15 +1,20 @@
 package com.ruoyi.performance.pojo;
 
-import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelIgnore;
 import com.alibaba.excel.annotation.ExcelProperty;
-import com.baomidou.mybatisplus.annotation.*;
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.time.LocalDateTime;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
-
-import java.io.Serializable;
-import java.math.BigDecimal;
-import java.time.LocalDateTime;
+import lombok.Getter;
+import lombok.Setter;
 
 /**
  * <p>
@@ -22,92 +27,98 @@
 @Data
 @TableName("auxiliary_working_hours_day")
 @ApiModel(value = "AuxiliaryWorkingHoursDay瀵硅薄", description = "鏃ュ伐鏃剁鐞嗙殑杈呭姪宸ユ椂")
-@ExcelIgnoreUnannotated
 public class AuxiliaryWorkingHoursDay  implements Serializable {
 
     @TableId(value = "id", type = IdType.AUTO)
+    @ExcelIgnore
     private Integer id;
 
     @ApiModelProperty("濮撳悕id")
+    @ExcelIgnore
     private Integer nameUser;
 
     @ApiModelProperty("缂栧彿")
-    @ExcelProperty(index = 2, value = "缂栧彿")
+    @ExcelProperty(value = "缂栧彿")
     private String number;
 
     @ApiModelProperty("杈呭姪椤圭洰鍚嶇О")
-    @ExcelProperty(index = 3, value = "杈呭姪椤圭洰鍚嶇О")
+    @ExcelProperty(value = "杈呭姪椤圭洰鍚嶇О")
     private String auxiliaryProject;
 
     @ApiModelProperty("鏍稿噯宸ユ椂")
-    @ExcelProperty(index = 5, value = "鏍稿噯宸ユ椂")
-    private BigDecimal approvedWorkingHour;
+    @ExcelProperty(value = "鏍稿噯宸ユ椂")
+    private Double approvedWorkingHour;
 
     @ApiModelProperty("鏁伴噺")
-    @ExcelProperty(index = 6, value = "鏁伴噺")
-    private Integer amount;
+    @ExcelProperty(value = "鏁伴噺")
+    private Double amount;
 
     @ApiModelProperty("杈呭姪宸ユ椂")
-    @ExcelProperty(index = 7, value = "杈呭姪宸ユ椂")
-    private BigDecimal nonproductiveTime;
+    @ExcelProperty(value = "杈呭姪宸ユ椂")
+    private Double nonproductiveTime;
 
     @ApiModelProperty("杈呭姪璇存槑")
-    @ExcelProperty(index = 8, value = "杈呭姪璇存槑")
+    @ExcelProperty(value = "杈呭姪璇存槑")
     private String remarks;
 
-    @ApiModelProperty("澶嶆牳浜�")
-    @ExcelProperty(index = 9, value = "澶嶆牳浜�")
-    private String reviewer;
-
-    @ApiModelProperty("澶嶆牳鏁伴噺")
-    @ExcelProperty(index = 10, value = "澶嶆牳鏁伴噺")
-    private Integer reviewerNumber;
-
-    @ApiModelProperty("澶嶆牳宸ユ椂")
-    @ExcelProperty(index = 11, value = "澶嶆牳宸ユ椂")
-    private BigDecimal reviewerNonproductiveTime;
-
-    @ApiModelProperty("澶嶆牳璇存槑")
-    @ExcelProperty(index = 12, value = "澶嶆牳璇存槑")
-    private String reviewerRemark;
-
-    @ApiModelProperty("骞�")
-    @ExcelProperty(index = 13, value = "骞�")
-    private String year;
-
     @ApiModelProperty("鐝")
-    @ExcelProperty(index = 14, value = "鐝")
+    @ExcelProperty(value = "鐝")
     private String shift;
 
     @ApiModelProperty("鍛ㄦ")
-    @ExcelProperty(index = 15, value = "鍛ㄦ")
+    @ExcelProperty(value = "鍛ㄦ")
     private String week;
 
     @ApiModelProperty("鏄熸湡")
-    @ExcelProperty(index = 16, value = "鏄熸湡")
+    @ExcelProperty(value = "鏄熸湡")
     private String weekDay;
+
+    @ApiModelProperty("澶嶆牳浜�")
+    @ExcelProperty(value = "澶嶆牳浜�")
+    private String reviewer;
+
+    @ApiModelProperty("澶嶆牳鏁伴噺")
+    @ExcelProperty(value = "澶嶆牳鏁伴噺")
+    private Double reviewerNumber;
+
+    @ApiModelProperty("澶嶆牳宸ユ椂")
+    @ExcelProperty(value = "澶嶆牳宸ユ椂")
+    private Double reviewerNonproductiveTime;
+
+    @ApiModelProperty("澶嶆牳璇存槑")
+    @ExcelProperty(value = "澶嶆牳璇存槑")
+    private String reviewerRemark;
+
+    @ApiModelProperty("骞�")
+    @ExcelProperty(value = "骞�")
+    private String year;
 
     @ApiModelProperty("鍒涘缓鏃堕棿")
     @TableField(fill = FieldFill.INSERT)
+    @ExcelIgnore
     private LocalDateTime createTime;
 
     @ApiModelProperty("淇敼鏃堕棿")
     @TableField(fill = FieldFill.INSERT_UPDATE)
+    @ExcelIgnore
     private LocalDateTime updateTime;
 
     @ApiModelProperty("鍒涘缓浜篿d")
     @TableField(fill = FieldFill.INSERT)
+    @ExcelIgnore
     private Integer createUser;
 
     @ApiModelProperty("淇敼浜篿d")
     @TableField(fill = FieldFill.INSERT_UPDATE)
+    @ExcelIgnore
     private Integer updateUser;
 
     @ApiModelProperty("鐘舵��")
-    @ExcelProperty(index = 4, value = "鐘舵��")
+    @ExcelProperty(value = "鐘舵��")
+    @ExcelIgnore
     private String state;
 
     @ApiModelProperty("鏃ユ湡")
-    @ExcelProperty(index = 17, value = "鏃ユ湡")
+    @ExcelProperty(value = "鏃ユ湡")
     private String dateTime;
 }
diff --git a/performance-server/src/main/java/com/ruoyi/performance/service/impl/AuxiliaryOutputWorkingHoursServiceImpl.java b/performance-server/src/main/java/com/ruoyi/performance/service/impl/AuxiliaryOutputWorkingHoursServiceImpl.java
index a8524ef..d8974a9 100644
--- a/performance-server/src/main/java/com/ruoyi/performance/service/impl/AuxiliaryOutputWorkingHoursServiceImpl.java
+++ b/performance-server/src/main/java/com/ruoyi/performance/service/impl/AuxiliaryOutputWorkingHoursServiceImpl.java
@@ -160,7 +160,7 @@
         map.put("浜ч噺宸ユ椂姹囨��", sumOutputWorkTime);
         if (ObjectUtils.isNotEmpty(auxiliaryWorkingHoursDays)) {
             for (AuxiliaryWorkingHoursDay auxiliaryWorkingHoursDay : auxiliaryWorkingHoursDays) {
-                sumApprovedWorkingHour = sumApprovedWorkingHour.add(auxiliaryWorkingHoursDay.getReviewerNonproductiveTime());//澶嶆牳宸ユ椂
+//                sumApprovedWorkingHour = sumApprovedWorkingHour.add(auxiliaryWorkingHoursDay.getReviewerNonproductiveTime());//澶嶆牳宸ユ椂
             }
         }
         map.put("杈呭姪宸ユ椂姹囨��", sumApprovedWorkingHour);
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/UserController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/UserController.java
index 67cc35f..e93f447 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/UserController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/UserController.java
@@ -5,9 +5,9 @@
 import com.ruoyi.common.core.domain.entity.Company;
 import com.ruoyi.common.core.domain.entity.User;
 import com.ruoyi.common.core.dto.PersonDto;
+import com.ruoyi.framework.util.HeaderToken;
 import com.ruoyi.system.service.UserService;
 import com.ruoyi.web.controller.dto.UpdateUserDto;
-import com.ruoyi.web.controller.system.api.HeaderToken;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
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/core/domain/entity/User.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/User.java
index 2662b2d..3b9d9c7 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/User.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/User.java
@@ -4,6 +4,7 @@
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
+import java.time.LocalDateTime;
 import java.util.Date;
 
 /**
@@ -83,7 +84,7 @@
 
     @TableField(fill = FieldFill.INSERT)
     @ApiModelProperty(value = "鍒涘缓鏃堕棿")
-    private Date createTime;
+    private LocalDateTime createTime;
 
     @TableField(fill = FieldFill.INSERT_UPDATE)
     @ApiModelProperty(value = "鏇存柊鑰�")
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/dto/DepartmentDto.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/dto/DepartmentDto.java
new file mode 100644
index 0000000..f29fac7
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/dto/DepartmentDto.java
@@ -0,0 +1,23 @@
+package com.ruoyi.common.core.dto;
+
+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/dto/UserPageDto.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/dto/UserPageDto.java
new file mode 100644
index 0000000..f4f82f7
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/dto/UserPageDto.java
@@ -0,0 +1,24 @@
+package com.ruoyi.common.core.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/ruoyi-common/src/main/java/com/ruoyi/common/utils/DateImageUtil.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/DateImageUtil.java
index 7fb91ee..0ca66f5 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/DateImageUtil.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/DateImageUtil.java
@@ -9,6 +9,7 @@
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
+import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
 
@@ -58,4 +59,41 @@
         }
         return new ByteArrayInputStream(os.toByteArray());
     }
+
+    public static InputStream createDateImage(LocalDate date) {
+        int width = 80;
+        int height = 20;
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy.MM.dd");
+        if (date == null) {
+            date = LocalDate.now();
+        }
+        String s = date.format(formatter);
+
+        java.awt.Font font = new java.awt.Font("Serif", java.awt.Font.BOLD, 10);
+        // 鍒涘缓涓�涓敾甯冿紙鑳屾櫙閫忔槑锛�
+        BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
+        // 鑾峰彇鐢诲竷鐨勭敾绗�
+        Graphics2D g2 = (Graphics2D) bi.getGraphics();
+        // 寮�濮嬬粯鍥�
+        g2.setComposite(java.awt.AlphaComposite.Src); // 纭繚缁樺浘鏃舵槸閫忔槑鑳屾櫙
+        g2.setBackground(new Color(0, 0, 0, 0)); // 鑳屾櫙鑹蹭负閫忔槑
+        g2.clearRect(0, 0, width, height);
+        g2.setPaint(new Color(0, 0, 0)); // 璁剧疆缁樺埗棰滆壊
+        FontRenderContext context = g2.getFontRenderContext();
+        Rectangle2D bounds = font.getStringBounds(s, context);
+        double x = (width - bounds.getWidth()) / 2;
+        double y = (height - bounds.getHeight()) / 2;
+        double ascent = -bounds.getY();
+        double baseY = y + ascent;
+        g2.drawString(s, (int) x, (int) baseY);
+        g2.dispose(); // 閲婃斁鐢荤瑪璧勬簮
+        ByteArrayOutputStream os = new ByteArrayOutputStream();
+
+        try {
+            ImageIO.write(bi, "png", os);
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+        return new ByteArrayInputStream(os.toByteArray());
+    }
 }
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/api/HeaderToken.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/util/HeaderToken.java
similarity index 98%
rename from ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/api/HeaderToken.java
rename to ruoyi-framework/src/main/java/com/ruoyi/framework/util/HeaderToken.java
index d1407cf..20eb3f4 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/api/HeaderToken.java
+++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/util/HeaderToken.java
@@ -1,4 +1,4 @@
-package com.ruoyi.web.controller.system.api;
+package com.ruoyi.framework.util;
 
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.http.HttpRequest;
@@ -15,6 +15,7 @@
 import com.ruoyi.common.core.domain.entity.Person;
 import com.ruoyi.common.core.domain.entity.User;
 import com.ruoyi.framework.exception.ErrorException;
+import com.ruoyi.system.domain.AuthApi;
 import com.ruoyi.system.mapper.UserMapper;
 import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.stereotype.Component;
@@ -188,4 +189,4 @@
         }
         return map;
     }
-}
\ No newline at end of file
+}
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/util/TestApi.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/util/TestApi.java
new file mode 100644
index 0000000..d19ddcd
--- /dev/null
+++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/util/TestApi.java
@@ -0,0 +1,25 @@
+package com.ruoyi.framework.util;
+
+import cn.hutool.http.HttpRequest;
+import cn.hutool.http.HttpResponse;
+import com.ruoyi.system.domain.AuthApi;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+@Component
+public class TestApi {
+
+    @Autowired
+    private HeaderToken headerToken;
+
+    public void testApi() {
+        String accessToken =headerToken.getAccessToken();
+        String apiUrl = AuthApi.companies;
+        // 鏇挎崲涓哄疄闄呯殑API绔偣URL
+        HttpRequest request = HttpRequest.get(apiUrl)
+                .header("Authorization", "Bearer " + accessToken);
+        HttpResponse response = request.execute();
+        System.out.println("Response Code: " + response.getStatus());
+        System.out.println("Response Body: " + response.body());
+    }
+}
diff --git a/ruoyi-system/pom.xml b/ruoyi-system/pom.xml
index 6248a2c..07627a3 100644
--- a/ruoyi-system/pom.xml
+++ b/ruoyi-system/pom.xml
@@ -25,4 +25,4 @@
 
     </dependencies>
 
-</project>
\ No newline at end of file
+</project>
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/api/AuthApi.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/AuthApi.java
similarity index 96%
rename from ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/api/AuthApi.java
rename to ruoyi-system/src/main/java/com/ruoyi/system/domain/AuthApi.java
index 0a38ac9..4e1d880 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/api/AuthApi.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/AuthApi.java
@@ -1,4 +1,4 @@
-package com.ruoyi.web.controller.system.api;
+package com.ruoyi.system.domain;
 
 public class AuthApi {
 
@@ -54,4 +54,4 @@
 
     public static String person = "https://ztt-connector.ztt.cn/api/org/v1/employees/simple/";
 
-}
\ No newline at end of file
+}
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..894912e
--- /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.DepartmentLims;
+import com.ruoyi.common.core.dto.DepartmentDto;
+
+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/java/com/ruoyi/system/service/DepartmentLimsService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/DepartmentLimsService.java
new file mode 100644
index 0000000..2e7a187
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/DepartmentLimsService.java
@@ -0,0 +1,25 @@
+package com.ruoyi.system.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.common.core.domain.entity.DepartmentLims;
+import com.ruoyi.common.core.dto.DepartmentDto;
+
+import java.util.List;
+
+/**
+* @author z1292
+* @description 閽堝琛ㄣ�恉epartment_lims(閮ㄩ棬鏄庣粏)銆戠殑鏁版嵁搴撴搷浣淪ervice
+* @createDate 2024-05-22 14:08:17
+*/
+public interface DepartmentLimsService extends IService<DepartmentLims> {
+
+    //娣诲姞閮ㄩ棬
+    int addDepartment(DepartmentLims departmentLims);
+
+    //鑾峰彇閮ㄩ棬鏍�
+    List<DepartmentDto> selectDepartment();
+
+    //鍒犻櫎閮ㄩ棬
+    boolean delDepartment(Integer id);
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/DepartmentLimsServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/DepartmentLimsServiceImpl.java
new file mode 100644
index 0000000..4d798bf
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/DepartmentLimsServiceImpl.java
@@ -0,0 +1,86 @@
+package com.ruoyi.system.service.impl;
+
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.common.core.domain.entity.DepartmentLims;
+import com.ruoyi.common.core.dto.DepartmentDto;
+import com.ruoyi.system.mapper.DepartmentLimsMapper;
+import com.ruoyi.system.service.DepartmentLimsService;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+/**
+* @author z1292
+* @description 閽堝琛ㄣ�恉epartment_lims(閮ㄩ棬鏄庣粏)銆戠殑鏁版嵁搴撴搷浣淪ervice瀹炵幇
+* @createDate 2024-05-22 14:08:17
+*/
+@Service
+@AllArgsConstructor
+public class DepartmentLimsServiceImpl extends ServiceImpl<DepartmentLimsMapper, DepartmentLims>
+    implements DepartmentLimsService {
+
+    DepartmentLimsMapper departmentMapper;
+
+    @Override
+    public int addDepartment(DepartmentLims department) {
+        departmentMapper.insert(department);
+        return department.getId();
+    }
+
+    //鑾峰彇閮ㄩ棬鏍�
+    @Override
+    public List<DepartmentDto> selectDepartment() {
+        List<DepartmentDto> departments = departmentMapper.selectDepartment();
+        //鑾峰彇鐖惰妭鐐�
+        List<DepartmentDto> collect = departments.stream().filter(m -> m.getFatherId() == null).peek(
+                (m) -> m.setChildren(getChildren(m, departments))
+        ).collect(Collectors.toList());
+        return collect;
+    }
+
+    /**
+     * 閫掑綊鏌ヨ瀛愯妭鐐�
+     * @param root  鏍硅妭鐐�
+     * @param all   鎵�鏈夎妭鐐�
+     * @return 鏍硅妭鐐逛俊鎭�
+     */
+    private List<DepartmentDto> getChildren(DepartmentDto root, List<DepartmentDto> all) {
+        return all.stream().filter(m -> Objects.equals(m.getFatherId(), root.getId())).peek(
+                (m) -> m.setChildren(getChildren(m, all))
+        ).collect(Collectors.toList());
+    }
+
+    //鍒犻櫎閮ㄩ棬
+    @Override
+    public boolean delDepartment(Integer id) {
+        //鍒ゆ柇鏄惁鏈夊瓙绫�,鐩村埌娌℃湁涓烘
+        List<DepartmentLims> department = getDepartment(id);
+        return removeBatchByIds(department);
+    }
+
+    //鍒ゆ柇鏄惁鏈夊瓙绫�,鐩村埌娌℃湁涓烘
+    public List<DepartmentLims> getDepartment(Integer id) {
+        List<DepartmentLims> list = new ArrayList<>();
+        DepartmentLims depart = baseMapper.selectById(id);
+        list.add(depart);
+        List<DepartmentLims> departments = baseMapper.selectList(Wrappers.<DepartmentLims>lambdaQuery().eq(DepartmentLims::getFatherId, id));
+        if (ObjectUtils.isNotEmpty(departments)) {
+            list.addAll(departments);
+            for (DepartmentLims department : departments) {
+                list.addAll(getDepartment(department.getId()));
+            }
+        }
+        return list;
+    }
+
+}
+
+
+
+
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..01b5662
--- /dev/null
+++ b/ruoyi-system/src/main/resources/mapper/system/DepartmentLimsMapper.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.system.mapper.DepartmentLimsMapper">
+
+    <resultMap id="BaseResultMap" type="com.ruoyi.common.core.domain.entity.DepartmentLims">
+            <id property="id" column="id" jdbcType="INTEGER"/>
+            <result property="name" column="name" jdbcType="VARCHAR"/>
+            <result property="fatherId" column="father_id" jdbcType="INTEGER"/>
+            <result property="createUser" column="create_user" jdbcType="INTEGER"/>
+            <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
+            <result property="updateUser" column="update_user" jdbcType="INTEGER"/>
+            <result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/>
+    </resultMap>
+
+    <select id="selectDepartment" resultType="com.ruoyi.common.core.dto.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