From 7a838ed69de1d9593fe6b37f9b5caafb5f8d0cbf Mon Sep 17 00:00:00 2001
From: lxp <1928192722@qq.com>
Date: 星期一, 10 三月 2025 14:48:45 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/dev' into dev

---
 cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonJobResponsibilitiesService.java                  |   27 
 cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonSupervisePlanDetails.java                           |   73 
 inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsOrderMapper.java                                       |    2 
 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/controller/PersonTrainingController.java                       |  272 +
 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 
 inspect-server/src/main/java/com/ruoyi/inspect/controller/InsOrderController.java                               |   32 
 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 
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDictTypeServiceImpl.java                            |   13 
 cnas-personnel/src/main/resources/static/communication-deal.docx                                                |    0 
 cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonSupervisionControlSheetMapper.java                |   25 
 inspect-server/src/main/java/com/ruoyi/inspect/service/InsOrderService.java                                     |    2 
 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/controller/PersonJobResponsibilitiesController.java            |   57 
 cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonTraining.java                                       |   83 
 cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonSupervisePlanServiceImpl.java               |  331 +
 cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessComplainServiceImpl.java                       |    1 
 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/java/com/ruoyi/personnel/controller/PersonRewardPunishmentRecordController.java         |  100 
 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 ++
 pom.xml                                                                                                         |   30 
 basic-server/src/main/java/com/ruoyi/basic/mapper/StandardTreeMapper.java                                       |    8 
 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 
 inspect-server/src/main/resources/mapper/InsOrderMapper.xml                                                     |    2 
 cnas-personnel/src/main/resources/mapper/PersonSupervisionRecordMapper.xml                                      |   78 
 inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderServiceImpl.java                            |   32 
 ruoyi-system/src/main/resources/mapper/system/DepartmentLimsMapper.xml                                          |   34 
 cnas-personnel/src/main/java/com/ruoyi/personnel/controller/SuperVisePlanController.java                        |  136 
 cnas-personnel/pom.xml                                                                                          |   56 
 performance-server/src/main/java/com/ruoyi/performance/pojo/AuxiliaryWorkingHoursDay.java                       |   93 
 cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonBasicInfoController.java                      |  202 +
 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 
 basic-server/src/main/java/com/ruoyi/basic/controller/StandardTreeController.java                               |    7 
 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 
 ruoyi-common/src/main/java/com/ruoyi/common/utils/FileSaveUtil.java                                             |    3 
 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 
 basic-server/src/main/resources/mapper/StructureItemParameterMapper.xml                                         |    2 
 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/controller/PersonSupervisionRecordController.java              |  161 
 cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonSupervisionRecordDto.java                            |   33 
 ruoyi-system/src/main/java/com/ruoyi/system/service/DepartmentLimsService.java                                  |   25 
 performance-server/src/main/java/com/ruoyi/performance/controller/PerformanceShiftController.java               |    2 
 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-require/src/main/resources/mapper/FeCalibrationScheduleMapper.xml                                          |    2 
 cnas-personnel/src/main/resources/static/person-deal.docx                                                       |    0 
 cnas-device/pom.xml                                                                                             |   27 
 cnas-personnel/src/main/java/com/ruoyi/personnel/schedule/PersonSchedule.java                                   |   54 
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/UserController.java                                   |    4 
 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/controller/PersonPostAuthorizationRecordController.java        |   66 
 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/controller/FileGeneralController.java                          |   76 
 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/controller/PersonTrackRecordController.java                    |   88 
 cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonTrainingRecordController.java                 |   60 
 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 
 basic-server/src/main/java/com/ruoyi/basic/pojo/StructureItemParameter.java                                     |   19 
 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 
 ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDictTypeService.java                                    |    4 
 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 
 basic-server/src/main/java/com/ruoyi/basic/service/impl/CapacityScopeServiceImpl.java                           |   70 
 cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonSupervisionControlSheetServiceImpl.java     |  155 
 ruoyi-admin/pom.xml                                                                                             |   24 
 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/controller/PersonPersonnelCapacityController.java              |   90 
 /dev/null                                                                                                       |  111 
 cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonCommunicationAbilityController.java           |   61 
 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-admin/src/main/java/com/ruoyi/web/controller/system/SysDictTypeController.java                            |    3 
 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-process/src/main/java/com/ruoyi/process/service/impl/ProcessMethodVerifyServiceImpl.java                   |    1 
 cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonCommunicationAbilityMapper.java                   |   21 
 cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonSupervisePlanDetailsService.java                 |   26 
 176 files changed, 10,288 insertions(+), 238 deletions(-)

diff --git a/basic-server/src/main/java/com/ruoyi/basic/controller/StandardTreeController.java b/basic-server/src/main/java/com/ruoyi/basic/controller/StandardTreeController.java
index 2bf8054..e25a8b9 100644
--- a/basic-server/src/main/java/com/ruoyi/basic/controller/StandardTreeController.java
+++ b/basic-server/src/main/java/com/ruoyi/basic/controller/StandardTreeController.java
@@ -105,8 +105,11 @@
     }
 
     @ApiOperation(value = "閫氳繃妫�楠屾爣鍑嗘煡璇㈡楠岄」鐩�")
-    @GetMapping("/selectStandardProductListByMethodId")
-    public Result selectStandardProductListByMethodId(Integer id, String tree, Integer page) {
+    @PostMapping("/selectStandardProductListByMethodId")
+    public Result selectStandardProductListByMethodId(@RequestBody Map<String,Object> map ) {
+        Integer id =(Integer) map.get("id");
+        String tree = (String)map.get("tree");
+        Integer page = (Integer)map.get("page");
         return Result.success(standardProductListService.selectStandardProductListByMethodId(id, tree, page));
     }
 
diff --git a/basic-server/src/main/java/com/ruoyi/basic/mapper/StandardTreeMapper.java b/basic-server/src/main/java/com/ruoyi/basic/mapper/StandardTreeMapper.java
index 8b82e09..ccb59a6 100644
--- a/basic-server/src/main/java/com/ruoyi/basic/mapper/StandardTreeMapper.java
+++ b/basic-server/src/main/java/com/ruoyi/basic/mapper/StandardTreeMapper.java
@@ -30,11 +30,11 @@
 
     List<StandardMethodList> getStandardMethodListBySample(String sampleType);
 
-    List<StandardProductList> selectStandardProductListByTree(String tree, String sample, String model, String trees, String laboratory);
+    List<StandardProductList> selectStandardProductListByTree(@Param("tree") String tree, @Param("sample") String sample, @Param("model") String model, @Param("trees") String trees, @Param("laboratory") String laboratory);
 
-    List<StandardProductList> selectStandardProductListByTree2(String tree, String sample, String model, String trees, String laboratory);
+    List<StandardProductList> selectStandardProductListByTree2(@Param("tree") String tree, @Param("sample") String sample, @Param("model") String model, @Param("trees") String trees, @Param("laboratory") String laboratory);
 
-    List<StandardProductList> selectStandardProductListByTree3(String tree, String sample, String model, String trees, String laboratory);
+    List<StandardProductList> selectStandardProductListByTree3(@Param("tree") String tree, @Param("sample") String sample, @Param("model") String model, @Param("trees") String trees, @Param("laboratory") String laboratory);
 
     List<SampleTypeDto> getStandardTree2();
 
@@ -42,7 +42,7 @@
 
     String getLaboratory(String str);
 
-    Integer getStructureItemParameterId(String sampleType, String item, String itemChild, String inspectionItemClass);
+    Integer getStructureItemParameterId(@Param("sampleType") String sampleType, @Param("item") String item, @Param("itemChild") String itemChild, @Param("inspectionItemClass") String inspectionItemClass);
 
     List<ProductDto> selectPList(String name);
 
diff --git a/basic-server/src/main/java/com/ruoyi/basic/pojo/StructureItemParameter.java b/basic-server/src/main/java/com/ruoyi/basic/pojo/StructureItemParameter.java
index 61103cb..223587f 100644
--- a/basic-server/src/main/java/com/ruoyi/basic/pojo/StructureItemParameter.java
+++ b/basic-server/src/main/java/com/ruoyi/basic/pojo/StructureItemParameter.java
@@ -36,6 +36,9 @@
     @ApiModelProperty(value = "妫�楠屽璞�")
     private String sample;
 
+    @TableField(exist = false)
+    private String samples;
+
     @ApiModelProperty(value = "鍗曚环(鍏�)")
     private String price;
 
@@ -69,8 +72,16 @@
     @ApiModelProperty(value = "妫�楠岄」绫诲瀷")
     private String inspectionItemType;
 
+    @ApiModelProperty(value = "妫�楠岄」绫诲瀷")
+    @TableField(exist = false)
+    private String inspectionItemTypeTwo;
+
     @ApiModelProperty(value = "妫�楠屽�肩被鍨�")
     private String inspectionValueType;
+
+    @ApiModelProperty(value = "妫�楠屽�肩被鍨�")
+    @TableField(exist = false)
+    private String inspectionValueTypeTwo;
 
     @ApiModelProperty(value = "妫�楠屾鏁�")
     private Integer checkoutNumber;
@@ -81,9 +92,17 @@
     @ApiModelProperty(value = "鐗规畩鏍囪瘑")
     private String bsm;
 
+    @ApiModelProperty(value = "鐗规畩鏍囪瘑")
+    @TableField(exist = false)
+    private String updateBsm;
+
     @ApiModelProperty(value = "鍘熷璁板綍妯℃澘")
     private Integer templateId;
 
+    @ApiModelProperty(value = "鍘熷璁板綍妯℃澘")
+    @TableField(exist = false)
+    private String templateName;
+
     @ApiModelProperty(value = "鍒涘缓浜篿d")
     @TableField(fill = FieldFill.INSERT)
     private Integer createUser;
diff --git a/basic-server/src/main/java/com/ruoyi/basic/service/impl/CapacityScopeServiceImpl.java b/basic-server/src/main/java/com/ruoyi/basic/service/impl/CapacityScopeServiceImpl.java
index 6bc9025..fc2ec38 100644
--- a/basic-server/src/main/java/com/ruoyi/basic/service/impl/CapacityScopeServiceImpl.java
+++ b/basic-server/src/main/java/com/ruoyi/basic/service/impl/CapacityScopeServiceImpl.java
@@ -2,6 +2,7 @@
 
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
@@ -12,15 +13,24 @@
 import com.ruoyi.basic.mapper.*;
 import com.ruoyi.basic.pojo.*;
 import com.ruoyi.basic.service.CapacityScopeService;
+import com.ruoyi.common.core.domain.entity.SysDictData;
 import com.ruoyi.common.exception.base.BaseException;
 import com.ruoyi.common.utils.QueryWrappers;
 import com.ruoyi.basic.service.StandardProductListService;
 import com.ruoyi.basic.service.StructureItemParameterService;
+import com.ruoyi.system.mapper.SysDictTypeMapper;
+import com.ruoyi.system.service.ISysDictTypeService;
 import lombok.AllArgsConstructor;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
+import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
+import java.util.concurrent.CompletableFuture;
 import java.util.stream.Collectors;
 
 /**
@@ -33,7 +43,9 @@
 @AllArgsConstructor
 public class CapacityScopeServiceImpl extends ServiceImpl<StructureItemParameterMapper, StructureItemParameter> implements CapacityScopeService {
 
-    private LaboratoryMapper laboratoryMapper;
+    private StandardProductListMapper standardProductListMapper;
+
+    private ThreadPoolTaskExecutor threadPoolTaskExecutor;
 
     private StructureItemParameterMapper structureItemParameterMapper;
 
@@ -47,9 +59,32 @@
 
     private StructureItemParameterService structureItemParameterService;
 
+    private ISysDictTypeService sysDictTypeService;
+
     @Override
     public IPage<StructureItemParameter> selectItemParameterList(Page page, StructureItemParameter itemParameter) {
-       return structureItemParameterMapper.selectItemParameterList(page, QueryWrappers.queryWrappers(itemParameter));
+        IPage<StructureItemParameter> parameterIPage = structureItemParameterMapper.selectItemParameterList(page, QueryWrappers.queryWrappers(itemParameter));
+        //鏌ヨ瀛楀吀
+        Map<String, List<SysDictData>> dictMaps = sysDictTypeService.selectEnumListByCategory(Arrays.asList("妫�楠岄」绫诲瀷", "鏄惁", "妫�楠屽�肩被鍨�", "鍗曚綅"));
+        parameterIPage.getRecords().forEach(ele->{
+            ele.setInspectionItemTypeTwo(getLabelByValue(dictMaps.get("妫�楠岄」绫诲瀷"),ele.getInspectionItemType()));
+            ele.setUpdateBsm(getLabelByValue(dictMaps.get("鏄惁"),ele.getBsm()));
+            ele.setInspectionValueTypeTwo(getLabelByValue(dictMaps.get("妫�楠屽�肩被鍨�"),ele.getInspectionValueType()));
+        });
+        return parameterIPage;
+    }
+
+    /**
+     * 鏍规嵁value鑾峰彇瀛楀吀
+     * @param dictList
+     * @param value
+     * @return
+     */
+    private String getLabelByValue(List<SysDictData> dictList, String value){
+        if(dictList.isEmpty()){
+            return "";
+        }
+        return dictList.stream().filter(ele-> Objects.equals(ele.getDictValue(),value)).map(SysDictData::getDictLabel).findFirst().orElse("");
     }
 
     @Override
@@ -67,7 +102,29 @@
     }
 
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public int upItemParameter(StructureItemParameter itemParameter) {
+        //鑳藉姏鑼冨洿鏇存柊锛屽悓鏃舵洿鏂板搴旂殑鏍囧噯搴�
+        StructureItemParameter oldParameter = structureItemParameterMapper.selectById(itemParameter.getId());
+        //鍒ゆ柇妫�楠岄」銆佹楠屽瓙椤广�佸崟浣嶆槸鍚︽湁淇敼锛屾湁灏卞悓鏃朵慨鏀规爣鍑嗗簱瀵瑰簲鐨勬暟鎹�
+        if(
+                !StringUtils.equals(itemParameter.getInspectionItem(),oldParameter.getInspectionItem()) ||
+                        !StringUtils.equals(itemParameter.getInspectionItemSubclass(),oldParameter.getInspectionItemSubclass()) ||
+                        !StringUtils.equals(itemParameter.getInspectionItemEn(),oldParameter.getInspectionItemEn()) ||
+                        !StringUtils.equals(itemParameter.getInspectionItemSubclassEn(),oldParameter.getInspectionItemSubclassEn()) ||
+                        !StringUtils.equals(itemParameter.getUnit(),oldParameter.getUnit())
+        ){
+            CompletableFuture.runAsync(() -> {
+                LambdaUpdateWrapper<StandardProductList> updateWrapper = Wrappers.<StandardProductList>lambdaUpdate()
+                        .set(StandardProductList::getInspectionItem, itemParameter.getInspectionItem())
+                        .set(StandardProductList::getInspectionItemEn, itemParameter.getInspectionItemEn())
+                        .set(StandardProductList::getInspectionItemSubclass, itemParameter.getInspectionItemSubclass())
+                        .set(StandardProductList::getInspectionItemSubclassEn, itemParameter.getInspectionItemSubclassEn())
+                        .set(StandardProductList::getUnit, itemParameter.getUnit())
+                        .eq(StandardProductList::getStructureItemParameterId,itemParameter.getId());
+                standardProductListMapper.update(null,updateWrapper);
+            },threadPoolTaskExecutor);
+        }
         return structureItemParameterMapper.updateById(itemParameter);
     }
 
@@ -82,20 +139,19 @@
         if(count.compareTo(0L) > 0){
             throw new BaseException("妫�楠屽璞′笉鑳介噸澶�");
         }
-
         return structureTestObjectMapper.insert(testObject);
     }
 
     @Override
     public int delTestObject(Integer id) {
-        // 鍒犻櫎浜у搧缁存姢鐨勯浂浠剁粦瀹�
         List<Product> products = productMapper.selectList(Wrappers.<Product>lambdaQuery()
                 .eq(Product::getObjectId, id));
         List<Integer> productIds = products.stream().map(Product::getId).collect(Collectors.toList());
         // 鍒犻櫎浜у搧缁存姢
-        productMapper.delete(Wrappers.<Product>lambdaQuery()
-                .in(Product::getId, productIds));
-
+        if (productIds.size()>0) {
+            productMapper.delete(Wrappers.<Product>lambdaQuery()
+                    .in(Product::getId, productIds));
+        }
         return structureTestObjectMapper.deleteById(id);
     }
 
diff --git a/basic-server/src/main/resources/mapper/StructureItemParameterMapper.xml b/basic-server/src/main/resources/mapper/StructureItemParameterMapper.xml
index f52ee2b..d355e72 100644
--- a/basic-server/src/main/resources/mapper/StructureItemParameterMapper.xml
+++ b/basic-server/src/main/resources/mapper/StructureItemParameterMapper.xml
@@ -10,6 +10,7 @@
     </delete>
     <select id="selectItemParameterList" resultType="com.ruoyi.basic.pojo.StructureItemParameter">
         select * from (select A.id,
+        st.name as template_name,
         inspection_item,
         inspection_item_en,
         inspection_item_subclass,
@@ -50,6 +51,7 @@
         END AS samples
         from structure_item_parameter) A
         left join structure_test_object sto on samples = specimen_name
+        LEFT JOIN  standard_template st ON  template_id = st.id
         <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
             ${ew.customSqlSegment}
         </if>)B
diff --git a/cnas-device/pom.xml b/cnas-device/pom.xml
new file mode 100644
index 0000000..ec0af39
--- /dev/null
+++ b/cnas-device/pom.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>ruoyi</artifactId>
+        <groupId>com.ruoyi</groupId>
+        <version>3.8.9</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>cnas-device</artifactId>
+
+    <properties>
+        <maven.compiler.source>8</maven.compiler.source>
+        <maven.compiler.target>8</maven.compiler.target>
+    </properties>
+
+    <dependencies>
+        <!--涓氬姟妯″潡-->
+        <dependency>
+            <groupId>com.ruoyi</groupId>
+            <artifactId>inspect-server</artifactId>
+        </dependency>
+    </dependencies>
+
+</project>
diff --git a/cnas-personnel/pom.xml b/cnas-personnel/pom.xml
new file mode 100644
index 0000000..3a630d5
--- /dev/null
+++ b/cnas-personnel/pom.xml
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>ruoyi</artifactId>
+        <groupId>com.ruoyi</groupId>
+        <version>3.8.9</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>cnas-personnel</artifactId>
+
+    <properties>
+        <maven.compiler.source>8</maven.compiler.source>
+        <maven.compiler.target>8</maven.compiler.target>
+    </properties>
+
+    <dependencies>
+        <!-- 閫氱敤宸ュ叿-->
+        <dependency>
+            <groupId>com.ruoyi</groupId>
+            <artifactId>ruoyi-common</artifactId>
+        </dependency>
+
+        <!-- 鏍稿績妯″潡-->
+        <dependency>
+            <groupId>com.ruoyi</groupId>
+            <artifactId>ruoyi-framework</artifactId>
+        </dependency>
+
+        <!-- 绯荤粺妯″潡-->
+        <dependency>
+            <groupId>com.ruoyi</groupId>
+            <artifactId>ruoyi-system</artifactId>
+        </dependency>
+
+        <!-- 绯荤粺妯″潡-->
+        <dependency>
+            <groupId>com.ruoyi</groupId>
+            <artifactId>inspect-server</artifactId>
+        </dependency>
+
+        <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/controller/FileGeneralController.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/FileGeneralController.java
new file mode 100644
index 0000000..8d95587
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/FileGeneralController.java
@@ -0,0 +1,76 @@
+package com.ruoyi.personnel.controller;
+
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.personnel.service.FileGeneralService;
+import io.swagger.annotations.Api;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletResponse;
+
+@RestController
+@Api(tags = "鏂囦欢閫氱敤鎺ュ彛")
+@RequestMapping("/fileGeneral")
+public class FileGeneralController {
+
+    @Autowired
+    private FileGeneralService fileGeneralService;
+
+    /**
+     * 鏂囦欢涓婁紶
+     * @param file 鏂囦欢鍐呭
+     * @param suffix 鏂囦欢鍚庢渶
+     * @param id 缁戝畾琛ㄧ殑id
+     * @param type 鏋氫妇绫诲瀷
+     * @return
+     */
+
+    @PostMapping("/fileUpload")
+    public Result fileUpload(MultipartFile file, String suffix, Integer id,Integer type) {
+        fileGeneralService.fileUpload(file, suffix, id,type);
+        return Result.success();
+    }
+
+    /**
+     * 鏂囦欢鏁版嵁鏌ョ湅
+     * @param id 缁戝畾id
+     * @param type 鏋氫妇绫诲瀷
+     * @return
+     */
+
+    @GetMapping("/selectFile")
+    public Result selectFile(Integer id,Integer type) {
+        return Result.success(fileGeneralService.selectFile(id,type));
+    }
+
+    /**
+     * 鏂囦欢鍒犻櫎
+     * @param id 鏂囦欢id
+     * @return
+     */
+    @GetMapping("/delFile")
+    public Result delFile(Integer id) {
+        fileGeneralService.delFile(id);
+        return Result.success();
+    }
+
+    /**
+     * 鏂囦欢涓嬭浇
+     * @param id 鏂囦欢id
+     * @return
+     */
+    @PostMapping("/fileDownLoad")
+    public void fileDownLoad(Integer id,HttpServletResponse response) {
+        fileGeneralService.fileDownLoad(id,response);
+    }
+
+
+
+
+
+
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonBasicInfoController.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonBasicInfoController.java
new file mode 100644
index 0000000..015621a
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonBasicInfoController.java
@@ -0,0 +1,202 @@
+package com.ruoyi.personnel.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.common.core.dto.DepartmentDto;
+import com.ruoyi.common.core.dto.UserPageDto;
+import com.ruoyi.common.utils.FileSaveUtil;
+import com.ruoyi.common.utils.JackSonUtil;
+import com.ruoyi.personnel.dto.PersonBasicInfoDetailsDto;
+import com.ruoyi.personnel.dto.PersonBasicInfoDto;
+import com.ruoyi.personnel.pojo.Annex;
+import com.ruoyi.personnel.service.AnnexService;
+import com.ruoyi.personnel.service.PersonBasicInfoService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ *  鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-08-30 09:19:57
+ */
+@Api(tags = "浜哄憳-浜哄憳鍩烘湰淇℃伅")
+@RestController
+@RequestMapping("/personBasicInfo")
+public class PersonBasicInfoController {
+
+    @Resource
+    private PersonBasicInfoService personBasicInfoService;
+
+    @Resource
+    private AnnexService annexService;
+
+    @ApiOperation(value = "鏌ヨCNAS浜哄憳渚ц竟鏍�")
+    @GetMapping("/selectCNSAPersonTree")
+    public Result<List<DepartmentDto>> selectCNSAPersonTree() {
+        return Result.success(personBasicInfoService.selectCNSAPersonTree());
+    }
+
+    @ApiOperation(value = "鑾峰彇CNAS浜哄憳鍩烘湰淇℃伅")
+    @GetMapping("/getCNASPersonnelInfo")
+    public Result getCNASPersonnelInfo(Integer userId) {
+        return Result.success(personBasicInfoService.getCNASPersonnelInfo(userId));
+    }
+
+    @ApiOperation(value = "淇濆瓨CNAS浜哄憳鍩烘湰淇℃伅")
+    @PostMapping("/saveCNASPersonnelInfo")
+    public Result saveCNASPersonnelInfo(@RequestBody PersonBasicInfoDto personBasicInfoDto) {
+        personBasicInfoService.saveCNASPersonnelInfo(personBasicInfoDto);
+        return Result.success();
+    }
+
+    @ApiOperation(value = "浜哄憳鏄庣粏鍒嗛〉鏌ヨ")
+    @GetMapping("basicInformationOfPersonnelSelectPage")
+    public Result<IPage<Map<String, Object>>> basicInformationOfPersonnelSelectPage(Page<List<PersonBasicInfoDetailsDto>> page, String name, Integer departmentId) {
+        return Result.success(personBasicInfoService.basicInformationOfPersonnelSelectPage(page, name, departmentId));
+    }
+
+    // 涓婁紶鏂囦欢鎺ュ彛
+    @ApiOperation(value = "涓婁紶鏂囦欢鎺ュ彛")
+    @PostMapping("/saveCNASFile")
+    public Result saveFile(@RequestPart("file") MultipartFile file) {
+        String s = FileSaveUtil.uploadWordFile(file);
+        return Result.success(s);
+    }
+
+    /**
+     * 璁惧鏍″噯 闄勪欢涓婁紶
+     * @param file
+     * @param suffix
+     * @param id
+     * @return
+     */
+    @ApiOperation(value = "璁惧鏍″噯  涓婁紶鏂囦欢鎺ュ彛")
+    @PostMapping("/saveDeviceCalibrationFile")
+    public Result saveDeviceCalibrationFile(@RequestParam("file") MultipartFile file,@RequestParam("suffix")String suffix,@RequestParam("id") Integer id) {
+        personBasicInfoService.saveDeviceCalibrationFile(file,suffix,id);
+        return Result.success();
+    }
+
+    /**
+     * 鏌ョ湅璁惧鏍″噯闄勪欢
+     * @param id
+     * @return
+     */
+    @ApiOperation(value = "璁惧鏍″噯 闄勪欢鏌ョ湅")
+    @GetMapping("/getDeviceCalibrationFile")
+    public Result getDeviceCalibrationFile(Integer id) {
+        return Result.success(personBasicInfoService.getDeviceCalibrationFile(id));
+    }
+
+    /**
+     * 鍒犻櫎璁惧鏍″噯闄勪欢
+     * @param id
+     * @return
+     */
+    @ApiOperation(value = "璁惧鏍″噯 闄勪欢鍒犻櫎")
+    @DeleteMapping("/delDeviceCalibrationFile")
+    public Result delDeviceCalibrationFile(Integer id) {
+        personBasicInfoService.delDeviceCalibrationFile(id);
+        return Result.success();
+    }
+
+    /**
+     * 涓嬭浇璁惧鏍¢獙闄勪欢涓嬭浇
+     * @param id
+     * @return
+     */
+    @ApiOperation(value = "璁惧鏍¢獙闄勪欢涓嬭浇")
+    @GetMapping("/downLoadDeviceCalibrationFile")
+    public Result downLoadDeviceCalibrationFile(Integer id,HttpServletResponse response) {
+        personBasicInfoService.downLoadDeviceCalibrationFile(id,response);
+        return Result.success();
+    }
+
+
+    @GetMapping("/getAnnexByUserId")
+    public Result<List<Annex>> getAnnexByUserId(Integer userId) {
+        List<Annex> list = annexService.list(new LambdaQueryWrapper<Annex>().eq(Annex::getUserId, userId));
+        return Result.success(list);
+    }
+
+    // 鍒犻櫎鏂囦欢
+    @DeleteMapping("/deleteCNASFile")
+    public Result saveFile(String fileName) {
+        String[] split = fileName.split(",");
+        for (String s : split) {
+            FileSaveUtil.DeleteFile(s);
+        }
+        return Result.success();
+
+    }
+
+    /**
+     * 浜哄憳鍩烘湰淇℃伅闄勪欢鏂板
+     */
+    @PostMapping("/addAnnex")
+    public Result addAnnex(@RequestBody Annex annex) {
+        annexService.save(annex);
+        return Result.success();
+    }
+
+    @GetMapping("/getAnnex")
+    public Result<Annex> getAnnex(Integer id) {
+        return Result.success(annexService.getById(id));
+    }
+    /**
+     * 浜哄憳鍩烘湰淇℃伅闄勪欢鍒犻櫎
+     */
+    @DeleteMapping("/deleteAnnex/{id}")
+    public Result deleteAnnex(@PathVariable("id") Integer id) {
+        annexService.removeById(id);
+        return Result.success();
+    }
+
+    /**
+     * 浜哄憳鍩烘湰淇℃伅闄勪欢淇敼
+     *
+     */
+    @PostMapping("/updateAnnex")
+    public Result updateAnnex(@RequestBody Annex annex) {
+        annexService.updateById(annex);
+        return Result.success();
+    }
+
+    @ApiOperation(value = "瀵煎嚭浜哄憳鍩烘湰淇℃伅")
+    @GetMapping("/exportPersonBasicInfo")
+    public void exportPersonBasicInfo(UserPageDto userPageDto, HttpServletResponse response) throws Exception {
+        personBasicInfoService.exportPersonBasicInfo(userPageDto,response);
+    }
+
+    @ApiOperation(value = "涓嬭浇浜哄憳妗f鍗�")
+    @GetMapping("/exportPersonBasicInfoById")
+    public Result exportPersonBasicInfoById(Integer id, HttpServletResponse response) {
+        return Result.success(personBasicInfoService.exportPersonBasicInfoById(id,response));
+    }
+
+    @GetMapping("/getEmployees")
+    @ApiOperation(value = "瀵规帴浜哄憳骞冲彴 鑾峰彇鎵�鏈変汉鍛樹俊鎭�")
+    public Result getEmployees(Integer departId) {
+        personBasicInfoService.getEmployees(departId);
+        return Result.success();
+    }
+
+    @GetMapping("/getEmployee")
+    @ApiOperation(value = "瀵规帴浜哄憳骞冲彴 鏍规嵁宸ュ彿鑾峰彇浜哄憳淇℃伅")
+    public Result getEmployee(Integer userId) {
+        personBasicInfoService.getEmployee(userId);
+        return Result.success();
+    }
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonCommunicationAbilityController.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonCommunicationAbilityController.java
new file mode 100644
index 0000000..6fa8de7
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonCommunicationAbilityController.java
@@ -0,0 +1,61 @@
+package com.ruoyi.personnel.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.personnel.dto.PersonCommunicationAbilityDto;
+import com.ruoyi.personnel.pojo.PersonCommunicationAbility;
+import com.ruoyi.personnel.service.PersonCommunicationAbilityService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * <p>
+ * 娌熼�氳褰� 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-10-09 12:00:57
+ */
+@Api(tags = "浜哄憳 - 娌熼�氳褰�")
+@RestController
+@RequestMapping("/personCommunicationAbility")
+public class PersonCommunicationAbilityController {
+
+    @Autowired
+    private PersonCommunicationAbilityService personCommunicationAbilityService;
+
+    @ApiOperation(value = "鏂板/鏇存柊 娌熼�氳褰�")
+    @PostMapping("addOrUpdatePersonCommunicationAbility")
+    public Result<?> addOrUpdatePersonCommunicationAbility(@RequestBody PersonCommunicationAbility personCommunicationAbility) {
+        personCommunicationAbilityService.saveOrUpdate(personCommunicationAbility);
+        return Result.success();
+    }
+
+    @ApiOperation(value = "鍒犻櫎 娌熼�氳褰�")
+    @DeleteMapping("deletePersonCommunicationAbility")
+    public Result<?> deletePersonCommunicationAbility(@RequestParam("id") Integer id) {
+        personCommunicationAbilityService.removeById(id);
+        return Result.success();
+    }
+
+
+    @ApiOperation(value = "鏌ヨ 娌熼�氳褰�")
+    @GetMapping("personPersonCommunicationAbilityPage")
+    public Result<IPage<PersonCommunicationAbilityDto>> personPersonCommunicationAbilityPage(Page page,
+                                                                                             Integer departLimsId,
+                                                                                             Integer userId,
+                                                                                             String userName) {
+        return Result.success(personCommunicationAbilityService.personPersonCommunicationAbilityPage(page, departLimsId, userId, userName));
+    }
+
+    @ApiOperation(value = "瀵煎嚭娌熼�氳褰�")
+    @GetMapping("exportPersonCommunicationAbility")
+    public void exportPersonCommunicationAbility(Integer id, HttpServletResponse response) throws Exception{
+        personCommunicationAbilityService.exportPersonCommunicationAbility(id,response);
+    }
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonJobResponsibilitiesController.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonJobResponsibilitiesController.java
new file mode 100644
index 0000000..e9838af
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonJobResponsibilitiesController.java
@@ -0,0 +1,57 @@
+package com.ruoyi.personnel.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.personnel.dto.PersonJobResponsibilitiesDto;
+import com.ruoyi.personnel.pojo.PersonJobResponsibilities;
+import com.ruoyi.personnel.service.PersonJobResponsibilitiesService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * <p>
+ * 宀椾綅鑱岃矗 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-10-09 02:07:49
+ */
+@Api(tags = "浜哄憳 - 宀椾綅鑱岃矗")
+@RestController
+@RequestMapping("/personJobResponsibilities")
+public class PersonJobResponsibilitiesController {
+    @Autowired
+    private PersonJobResponsibilitiesService personJobResponsibilitiesService;
+
+    @ApiOperation(value = "鏂板/鏇存柊 宀椾綅鑱岃矗")
+    @PostMapping("personJobResponsibilitiesSave")
+    public Result<?> personJobResponsibilitiesSave(@RequestBody PersonJobResponsibilities personJobResponsibilities) {
+        personJobResponsibilitiesService.saveOrUpdate(personJobResponsibilities);
+        return Result.success();
+    }
+
+    @ApiOperation(value = "鍒犻櫎 宀椾綅鑱岃矗")
+    @DeleteMapping("personJobResponsibilitiesDelete")
+    public Result<?> personJobResponsibilitiesDelete(@RequestParam("id") Integer id) {
+        personJobResponsibilitiesService.removeById(id);
+        return Result.success();
+    }
+
+    @ApiOperation(value = "鏌ヨ 宀椾綅鑱岃矗")
+    @GetMapping("personJobResponsibilitiesSelect")
+    public Result<IPage<PersonJobResponsibilitiesDto>> personJobResponsibilitiesSelect(Page page, String userId, String departmentId, String userName) {
+        IPage<PersonJobResponsibilitiesDto> iPage = personJobResponsibilitiesService.personJobResponsibilitiesSelect(page, userId, departmentId, userName);
+        return Result.success(iPage);
+    }
+
+    @ApiOperation(value = "瀵煎嚭浠昏亴宀椾綅璇存槑璇�")
+    @GetMapping("/exportPersonJobResponsibilities")
+    public void exportPersonJobResponsibilities(Integer id, HttpServletResponse response){
+        personJobResponsibilitiesService.exportPersonJobResponsibilities(id,response);
+    }
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonPersonnelCapacityController.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonPersonnelCapacityController.java
new file mode 100644
index 0000000..9192ced
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonPersonnelCapacityController.java
@@ -0,0 +1,90 @@
+package com.ruoyi.personnel.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.personnel.dto.PersonPersonnelCapacityDto;
+import com.ruoyi.personnel.pojo.PersonPersonnelCapacity;
+import com.ruoyi.personnel.service.PersonPersonnelCapacityService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.catalina.security.SecurityUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 浜哄憳鑳藉姏 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-10-10 11:26:18
+ */
+@Api(tags = "浜哄憳 - 浜哄憳鑳藉姏")
+@RestController
+@RequestMapping("/personPersonnelCapacity")
+public class PersonPersonnelCapacityController {
+
+    @Autowired
+    private PersonPersonnelCapacityService personPersonnelCapacityService;
+
+    @ApiOperation(value = "鏂板/鏇存柊 浜哄憳鑳藉姏")
+    @PostMapping("addOrUpdatePersonPersonnelCapacity")
+    public Result<?> addOrUpdatePersonPersonnelCapacity(@RequestBody PersonPersonnelCapacity personPersonnelCapacity) {
+        personPersonnelCapacityService.saveOrUpdate(personPersonnelCapacity);
+        return Result.success();
+    }
+
+    @ApiOperation(value = "鍒犻櫎 浜哄憳鑳藉姏")
+    @DeleteMapping("deletePersonPersonnelCapacity")
+    public Result<?> deletePersonPersonnelCapacity(@RequestParam("id") Integer id) {
+        // 鍒犻櫎鏁版嵁
+        personPersonnelCapacityService.removeById(id);
+        return Result.success();
+    }
+
+    @ApiOperation(value = "鏌ヨ 浜哄憳鑳藉姏")
+    @GetMapping("personPersonnelCapacityPage")
+    public Result<IPage<PersonPersonnelCapacityDto>> personPersonnelCapacityPage(Page page,
+                                                                                 Integer departmentId,
+                                                                                 Integer userId,
+                                                                                 String userName) {
+        return Result.success(personPersonnelCapacityService.personPersonnelCapacityPage(page, departmentId, userId, userName));
+    }
+
+    @ApiOperation(value = "纭 浜哄憳鑳藉姏")
+    @PostMapping("confirmPersonnelCapability")
+    public Result<?> confirmPersonnelCapability(@RequestParam("id") Integer id) {
+        Integer userId = SecurityUtils.getUserId().intValue();
+        personPersonnelCapacityService.update(Wrappers.<PersonPersonnelCapacity>lambdaUpdate()
+                .eq(PersonPersonnelCapacity::getId, id)
+                .set(PersonPersonnelCapacity::getConfirmOperatingPersonnelId, userId)
+                .set(PersonPersonnelCapacity::getConfirmDate, LocalDateTime.now()));
+        return Result.success();
+    }
+
+    /**
+     * 瀵煎嚭浜哄憳鑳藉姏
+     * @return
+     */
+    @ApiOperation(value = "瀵煎嚭浜哄憳鑳藉姏")
+    @GetMapping("/exportPersonnelCapacity")
+    public void exportPersonnelCapacity(Integer id, HttpServletResponse response){
+        personPersonnelCapacityService.exportPersonnelCapacity(id, response);
+    }
+
+    /**
+     * 浜哄憳鑳藉姏纭
+     * @return
+     */
+    @ApiOperation(value = "浜哄憳鑳藉姏纭")
+    @GetMapping("/confirmPersonnelCapacity")
+    public Result<?> confirmPersonnelCapacity(Integer id){
+        return Result.success(personPersonnelCapacityService.confirmPersonnelCapacity(id));
+    }
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonPostAuthorizationRecordController.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonPostAuthorizationRecordController.java
new file mode 100644
index 0000000..b3c5614
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonPostAuthorizationRecordController.java
@@ -0,0 +1,66 @@
+package com.ruoyi.personnel.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.common.utils.FileSaveUtil;
+import com.ruoyi.personnel.dto.PersonPostAuthorizationRecordDto;
+import com.ruoyi.personnel.pojo.PersonPostAuthorizationRecord;
+import com.ruoyi.personnel.service.PersonPostAuthorizationRecordService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * <p>
+ * 浠昏亴鎺堟潈璁板綍 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-10-09 10:48:17
+ */
+@Api(tags = "浜哄憳 - 浠昏亴鎺堟潈璁板綍")
+@RestController
+@RequestMapping("/personPostAuthorizationRecord")
+public class PersonPostAuthorizationRecordController {
+
+    @Autowired
+    private PersonPostAuthorizationRecordService personPostAuthorizationRecordService;
+
+    @ApiOperation(value = "鏂板/鏇存柊 浠昏亴鎺堟潈璁板綍")
+    @PostMapping("addOrUpdatePersonPostAuthorizationRecord")
+    public Result<?> addOrUpdatePersonPostAuthorizationRecord(@RequestBody PersonPostAuthorizationRecord personRewardPunishmentRecord) {
+        personPostAuthorizationRecordService.saveOrUpdate(personRewardPunishmentRecord);
+        return Result.success();
+    }
+
+    @ApiOperation(value = "鍒犻櫎 浠昏亴鎺堟潈璁板綍")
+    @DeleteMapping("deletePersonPostAuthorizationRecord")
+    public Result<?> deletePersonPostAuthorizationRecord(@RequestParam("id") Integer id) {
+        // 鍒犻櫎鏂囦欢
+        PersonPostAuthorizationRecord postAuthorizationRecord = personPostAuthorizationRecordService.getById(id);
+        FileSaveUtil.DeleteFile(postAuthorizationRecord.getSystemFileName());
+        // 鍒犻櫎鏁版嵁
+        personPostAuthorizationRecordService.removeById(id);
+        return Result.success();
+    }
+
+
+    @ApiOperation(value = "鏌ヨ 浠昏亴鎺堟潈璁板綍")
+    @GetMapping("PersonPostAuthorizationRecordPage")
+    public Result<IPage<PersonPostAuthorizationRecordDto>> PersonPostAuthorizationRecordPage(Page page,
+                                                                                             Integer departLimsId,
+                                                                                             Integer userId,
+                                                                                             String userName) {
+        return Result.success(personPostAuthorizationRecordService.personPostAuthorizationRecordPage(page, departLimsId, userId, userName));
+    }
+
+    @ApiOperation(value = "瀵煎嚭宀椾綅鑱屼笟璧勬牸璇佷功")
+    @GetMapping("/exportPersonPostAuthorizationRecord")
+    public void exportPersonPostAuthorizationRecord(Integer id, HttpServletResponse response){
+        personPostAuthorizationRecordService.exportPersonPostAuthorizationRecord(id,response);
+    }
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonRewardPunishmentRecordController.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonRewardPunishmentRecordController.java
new file mode 100644
index 0000000..0e35c94
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonRewardPunishmentRecordController.java
@@ -0,0 +1,100 @@
+package com.ruoyi.personnel.controller;
+
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.personnel.dto.PersonRewardPunishmentRecordDto;
+import com.ruoyi.personnel.excel.PersonRewardPunishmentRecordExcel;
+import com.ruoyi.personnel.pojo.PersonRewardPunishmentRecord;
+import com.ruoyi.personnel.service.PersonRewardPunishmentRecordService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.SneakyThrows;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * <p>
+ * 濂栨儵璁板綍 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-10-08 11:25:02
+ */
+@Api(tags = "浜哄憳 - 濂栨儵璁板綍")
+@RestController
+@RequestMapping("/personRewardPunishmentRecord")
+public class PersonRewardPunishmentRecordController {
+
+    @Autowired
+    private PersonRewardPunishmentRecordService personRewardPunishmentRecordService;
+
+    @ApiOperation(value = "鏂板/鏇存柊 濂栨儵璁板綍")
+    @PostMapping("addOrUpdateRewardPunishment")
+    public Result<?> PersonTrainingSave(@RequestBody PersonRewardPunishmentRecord personRewardPunishmentRecord) {
+        personRewardPunishmentRecordService.saveOrUpdate(personRewardPunishmentRecord);
+        return Result.success();
+    }
+
+    @ApiOperation(value = "鍒犻櫎濂栨儵璁板綍")
+    @DeleteMapping("deleteRewardPunishment")
+    public Result<?> deleteRewardPunishment(@RequestParam("id") Integer id) {
+        personRewardPunishmentRecordService.removeById(id);
+        return Result.success();
+    }
+
+    @ApiOperation(value = "鏌ヨ 濂栨儵璁板綍")
+    @GetMapping("rewardPunishmentPage")
+    @SneakyThrows
+    public Result<IPage<PersonRewardPunishmentRecordDto>> rewardPunishmentPage(Page page,
+                                                                               Integer userId,
+                                                                               Integer departmentId,
+                                                                               String userName,
+                                                                               @RequestParam(value = "startTime",required = false) String startTimeStr,
+                                                                               @RequestParam(value = "endTime",required = false) String endTimeStr) {
+        Date startTime = null;
+        Date endTime = null;
+        if (StringUtils.isNotEmpty(startTimeStr) || StringUtils.isNotEmpty(endTimeStr)) {
+            SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
+            startTime = formatter.parse(startTimeStr);
+            endTime = formatter.parse(endTimeStr);
+        }
+        return Result.success(personRewardPunishmentRecordService.rewardPunishmentPage(page, userId, userName, startTime, endTime, departmentId));
+    }
+
+    @ApiOperation(value = "濂栨儵璁板綍瀵煎嚭")
+    @GetMapping("rewardPunishmentExport")
+    public void rewardPunishmentExport(Integer userId,
+                                       Integer departmentId,
+                                       String userName,
+                                       @RequestParam(value = "startTime",required = false) String startTimeStr,
+                                       @RequestParam(value = "endTime",required = false) String endTimeStr,
+                                       HttpServletResponse response) throws Exception {
+        Date startTime = null;
+        Date endTime = null;
+        if (StringUtils.isNotEmpty(startTimeStr) || StringUtils.isNotEmpty(endTimeStr)) {
+            SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
+            startTime = formatter.parse(startTimeStr);
+            endTime = formatter.parse(endTimeStr);
+        }
+        List<PersonRewardPunishmentRecordExcel> data = personRewardPunishmentRecordService.rewardPunishmentExport(userId, departmentId, userName, startTime, endTime);
+        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
+        response.setHeader("requestType", "excel");
+        response.setHeader("Access-Control-Expose-Headers", "requestType");
+        // 璁剧疆鍗曞厓鏍兼牱寮�
+        // 淇濆瓨鍒扮涓�涓猻heet涓�
+        EasyExcel.write(response.getOutputStream())
+                .head(PersonRewardPunishmentRecordExcel.class)
+                .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()) // 鑷�傚簲鍒楀
+                .sheet()
+                .doWrite(data);
+    }
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonSupervisionRecordController.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonSupervisionRecordController.java
new file mode 100644
index 0000000..1905fb1
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonSupervisionRecordController.java
@@ -0,0 +1,161 @@
+package com.ruoyi.personnel.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.personnel.dto.PersonSupervisionRecordDto;
+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 io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.time.LocalDate;
+import java.util.List;
+
+/**
+ * <p>
+ * 鐩戠潱璁板綍 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-10-10 04:16:49
+ */
+@Api(tags = "浜哄憳 - 鐩戠潱璁板綍")
+@RestController
+@RequestMapping("/personSupervisionRecord")
+public class PersonSupervisionRecordController {
+
+    @Autowired
+    private PersonSupervisionRecordService personSupervisionRecordService;
+
+    @Autowired
+    private PersonSupervisionControlSheetService personSupervisionControlSheetService;
+
+    @Autowired
+    private PersonSupervisionProcessingSheetService personSupervisionProcessingSheetService;
+
+    @ApiOperation(value = "鏂板/鏇存柊 鐩戠潱璁板綍")
+    @PostMapping("addOrUpdatePersonSupervisionRecord")
+    public Result<?> addOrUpdatePersonSupervisionRecord(@RequestBody PersonSupervisionRecord personSupervisionRecord) {
+        personSupervisionRecordService.saveOrUpdate(personSupervisionRecord);
+        return Result.success();
+    }
+
+    @ApiOperation(value = "鎵归噺鍒犻櫎 鐩戠潱璁板綍")
+    @ApiImplicitParam(name = "ids", dataType = "array", allowMultiple = true, paramType = "query")
+    @DeleteMapping("deletePersonSupervisionRecord")
+    public Result<?> deletePersonSupervisionRecord(@RequestParam("ids") List<Integer> ids) {
+        personSupervisionRecordService.deletePersonSupervisionRecord(ids);
+        return Result.success();
+    }
+
+    @ApiOperation(value = "鏌ヨ 鐩戠潱璁板綍")
+    @GetMapping("personSupervisionRecordPage")
+    public Result<IPage<PersonSupervisionRecordDto>> personSupervisionRecordPage(Page page,
+                                                                                 Integer userId,
+                                                                                 Integer departLimsId,
+                                                                                 String userName) {
+        return Result.success(personSupervisionRecordService.personSupervisionRecordPage(page, userId, userName, departLimsId));
+    }
+
+
+    @ApiOperation(value = "鎺у埗鍗曞拰澶勭悊鍗� 鏄惁鍙互鎻愪氦")
+    @GetMapping("isSubmit")
+    public Result isSubmit() {
+        return Result.success();
+    }
+
+
+
+    @ApiOperation(value = "鏌ヨ 鐩戠潱璁板綍 - 鎺у埗鍗�")
+    @GetMapping("personSupervisionControlSheetPage")
+    public Result<?> personSupervisionControlSheetPage(Integer id) {
+        PersonSupervisionControlSheet byId = personSupervisionControlSheetService.getOne(Wrappers.<PersonSupervisionControlSheet>lambdaQuery()
+                .eq(PersonSupervisionControlSheet::getSupervisionRecordId, id));
+        if (ObjectUtils.isEmpty(byId)) {
+            return Result.fail(202);
+        } else {
+            return Result.success(byId);
+        }
+    }
+
+    @ApiOperation(value = "鏌ヨ 鐩戠潱璁板綍 - 澶勭悊鍗�")
+    @GetMapping("personSupervisionProcessingPage")
+    public Result<?> personSupervisionProcessingPage(Integer id) {
+        PersonSupervisionProcessingSheet byId = personSupervisionProcessingSheetService.getOne(Wrappers.<PersonSupervisionProcessingSheet>lambdaQuery()
+                .eq(PersonSupervisionProcessingSheet::getSupervisionRecordId, id));
+        if (ObjectUtils.isEmpty(byId)) {
+            return Result.fail(202);
+        } else {
+            return Result.success(byId);
+        }
+    }
+
+    @ApiOperation(value = "鏂板/鏇存柊 鐩戠潱璁板綍 - 鎺у埗鍗�")
+    @PostMapping("addOrUpdatePersonSupervisionControl")
+    public Result<?> addOrUpdatePersonSupervisionControl(@RequestBody PersonSupervisionControlSheet personSupervisionControlSheet) {
+        PersonSupervisionControlSheet supervisionControlSheet = personSupervisionControlSheetService.getOne(Wrappers.<PersonSupervisionControlSheet>lambdaQuery()
+                .eq(PersonSupervisionControlSheet::getSupervisionRecordId, personSupervisionControlSheet.getSupervisionRecordId()));
+        personSupervisionControlSheet.setCreateTime(LocalDate.now());
+        if (ObjectUtils.isEmpty(supervisionControlSheet)) {
+            personSupervisionControlSheetService.save(personSupervisionControlSheet);
+        } else {
+            personSupervisionControlSheetService.updateById(personSupervisionControlSheet);
+        }
+        return Result.success();
+    }
+
+    @ApiOperation(value = "鏂板/鏇存柊 鐩戠潱璁板綍 - 澶勭悊鍗�")
+    @PostMapping("addOrUpdatePersonnelServiceProcessing")
+    public Result<?> addOrUpdatePersonnelServiceProcessing(@RequestBody PersonSupervisionProcessingSheet personSupervisionProcessingSheet) {
+        PersonSupervisionProcessingSheet processingSheetServiceOne = personSupervisionProcessingSheetService.getOne(Wrappers.<PersonSupervisionProcessingSheet>lambdaQuery()
+                .eq(PersonSupervisionProcessingSheet::getSupervisionRecordId, personSupervisionProcessingSheet.getSupervisionRecordId()));
+        if (ObjectUtils.isEmpty(processingSheetServiceOne)) {
+            personSupervisionProcessingSheetService.save(personSupervisionProcessingSheet);
+        } else {
+            personSupervisionProcessingSheetService.updateById(personSupervisionProcessingSheet);
+        }
+        return Result.success();
+    }
+
+    /**
+     * 瀵煎嚭浜哄憳鐩戠潱璁板綍
+     * @return
+     */
+    @ApiOperation(value = "瀵煎嚭浜哄憳鐩戠潱璁板綍")
+    @GetMapping("/exportPersonSupervisionRecord")
+    public void exportPersonSupervisionRecord(Integer id, HttpServletResponse response){
+        personSupervisionRecordService.exportPersonSupervisionRecord(id, response);
+    }
+
+
+    /**
+     * 瀵煎嚭浜哄憳鐩戠潱璁板綍绾犳鎺у埗鍗�
+     * @return
+     */
+    @ApiOperation(value = "瀵煎嚭浜哄憳鐩戠潱璁板綍绾犳鎺у埗鍗�")
+    @GetMapping("/exportSupervisionControlSheet")
+    public void exportSupervisionControlSheet(Integer supervisionRecordId, HttpServletResponse response){
+        personSupervisionControlSheetService.exportSupervisionControlSheet(supervisionRecordId, response);
+    }
+
+    /**
+     * 瀵煎嚭浜哄憳鐩戠潱璁板綍绾犳澶勭悊鍗�
+     * @return
+     */
+    @ApiOperation(value = "瀵煎嚭浜哄憳鐩戠潱璁板綍绾犳澶勭悊鍗�")
+    @GetMapping("/exportSupervisionProcessingSheet")
+    public void exportSupervisionProcessingSheet(Integer supervisionRecordId, HttpServletResponse response){
+        personSupervisionProcessingSheetService.exportSupervisionProcessingSheet(supervisionRecordId, response);
+    }
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonTrackRecordController.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonTrackRecordController.java
new file mode 100644
index 0000000..2e0bcfe
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonTrackRecordController.java
@@ -0,0 +1,88 @@
+package com.ruoyi.personnel.controller;
+
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.common.core.domain.entity.User;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.personnel.pojo.PersonTrackRecord;
+import com.ruoyi.personnel.service.PersonTrackRecordService;
+import com.ruoyi.system.mapper.UserMapper;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+
+/**
+ * <p>
+ * 宸ヤ綔灞ュ巻 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-09-02 03:13:03
+ */
+@Api(tags = "浜哄憳 - 宸ヤ綔灞ュ巻")
+@RestController
+@AllArgsConstructor
+@RequestMapping("/personTrackRecord")
+public class PersonTrackRecordController {
+
+    @Autowired
+    private PersonTrackRecordService personTrackRecordService;
+
+
+    private UserMapper userMapper;
+
+    @ApiOperation(value = "鏂板宸ヤ綔灞ュ巻")
+    @PostMapping("personTrackRecordSave")
+    public Result<?> personTrackRecordSave(@RequestBody PersonTrackRecord personTrackRecord) {
+        Integer userId = SecurityUtils.getUserId().intValue();
+        User user = userMapper.selectById(userId);
+        personTrackRecord.setCreateUser(user.getName());
+        personTrackRecordService.save(personTrackRecord);
+        return Result.success();
+    }
+
+    @ApiOperation(value = "鍒犻櫎宸ヤ綔灞ュ巻")
+    @DeleteMapping("personTrackRecordDelete")
+    public Result<?> personTrackRecordDelete(@RequestParam("id") Integer id) {
+        personTrackRecordService.removeById(id);
+        return Result.success();
+    }
+
+    @ApiOperation(value = "宸ヤ綔灞ュ巻鏇存柊")
+    @PostMapping("personTrackRecordUpdate")
+    public Result<?> personTrackRecordUpdate(@RequestBody PersonTrackRecord personTrackRecord) {
+        personTrackRecordService.updateById(personTrackRecord);
+        return Result.success();
+    }
+
+    @ApiOperation(value = "鏌ヨ宸ヤ綔灞ュ巻")
+    @GetMapping("personTrackRecordSelect")
+    public Result<IPage<PersonTrackRecord>> personTrackRecordSelect(Page page, String userId, String departmentId) {
+        IPage<PersonTrackRecord> iPage = personTrackRecordService.personTrackRecordSelect(page, userId, departmentId);
+        return Result.success(iPage);
+    }
+
+    @ApiOperation(value = "宸ヤ綔灞ュ巻瀵煎嚭")
+    @GetMapping("personTrackRecordExport")
+    public void personTrackRecordExport(HttpServletResponse response, String userId, String departmentId) throws Exception {
+        List<PersonTrackRecord> data = personTrackRecordService.personTrackRecordExport(userId, departmentId);
+        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
+        response.setHeader("requestType", "excel");
+        response.setHeader("Access-Control-Expose-Headers", "requestType");
+        // 璁剧疆鍗曞厓鏍兼牱寮�
+        // 淇濆瓨鍒扮涓�涓猻heet涓�
+        EasyExcel.write(response.getOutputStream())
+                .head(PersonTrackRecord.class)
+                .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()) // 鑷�傚簲鍒楀
+                .sheet()
+                .doWrite(data);
+    }
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonTrainingController.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonTrainingController.java
new file mode 100644
index 0000000..f485096
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonTrainingController.java
@@ -0,0 +1,272 @@
+package com.ruoyi.personnel.controller;
+
+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.ruoyi.common.core.domain.Result;
+import com.ruoyi.common.numgen.NumberGenerator;
+import com.ruoyi.personnel.dto.*;
+import com.ruoyi.personnel.pojo.PersonTraining;
+import com.ruoyi.personnel.pojo.PersonTrainingDetailed;
+import com.ruoyi.personnel.pojo.PersonTrainingRecord;
+import com.ruoyi.personnel.service.PersonTrainingDetailedService;
+import com.ruoyi.personnel.service.PersonTrainingRecordService;
+import com.ruoyi.personnel.service.PersonTrainingService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import java.text.SimpleDateFormat;
+import java.time.LocalDateTime;
+import java.util.Date;
+import java.util.List;
+import java.util.Locale;
+import java.util.Objects;
+
+/**
+ * <p>
+ * 鍩硅璁″垝 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-10-11 01:11:49
+ */
+@Api(tags = "浜哄憳 - 鍩硅璁″垝")
+@RestController
+@RequestMapping("/personTraining")
+public class PersonTrainingController {
+
+    @Autowired
+    private PersonTrainingService personTrainingService;
+
+    @Autowired
+    private PersonTrainingDetailedService personTrainingDetailedService;
+
+    @Autowired
+    private PersonTrainingRecordService personTrainingRecordService;
+
+    @Resource
+    private NumberGenerator<PersonTrainingDetailed> numberGenerator;
+
+    @ApiOperation(value = "鍩硅璁″垝 瀵煎叆")
+    @PostMapping("personTrainingImport")
+    public Result<?> personTrainingImport(@RequestPart("file") MultipartFile file) {
+        personTrainingService.personTrainingImport(file);
+        return Result.success();
+    }
+
+    @ApiOperation(value = "鍩硅璁″垝 鍒犻櫎")
+    @DeleteMapping("personTrainingDelete")
+    public Result<?> personTrainingDelete(@RequestParam("id") Integer id) {
+        personTrainingService.personTrainingDelete(id);
+        return Result.success();
+    }
+    @ApiOperation(value = "鍩硅璁″垝 鏌ヨ")
+    @GetMapping("personTrainingSelect")
+    public Result<IPage<PersonTrainingDto>> personTrainingSelect(Page page, String compilerName, Integer departmentId) {
+        IPage<PersonTrainingDto> iPage = personTrainingService.personTrainingSelect(page, compilerName, departmentId);
+        return Result.success(iPage);
+    }
+
+    @ApiOperation(value = "鍩硅璁″垝 骞村害璁″垝鏄庣粏琛� 鍒犻櫎")
+    @DeleteMapping("/deleteDetail")
+    public Result<?> deleteDetail( Integer id) {
+        personTrainingService.deleteDetail(id);
+        return Result.success();
+    }
+
+    @ApiOperation(value = "骞村害鍩硅璁″垝 瀹℃牳")
+    @PostMapping("reviewAnnualPersonnelTraining")
+    public Result<?> reviewAnnualPersonnelTraining(@RequestBody PersonTrainingUpdateDto personTrainingUpdateDto) {
+        personTrainingService.reviewAnnualPersonnelTraining(personTrainingUpdateDto);
+        return Result.success();
+    }
+
+    @ApiOperation(value = "鍩硅璁″垝 鎵瑰噯")
+    @PostMapping("approveAnnualPersonnelTraining")
+    public Result<?> approveAnnualPersonnelTraining(@RequestBody PersonTrainingUpdateDto personTrainingUpdateDto) {
+        personTrainingService.approveAnnualPersonnelTraining(personTrainingUpdateDto);
+        return Result.success();
+    }
+
+    @ApiOperation(value = "骞村害璁″垝鏄庣粏琛� 鏂板/缂栬緫")
+    @PostMapping("addOrUpdatePersonTrainingDetailed")
+    public Result<?> addOrUpdatePersonTrainingDetailed(@RequestBody PersonTrainingDetailed personTrainingDetailed) {
+        if (ObjectUtils.isEmpty(personTrainingDetailed.getId())) {
+            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);
+        }
+        // 濡傛灉鏄柊澧� 骞村害璁″垝琛ㄩ渶瑕侀噸鏂板鏍搞�佹壒鍑�
+        if(Objects.isNull(personTrainingDetailed.getId())) {
+            PersonTraining byId = personTrainingService.getById(personTrainingDetailed.getPlanId());
+            personTrainingService.update(new LambdaUpdateWrapper<PersonTraining>()
+                    .set(PersonTraining::getReviewerId,null)
+                    .set(PersonTraining::getAuditDate,null)
+                    .set(PersonTraining::getReviewerStatus,null)
+                    .set(PersonTraining::getApproverId,null)
+                    .set(PersonTraining::getApprovalStatus,null)
+                    .set(PersonTraining::getApprovalDate,null)
+                    .eq(PersonTraining::getId,byId.getId()));
+        }
+        // 濡傛灉鏃堕棿宸茬粡鍒颁簡锛岄偅涔堢姸鎬佸氨瑕佹敼涓哄凡缁撴潫
+        LocalDateTime now = LocalDateTime.now();
+        String trainingDateTwo = personTrainingDetailed.getTrainingDateTwo(); // 鏃ユ湡
+        String endTime = personTrainingDetailed.getEndTime(); // 缁撴潫鏃堕棿
+        LocalDateTime parse = LocalDateTime.parse(trainingDateTwo + "T" + endTime);
+        if(now.isAfter(parse)) {
+            personTrainingDetailed.setState(4);
+        }
+        personTrainingDetailedService.saveOrUpdate(personTrainingDetailed);
+        return Result.success();
+    }
+
+    @ApiOperation(value = "骞村害璁″垝鏄庣粏琛� 鎵归噺鍒犻櫎")
+    @DeleteMapping("deleteAnnualPlanDetailTable")
+    public Result<?> deleteAnnualPlanDetailTable(@RequestParam("ids") String ids) {
+        personTrainingDetailedService.deleteAnnualPlanDetailTable(ids);
+        return Result.success();
+    }
+
+    @ApiOperation(value = "骞村害璁″垝鏄庣粏琛� 鏌ヨ")
+    @GetMapping("queryTheAnnualPlanDetailsTable")
+    public Result<IPage<PersonTrainingDetailedDto>> queryTheAnnualPlanDetailsTable(Page page,
+                                                                                   String trainingLecturerName, String courseCode,
+                                                                                   String trainingDate, String id, Integer userId,
+                                                                                   Integer departId,
+                                                                                   Integer state) {
+        Integer planId = 0;
+        if(id.equals("null") || StringUtils.isEmpty(id)) {
+            planId = null;
+        } else {
+            planId = Integer.parseInt(id);
+        }
+        IPage<PersonTrainingDetailedDto> iPage = personTrainingDetailedService.queryTheAnnualPlanDetailsTable(page,
+                trainingLecturerName, courseCode, trainingDate, planId, userId,departId,state);
+        return Result.success(iPage);
+    }
+
+    @ApiOperation(value = "骞村害璁″垝鏄庣粏琛�-缁撴灉鏄庣粏-鏂囦欢涓婁紶")
+    @PostMapping("/fileUpload")
+    public Result<?> fileUpload(@RequestParam MultipartFile file,@RequestParam Integer id) {
+        return Result.success(personTrainingDetailedService.fileUpload(file,id));
+    }
+
+    @ApiOperation(value = "鏌ョ湅鎵�鏈夐儴闂�")
+    @GetMapping("/selectDepartLims")
+    public Result<?> selectDepartLims() {
+        return Result.success(personTrainingDetailedService.selectDepartLims());
+    }
+
+
+    @ApiOperation(value = "鍩硅涓庤�冩牳璁板綍 鏌ヨ")
+    @GetMapping("trainingAndAssessmentRecordsPage")
+    public Result<List<PersonTrainingRecordDto>> trainingAndAssessmentRecordsPage(Integer trainingDetailedId,
+                                                                                  String userName) {
+        List<PersonTrainingRecordDto> list = personTrainingRecordService.trainingAndAssessmentRecordsPage(trainingDetailedId, userName);
+        return Result.success(list);
+    }
+
+    @ApiOperation(value = "鍩硅涓庤�冩牳璁板綍 鏂板浜哄憳")
+    @PostMapping("newPersonnelAddedToTrainingRecords")
+    public Result<?> newPersonnelAddedToTrainingRecords(@RequestBody List<PersonTrainingRecord> personTrainingRecord) {
+        personTrainingRecordService.saveBatch(personTrainingRecord);
+        return Result.success();
+    }
+
+    @ApiOperation(value = "鍩硅涓庤�冩牳璁板綍 璁ら")
+    @PostMapping("claimOfTrainingAndAssessmentRecords")
+    public Result<?> claimOfTrainingAndAssessmentRecords(@RequestParam("claimAndClaim") Boolean claimAndClaim,
+                                                         @RequestParam("courseId") Integer courseId) {
+        personTrainingRecordService.claimOfTrainingAndAssessmentRecords(claimAndClaim, courseId);
+        return Result.success();
+    }
+
+    @ApiOperation(value = "鍩硅涓庤�冩牳璁板綍 鎻愪氦/鎾ら攢")
+    @PostMapping("trainingAndAssessmentRecordsAdded")
+    public Result<?> trainingAndAssessmentRecordsAdded(@RequestBody PersonTrainingRecordSubmitDto personTrainingRecordSubmitDto) {
+        personTrainingDetailedService.update(Wrappers.<PersonTrainingDetailed>lambdaUpdate()
+                .eq(PersonTrainingDetailed::getId, personTrainingRecordSubmitDto.getTrainingDetailedId())
+                .set(PersonTrainingDetailed::getAssessmentMethod, personTrainingRecordSubmitDto.getAssessmentMethod())
+                .set(PersonTrainingDetailed::getComprehensiveAssessment, personTrainingRecordSubmitDto.getComprehensiveAssessment())
+                .set(PersonTrainingDetailed::getAssessmentUserId, personTrainingRecordSubmitDto.getAssessmentUserId())
+                .set(PersonTrainingDetailed::getAssessmentDate, personTrainingRecordSubmitDto.getAssessmentDate())
+                .set(PersonTrainingDetailed::getState, personTrainingRecordSubmitDto.getState())
+                .set(PersonTrainingDetailed::getTrainingAbstract,personTrainingRecordSubmitDto.getTrainingAbstract()));
+        return Result.success();
+    }
+
+    @ApiOperation(value = "鍩硅涓庤�冩牳璁板綍 鍒犻櫎")
+    @DeleteMapping("deleteTrainingAndAssessmentRecords")
+    public Result<?> deleteTrainingAndAssessmentRecords(@RequestParam("ids") String ids) {
+        personTrainingRecordService.deleteTrainingAndAssessmentRecords(ids);
+        return Result.success();
+    }
+
+    @PostMapping("outOfFocusPreservation")
+    public Result<?> outOfFocusPreservation(@RequestBody PersonTrainingRecord personTrainingRecord) {
+        personTrainingRecordService.outOfFocusPreservation(personTrainingRecord);
+        return Result.success();
+    }
+
+    /**
+     * 瀵煎嚭浜哄憳鍩硅璁″垝
+     * @return
+     */
+    @ApiOperation(value = "瀵煎嚭浜哄憳鍩硅璁″垝")
+    @GetMapping("/exportPersonTraining")
+    public void exportPersonTraining(Integer id, HttpServletResponse response){
+        personTrainingService.exportPersonTraining(id, response);
+    }
+
+    /**
+     * 瀵煎嚭浜哄憳鍩硅涓庤�冩牳璁板綍
+     * @return
+     */
+    @ApiOperation(value = "瀵煎嚭浜哄憳鍩硅涓庤�冩牳璁板綍")
+    @GetMapping("/exportPersonTrainingRecord")
+    public void exportPersonTrainingRecord(Integer id, HttpServletResponse response){
+        personTrainingService.exportPersonTrainingRecord(id, response);
+    }
+
+
+    /**
+     * 骞村害璁″垝鏄庣粏琛� 闄勪欢鏌ヨ
+     */
+    @GetMapping("/getFileData")
+    @ApiOperation(value = "闄勪欢鏌ヨ")
+    public Result<?> getFileData(Integer detailedId) {
+        return Result.success(personTrainingDetailedService.getFileData(detailedId));
+    }
+
+    /**
+     * 骞村害璁″垝鏄庣粏琛� 闄勪欢鍒犻櫎
+     */
+    @DeleteMapping("/deleteFile")
+    @ApiOperation(value = "闄勪欢鍒犻櫎")
+    public Result<?> deleteFile(Integer id) {
+        personTrainingDetailedService.deleteFile(id);
+        return Result.success();
+    }
+
+    /**
+     * 闄勪欢涓嬭浇
+     */
+    @ApiOperation(value = "闄勪欢涓嬭浇")
+    @GetMapping("/fileDownLoad")
+    public Result<?> fileDownLoad(Integer id,HttpServletResponse response) {
+        personTrainingDetailedService.fileDownLoad(id,response);
+        return Result.success();
+    }
+
+
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonTrainingRecordController.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonTrainingRecordController.java
new file mode 100644
index 0000000..f5aa1fa
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonTrainingRecordController.java
@@ -0,0 +1,60 @@
+package com.ruoyi.personnel.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.personnel.dto.PersonTrainingRecordListDto;
+import com.ruoyi.personnel.dto.TrainingRecordPersonDetailedDto;
+import com.ruoyi.personnel.service.PersonTrainingRecordService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * <p>
+ * 鍩硅璁″垝 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-10-11 01:11:49
+ */
+@Api(tags = "浜哄憳 - 鍩硅璁板綍")
+@RestController
+@RequestMapping("/personTrainingRecord")
+public class PersonTrainingRecordController {
+
+    @Autowired
+    private PersonTrainingRecordService personTrainingRecordService;
+
+    @ApiOperation(value = "鏌ヨ浜哄憳 鍩硅璁板綍")
+    @GetMapping("trainingSelectTrainingRecord")
+    public Result<IPage<PersonTrainingRecordListDto>> trainingSelectTrainingRecord(Page page, String userName, Integer userId, Integer departmentId) {
+        IPage<PersonTrainingRecordListDto> iPage = personTrainingRecordService.personnelTrainingPersonnel(page, userName, userId, departmentId);
+        return Result.success(iPage);
+    }
+
+    @ApiOperation(value = "鏌ヨ浜哄憳鏄庣粏 鍩硅璁板綍")
+    @GetMapping("queryPersonnelDetails")
+    public Result<IPage<TrainingRecordPersonDetailedDto>> queryPersonnelDetails(Page page, Integer userId, Integer trainingDate) {
+//        IPage<TrainingRecordPersonDetailedDto> iPage = personTrainingRecordService.queryPersonnelDetails(page, userId);
+        IPage<TrainingRecordPersonDetailedDto> iPage = personTrainingRecordService.queryPersonnelDetailsOfUserIdAndYear(page, userId, trainingDate); // 鏂板鏍规嵁骞翠唤鏌ヨ
+        return Result.success(iPage);
+    }
+
+    /**
+     * 瀵煎嚭浜哄憳鍩硅璁板綍
+     * @return
+     */
+    @ApiOperation(value = "瀵煎嚭浜哄憳鍩硅璁板綍")
+    @GetMapping("/exportTrainingRecord")
+    public void exportTrainingRecord(Integer userId, Integer trainingDate, HttpServletResponse response){
+//        personTrainingRecordService.exportTrainingRecord(userId, response);
+        personTrainingRecordService.exportTrainingRecordAddTrainingDate(userId, trainingDate, response);// 鏂板鏍规嵁骞翠唤鏌ヨ
+
+    }
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/SuperVisePlanController.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/SuperVisePlanController.java
new file mode 100644
index 0000000..1c63015
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/SuperVisePlanController.java
@@ -0,0 +1,136 @@
+package com.ruoyi.personnel.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.personnel.dto.PersonSupervisePlanDetailsDto;
+import com.ruoyi.personnel.dto.PersonSupervisePlanDto;
+import com.ruoyi.personnel.pojo.PersonSupervisePlan;
+import com.ruoyi.personnel.pojo.PersonSupervisePlanDetails;
+import com.ruoyi.personnel.service.PersonSupervisePlanDetailsService;
+import com.ruoyi.personnel.service.PersonSupervisePlanService;
+import com.ruoyi.system.mapper.UserMapper;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletResponse;
+import java.time.LocalDateTime;
+import java.util.Map;
+
+/**
+ * <p>
+ * 鐩戠璁″垝 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author tangbowen
+ * @since 2024-09-29 11:13:25
+ */
+@Api(tags = "浜哄憳 - 鐩戠潱璁″垝")
+@AllArgsConstructor
+@RestController
+@RequestMapping("/superVisePlan")
+public class SuperVisePlanController {
+
+    private PersonSupervisePlanDetailsService personSupervisePlanDetailsService;
+
+    private PersonSupervisePlanService personSupervisePlanService;
+
+    private UserMapper userMapper;
+
+    @ApiOperation(value = "鏌ヨ 骞村害璁″垝")
+    @GetMapping("/yearPlanList")
+    public Result<IPage<PersonSupervisePlanDto>> yearPlanList(Integer size, Integer current, @RequestParam(value = "organizationPerson",required = false) String organizationPerson, Integer departId) {
+        if(departId.equals(1)) {
+            departId = null;
+        }
+       return Result.success(personSupervisePlanService.yearPlanDtoIPage(new Page<>(current, size), organizationPerson,departId));
+    }
+
+    @ApiOperation(value = "鎵瑰噯 骞村害璁″垝")
+    @PostMapping("/yearPlanDetailApproval")
+    public Result yearPlanDetailApproval(@RequestBody Map<String,Object> map ) {
+        Integer id = (Integer)map.get("id");
+        Integer approvalStatus =(Integer) map.get("approvalStatus");
+        PersonSupervisePlan byId = personSupervisePlanService.getById(id);
+        // 閫氫俊鐨勪负璁稿啗 鐢靛姏鐨勬槸鍒樺缓寰�
+        Integer approvalId = null;
+        Integer departId = byId.getDepartId();
+        if(departId.equals(18)) {
+            approvalId = 11;
+        } else if (departId.equals(19)) {
+            approvalId = 35;
+        }
+        personSupervisePlanService.update(Wrappers.<PersonSupervisePlan>lambdaUpdate()
+                .eq(PersonSupervisePlan::getId, id)
+                .set(PersonSupervisePlan::getApprovalStatus, approvalStatus)
+                .set(PersonSupervisePlan::getApprovalId,approvalId)
+                .set(PersonSupervisePlan::getApprovalDate, LocalDateTime.now()));
+        return Result.success("鏇存柊鎴愬姛");
+    }
+
+    @ApiOperation(value = "鍒犻櫎 骞村害璁″垝")
+    @DeleteMapping("/yearPlanDel")
+    public Result yearPlanDel(String id) {
+        personSupervisePlanService.removeById(id);
+        // 瀵瑰簲鐨勫勾搴﹁鍒掕鎯呬篃闇�鍒犻櫎
+        personSupervisePlanDetailsService.remove(Wrappers.<PersonSupervisePlanDetails>lambdaQuery()
+                .eq(PersonSupervisePlanDetails::getPlanId, id));
+        return Result.success();
+    }
+
+    @ApiOperation(value = "鏌ヨ 骞村害璁″垝璇︽儏")
+    @GetMapping("/yearPlanDetailList")
+    public Result<IPage<PersonSupervisePlanDetailsDto>> yearPlanDetailList(Page page,
+                                                                           Integer planId,
+                                                                           @RequestParam(value = "date",required = false) String date,
+                                                                           @RequestParam(value = "project",required = false) String project) {
+        return Result.success(personSupervisePlanDetailsService.yearPlanDetailPage(page, date,project, planId));
+    }
+
+    /**
+     * 鍙兘鏄痚xcel 涔熷彲鑳芥槸word
+     * @param file
+     * @param suffix 鏂囦欢鍚庣紑
+     * @return
+     */
+    @ApiOperation(value = "瀵煎叆 骞村害璁″垝")
+    @PostMapping("/yearPlanDetailImport")
+    public Result yearPlanDetailImport(@RequestParam("file") MultipartFile file,@RequestParam("suffix")String suffix) {
+        personSupervisePlanService.yearPlanDetailImport(file,suffix);
+        return Result.success();
+    }
+
+    @ApiOperation(value = "鍒犻櫎 骞村害璁″垝璇︽儏")
+    @DeleteMapping("/yearPlanDetailDel")
+    public Result yearPlanDetailDel(String id) {
+        return Result.success(personSupervisePlanDetailsService.removeById(id));
+    }
+
+    @ApiOperation(value = "鏂板 骞村害璁″垝璇︽儏")
+    @PostMapping("/yearPlanDetailAdd")
+    public Result yearPlanDetailAdd(@RequestBody PersonSupervisePlanDetails personSupervisePlanDetails) {
+        personSupervisePlanDetailsService.save(personSupervisePlanDetails);
+        return Result.success();
+    }
+
+    @ApiOperation(value = "缂栬緫 骞村害璁″垝璇︽儏")
+    @PostMapping("/yearPlanDetailEdit")
+    public Result yearPlanDetailEdit(@RequestBody PersonSupervisePlanDetails personSupervisePlanDetails) {
+        personSupervisePlanDetailsService.updateById(personSupervisePlanDetails);
+        return Result.success("淇濆瓨鎴愬姛");
+    }
+
+    /**
+     * 瀵煎嚭浜哄憳鐩戠潱璁″垝
+     * @return
+     */
+    @ApiOperation(value = "瀵煎嚭浜哄憳鐩戠潱璁″垝")
+    @GetMapping("/exportSuperVisePlan")
+    public void exportSuperVisePlan(Integer id, HttpServletResponse response){
+        personSupervisePlanService.exportSuperVisePlan(id, response);
+    }
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonBasicInfoDetailsDto.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonBasicInfoDetailsDto.java
new file mode 100644
index 0000000..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..b81a69f
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonSupervisePlanServiceImpl.java
@@ -0,0 +1,331 @@
+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.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URLEncoder;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 鐩戠潱璁″垝 - 鐖� 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-10-09 04:14:45
+ */
+@Service
+@Slf4j
+@Transactional(rollbackFor = Exception.class)
+public class PersonSupervisePlanServiceImpl extends ServiceImpl<PersonSupervisePlanMapper, PersonSupervisePlan> implements PersonSupervisePlanService {
+
+    @Resource
+    private PersonSupervisePlanDetailsService personSupervisePlanDetailsService;
+
+    @Resource
+    private PersonSupervisePlanDetailsMapper personSupervisePlanDetailsMapper;
+
+    @Resource
+    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/cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessComplainServiceImpl.java b/cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessComplainServiceImpl.java
index 384e6dc..e7f435c 100644
--- a/cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessComplainServiceImpl.java
+++ b/cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessComplainServiceImpl.java
@@ -35,6 +35,7 @@
     @Resource
     private ProcessComplainMapper processComplainMapper;
 // todo :妫�楠屾牱鍝佸拰鎶ュ憡妯″潡鎼縼涔嬪悗鏀惧紑
+
 //    @Resource
 //    private InsReportMapper insReportMapper;
 //
diff --git a/cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessMethodVerifyServiceImpl.java b/cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessMethodVerifyServiceImpl.java
index 82b850c..d604cd5 100644
--- a/cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessMethodVerifyServiceImpl.java
+++ b/cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessMethodVerifyServiceImpl.java
@@ -289,7 +289,6 @@
         // 灏嗗唴閮ㄥ瓧娈佃浆鎹㈡垚灞曠ず鍒皐ord涓殑瀵硅薄
         ProcessMethodVerifyExportWordDto exportWordTemplate = getExportWordTemplate(processMethodVerify);
 
-        // TODO:瀵煎嚭鏍囧噯鏂规硶鏇存柊楠岃瘉鑾峰彇浜哄憳绛惧悕鍒楄〃鏈缃�
         // 鑾峰彇浜哄憳id瀛楃涓� 濡傦細1,2,3,4,5
         String confirmUser = processMethodVerify.getConfirmUser();
         // 瀵逛汉鍛榠d瀛楃涓茶繘琛屽垎鍓叉垚鏁扮粍
diff --git a/cnas-require/src/main/resources/mapper/FeCalibrationScheduleMapper.xml b/cnas-require/src/main/resources/mapper/FeCalibrationScheduleMapper.xml
index bbdeeae..8485501 100644
--- a/cnas-require/src/main/resources/mapper/FeCalibrationScheduleMapper.xml
+++ b/cnas-require/src/main/resources/mapper/FeCalibrationScheduleMapper.xml
@@ -29,7 +29,7 @@
             <if test="instrumentName != null and instrumentName != ''">
                 instrument_name like CONCAT('%', #{instrumentName}, '%')
             </if>
-            <if test="instrumentName != null and managementNumber != ''">
+            <if test="managementNumber != null and managementNumber != ''">
                 management_number like CONCAT('%', #{managementNumber}, '%')
             </if>
         </where>
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/controller/InsOrderController.java b/inspect-server/src/main/java/com/ruoyi/inspect/controller/InsOrderController.java
index fbc26ce..1a95be3 100644
--- a/inspect-server/src/main/java/com/ruoyi/inspect/controller/InsOrderController.java
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/controller/InsOrderController.java
@@ -17,6 +17,7 @@
 import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
+import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletResponse;
@@ -40,9 +41,12 @@
     //鑾峰彇妫�楠屼笅鍗曟暟鎹�
     @ApiOperation(value = "鏌ョ湅鎵�灞炲崟浣嶆楠屽崟")
     @GetMapping("/selectInsOrderParameter")
+    @PreAuthorize("@ss.hasPermi('business:order:queryAll')")
     public Result selectInsOrderParameter(Page page, SampleOrderDto sampleOrderDto) {
         return Result.success(insOrderService.selectInsOrderParameter(page, sampleOrderDto));
     }
+
+
 
     //鐢ㄤ簬妫�楠屼笅鍗曞尯鍒煡鐪嬫墍鏈夎鍗曞拰鍙煡鐪嬪悓涓�涓鎵樺崟浣嶇殑璁㈠崟
     @ApiOperation(value = "鍒ゆ柇褰撳墠瀹㈡埛绱ф�ラ搴︽槸鍚︾敤瀹�")
@@ -52,11 +56,11 @@
     }
 
     //鐢ㄤ簬妫�楠屼笅鍗曞尯鍒煡鐪嬫墍鏈夎鍗曞拰鍙煡鐪嬪悓涓�涓鎵樺崟浣嶇殑璁㈠崟
-    @ApiOperation(value = "鏌ョ湅鎵�鏈夋楠屽崟")
-    @PostMapping("/selectAllInsOrderParameter")
-    public Result selectAllInsOrderParameter() {
-        return Result.success();
-    }
+//    @ApiOperation(value = "鏌ョ湅鎵�鏈夋楠屽崟")
+//    @PostMapping("/selectAllInsOrderParameter")
+//    public Result selectAllInsOrderParameter() {
+//        return Result.success();
+//    }
 
 
     @ApiOperation(value = "鍒嗛厤鎸夐挳")
@@ -78,14 +82,14 @@
     }
 
     @ApiOperation(value = "鏌ヨ璁㈠崟鏈�闀块璁℃椂闂�")
-    @PostMapping("/selectOrderManDay")
+    @GetMapping("/selectOrderManDay")
     public Result<?> selectOrderManDay(Integer id) {
         int day = insProductService.selectOrderManDay(id);
         return Result.success("鎴愬姛", LocalDateTime.now().plusHours(day).format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
     }
 
     @ApiOperation(value = "鏌ヨ妫�楠屼笅鍗曞唴瀹硅鎯�")
-    @PostMapping("/getInsOrder")
+    @GetMapping("/getInsOrder")
     public Result<?> getInsOrder(Integer orderId) {
         return Result.success(insOrderService.getInsOrder(orderId));
     }
@@ -119,13 +123,13 @@
     }
 
     @ApiOperation(value = "閫氳繃妫�楠屽崟妯℃澘id鑾峰彇妫�楠屽崟妯℃澘鍐呭")
-    @PostMapping("/selectInsOrderTemplateById")
+    @GetMapping("/selectInsOrderTemplateById")
     public Result<?> selectInsOrderTemplateById(Integer id) {
         return Result.success( insOrderTemplateService.selectInsOrderTemplateById(id),"鎴愬姛");
     }
 
     @ApiOperation(value = "閫氳繃妫�楠屽崟鏌ヨ妫�楠屾暟鎹紙鏁版嵁鏌ョ湅锛�")
-    @PostMapping("/selectSampleAndProductByOrderId")
+    @GetMapping("/selectSampleAndProductByOrderId")
     public Result<?> selectSampleAndProductByOrderId(@RequestBody Map<String, Object> data) throws Exception {
         SampleProductDto2 sampleProductDto = JackSonUtil.unmarshal(JackSonUtil.marshal(data.get("entity")), SampleProductDto2.class);
         return Result.success(insOrderService.selectSampleAndProductByOrderId(sampleProductDto));
@@ -143,7 +147,7 @@
     }
 
     @ApiOperation(value = "璐圭敤缁熻鑾峰彇鎬讳环")
-    @PostMapping("/costStatistics2")
+    @GetMapping("/costStatistics2")
     public Result<?> costStatistics2(@RequestBody Map<String, Object> data) throws Exception {
         CostStatisticsDto costStatisticsDto = JackSonUtil.unmarshal(JackSonUtil.marshal(data.get("entity")), CostStatisticsDto.class);
         return Result.success(insOrderService.costStatistics2(costStatisticsDto));
@@ -157,7 +161,7 @@
     }
 
     //寰呮鐨勬挙閿�鐨勬煡璇㈠緟妫�椤圭洰
-    @PostMapping("/selectNoProducts")
+    @GetMapping("/selectNoProducts")
     public Result<?> selectNoProducts(@RequestBody Map<String, Object> data,Integer orderId ,String ids) throws Exception {
         Page page = JackSonUtil.unmarshal(JackSonUtil.marshal(data.get("page")), Page.class);
         InsProduct insProduct = JackSonUtil.unmarshal(JackSonUtil.marshal(data.get("entity")), InsProduct.class);
@@ -289,13 +293,13 @@
     }
 
     @ApiOperation(value = "鏍囩鎵撳嵃鎸夐挳")
-    @PostMapping("/labelPrinting")
+    @GetMapping("/labelPrinting")
     public Result<?> labelPrinting(String ids) {
         return Result.success(insOrderService.labelPrinting(ids));
     }
 
     @ApiOperation(value = "鏌ョ湅璐圭敤缁熻鍒楄〃")
-    @PostMapping("/costStatistics")
+    @GetMapping("/costStatistics")
     public Result<?> costStatistics(@RequestBody Map<String, Object> data) throws Exception {
         Page page = JackSonUtil.unmarshal(JackSonUtil.marshal(data.get("page")), Page.class);
         CostStatisticsDto costStatisticsDto = JackSonUtil.unmarshal(JackSonUtil.marshal(data.get("entity")), CostStatisticsDto.class);
@@ -303,7 +307,7 @@
     }
 
     @ApiOperation(value = "鏌ョ湅缁撴灉鎸夐挳(娓╁害寰幆)")
-    @PostMapping("/getInsOrderTemList")
+    @GetMapping("/getInsOrderTemList")
     public Result getInsOrderTemList(@RequestBody Map<String, Object> data) {
         return Result.success(insOrderService.getInsOrderTemList(data));
     }
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsOrderMapper.java b/inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsOrderMapper.java
index 512ba4d..1fde9fa 100644
--- a/inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsOrderMapper.java
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsOrderMapper.java
@@ -38,7 +38,7 @@
     List<Map<String,Object>> getTabHeader(@Param("sonLaboratory") String sonLaboratory,@Param("sample") String sample);
 
     //鑾峰彇妫�楠屼笅鍗曟暟鎹�
-    IPage<SampleOrderDto> selectInsOrderPage(IPage<InsOrder> page, QueryWrapper<SampleOrderDto> ew, @Param("laboratory") String laboratory,
+    IPage<SampleOrderDto> selectInsOrderPage(IPage<InsOrder> page, @Param("ew") QueryWrapper<SampleOrderDto> ew, @Param("laboratory") String laboratory,
                                              @Param("startTime") String startTime,
                                              @Param("endTime") String endTime,
                                              @Param("eqState") String eqState,
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/service/InsOrderService.java b/inspect-server/src/main/java/com/ruoyi/inspect/service/InsOrderService.java
index e585141..5efb038 100644
--- a/inspect-server/src/main/java/com/ruoyi/inspect/service/InsOrderService.java
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/service/InsOrderService.java
@@ -20,7 +20,7 @@
 public interface InsOrderService extends IService<InsOrder> {
 
     //鑾峰彇鍗曚綅妫�楠屼笅鍗曟暟鎹�
-    Map<String, Object> selectInsOrderParameter(Page<InsOrder> page, SampleOrderDto sampleOrderDto);
+    IPage<SampleOrderDto> selectInsOrderParameter(Page<InsOrder> page, SampleOrderDto sampleOrderDto);
 
     //淇敼妫�楠屼笅鍗曟暟鎹�
     int upInsOrder(UpInsOrderDTO upInsOrderDTO);
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderServiceImpl.java b/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderServiceImpl.java
index 3f1c275..ed21b5c 100644
--- a/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderServiceImpl.java
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderServiceImpl.java
@@ -49,6 +49,7 @@
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.core.Authentication;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Isolation;
 import org.springframework.transaction.annotation.Transactional;
@@ -114,7 +115,7 @@
 
     //鑾峰彇妫�楠屼笅鍗曟暟鎹�
     @Override
-    public Map<String, Object> selectInsOrderParameter(Page<InsOrder> page, SampleOrderDto sampleOrderDto) {
+    public IPage<SampleOrderDto> selectInsOrderParameter(Page<InsOrder> page, SampleOrderDto sampleOrderDto) {
         page.setOptimizeCountSql(false);
         List<String> startAndEndTime = sampleOrderDto.getStartAndEndTime();
         String startTime = "";
@@ -123,25 +124,23 @@
             startTime = startAndEndTime.get(0) + " 00:00:00";
             endTime = startAndEndTime.get(1) + " 23:59:59";
         }
-
-        Map<String, Object> map = new HashMap<>();
 ////        map.put("head", PrintChina.printChina(SampleOrderDto.class));
 //        //鍒ゆ柇鍏ㄩ儴,涓汉,缁勭粐鐨勬潈闄�
 //        Map<String, Integer> map1 = getLook.selectPowerByMethodAndUserId("selectInsOrderParameter");
-//        User user = userMapper.selectById(map1.get("userId"));//褰撳墠鐧诲綍鐨勪汉
-//        Integer roleId = user.getRoleId();
+        User user = userMapper.selectById(SecurityUtils.getUserId());;//褰撳墠鐧诲綍鐨勪汉
 //        //鑾峰彇褰撳墠浜烘墍灞炲疄楠屽id
-//        String departLimsId = user.getDepartLimsId();
-        String laboratory = null;
-//        if (ObjectUtils.isNotEmpty(departLimsId) && !departLimsId.isEmpty()) {
-//            String[] split = departLimsId.split(",");
-//            //鏌ヨ瀵瑰簲鏋舵瀯鍚嶇О(閫氫俊瀹為獙瀹�,鐢靛姏瀹為獙瀹�,妫�娴嬪姙)
-//            String departLims = baseMapper.seldepLimsId(Integer.parseInt(split[split.length - 1]));
-//            if (departLims.contains("瀹為獙瀹�")) {
-//                laboratory = departLims;
-//            }
-//        }
+        String departLimsId = user.getDepartLimsId();
+        String laboratory = "";
+        if (ObjectUtils.isNotEmpty(departLimsId) && !departLimsId.isEmpty()) {
+            String[] split = departLimsId.split(",");
+            //鏌ヨ瀵瑰簲鏋舵瀯鍚嶇О(閫氫俊瀹為獙瀹�,鐢靛姏瀹為獙瀹�,妫�娴嬪姙)
+            String departLims = baseMapper.seldepLimsId(Integer.parseInt(split[split.length - 1]));
+            if (departLims.contains("瀹為獙瀹�")) {
+                laboratory = departLims;
+            }
+        }
 //        //鍒ゆ柇鏄惁鏄叏閮ㄦ潈闄�
+//        SecurityUtils.hasPermi("");
 //        Power power = powerMapper.selectOne(Wrappers.<Power>lambdaQuery().eq(Power::getRoleId, roleId).eq(Power::getMenuMethod, "selectAllInsOrderParameter"));
 //        if (ObjectUtils.isEmpty(power)) {
 //            if (map1.get("look") == 1) {
@@ -174,8 +173,7 @@
                 i.setSampleCode(split[0]);
             }
         });
-        map.put("body", sampleOrderDtoIPage);
-        return map;
+        return sampleOrderDtoIPage;
     }
 
     @Override
diff --git a/inspect-server/src/main/resources/mapper/InsOrderMapper.xml b/inspect-server/src/main/resources/mapper/InsOrderMapper.xml
index d6baaef..2af95a9 100644
--- a/inspect-server/src/main/resources/mapper/InsOrderMapper.xml
+++ b/inspect-server/src/main/resources/mapper/InsOrderMapper.xml
@@ -840,7 +840,7 @@
     </select>
 
     <select id="seldepLimsId" resultType="java.lang.String">
-        select name
+        select `name`
         from department_lims
         where id = #{depLimsId}
     </select>
diff --git a/performance-server/src/main/java/com/ruoyi/performance/controller/PerformanceShiftController.java b/performance-server/src/main/java/com/ruoyi/performance/controller/PerformanceShiftController.java
index e7b2064..26b0197 100644
--- a/performance-server/src/main/java/com/ruoyi/performance/controller/PerformanceShiftController.java
+++ b/performance-server/src/main/java/com/ruoyi/performance/controller/PerformanceShiftController.java
@@ -123,7 +123,7 @@
     @GetMapping("temporaryInterface")
     public void temporaryInterface() {
         System.out.println("寮�濮嬬粰姣忎釜浜鸿繘琛屾帓鐝�,榛樿鏃╃彮======start");
-        // TODO 缁欐瘡涓汉閮借繘琛屾帓鐝�(榛樿鏃╃彮)
+        // 缁欐瘡涓汉閮借繘琛屾帓鐝�(榛樿鏃╃彮)
         PerformanceShiftAddDto performanceShiftAddDto = new PerformanceShiftAddDto();
         //鐝--鏃�(鏌ヨ瀛楀吀)
         List<SysDictData> shiftType = dictTypeService.selectDictDataByName("鐝绫诲瀷");
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/pom.xml b/pom.xml
index 614477f..a7ea6ca 100644
--- a/pom.xml
+++ b/pom.xml
@@ -205,20 +205,6 @@
                 <version>${kaptcha.version}</version>
             </dependency>
 
-            <!-- 瀹氭椂浠诲姟-->
-            <dependency>
-                <groupId>com.ruoyi</groupId>
-                <artifactId>ruoyi-quartz</artifactId>
-                <version>${ruoyi.version}</version>
-            </dependency>
-
-            <!-- 浠g爜鐢熸垚-->
-            <dependency>
-                <groupId>com.ruoyi</groupId>
-                <artifactId>ruoyi-generator</artifactId>
-                <version>${ruoyi.version}</version>
-            </dependency>
-
             <!-- 鏍稿績妯″潡-->
             <dependency>
                 <groupId>com.ruoyi</groupId>
@@ -279,6 +265,20 @@
             <dependency>
                 <groupId>com.ruoyi</groupId>
                 <artifactId>cnas-require</artifactId>
+                <version>${ruoyi.version}</version>
+            </dependency>
+
+            <!--cnas璁惧绠$悊-->
+            <dependency>
+                <groupId>com.ruoyi</groupId>
+                <artifactId>cnas-device</artifactId>
+                <version>${ruoyi.version}</version>
+            </dependency>
+
+            <!--cnas浜哄憳-->
+            <dependency>
+                <groupId>com.ruoyi</groupId>
+                <artifactId>cnas-personnel</artifactId>
                 <version>${ruoyi.version}</version>
             </dependency>
 
@@ -399,6 +399,8 @@
         <module>cnas-process</module>
         <module>cnas-require</module>
         <module>cnas_server</module>
+        <module>cnas-device</module>
+        <module>cnas-personnel</module>
     </modules>
     <packaging>pom</packaging>
 
diff --git a/ruoyi-admin/pom.xml b/ruoyi-admin/pom.xml
index 0fbb1aa..8d01590 100644
--- a/ruoyi-admin/pom.xml
+++ b/ruoyi-admin/pom.xml
@@ -54,18 +54,6 @@
             <artifactId>ruoyi-framework</artifactId>
         </dependency>
 
-        <!-- 瀹氭椂浠诲姟-->
-        <dependency>
-            <groupId>com.ruoyi</groupId>
-            <artifactId>ruoyi-quartz</artifactId>
-        </dependency>
-
-        <!-- 浠g爜鐢熸垚-->
-        <dependency>
-            <groupId>com.ruoyi</groupId>
-            <artifactId>ruoyi-generator</artifactId>
-        </dependency>
-
         <!--鍩虹妯″潡-->
         <dependency>
             <groupId>com.ruoyi</groupId>
@@ -104,6 +92,18 @@
             <groupId>com.ruoyi</groupId>
             <artifactId>cnas-require</artifactId>
         </dependency>
+
+        <!--cnas璁惧绠$悊-->
+        <dependency>
+            <groupId>com.ruoyi</groupId>
+            <artifactId>cnas-device</artifactId>
+        </dependency>
+
+        <!--cnas浜哄憳-->
+        <dependency>
+            <groupId>com.ruoyi</groupId>
+            <artifactId>cnas-personnel</artifactId>
+        </dependency>
     </dependencies>
 
     <build>
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictTypeController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictTypeController.java
index 7e3a519..f61208e 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictTypeController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictTypeController.java
@@ -2,6 +2,9 @@
 
 import java.util.List;
 import javax.servlet.http.HttpServletResponse;
+
+import io.swagger.annotations.ApiModelProperty;
+import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.validation.annotation.Validated;
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..53ee93f 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.*;
@@ -33,7 +33,7 @@
     private HeaderToken headerToken;
 
     /**
-     * todo:  type : 1: 鑾峰彇妫�娴嬩汉鍛樹俊鎭�
+     *type : 1: 鑾峰彇妫�娴嬩汉鍛樹俊鎭�
      type : 2: 鑾峰彇褰撳墠閮ㄩ棬(瀹為獙瀹や汉鍛�)
      * @param user
      * @param type
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-common/src/main/java/com/ruoyi/common/utils/FileSaveUtil.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/FileSaveUtil.java
index da4ca5f..d92c183 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/FileSaveUtil.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/FileSaveUtil.java
@@ -1,6 +1,7 @@
 package com.ruoyi.common.utils;
 
 import com.alibaba.excel.util.IoUtils;
+import com.ruoyi.common.exception.base.BaseException;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Component;
@@ -69,7 +70,7 @@
             suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
             // 濡傛灉鍚庣紑鍚嶄笉閫氳繃鎶涘嚭寮傚父
             if (!isFileAllowed(suffix)){
-                throw new RuntimeException(suffix);
+                throw new BaseException("涓嶆敮鎸佽鏂囦欢绫诲瀷涓婁紶");
             }
         }
         // 鍚嶇О鎷兼帴
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-generator/pom.xml b/ruoyi-generator/pom.xml
deleted file mode 100644
index 188cd90..0000000
--- a/ruoyi-generator/pom.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <parent>
-        <artifactId>ruoyi</artifactId>
-        <groupId>com.ruoyi</groupId>
-        <version>3.8.9</version>
-    </parent>
-    <modelVersion>4.0.0</modelVersion>
-
-    <artifactId>ruoyi-generator</artifactId>
-
-    <description>
-        generator浠g爜鐢熸垚
-    </description>
-
-    <dependencies>
-
-        <!-- velocity浠g爜鐢熸垚浣跨敤妯℃澘 -->
-        <dependency>
-            <groupId>org.apache.velocity</groupId>
-            <artifactId>velocity-engine-core</artifactId>
-        </dependency>
-
-        <!-- 閫氱敤宸ュ叿-->
-        <dependency>
-            <groupId>com.ruoyi</groupId>
-            <artifactId>ruoyi-common</artifactId>
-        </dependency>
-
-        <!-- 闃块噷鏁版嵁搴撹繛鎺ユ睜 -->
-        <dependency>
-            <groupId>com.alibaba</groupId>
-            <artifactId>druid-spring-boot-starter</artifactId>
-        </dependency>
-
-    </dependencies>
-
-</project>
\ No newline at end of file
diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/config/GenConfig.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/config/GenConfig.java
deleted file mode 100644
index c01857c..0000000
--- a/ruoyi-generator/src/main/java/com/ruoyi/generator/config/GenConfig.java
+++ /dev/null
@@ -1,87 +0,0 @@
-package com.ruoyi.generator.config;
-
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.boot.context.properties.ConfigurationProperties;
-import org.springframework.context.annotation.PropertySource;
-import org.springframework.stereotype.Component;
-
-/**
- * 璇诲彇浠g爜鐢熸垚鐩稿叧閰嶇疆
- * 
- * @author ruoyi
- */
-@Component
-@ConfigurationProperties(prefix = "gen")
-@PropertySource(value = { "classpath:generator.yml" })
-public class GenConfig
-{
-    /** 浣滆�� */
-    public static String author;
-
-    /** 鐢熸垚鍖呰矾寰� */
-    public static String packageName;
-
-    /** 鑷姩鍘婚櫎琛ㄥ墠缂� */
-    public static boolean autoRemovePre;
-
-    /** 琛ㄥ墠缂� */
-    public static String tablePrefix;
-
-    /** 鏄惁鍏佽鐢熸垚鏂囦欢瑕嗙洊鍒版湰鍦帮紙鑷畾涔夎矾寰勶級 */
-    public static boolean allowOverwrite;
-
-    public static String getAuthor()
-    {
-        return author;
-    }
-
-    @Value("${author}")
-    public void setAuthor(String author)
-    {
-        GenConfig.author = author;
-    }
-
-    public static String getPackageName()
-    {
-        return packageName;
-    }
-
-    @Value("${packageName}")
-    public void setPackageName(String packageName)
-    {
-        GenConfig.packageName = packageName;
-    }
-
-    public static boolean getAutoRemovePre()
-    {
-        return autoRemovePre;
-    }
-
-    @Value("${autoRemovePre}")
-    public void setAutoRemovePre(boolean autoRemovePre)
-    {
-        GenConfig.autoRemovePre = autoRemovePre;
-    }
-
-    public static String getTablePrefix()
-    {
-        return tablePrefix;
-    }
-
-    @Value("${tablePrefix}")
-    public void setTablePrefix(String tablePrefix)
-    {
-        GenConfig.tablePrefix = tablePrefix;
-    }
-
-    public static boolean isAllowOverwrite()
-    {
-        return allowOverwrite;
-    }
-
-    @Value("${allowOverwrite}")
-    public void setAllowOverwrite(boolean allowOverwrite)
-    {
-        GenConfig.allowOverwrite = allowOverwrite;
-    }
-}
diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/controller/GenController.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/controller/GenController.java
deleted file mode 100644
index ac040ed..0000000
--- a/ruoyi-generator/src/main/java/com/ruoyi/generator/controller/GenController.java
+++ /dev/null
@@ -1,263 +0,0 @@
-package com.ruoyi.generator.controller;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import javax.servlet.http.HttpServletResponse;
-import org.apache.commons.io.IOUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.DeleteMapping;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.PutMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-import com.alibaba.druid.DbType;
-import com.alibaba.druid.sql.SQLUtils;
-import com.alibaba.druid.sql.ast.SQLStatement;
-import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlCreateTableStatement;
-import com.ruoyi.common.annotation.Log;
-import com.ruoyi.common.core.controller.BaseController;
-import com.ruoyi.common.core.domain.AjaxResult;
-import com.ruoyi.common.core.page.TableDataInfo;
-import com.ruoyi.common.core.text.Convert;
-import com.ruoyi.common.enums.BusinessType;
-import com.ruoyi.common.utils.SecurityUtils;
-import com.ruoyi.common.utils.sql.SqlUtil;
-import com.ruoyi.generator.config.GenConfig;
-import com.ruoyi.generator.domain.GenTable;
-import com.ruoyi.generator.domain.GenTableColumn;
-import com.ruoyi.generator.service.IGenTableColumnService;
-import com.ruoyi.generator.service.IGenTableService;
-
-/**
- * 浠g爜鐢熸垚 鎿嶄綔澶勭悊
- *
- * @author ruoyi
- */
-@RestController
-@RequestMapping("/tool/gen")
-public class GenController extends BaseController
-{
-    @Autowired
-    private IGenTableService genTableService;
-
-    @Autowired
-    private IGenTableColumnService genTableColumnService;
-
-    /**
-     * 鏌ヨ浠g爜鐢熸垚鍒楄〃
-     */
-    @PreAuthorize("@ss.hasPermi('tool:gen:list')")
-    @GetMapping("/list")
-    public TableDataInfo genList(GenTable genTable)
-    {
-        startPage();
-        List<GenTable> list = genTableService.selectGenTableList(genTable);
-        return getDataTable(list);
-    }
-
-    /**
-     * 淇敼浠g爜鐢熸垚涓氬姟
-     */
-    @PreAuthorize("@ss.hasPermi('tool:gen:query')")
-    @GetMapping(value = "/{tableId}")
-    public AjaxResult getInfo(@PathVariable Long tableId)
-    {
-        GenTable table = genTableService.selectGenTableById(tableId);
-        List<GenTable> tables = genTableService.selectGenTableAll();
-        List<GenTableColumn> list = genTableColumnService.selectGenTableColumnListByTableId(tableId);
-        Map<String, Object> map = new HashMap<String, Object>();
-        map.put("info", table);
-        map.put("rows", list);
-        map.put("tables", tables);
-        return success(map);
-    }
-
-    /**
-     * 鏌ヨ鏁版嵁搴撳垪琛�
-     */
-    @PreAuthorize("@ss.hasPermi('tool:gen:list')")
-    @GetMapping("/db/list")
-    public TableDataInfo dataList(GenTable genTable)
-    {
-        startPage();
-        List<GenTable> list = genTableService.selectDbTableList(genTable);
-        return getDataTable(list);
-    }
-
-    /**
-     * 鏌ヨ鏁版嵁琛ㄥ瓧娈靛垪琛�
-     */
-    @PreAuthorize("@ss.hasPermi('tool:gen:list')")
-    @GetMapping(value = "/column/{tableId}")
-    public TableDataInfo columnList(Long tableId)
-    {
-        TableDataInfo dataInfo = new TableDataInfo();
-        List<GenTableColumn> list = genTableColumnService.selectGenTableColumnListByTableId(tableId);
-        dataInfo.setRows(list);
-        dataInfo.setTotal(list.size());
-        return dataInfo;
-    }
-
-    /**
-     * 瀵煎叆琛ㄧ粨鏋勶紙淇濆瓨锛�
-     */
-    @PreAuthorize("@ss.hasPermi('tool:gen:import')")
-    @Log(title = "浠g爜鐢熸垚", businessType = BusinessType.IMPORT)
-    @PostMapping("/importTable")
-    public AjaxResult importTableSave(String tables)
-    {
-        String[] tableNames = Convert.toStrArray(tables);
-        // 鏌ヨ琛ㄤ俊鎭�
-        List<GenTable> tableList = genTableService.selectDbTableListByNames(tableNames);
-        genTableService.importGenTable(tableList, SecurityUtils.getUsername());
-        return success();
-    }
-
-    /**
-     * 鍒涘缓琛ㄧ粨鏋勶紙淇濆瓨锛�
-     */
-    @PreAuthorize("@ss.hasRole('admin')")
-    @Log(title = "鍒涘缓琛�", businessType = BusinessType.OTHER)
-    @PostMapping("/createTable")
-    public AjaxResult createTableSave(String sql)
-    {
-        try
-        {
-            SqlUtil.filterKeyword(sql);
-            List<SQLStatement> sqlStatements = SQLUtils.parseStatements(sql, DbType.mysql);
-            List<String> tableNames = new ArrayList<>();
-            for (SQLStatement sqlStatement : sqlStatements)
-            {
-                if (sqlStatement instanceof MySqlCreateTableStatement)
-                {
-                    MySqlCreateTableStatement createTableStatement = (MySqlCreateTableStatement) sqlStatement;
-                    if (genTableService.createTable(createTableStatement.toString()))
-                    {
-                        String tableName = createTableStatement.getTableName().replaceAll("`", "");
-                        tableNames.add(tableName);
-                    }
-                }
-            }
-            List<GenTable> tableList = genTableService.selectDbTableListByNames(tableNames.toArray(new String[tableNames.size()]));
-            String operName = SecurityUtils.getUsername();
-            genTableService.importGenTable(tableList, operName);
-            return AjaxResult.success();
-        }
-        catch (Exception e)
-        {
-            logger.error(e.getMessage(), e);
-            return AjaxResult.error("鍒涘缓琛ㄧ粨鏋勫紓甯�");
-        }
-    }
-
-    /**
-     * 淇敼淇濆瓨浠g爜鐢熸垚涓氬姟
-     */
-    @PreAuthorize("@ss.hasPermi('tool:gen:edit')")
-    @Log(title = "浠g爜鐢熸垚", businessType = BusinessType.UPDATE)
-    @PutMapping
-    public AjaxResult editSave(@Validated @RequestBody GenTable genTable)
-    {
-        genTableService.validateEdit(genTable);
-        genTableService.updateGenTable(genTable);
-        return success();
-    }
-
-    /**
-     * 鍒犻櫎浠g爜鐢熸垚
-     */
-    @PreAuthorize("@ss.hasPermi('tool:gen:remove')")
-    @Log(title = "浠g爜鐢熸垚", businessType = BusinessType.DELETE)
-    @DeleteMapping("/{tableIds}")
-    public AjaxResult remove(@PathVariable Long[] tableIds)
-    {
-        genTableService.deleteGenTableByIds(tableIds);
-        return success();
-    }
-
-    /**
-     * 棰勮浠g爜
-     */
-    @PreAuthorize("@ss.hasPermi('tool:gen:preview')")
-    @GetMapping("/preview/{tableId}")
-    public AjaxResult preview(@PathVariable("tableId") Long tableId) throws IOException
-    {
-        Map<String, String> dataMap = genTableService.previewCode(tableId);
-        return success(dataMap);
-    }
-
-    /**
-     * 鐢熸垚浠g爜锛堜笅杞芥柟寮忥級
-     */
-    @PreAuthorize("@ss.hasPermi('tool:gen:code')")
-    @Log(title = "浠g爜鐢熸垚", businessType = BusinessType.GENCODE)
-    @GetMapping("/download/{tableName}")
-    public void download(HttpServletResponse response, @PathVariable("tableName") String tableName) throws IOException
-    {
-        byte[] data = genTableService.downloadCode(tableName);
-        genCode(response, data);
-    }
-
-    /**
-     * 鐢熸垚浠g爜锛堣嚜瀹氫箟璺緞锛�
-     */
-    @PreAuthorize("@ss.hasPermi('tool:gen:code')")
-    @Log(title = "浠g爜鐢熸垚", businessType = BusinessType.GENCODE)
-    @GetMapping("/genCode/{tableName}")
-    public AjaxResult genCode(@PathVariable("tableName") String tableName)
-    {
-        if (!GenConfig.isAllowOverwrite())
-        {
-            return AjaxResult.error("銆愮郴缁熼璁俱�戜笉鍏佽鐢熸垚鏂囦欢瑕嗙洊鍒版湰鍦�");
-        }
-        genTableService.generatorCode(tableName);
-        return success();
-    }
-
-    /**
-     * 鍚屾鏁版嵁搴�
-     */
-    @PreAuthorize("@ss.hasPermi('tool:gen:edit')")
-    @Log(title = "浠g爜鐢熸垚", businessType = BusinessType.UPDATE)
-    @GetMapping("/synchDb/{tableName}")
-    public AjaxResult synchDb(@PathVariable("tableName") String tableName)
-    {
-        genTableService.synchDb(tableName);
-        return success();
-    }
-
-    /**
-     * 鎵归噺鐢熸垚浠g爜
-     */
-    @PreAuthorize("@ss.hasPermi('tool:gen:code')")
-    @Log(title = "浠g爜鐢熸垚", businessType = BusinessType.GENCODE)
-    @GetMapping("/batchGenCode")
-    public void batchGenCode(HttpServletResponse response, String tables) throws IOException
-    {
-        String[] tableNames = Convert.toStrArray(tables);
-        byte[] data = genTableService.downloadCode(tableNames);
-        genCode(response, data);
-    }
-
-    /**
-     * 鐢熸垚zip鏂囦欢
-     */
-    private void genCode(HttpServletResponse response, byte[] data) throws IOException
-    {
-        response.reset();
-        response.addHeader("Access-Control-Allow-Origin", "*");
-        response.addHeader("Access-Control-Expose-Headers", "Content-Disposition");
-        response.setHeader("Content-Disposition", "attachment; filename=\"ruoyi.zip\"");
-        response.addHeader("Content-Length", "" + data.length);
-        response.setContentType("application/octet-stream; charset=UTF-8");
-        IOUtils.write(data, response.getOutputStream());
-    }
-}
diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/domain/GenTable.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/domain/GenTable.java
deleted file mode 100644
index 022a54d..0000000
--- a/ruoyi-generator/src/main/java/com/ruoyi/generator/domain/GenTable.java
+++ /dev/null
@@ -1,385 +0,0 @@
-package com.ruoyi.generator.domain;
-
-import java.util.List;
-import javax.validation.Valid;
-import javax.validation.constraints.NotBlank;
-import org.apache.commons.lang3.ArrayUtils;
-import com.ruoyi.common.constant.GenConstants;
-import com.ruoyi.common.core.domain.BaseEntity;
-import com.ruoyi.common.utils.StringUtils;
-
-/**
- * 涓氬姟琛� gen_table
- * 
- * @author ruoyi
- */
-public class GenTable extends BaseEntity
-{
-    private static final long serialVersionUID = 1L;
-
-    /** 缂栧彿 */
-    private Long tableId;
-
-    /** 琛ㄥ悕绉� */
-    @NotBlank(message = "琛ㄥ悕绉颁笉鑳戒负绌�")
-    private String tableName;
-
-    /** 琛ㄦ弿杩� */
-    @NotBlank(message = "琛ㄦ弿杩颁笉鑳戒负绌�")
-    private String tableComment;
-
-    /** 鍏宠仈鐖惰〃鐨勮〃鍚� */
-    private String subTableName;
-
-    /** 鏈〃鍏宠仈鐖惰〃鐨勫閿悕 */
-    private String subTableFkName;
-
-    /** 瀹炰綋绫诲悕绉�(棣栧瓧姣嶅ぇ鍐�) */
-    @NotBlank(message = "瀹炰綋绫诲悕绉颁笉鑳戒负绌�")
-    private String className;
-
-    /** 浣跨敤鐨勬ā鏉匡紙crud鍗曡〃鎿嶄綔 tree鏍戣〃鎿嶄綔 sub涓诲瓙琛ㄦ搷浣滐級 */
-    private String tplCategory;
-
-    /** 鍓嶇绫诲瀷锛坋lement-ui妯$増 element-plus妯$増锛� */
-    private String tplWebType;
-
-    /** 鐢熸垚鍖呰矾寰� */
-    @NotBlank(message = "鐢熸垚鍖呰矾寰勪笉鑳戒负绌�")
-    private String packageName;
-
-    /** 鐢熸垚妯″潡鍚� */
-    @NotBlank(message = "鐢熸垚妯″潡鍚嶄笉鑳戒负绌�")
-    private String moduleName;
-
-    /** 鐢熸垚涓氬姟鍚� */
-    @NotBlank(message = "鐢熸垚涓氬姟鍚嶄笉鑳戒负绌�")
-    private String businessName;
-
-    /** 鐢熸垚鍔熻兘鍚� */
-    @NotBlank(message = "鐢熸垚鍔熻兘鍚嶄笉鑳戒负绌�")
-    private String functionName;
-
-    /** 鐢熸垚浣滆�� */
-    @NotBlank(message = "浣滆�呬笉鑳戒负绌�")
-    private String functionAuthor;
-
-    /** 鐢熸垚浠g爜鏂瑰紡锛�0zip鍘嬬缉鍖� 1鑷畾涔夎矾寰勶級 */
-    private String genType;
-
-    /** 鐢熸垚璺緞锛堜笉濉粯璁ら」鐩矾寰勶級 */
-    private String genPath;
-
-    /** 涓婚敭淇℃伅 */
-    private GenTableColumn pkColumn;
-
-    /** 瀛愯〃淇℃伅 */
-    private GenTable subTable;
-
-    /** 琛ㄥ垪淇℃伅 */
-    @Valid
-    private List<GenTableColumn> columns;
-
-    /** 鍏跺畠鐢熸垚閫夐」 */
-    private String options;
-
-    /** 鏍戠紪鐮佸瓧娈� */
-    private String treeCode;
-
-    /** 鏍戠埗缂栫爜瀛楁 */
-    private String treeParentCode;
-
-    /** 鏍戝悕绉板瓧娈� */
-    private String treeName;
-
-    /** 涓婄骇鑿滃崟ID瀛楁 */
-    private Long parentMenuId;
-
-    /** 涓婄骇鑿滃崟鍚嶇О瀛楁 */
-    private String parentMenuName;
-
-    public Long getTableId()
-    {
-        return tableId;
-    }
-
-    public void setTableId(Long tableId)
-    {
-        this.tableId = tableId;
-    }
-
-    public String getTableName()
-    {
-        return tableName;
-    }
-
-    public void setTableName(String tableName)
-    {
-        this.tableName = tableName;
-    }
-
-    public String getTableComment()
-    {
-        return tableComment;
-    }
-
-    public void setTableComment(String tableComment)
-    {
-        this.tableComment = tableComment;
-    }
-
-    public String getSubTableName()
-    {
-        return subTableName;
-    }
-
-    public void setSubTableName(String subTableName)
-    {
-        this.subTableName = subTableName;
-    }
-
-    public String getSubTableFkName()
-    {
-        return subTableFkName;
-    }
-
-    public void setSubTableFkName(String subTableFkName)
-    {
-        this.subTableFkName = subTableFkName;
-    }
-
-    public String getClassName()
-    {
-        return className;
-    }
-
-    public void setClassName(String className)
-    {
-        this.className = className;
-    }
-
-    public String getTplCategory()
-    {
-        return tplCategory;
-    }
-
-    public void setTplCategory(String tplCategory)
-    {
-        this.tplCategory = tplCategory;
-    }
-
-    public String getTplWebType()
-    {
-        return tplWebType;
-    }
-
-    public void setTplWebType(String tplWebType)
-    {
-        this.tplWebType = tplWebType;
-    }
-
-    public String getPackageName()
-    {
-        return packageName;
-    }
-
-    public void setPackageName(String packageName)
-    {
-        this.packageName = packageName;
-    }
-
-    public String getModuleName()
-    {
-        return moduleName;
-    }
-
-    public void setModuleName(String moduleName)
-    {
-        this.moduleName = moduleName;
-    }
-
-    public String getBusinessName()
-    {
-        return businessName;
-    }
-
-    public void setBusinessName(String businessName)
-    {
-        this.businessName = businessName;
-    }
-
-    public String getFunctionName()
-    {
-        return functionName;
-    }
-
-    public void setFunctionName(String functionName)
-    {
-        this.functionName = functionName;
-    }
-
-    public String getFunctionAuthor()
-    {
-        return functionAuthor;
-    }
-
-    public void setFunctionAuthor(String functionAuthor)
-    {
-        this.functionAuthor = functionAuthor;
-    }
-
-    public String getGenType()
-    {
-        return genType;
-    }
-
-    public void setGenType(String genType)
-    {
-        this.genType = genType;
-    }
-
-    public String getGenPath()
-    {
-        return genPath;
-    }
-
-    public void setGenPath(String genPath)
-    {
-        this.genPath = genPath;
-    }
-
-    public GenTableColumn getPkColumn()
-    {
-        return pkColumn;
-    }
-
-    public void setPkColumn(GenTableColumn pkColumn)
-    {
-        this.pkColumn = pkColumn;
-    }
-
-    public GenTable getSubTable()
-    {
-        return subTable;
-    }
-
-    public void setSubTable(GenTable subTable)
-    {
-        this.subTable = subTable;
-    }
-
-    public List<GenTableColumn> getColumns()
-    {
-        return columns;
-    }
-
-    public void setColumns(List<GenTableColumn> columns)
-    {
-        this.columns = columns;
-    }
-
-    public String getOptions()
-    {
-        return options;
-    }
-
-    public void setOptions(String options)
-    {
-        this.options = options;
-    }
-
-    public String getTreeCode()
-    {
-        return treeCode;
-    }
-
-    public void setTreeCode(String treeCode)
-    {
-        this.treeCode = treeCode;
-    }
-
-    public String getTreeParentCode()
-    {
-        return treeParentCode;
-    }
-
-    public void setTreeParentCode(String treeParentCode)
-    {
-        this.treeParentCode = treeParentCode;
-    }
-
-    public String getTreeName()
-    {
-        return treeName;
-    }
-
-    public void setTreeName(String treeName)
-    {
-        this.treeName = treeName;
-    }
-
-    public Long getParentMenuId()
-    {
-        return parentMenuId;
-    }
-
-    public void setParentMenuId(Long parentMenuId)
-    {
-        this.parentMenuId = parentMenuId;
-    }
-
-    public String getParentMenuName()
-    {
-        return parentMenuName;
-    }
-
-    public void setParentMenuName(String parentMenuName)
-    {
-        this.parentMenuName = parentMenuName;
-    }
-
-    public boolean isSub()
-    {
-        return isSub(this.tplCategory);
-    }
-
-    public static boolean isSub(String tplCategory)
-    {
-        return tplCategory != null && StringUtils.equals(GenConstants.TPL_SUB, tplCategory);
-    }
-
-    public boolean isTree()
-    {
-        return isTree(this.tplCategory);
-    }
-
-    public static boolean isTree(String tplCategory)
-    {
-        return tplCategory != null && StringUtils.equals(GenConstants.TPL_TREE, tplCategory);
-    }
-
-    public boolean isCrud()
-    {
-        return isCrud(this.tplCategory);
-    }
-
-    public static boolean isCrud(String tplCategory)
-    {
-        return tplCategory != null && StringUtils.equals(GenConstants.TPL_CRUD, tplCategory);
-    }
-
-    public boolean isSuperColumn(String javaField)
-    {
-        return isSuperColumn(this.tplCategory, javaField);
-    }
-
-    public static boolean isSuperColumn(String tplCategory, String javaField)
-    {
-        if (isTree(tplCategory))
-        {
-            return StringUtils.equalsAnyIgnoreCase(javaField,
-                    ArrayUtils.addAll(GenConstants.TREE_ENTITY, GenConstants.BASE_ENTITY));
-        }
-        return StringUtils.equalsAnyIgnoreCase(javaField, GenConstants.BASE_ENTITY);
-    }
-}
\ No newline at end of file
diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/domain/GenTableColumn.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/domain/GenTableColumn.java
deleted file mode 100644
index d1733b6..0000000
--- a/ruoyi-generator/src/main/java/com/ruoyi/generator/domain/GenTableColumn.java
+++ /dev/null
@@ -1,373 +0,0 @@
-package com.ruoyi.generator.domain;
-
-import javax.validation.constraints.NotBlank;
-import com.ruoyi.common.core.domain.BaseEntity;
-import com.ruoyi.common.utils.StringUtils;
-
-/**
- * 浠g爜鐢熸垚涓氬姟瀛楁琛� gen_table_column
- * 
- * @author ruoyi
- */
-public class GenTableColumn extends BaseEntity
-{
-    private static final long serialVersionUID = 1L;
-
-    /** 缂栧彿 */
-    private Long columnId;
-
-    /** 褰掑睘琛ㄧ紪鍙� */
-    private Long tableId;
-
-    /** 鍒楀悕绉� */
-    private String columnName;
-
-    /** 鍒楁弿杩� */
-    private String columnComment;
-
-    /** 鍒楃被鍨� */
-    private String columnType;
-
-    /** JAVA绫诲瀷 */
-    private String javaType;
-
-    /** JAVA瀛楁鍚� */
-    @NotBlank(message = "Java灞炴�т笉鑳戒负绌�")
-    private String javaField;
-
-    /** 鏄惁涓婚敭锛�1鏄級 */
-    private String isPk;
-
-    /** 鏄惁鑷锛�1鏄級 */
-    private String isIncrement;
-
-    /** 鏄惁蹇呭~锛�1鏄級 */
-    private String isRequired;
-
-    /** 鏄惁涓烘彃鍏ュ瓧娈碉紙1鏄級 */
-    private String isInsert;
-
-    /** 鏄惁缂栬緫瀛楁锛�1鏄級 */
-    private String isEdit;
-
-    /** 鏄惁鍒楄〃瀛楁锛�1鏄級 */
-    private String isList;
-
-    /** 鏄惁鏌ヨ瀛楁锛�1鏄級 */
-    private String isQuery;
-
-    /** 鏌ヨ鏂瑰紡锛圗Q绛変簬銆丯E涓嶇瓑浜庛�丟T澶т簬銆丩T灏忎簬銆丩IKE妯$硦銆丅ETWEEN鑼冨洿锛� */
-    private String queryType;
-
-    /** 鏄剧ず绫诲瀷锛坕nput鏂囨湰妗嗐�乼extarea鏂囨湰鍩熴�乻elect涓嬫媺妗嗐�乧heckbox澶嶉�夋銆乺adio鍗曢�夋銆乨atetime鏃ユ湡鎺т欢銆乮mage鍥剧墖涓婁紶鎺т欢銆乽pload鏂囦欢涓婁紶鎺т欢銆乪ditor瀵屾枃鏈帶浠讹級 */
-    private String htmlType;
-
-    /** 瀛楀吀绫诲瀷 */
-    private String dictType;
-
-    /** 鎺掑簭 */
-    private Integer sort;
-
-    public void setColumnId(Long columnId)
-    {
-        this.columnId = columnId;
-    }
-
-    public Long getColumnId()
-    {
-        return columnId;
-    }
-
-    public void setTableId(Long tableId)
-    {
-        this.tableId = tableId;
-    }
-
-    public Long getTableId()
-    {
-        return tableId;
-    }
-
-    public void setColumnName(String columnName)
-    {
-        this.columnName = columnName;
-    }
-
-    public String getColumnName()
-    {
-        return columnName;
-    }
-
-    public void setColumnComment(String columnComment)
-    {
-        this.columnComment = columnComment;
-    }
-
-    public String getColumnComment()
-    {
-        return columnComment;
-    }
-
-    public void setColumnType(String columnType)
-    {
-        this.columnType = columnType;
-    }
-
-    public String getColumnType()
-    {
-        return columnType;
-    }
-
-    public void setJavaType(String javaType)
-    {
-        this.javaType = javaType;
-    }
-
-    public String getJavaType()
-    {
-        return javaType;
-    }
-
-    public void setJavaField(String javaField)
-    {
-        this.javaField = javaField;
-    }
-
-    public String getJavaField()
-    {
-        return javaField;
-    }
-
-    public String getCapJavaField()
-    {
-        return StringUtils.capitalize(javaField);
-    }
-
-    public void setIsPk(String isPk)
-    {
-        this.isPk = isPk;
-    }
-
-    public String getIsPk()
-    {
-        return isPk;
-    }
-
-    public boolean isPk()
-    {
-        return isPk(this.isPk);
-    }
-
-    public boolean isPk(String isPk)
-    {
-        return isPk != null && StringUtils.equals("1", isPk);
-    }
-
-    public String getIsIncrement()
-    {
-        return isIncrement;
-    }
-
-    public void setIsIncrement(String isIncrement)
-    {
-        this.isIncrement = isIncrement;
-    }
-
-    public boolean isIncrement()
-    {
-        return isIncrement(this.isIncrement);
-    }
-
-    public boolean isIncrement(String isIncrement)
-    {
-        return isIncrement != null && StringUtils.equals("1", isIncrement);
-    }
-
-    public void setIsRequired(String isRequired)
-    {
-        this.isRequired = isRequired;
-    }
-
-    public String getIsRequired()
-    {
-        return isRequired;
-    }
-
-    public boolean isRequired()
-    {
-        return isRequired(this.isRequired);
-    }
-
-    public boolean isRequired(String isRequired)
-    {
-        return isRequired != null && StringUtils.equals("1", isRequired);
-    }
-
-    public void setIsInsert(String isInsert)
-    {
-        this.isInsert = isInsert;
-    }
-
-    public String getIsInsert()
-    {
-        return isInsert;
-    }
-
-    public boolean isInsert()
-    {
-        return isInsert(this.isInsert);
-    }
-
-    public boolean isInsert(String isInsert)
-    {
-        return isInsert != null && StringUtils.equals("1", isInsert);
-    }
-
-    public void setIsEdit(String isEdit)
-    {
-        this.isEdit = isEdit;
-    }
-
-    public String getIsEdit()
-    {
-        return isEdit;
-    }
-
-    public boolean isEdit()
-    {
-        return isInsert(this.isEdit);
-    }
-
-    public boolean isEdit(String isEdit)
-    {
-        return isEdit != null && StringUtils.equals("1", isEdit);
-    }
-
-    public void setIsList(String isList)
-    {
-        this.isList = isList;
-    }
-
-    public String getIsList()
-    {
-        return isList;
-    }
-
-    public boolean isList()
-    {
-        return isList(this.isList);
-    }
-
-    public boolean isList(String isList)
-    {
-        return isList != null && StringUtils.equals("1", isList);
-    }
-
-    public void setIsQuery(String isQuery)
-    {
-        this.isQuery = isQuery;
-    }
-
-    public String getIsQuery()
-    {
-        return isQuery;
-    }
-
-    public boolean isQuery()
-    {
-        return isQuery(this.isQuery);
-    }
-
-    public boolean isQuery(String isQuery)
-    {
-        return isQuery != null && StringUtils.equals("1", isQuery);
-    }
-
-    public void setQueryType(String queryType)
-    {
-        this.queryType = queryType;
-    }
-
-    public String getQueryType()
-    {
-        return queryType;
-    }
-
-    public String getHtmlType()
-    {
-        return htmlType;
-    }
-
-    public void setHtmlType(String htmlType)
-    {
-        this.htmlType = htmlType;
-    }
-
-    public void setDictType(String dictType)
-    {
-        this.dictType = dictType;
-    }
-
-    public String getDictType()
-    {
-        return dictType;
-    }
-
-    public void setSort(Integer sort)
-    {
-        this.sort = sort;
-    }
-
-    public Integer getSort()
-    {
-        return sort;
-    }
-
-    public boolean isSuperColumn()
-    {
-        return isSuperColumn(this.javaField);
-    }
-
-    public static boolean isSuperColumn(String javaField)
-    {
-        return StringUtils.equalsAnyIgnoreCase(javaField,
-                // BaseEntity
-                "createBy", "createTime", "updateBy", "updateTime", "remark",
-                // TreeEntity
-                "parentName", "parentId", "orderNum", "ancestors");
-    }
-
-    public boolean isUsableColumn()
-    {
-        return isUsableColumn(javaField);
-    }
-
-    public static boolean isUsableColumn(String javaField)
-    {
-        // isSuperColumn()涓殑鍚嶅崟鐢ㄤ簬閬垮厤鐢熸垚澶氫綑Domain灞炴�э紝鑻ユ煇浜涘睘鎬у湪鐢熸垚椤甸潰鏃堕渶瑕佺敤鍒颁笉鑳藉拷鐣ワ紝鍒欐斁鍦ㄦ澶勭櫧鍚嶅崟
-        return StringUtils.equalsAnyIgnoreCase(javaField, "parentId", "orderNum", "remark");
-    }
-
-    public String readConverterExp()
-    {
-        String remarks = StringUtils.substringBetween(this.columnComment, "锛�", "锛�");
-        StringBuffer sb = new StringBuffer();
-        if (StringUtils.isNotEmpty(remarks))
-        {
-            for (String value : remarks.split(" "))
-            {
-                if (StringUtils.isNotEmpty(value))
-                {
-                    Object startStr = value.subSequence(0, 1);
-                    String endStr = value.substring(1);
-                    sb.append("").append(startStr).append("=").append(endStr).append(",");
-                }
-            }
-            return sb.deleteCharAt(sb.length() - 1).toString();
-        }
-        else
-        {
-            return this.columnComment;
-        }
-    }
-}
diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/mapper/GenTableColumnMapper.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/mapper/GenTableColumnMapper.java
deleted file mode 100644
index 951e166..0000000
--- a/ruoyi-generator/src/main/java/com/ruoyi/generator/mapper/GenTableColumnMapper.java
+++ /dev/null
@@ -1,60 +0,0 @@
-package com.ruoyi.generator.mapper;
-
-import java.util.List;
-import com.ruoyi.generator.domain.GenTableColumn;
-
-/**
- * 涓氬姟瀛楁 鏁版嵁灞�
- * 
- * @author ruoyi
- */
-public interface GenTableColumnMapper
-{
-    /**
-     * 鏍规嵁琛ㄥ悕绉版煡璇㈠垪淇℃伅
-     * 
-     * @param tableName 琛ㄥ悕绉�
-     * @return 鍒椾俊鎭�
-     */
-    public List<GenTableColumn> selectDbTableColumnsByName(String tableName);
-
-    /**
-     * 鏌ヨ涓氬姟瀛楁鍒楄〃
-     * 
-     * @param tableId 涓氬姟瀛楁缂栧彿
-     * @return 涓氬姟瀛楁闆嗗悎
-     */
-    public List<GenTableColumn> selectGenTableColumnListByTableId(Long tableId);
-
-    /**
-     * 鏂板涓氬姟瀛楁
-     * 
-     * @param genTableColumn 涓氬姟瀛楁淇℃伅
-     * @return 缁撴灉
-     */
-    public int insertGenTableColumn(GenTableColumn genTableColumn);
-
-    /**
-     * 淇敼涓氬姟瀛楁
-     * 
-     * @param genTableColumn 涓氬姟瀛楁淇℃伅
-     * @return 缁撴灉
-     */
-    public int updateGenTableColumn(GenTableColumn genTableColumn);
-
-    /**
-     * 鍒犻櫎涓氬姟瀛楁
-     * 
-     * @param genTableColumns 鍒楁暟鎹�
-     * @return 缁撴灉
-     */
-    public int deleteGenTableColumns(List<GenTableColumn> genTableColumns);
-
-    /**
-     * 鎵归噺鍒犻櫎涓氬姟瀛楁
-     * 
-     * @param ids 闇�瑕佸垹闄ょ殑鏁版嵁ID
-     * @return 缁撴灉
-     */
-    public int deleteGenTableColumnByIds(Long[] ids);
-}
diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/mapper/GenTableMapper.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/mapper/GenTableMapper.java
deleted file mode 100644
index 937656d..0000000
--- a/ruoyi-generator/src/main/java/com/ruoyi/generator/mapper/GenTableMapper.java
+++ /dev/null
@@ -1,91 +0,0 @@
-package com.ruoyi.generator.mapper;
-
-import java.util.List;
-import com.ruoyi.generator.domain.GenTable;
-
-/**
- * 涓氬姟 鏁版嵁灞�
- * 
- * @author ruoyi
- */
-public interface GenTableMapper
-{
-    /**
-     * 鏌ヨ涓氬姟鍒楄〃
-     * 
-     * @param genTable 涓氬姟淇℃伅
-     * @return 涓氬姟闆嗗悎
-     */
-    public List<GenTable> selectGenTableList(GenTable genTable);
-
-    /**
-     * 鏌ヨ鎹簱鍒楄〃
-     * 
-     * @param genTable 涓氬姟淇℃伅
-     * @return 鏁版嵁搴撹〃闆嗗悎
-     */
-    public List<GenTable> selectDbTableList(GenTable genTable);
-
-    /**
-     * 鏌ヨ鎹簱鍒楄〃
-     * 
-     * @param tableNames 琛ㄥ悕绉扮粍
-     * @return 鏁版嵁搴撹〃闆嗗悎
-     */
-    public List<GenTable> selectDbTableListByNames(String[] tableNames);
-
-    /**
-     * 鏌ヨ鎵�鏈夎〃淇℃伅
-     * 
-     * @return 琛ㄤ俊鎭泦鍚�
-     */
-    public List<GenTable> selectGenTableAll();
-
-    /**
-     * 鏌ヨ琛↖D涓氬姟淇℃伅
-     * 
-     * @param id 涓氬姟ID
-     * @return 涓氬姟淇℃伅
-     */
-    public GenTable selectGenTableById(Long id);
-
-    /**
-     * 鏌ヨ琛ㄥ悕绉颁笟鍔′俊鎭�
-     * 
-     * @param tableName 琛ㄥ悕绉�
-     * @return 涓氬姟淇℃伅
-     */
-    public GenTable selectGenTableByName(String tableName);
-
-    /**
-     * 鏂板涓氬姟
-     * 
-     * @param genTable 涓氬姟淇℃伅
-     * @return 缁撴灉
-     */
-    public int insertGenTable(GenTable genTable);
-
-    /**
-     * 淇敼涓氬姟
-     * 
-     * @param genTable 涓氬姟淇℃伅
-     * @return 缁撴灉
-     */
-    public int updateGenTable(GenTable genTable);
-
-    /**
-     * 鎵归噺鍒犻櫎涓氬姟
-     * 
-     * @param ids 闇�瑕佸垹闄ょ殑鏁版嵁ID
-     * @return 缁撴灉
-     */
-    public int deleteGenTableByIds(Long[] ids);
-
-    /**
-     * 鍒涘缓琛�
-     *
-     * @param sql 琛ㄧ粨鏋�
-     * @return 缁撴灉
-     */
-    public int createTable(String sql);
-}
diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableColumnServiceImpl.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableColumnServiceImpl.java
deleted file mode 100644
index 0679689..0000000
--- a/ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableColumnServiceImpl.java
+++ /dev/null
@@ -1,68 +0,0 @@
-package com.ruoyi.generator.service;
-
-import java.util.List;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-import com.ruoyi.common.core.text.Convert;
-import com.ruoyi.generator.domain.GenTableColumn;
-import com.ruoyi.generator.mapper.GenTableColumnMapper;
-
-/**
- * 涓氬姟瀛楁 鏈嶅姟灞傚疄鐜�
- * 
- * @author ruoyi
- */
-@Service
-public class GenTableColumnServiceImpl implements IGenTableColumnService 
-{
-	@Autowired
-	private GenTableColumnMapper genTableColumnMapper;
-
-	/**
-     * 鏌ヨ涓氬姟瀛楁鍒楄〃
-     * 
-     * @param tableId 涓氬姟瀛楁缂栧彿
-     * @return 涓氬姟瀛楁闆嗗悎
-     */
-	@Override
-	public List<GenTableColumn> selectGenTableColumnListByTableId(Long tableId)
-	{
-	    return genTableColumnMapper.selectGenTableColumnListByTableId(tableId);
-	}
-	
-    /**
-     * 鏂板涓氬姟瀛楁
-     * 
-     * @param genTableColumn 涓氬姟瀛楁淇℃伅
-     * @return 缁撴灉
-     */
-	@Override
-	public int insertGenTableColumn(GenTableColumn genTableColumn)
-	{
-	    return genTableColumnMapper.insertGenTableColumn(genTableColumn);
-	}
-	
-	/**
-     * 淇敼涓氬姟瀛楁
-     * 
-     * @param genTableColumn 涓氬姟瀛楁淇℃伅
-     * @return 缁撴灉
-     */
-	@Override
-	public int updateGenTableColumn(GenTableColumn genTableColumn)
-	{
-	    return genTableColumnMapper.updateGenTableColumn(genTableColumn);
-	}
-
-	/**
-     * 鍒犻櫎涓氬姟瀛楁瀵硅薄
-     * 
-     * @param ids 闇�瑕佸垹闄ょ殑鏁版嵁ID
-     * @return 缁撴灉
-     */
-	@Override
-	public int deleteGenTableColumnByIds(String ids)
-	{
-		return genTableColumnMapper.deleteGenTableColumnByIds(Convert.toLongArray(ids));
-	}
-}
diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableServiceImpl.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableServiceImpl.java
deleted file mode 100644
index fc19233..0000000
--- a/ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableServiceImpl.java
+++ /dev/null
@@ -1,531 +0,0 @@
-package com.ruoyi.generator.service;
-
-import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.IOException;
-import java.io.StringWriter;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.function.Function;
-import java.util.stream.Collectors;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipOutputStream;
-import org.apache.commons.io.FileUtils;
-import org.apache.commons.io.IOUtils;
-import org.apache.velocity.Template;
-import org.apache.velocity.VelocityContext;
-import org.apache.velocity.app.Velocity;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-import com.alibaba.fastjson2.JSON;
-import com.alibaba.fastjson2.JSONObject;
-import com.ruoyi.common.constant.Constants;
-import com.ruoyi.common.constant.GenConstants;
-import com.ruoyi.common.core.text.CharsetKit;
-import com.ruoyi.common.exception.ServiceException;
-import com.ruoyi.common.utils.StringUtils;
-import com.ruoyi.generator.domain.GenTable;
-import com.ruoyi.generator.domain.GenTableColumn;
-import com.ruoyi.generator.mapper.GenTableColumnMapper;
-import com.ruoyi.generator.mapper.GenTableMapper;
-import com.ruoyi.generator.util.GenUtils;
-import com.ruoyi.generator.util.VelocityInitializer;
-import com.ruoyi.generator.util.VelocityUtils;
-
-/**
- * 涓氬姟 鏈嶅姟灞傚疄鐜�
- * 
- * @author ruoyi
- */
-@Service
-public class GenTableServiceImpl implements IGenTableService
-{
-    private static final Logger log = LoggerFactory.getLogger(GenTableServiceImpl.class);
-
-    @Autowired
-    private GenTableMapper genTableMapper;
-
-    @Autowired
-    private GenTableColumnMapper genTableColumnMapper;
-
-    /**
-     * 鏌ヨ涓氬姟淇℃伅
-     * 
-     * @param id 涓氬姟ID
-     * @return 涓氬姟淇℃伅
-     */
-    @Override
-    public GenTable selectGenTableById(Long id)
-    {
-        GenTable genTable = genTableMapper.selectGenTableById(id);
-        setTableFromOptions(genTable);
-        return genTable;
-    }
-
-    /**
-     * 鏌ヨ涓氬姟鍒楄〃
-     * 
-     * @param genTable 涓氬姟淇℃伅
-     * @return 涓氬姟闆嗗悎
-     */
-    @Override
-    public List<GenTable> selectGenTableList(GenTable genTable)
-    {
-        return genTableMapper.selectGenTableList(genTable);
-    }
-
-    /**
-     * 鏌ヨ鎹簱鍒楄〃
-     * 
-     * @param genTable 涓氬姟淇℃伅
-     * @return 鏁版嵁搴撹〃闆嗗悎
-     */
-    @Override
-    public List<GenTable> selectDbTableList(GenTable genTable)
-    {
-        return genTableMapper.selectDbTableList(genTable);
-    }
-
-    /**
-     * 鏌ヨ鎹簱鍒楄〃
-     * 
-     * @param tableNames 琛ㄥ悕绉扮粍
-     * @return 鏁版嵁搴撹〃闆嗗悎
-     */
-    @Override
-    public List<GenTable> selectDbTableListByNames(String[] tableNames)
-    {
-        return genTableMapper.selectDbTableListByNames(tableNames);
-    }
-
-    /**
-     * 鏌ヨ鎵�鏈夎〃淇℃伅
-     * 
-     * @return 琛ㄤ俊鎭泦鍚�
-     */
-    @Override
-    public List<GenTable> selectGenTableAll()
-    {
-        return genTableMapper.selectGenTableAll();
-    }
-
-    /**
-     * 淇敼涓氬姟
-     * 
-     * @param genTable 涓氬姟淇℃伅
-     * @return 缁撴灉
-     */
-    @Override
-    @Transactional
-    public void updateGenTable(GenTable genTable)
-    {
-        String options = JSON.toJSONString(genTable.getParams());
-        genTable.setOptions(options);
-        int row = genTableMapper.updateGenTable(genTable);
-        if (row > 0)
-        {
-            for (GenTableColumn cenTableColumn : genTable.getColumns())
-            {
-                genTableColumnMapper.updateGenTableColumn(cenTableColumn);
-            }
-        }
-    }
-
-    /**
-     * 鍒犻櫎涓氬姟瀵硅薄
-     * 
-     * @param tableIds 闇�瑕佸垹闄ょ殑鏁版嵁ID
-     * @return 缁撴灉
-     */
-    @Override
-    @Transactional
-    public void deleteGenTableByIds(Long[] tableIds)
-    {
-        genTableMapper.deleteGenTableByIds(tableIds);
-        genTableColumnMapper.deleteGenTableColumnByIds(tableIds);
-    }
-
-    /**
-     * 鍒涘缓琛�
-     *
-     * @param sql 鍒涘缓琛ㄨ鍙�
-     * @return 缁撴灉
-     */
-    @Override
-    public boolean createTable(String sql)
-    {
-        return genTableMapper.createTable(sql) == 0;
-    }
-
-    /**
-     * 瀵煎叆琛ㄧ粨鏋�
-     * 
-     * @param tableList 瀵煎叆琛ㄥ垪琛�
-     */
-    @Override
-    @Transactional
-    public void importGenTable(List<GenTable> tableList, String operName)
-    {
-        try
-        {
-            for (GenTable table : tableList)
-            {
-                String tableName = table.getTableName();
-                GenUtils.initTable(table, operName);
-                int row = genTableMapper.insertGenTable(table);
-                if (row > 0)
-                {
-                    // 淇濆瓨鍒椾俊鎭�
-                    List<GenTableColumn> genTableColumns = genTableColumnMapper.selectDbTableColumnsByName(tableName);
-                    for (GenTableColumn column : genTableColumns)
-                    {
-                        GenUtils.initColumnField(column, table);
-                        genTableColumnMapper.insertGenTableColumn(column);
-                    }
-                }
-            }
-        }
-        catch (Exception e)
-        {
-            throw new ServiceException("瀵煎叆澶辫触锛�" + e.getMessage());
-        }
-    }
-
-    /**
-     * 棰勮浠g爜
-     * 
-     * @param tableId 琛ㄧ紪鍙�
-     * @return 棰勮鏁版嵁鍒楄〃
-     */
-    @Override
-    public Map<String, String> previewCode(Long tableId)
-    {
-        Map<String, String> dataMap = new LinkedHashMap<>();
-        // 鏌ヨ琛ㄤ俊鎭�
-        GenTable table = genTableMapper.selectGenTableById(tableId);
-        // 璁剧疆涓诲瓙琛ㄤ俊鎭�
-        setSubTable(table);
-        // 璁剧疆涓婚敭鍒椾俊鎭�
-        setPkColumn(table);
-        VelocityInitializer.initVelocity();
-
-        VelocityContext context = VelocityUtils.prepareContext(table);
-
-        // 鑾峰彇妯℃澘鍒楄〃
-        List<String> templates = VelocityUtils.getTemplateList(table.getTplCategory(), table.getTplWebType());
-        for (String template : templates)
-        {
-            // 娓叉煋妯℃澘
-            StringWriter sw = new StringWriter();
-            Template tpl = Velocity.getTemplate(template, Constants.UTF8);
-            tpl.merge(context, sw);
-            dataMap.put(template, sw.toString());
-        }
-        return dataMap;
-    }
-
-    /**
-     * 鐢熸垚浠g爜锛堜笅杞芥柟寮忥級
-     * 
-     * @param tableName 琛ㄥ悕绉�
-     * @return 鏁版嵁
-     */
-    @Override
-    public byte[] downloadCode(String tableName)
-    {
-        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
-        ZipOutputStream zip = new ZipOutputStream(outputStream);
-        generatorCode(tableName, zip);
-        IOUtils.closeQuietly(zip);
-        return outputStream.toByteArray();
-    }
-
-    /**
-     * 鐢熸垚浠g爜锛堣嚜瀹氫箟璺緞锛�
-     * 
-     * @param tableName 琛ㄥ悕绉�
-     */
-    @Override
-    public void generatorCode(String tableName)
-    {
-        // 鏌ヨ琛ㄤ俊鎭�
-        GenTable table = genTableMapper.selectGenTableByName(tableName);
-        // 璁剧疆涓诲瓙琛ㄤ俊鎭�
-        setSubTable(table);
-        // 璁剧疆涓婚敭鍒椾俊鎭�
-        setPkColumn(table);
-
-        VelocityInitializer.initVelocity();
-
-        VelocityContext context = VelocityUtils.prepareContext(table);
-
-        // 鑾峰彇妯℃澘鍒楄〃
-        List<String> templates = VelocityUtils.getTemplateList(table.getTplCategory(), table.getTplWebType());
-        for (String template : templates)
-        {
-            if (!StringUtils.containsAny(template, "sql.vm", "api.js.vm", "index.vue.vm", "index-tree.vue.vm"))
-            {
-                // 娓叉煋妯℃澘
-                StringWriter sw = new StringWriter();
-                Template tpl = Velocity.getTemplate(template, Constants.UTF8);
-                tpl.merge(context, sw);
-                try
-                {
-                    String path = getGenPath(table, template);
-                    FileUtils.writeStringToFile(new File(path), sw.toString(), CharsetKit.UTF_8);
-                }
-                catch (IOException e)
-                {
-                    throw new ServiceException("娓叉煋妯℃澘澶辫触锛岃〃鍚嶏細" + table.getTableName());
-                }
-            }
-        }
-    }
-
-    /**
-     * 鍚屾鏁版嵁搴�
-     * 
-     * @param tableName 琛ㄥ悕绉�
-     */
-    @Override
-    @Transactional
-    public void synchDb(String tableName)
-    {
-        GenTable table = genTableMapper.selectGenTableByName(tableName);
-        List<GenTableColumn> tableColumns = table.getColumns();
-        Map<String, GenTableColumn> tableColumnMap = tableColumns.stream().collect(Collectors.toMap(GenTableColumn::getColumnName, Function.identity()));
-
-        List<GenTableColumn> dbTableColumns = genTableColumnMapper.selectDbTableColumnsByName(tableName);
-        if (StringUtils.isEmpty(dbTableColumns))
-        {
-            throw new ServiceException("鍚屾鏁版嵁澶辫触锛屽師琛ㄧ粨鏋勪笉瀛樺湪");
-        }
-        List<String> dbTableColumnNames = dbTableColumns.stream().map(GenTableColumn::getColumnName).collect(Collectors.toList());
-
-        dbTableColumns.forEach(column -> {
-            GenUtils.initColumnField(column, table);
-            if (tableColumnMap.containsKey(column.getColumnName()))
-            {
-                GenTableColumn prevColumn = tableColumnMap.get(column.getColumnName());
-                column.setColumnId(prevColumn.getColumnId());
-                if (column.isList())
-                {
-                    // 濡傛灉鏄垪琛紝缁х画淇濈暀鏌ヨ鏂瑰紡/瀛楀吀绫诲瀷閫夐」
-                    column.setDictType(prevColumn.getDictType());
-                    column.setQueryType(prevColumn.getQueryType());
-                }
-                if (StringUtils.isNotEmpty(prevColumn.getIsRequired()) && !column.isPk()
-                        && (column.isInsert() || column.isEdit())
-                        && ((column.isUsableColumn()) || (!column.isSuperColumn())))
-                {
-                    // 濡傛灉鏄�(鏂板/淇敼&闈炰富閿�/闈炲拷鐣ュ強鐖跺睘鎬�)锛岀户缁繚鐣欏繀濉�/鏄剧ず绫诲瀷閫夐」
-                    column.setIsRequired(prevColumn.getIsRequired());
-                    column.setHtmlType(prevColumn.getHtmlType());
-                }
-                genTableColumnMapper.updateGenTableColumn(column);
-            }
-            else
-            {
-                genTableColumnMapper.insertGenTableColumn(column);
-            }
-        });
-
-        List<GenTableColumn> delColumns = tableColumns.stream().filter(column -> !dbTableColumnNames.contains(column.getColumnName())).collect(Collectors.toList());
-        if (StringUtils.isNotEmpty(delColumns))
-        {
-            genTableColumnMapper.deleteGenTableColumns(delColumns);
-        }
-    }
-
-    /**
-     * 鎵归噺鐢熸垚浠g爜锛堜笅杞芥柟寮忥級
-     * 
-     * @param tableNames 琛ㄦ暟缁�
-     * @return 鏁版嵁
-     */
-    @Override
-    public byte[] downloadCode(String[] tableNames)
-    {
-        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
-        ZipOutputStream zip = new ZipOutputStream(outputStream);
-        for (String tableName : tableNames)
-        {
-            generatorCode(tableName, zip);
-        }
-        IOUtils.closeQuietly(zip);
-        return outputStream.toByteArray();
-    }
-
-    /**
-     * 鏌ヨ琛ㄤ俊鎭苟鐢熸垚浠g爜
-     */
-    private void generatorCode(String tableName, ZipOutputStream zip)
-    {
-        // 鏌ヨ琛ㄤ俊鎭�
-        GenTable table = genTableMapper.selectGenTableByName(tableName);
-        // 璁剧疆涓诲瓙琛ㄤ俊鎭�
-        setSubTable(table);
-        // 璁剧疆涓婚敭鍒椾俊鎭�
-        setPkColumn(table);
-
-        VelocityInitializer.initVelocity();
-
-        VelocityContext context = VelocityUtils.prepareContext(table);
-
-        // 鑾峰彇妯℃澘鍒楄〃
-        List<String> templates = VelocityUtils.getTemplateList(table.getTplCategory(), table.getTplWebType());
-        for (String template : templates)
-        {
-            // 娓叉煋妯℃澘
-            StringWriter sw = new StringWriter();
-            Template tpl = Velocity.getTemplate(template, Constants.UTF8);
-            tpl.merge(context, sw);
-            try
-            {
-                // 娣诲姞鍒皕ip
-                zip.putNextEntry(new ZipEntry(VelocityUtils.getFileName(template, table)));
-                IOUtils.write(sw.toString(), zip, Constants.UTF8);
-                IOUtils.closeQuietly(sw);
-                zip.flush();
-                zip.closeEntry();
-            }
-            catch (IOException e)
-            {
-                log.error("娓叉煋妯℃澘澶辫触锛岃〃鍚嶏細" + table.getTableName(), e);
-            }
-        }
-    }
-
-    /**
-     * 淇敼淇濆瓨鍙傛暟鏍¢獙
-     * 
-     * @param genTable 涓氬姟淇℃伅
-     */
-    @Override
-    public void validateEdit(GenTable genTable)
-    {
-        if (GenConstants.TPL_TREE.equals(genTable.getTplCategory()))
-        {
-            String options = JSON.toJSONString(genTable.getParams());
-            JSONObject paramsObj = JSON.parseObject(options);
-            if (StringUtils.isEmpty(paramsObj.getString(GenConstants.TREE_CODE)))
-            {
-                throw new ServiceException("鏍戠紪鐮佸瓧娈典笉鑳戒负绌�");
-            }
-            else if (StringUtils.isEmpty(paramsObj.getString(GenConstants.TREE_PARENT_CODE)))
-            {
-                throw new ServiceException("鏍戠埗缂栫爜瀛楁涓嶈兘涓虹┖");
-            }
-            else if (StringUtils.isEmpty(paramsObj.getString(GenConstants.TREE_NAME)))
-            {
-                throw new ServiceException("鏍戝悕绉板瓧娈典笉鑳戒负绌�");
-            }
-            else if (GenConstants.TPL_SUB.equals(genTable.getTplCategory()))
-            {
-                if (StringUtils.isEmpty(genTable.getSubTableName()))
-                {
-                    throw new ServiceException("鍏宠仈瀛愯〃鐨勮〃鍚嶄笉鑳戒负绌�");
-                }
-                else if (StringUtils.isEmpty(genTable.getSubTableFkName()))
-                {
-                    throw new ServiceException("瀛愯〃鍏宠仈鐨勫閿悕涓嶈兘涓虹┖");
-                }
-            }
-        }
-    }
-
-    /**
-     * 璁剧疆涓婚敭鍒椾俊鎭�
-     * 
-     * @param table 涓氬姟琛ㄤ俊鎭�
-     */
-    public void setPkColumn(GenTable table)
-    {
-        for (GenTableColumn column : table.getColumns())
-        {
-            if (column.isPk())
-            {
-                table.setPkColumn(column);
-                break;
-            }
-        }
-        if (StringUtils.isNull(table.getPkColumn()))
-        {
-            table.setPkColumn(table.getColumns().get(0));
-        }
-        if (GenConstants.TPL_SUB.equals(table.getTplCategory()))
-        {
-            for (GenTableColumn column : table.getSubTable().getColumns())
-            {
-                if (column.isPk())
-                {
-                    table.getSubTable().setPkColumn(column);
-                    break;
-                }
-            }
-            if (StringUtils.isNull(table.getSubTable().getPkColumn()))
-            {
-                table.getSubTable().setPkColumn(table.getSubTable().getColumns().get(0));
-            }
-        }
-    }
-
-    /**
-     * 璁剧疆涓诲瓙琛ㄤ俊鎭�
-     * 
-     * @param table 涓氬姟琛ㄤ俊鎭�
-     */
-    public void setSubTable(GenTable table)
-    {
-        String subTableName = table.getSubTableName();
-        if (StringUtils.isNotEmpty(subTableName))
-        {
-            table.setSubTable(genTableMapper.selectGenTableByName(subTableName));
-        }
-    }
-
-    /**
-     * 璁剧疆浠g爜鐢熸垚鍏朵粬閫夐」鍊�
-     * 
-     * @param genTable 璁剧疆鍚庣殑鐢熸垚瀵硅薄
-     */
-    public void setTableFromOptions(GenTable genTable)
-    {
-        JSONObject paramsObj = JSON.parseObject(genTable.getOptions());
-        if (StringUtils.isNotNull(paramsObj))
-        {
-            String treeCode = paramsObj.getString(GenConstants.TREE_CODE);
-            String treeParentCode = paramsObj.getString(GenConstants.TREE_PARENT_CODE);
-            String treeName = paramsObj.getString(GenConstants.TREE_NAME);
-            Long parentMenuId = paramsObj.getLongValue(GenConstants.PARENT_MENU_ID);
-            String parentMenuName = paramsObj.getString(GenConstants.PARENT_MENU_NAME);
-
-            genTable.setTreeCode(treeCode);
-            genTable.setTreeParentCode(treeParentCode);
-            genTable.setTreeName(treeName);
-            genTable.setParentMenuId(parentMenuId);
-            genTable.setParentMenuName(parentMenuName);
-        }
-    }
-
-    /**
-     * 鑾峰彇浠g爜鐢熸垚鍦板潃
-     * 
-     * @param table 涓氬姟琛ㄤ俊鎭�
-     * @param template 妯℃澘鏂囦欢璺緞
-     * @return 鐢熸垚鍦板潃
-     */
-    public static String getGenPath(GenTable table, String template)
-    {
-        String genPath = table.getGenPath();
-        if (StringUtils.equals(genPath, "/"))
-        {
-            return System.getProperty("user.dir") + File.separator + "src" + File.separator + VelocityUtils.getFileName(template, table);
-        }
-        return genPath + File.separator + VelocityUtils.getFileName(template, table);
-    }
-}
\ No newline at end of file
diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/service/IGenTableColumnService.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/service/IGenTableColumnService.java
deleted file mode 100644
index 3037f70..0000000
--- a/ruoyi-generator/src/main/java/com/ruoyi/generator/service/IGenTableColumnService.java
+++ /dev/null
@@ -1,44 +0,0 @@
-package com.ruoyi.generator.service;
-
-import java.util.List;
-import com.ruoyi.generator.domain.GenTableColumn;
-
-/**
- * 涓氬姟瀛楁 鏈嶅姟灞�
- * 
- * @author ruoyi
- */
-public interface IGenTableColumnService
-{
-    /**
-     * 鏌ヨ涓氬姟瀛楁鍒楄〃
-     * 
-     * @param tableId 涓氬姟瀛楁缂栧彿
-     * @return 涓氬姟瀛楁闆嗗悎
-     */
-    public List<GenTableColumn> selectGenTableColumnListByTableId(Long tableId);
-
-    /**
-     * 鏂板涓氬姟瀛楁
-     * 
-     * @param genTableColumn 涓氬姟瀛楁淇℃伅
-     * @return 缁撴灉
-     */
-    public int insertGenTableColumn(GenTableColumn genTableColumn);
-
-    /**
-     * 淇敼涓氬姟瀛楁
-     * 
-     * @param genTableColumn 涓氬姟瀛楁淇℃伅
-     * @return 缁撴灉
-     */
-    public int updateGenTableColumn(GenTableColumn genTableColumn);
-
-    /**
-     * 鍒犻櫎涓氬姟瀛楁淇℃伅
-     * 
-     * @param ids 闇�瑕佸垹闄ょ殑鏁版嵁ID
-     * @return 缁撴灉
-     */
-    public int deleteGenTableColumnByIds(String ids);
-}
diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/service/IGenTableService.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/service/IGenTableService.java
deleted file mode 100644
index 695426e..0000000
--- a/ruoyi-generator/src/main/java/com/ruoyi/generator/service/IGenTableService.java
+++ /dev/null
@@ -1,130 +0,0 @@
-package com.ruoyi.generator.service;
-
-import java.util.List;
-import java.util.Map;
-import com.ruoyi.generator.domain.GenTable;
-
-/**
- * 涓氬姟 鏈嶅姟灞�
- * 
- * @author ruoyi
- */
-public interface IGenTableService
-{
-    /**
-     * 鏌ヨ涓氬姟鍒楄〃
-     * 
-     * @param genTable 涓氬姟淇℃伅
-     * @return 涓氬姟闆嗗悎
-     */
-    public List<GenTable> selectGenTableList(GenTable genTable);
-
-    /**
-     * 鏌ヨ鎹簱鍒楄〃
-     * 
-     * @param genTable 涓氬姟淇℃伅
-     * @return 鏁版嵁搴撹〃闆嗗悎
-     */
-    public List<GenTable> selectDbTableList(GenTable genTable);
-
-    /**
-     * 鏌ヨ鎹簱鍒楄〃
-     * 
-     * @param tableNames 琛ㄥ悕绉扮粍
-     * @return 鏁版嵁搴撹〃闆嗗悎
-     */
-    public List<GenTable> selectDbTableListByNames(String[] tableNames);
-
-    /**
-     * 鏌ヨ鎵�鏈夎〃淇℃伅
-     * 
-     * @return 琛ㄤ俊鎭泦鍚�
-     */
-    public List<GenTable> selectGenTableAll();
-
-    /**
-     * 鏌ヨ涓氬姟淇℃伅
-     * 
-     * @param id 涓氬姟ID
-     * @return 涓氬姟淇℃伅
-     */
-    public GenTable selectGenTableById(Long id);
-
-    /**
-     * 淇敼涓氬姟
-     * 
-     * @param genTable 涓氬姟淇℃伅
-     * @return 缁撴灉
-     */
-    public void updateGenTable(GenTable genTable);
-
-    /**
-     * 鍒犻櫎涓氬姟淇℃伅
-     * 
-     * @param tableIds 闇�瑕佸垹闄ょ殑琛ㄦ暟鎹甀D
-     * @return 缁撴灉
-     */
-    public void deleteGenTableByIds(Long[] tableIds);
-
-    /**
-     * 鍒涘缓琛�
-     *
-     * @param sql 鍒涘缓琛ㄨ鍙�
-     * @return 缁撴灉
-     */
-    public boolean createTable(String sql);
-
-    /**
-     * 瀵煎叆琛ㄧ粨鏋�
-     *
-     * @param tableList 瀵煎叆琛ㄥ垪琛�
-     * @param operName 鎿嶄綔浜哄憳
-     */
-    public void importGenTable(List<GenTable> tableList, String operName);
-
-    /**
-     * 棰勮浠g爜
-     * 
-     * @param tableId 琛ㄧ紪鍙�
-     * @return 棰勮鏁版嵁鍒楄〃
-     */
-    public Map<String, String> previewCode(Long tableId);
-
-    /**
-     * 鐢熸垚浠g爜锛堜笅杞芥柟寮忥級
-     * 
-     * @param tableName 琛ㄥ悕绉�
-     * @return 鏁版嵁
-     */
-    public byte[] downloadCode(String tableName);
-
-    /**
-     * 鐢熸垚浠g爜锛堣嚜瀹氫箟璺緞锛�
-     * 
-     * @param tableName 琛ㄥ悕绉�
-     * @return 鏁版嵁
-     */
-    public void generatorCode(String tableName);
-
-    /**
-     * 鍚屾鏁版嵁搴�
-     * 
-     * @param tableName 琛ㄥ悕绉�
-     */
-    public void synchDb(String tableName);
-
-    /**
-     * 鎵归噺鐢熸垚浠g爜锛堜笅杞芥柟寮忥級
-     * 
-     * @param tableNames 琛ㄦ暟缁�
-     * @return 鏁版嵁
-     */
-    public byte[] downloadCode(String[] tableNames);
-
-    /**
-     * 淇敼淇濆瓨鍙傛暟鏍¢獙
-     * 
-     * @param genTable 涓氬姟淇℃伅
-     */
-    public void validateEdit(GenTable genTable);
-}
diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/util/GenUtils.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/util/GenUtils.java
deleted file mode 100644
index e7ebc20..0000000
--- a/ruoyi-generator/src/main/java/com/ruoyi/generator/util/GenUtils.java
+++ /dev/null
@@ -1,257 +0,0 @@
-package com.ruoyi.generator.util;
-
-import java.util.Arrays;
-import org.apache.commons.lang3.RegExUtils;
-import com.ruoyi.common.constant.GenConstants;
-import com.ruoyi.common.utils.StringUtils;
-import com.ruoyi.generator.config.GenConfig;
-import com.ruoyi.generator.domain.GenTable;
-import com.ruoyi.generator.domain.GenTableColumn;
-
-/**
- * 浠g爜鐢熸垚鍣� 宸ュ叿绫�
- * 
- * @author ruoyi
- */
-public class GenUtils
-{
-    /**
-     * 鍒濆鍖栬〃淇℃伅
-     */
-    public static void initTable(GenTable genTable, String operName)
-    {
-        genTable.setClassName(convertClassName(genTable.getTableName()));
-        genTable.setPackageName(GenConfig.getPackageName());
-        genTable.setModuleName(getModuleName(GenConfig.getPackageName()));
-        genTable.setBusinessName(getBusinessName(genTable.getTableName()));
-        genTable.setFunctionName(replaceText(genTable.getTableComment()));
-        genTable.setFunctionAuthor(GenConfig.getAuthor());
-        genTable.setCreateBy(operName);
-    }
-
-    /**
-     * 鍒濆鍖栧垪灞炴�у瓧娈�
-     */
-    public static void initColumnField(GenTableColumn column, GenTable table)
-    {
-        String dataType = getDbType(column.getColumnType());
-        String columnName = column.getColumnName();
-        column.setTableId(table.getTableId());
-        column.setCreateBy(table.getCreateBy());
-        // 璁剧疆java瀛楁鍚�
-        column.setJavaField(StringUtils.toCamelCase(columnName));
-        // 璁剧疆榛樿绫诲瀷
-        column.setJavaType(GenConstants.TYPE_STRING);
-        column.setQueryType(GenConstants.QUERY_EQ);
-
-        if (arraysContains(GenConstants.COLUMNTYPE_STR, dataType) || arraysContains(GenConstants.COLUMNTYPE_TEXT, dataType))
-        {
-            // 瀛楃涓查暱搴﹁秴杩�500璁剧疆涓烘枃鏈煙
-            Integer columnLength = getColumnLength(column.getColumnType());
-            String htmlType = columnLength >= 500 || arraysContains(GenConstants.COLUMNTYPE_TEXT, dataType) ? GenConstants.HTML_TEXTAREA : GenConstants.HTML_INPUT;
-            column.setHtmlType(htmlType);
-        }
-        else if (arraysContains(GenConstants.COLUMNTYPE_TIME, dataType))
-        {
-            column.setJavaType(GenConstants.TYPE_DATE);
-            column.setHtmlType(GenConstants.HTML_DATETIME);
-        }
-        else if (arraysContains(GenConstants.COLUMNTYPE_NUMBER, dataType))
-        {
-            column.setHtmlType(GenConstants.HTML_INPUT);
-
-            // 濡傛灉鏄诞鐐瑰瀷 缁熶竴鐢˙igDecimal
-            String[] str = StringUtils.split(StringUtils.substringBetween(column.getColumnType(), "(", ")"), ",");
-            if (str != null && str.length == 2 && Integer.parseInt(str[1]) > 0)
-            {
-                column.setJavaType(GenConstants.TYPE_BIGDECIMAL);
-            }
-            // 濡傛灉鏄暣褰�
-            else if (str != null && str.length == 1 && Integer.parseInt(str[0]) <= 10)
-            {
-                column.setJavaType(GenConstants.TYPE_INTEGER);
-            }
-            // 闀挎暣褰�
-            else
-            {
-                column.setJavaType(GenConstants.TYPE_LONG);
-            }
-        }
-
-        // 鎻掑叆瀛楁锛堥粯璁ゆ墍鏈夊瓧娈甸兘闇�瑕佹彃鍏ワ級
-        column.setIsInsert(GenConstants.REQUIRE);
-
-        // 缂栬緫瀛楁
-        if (!arraysContains(GenConstants.COLUMNNAME_NOT_EDIT, columnName) && !column.isPk())
-        {
-            column.setIsEdit(GenConstants.REQUIRE);
-        }
-        // 鍒楄〃瀛楁
-        if (!arraysContains(GenConstants.COLUMNNAME_NOT_LIST, columnName) && !column.isPk())
-        {
-            column.setIsList(GenConstants.REQUIRE);
-        }
-        // 鏌ヨ瀛楁
-        if (!arraysContains(GenConstants.COLUMNNAME_NOT_QUERY, columnName) && !column.isPk())
-        {
-            column.setIsQuery(GenConstants.REQUIRE);
-        }
-
-        // 鏌ヨ瀛楁绫诲瀷
-        if (StringUtils.endsWithIgnoreCase(columnName, "name"))
-        {
-            column.setQueryType(GenConstants.QUERY_LIKE);
-        }
-        // 鐘舵�佸瓧娈佃缃崟閫夋
-        if (StringUtils.endsWithIgnoreCase(columnName, "status"))
-        {
-            column.setHtmlType(GenConstants.HTML_RADIO);
-        }
-        // 绫诲瀷&鎬у埆瀛楁璁剧疆涓嬫媺妗�
-        else if (StringUtils.endsWithIgnoreCase(columnName, "type")
-                || StringUtils.endsWithIgnoreCase(columnName, "sex"))
-        {
-            column.setHtmlType(GenConstants.HTML_SELECT);
-        }
-        // 鍥剧墖瀛楁璁剧疆鍥剧墖涓婁紶鎺т欢
-        else if (StringUtils.endsWithIgnoreCase(columnName, "image"))
-        {
-            column.setHtmlType(GenConstants.HTML_IMAGE_UPLOAD);
-        }
-        // 鏂囦欢瀛楁璁剧疆鏂囦欢涓婁紶鎺т欢
-        else if (StringUtils.endsWithIgnoreCase(columnName, "file"))
-        {
-            column.setHtmlType(GenConstants.HTML_FILE_UPLOAD);
-        }
-        // 鍐呭瀛楁璁剧疆瀵屾枃鏈帶浠�
-        else if (StringUtils.endsWithIgnoreCase(columnName, "content"))
-        {
-            column.setHtmlType(GenConstants.HTML_EDITOR);
-        }
-    }
-
-    /**
-     * 鏍¢獙鏁扮粍鏄惁鍖呭惈鎸囧畾鍊�
-     * 
-     * @param arr 鏁扮粍
-     * @param targetValue 鍊�
-     * @return 鏄惁鍖呭惈
-     */
-    public static boolean arraysContains(String[] arr, String targetValue)
-    {
-        return Arrays.asList(arr).contains(targetValue);
-    }
-
-    /**
-     * 鑾峰彇妯″潡鍚�
-     * 
-     * @param packageName 鍖呭悕
-     * @return 妯″潡鍚�
-     */
-    public static String getModuleName(String packageName)
-    {
-        int lastIndex = packageName.lastIndexOf(".");
-        int nameLength = packageName.length();
-        return StringUtils.substring(packageName, lastIndex + 1, nameLength);
-    }
-
-    /**
-     * 鑾峰彇涓氬姟鍚�
-     * 
-     * @param tableName 琛ㄥ悕
-     * @return 涓氬姟鍚�
-     */
-    public static String getBusinessName(String tableName)
-    {
-        int lastIndex = tableName.lastIndexOf("_");
-        int nameLength = tableName.length();
-        return StringUtils.substring(tableName, lastIndex + 1, nameLength);
-    }
-
-    /**
-     * 琛ㄥ悕杞崲鎴怞ava绫诲悕
-     * 
-     * @param tableName 琛ㄥ悕绉�
-     * @return 绫诲悕
-     */
-    public static String convertClassName(String tableName)
-    {
-        boolean autoRemovePre = GenConfig.getAutoRemovePre();
-        String tablePrefix = GenConfig.getTablePrefix();
-        if (autoRemovePre && StringUtils.isNotEmpty(tablePrefix))
-        {
-            String[] searchList = StringUtils.split(tablePrefix, ",");
-            tableName = replaceFirst(tableName, searchList);
-        }
-        return StringUtils.convertToCamelCase(tableName);
-    }
-
-    /**
-     * 鎵归噺鏇挎崲鍓嶇紑
-     * 
-     * @param replacementm 鏇挎崲鍊�
-     * @param searchList 鏇挎崲鍒楄〃
-     * @return
-     */
-    public static String replaceFirst(String replacementm, String[] searchList)
-    {
-        String text = replacementm;
-        for (String searchString : searchList)
-        {
-            if (replacementm.startsWith(searchString))
-            {
-                text = replacementm.replaceFirst(searchString, "");
-                break;
-            }
-        }
-        return text;
-    }
-
-    /**
-     * 鍏抽敭瀛楁浛鎹�
-     * 
-     * @param text 闇�瑕佽鏇挎崲鐨勫悕瀛�
-     * @return 鏇挎崲鍚庣殑鍚嶅瓧
-     */
-    public static String replaceText(String text)
-    {
-        return RegExUtils.replaceAll(text, "(?:琛▅鑻ヤ緷)", "");
-    }
-
-    /**
-     * 鑾峰彇鏁版嵁搴撶被鍨嬪瓧娈�
-     * 
-     * @param columnType 鍒楃被鍨�
-     * @return 鎴彇鍚庣殑鍒楃被鍨�
-     */
-    public static String getDbType(String columnType)
-    {
-        if (StringUtils.indexOf(columnType, "(") > 0)
-        {
-            return StringUtils.substringBefore(columnType, "(");
-        }
-        else
-        {
-            return columnType;
-        }
-    }
-
-    /**
-     * 鑾峰彇瀛楁闀垮害
-     * 
-     * @param columnType 鍒楃被鍨�
-     * @return 鎴彇鍚庣殑鍒楃被鍨�
-     */
-    public static Integer getColumnLength(String columnType)
-    {
-        if (StringUtils.indexOf(columnType, "(") > 0)
-        {
-            String length = StringUtils.substringBetween(columnType, "(", ")");
-            return Integer.valueOf(length);
-        }
-        else
-        {
-            return 0;
-        }
-    }
-}
diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/util/VelocityInitializer.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/util/VelocityInitializer.java
deleted file mode 100644
index 9f69403..0000000
--- a/ruoyi-generator/src/main/java/com/ruoyi/generator/util/VelocityInitializer.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package com.ruoyi.generator.util;
-
-import java.util.Properties;
-import org.apache.velocity.app.Velocity;
-import com.ruoyi.common.constant.Constants;
-
-/**
- * VelocityEngine宸ュ巶
- * 
- * @author ruoyi
- */
-public class VelocityInitializer
-{
-    /**
-     * 鍒濆鍖杤m鏂规硶
-     */
-    public static void initVelocity()
-    {
-        Properties p = new Properties();
-        try
-        {
-            // 鍔犺浇classpath鐩綍涓嬬殑vm鏂囦欢
-            p.setProperty("resource.loader.file.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader");
-            // 瀹氫箟瀛楃闆�
-            p.setProperty(Velocity.INPUT_ENCODING, Constants.UTF8);
-            // 鍒濆鍖朧elocity寮曟搸锛屾寚瀹氶厤缃甈roperties
-            Velocity.init(p);
-        }
-        catch (Exception e)
-        {
-            throw new RuntimeException(e);
-        }
-    }
-}
diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/util/VelocityUtils.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/util/VelocityUtils.java
deleted file mode 100644
index 1a14681..0000000
--- a/ruoyi-generator/src/main/java/com/ruoyi/generator/util/VelocityUtils.java
+++ /dev/null
@@ -1,408 +0,0 @@
-package com.ruoyi.generator.util;
-
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-import org.apache.velocity.VelocityContext;
-import com.alibaba.fastjson2.JSON;
-import com.alibaba.fastjson2.JSONObject;
-import com.ruoyi.common.constant.GenConstants;
-import com.ruoyi.common.utils.DateUtils;
-import com.ruoyi.common.utils.StringUtils;
-import com.ruoyi.generator.domain.GenTable;
-import com.ruoyi.generator.domain.GenTableColumn;
-
-/**
- * 妯℃澘澶勭悊宸ュ叿绫�
- * 
- * @author ruoyi
- */
-public class VelocityUtils
-{
-    /** 椤圭洰绌洪棿璺緞 */
-    private static final String PROJECT_PATH = "main/java";
-
-    /** mybatis绌洪棿璺緞 */
-    private static final String MYBATIS_PATH = "main/resources/mapper";
-
-    /** 榛樿涓婄骇鑿滃崟锛岀郴缁熷伐鍏� */
-    private static final String DEFAULT_PARENT_MENU_ID = "3";
-
-    /**
-     * 璁剧疆妯℃澘鍙橀噺淇℃伅
-     *
-     * @return 妯℃澘鍒楄〃
-     */
-    public static VelocityContext prepareContext(GenTable genTable)
-    {
-        String moduleName = genTable.getModuleName();
-        String businessName = genTable.getBusinessName();
-        String packageName = genTable.getPackageName();
-        String tplCategory = genTable.getTplCategory();
-        String functionName = genTable.getFunctionName();
-
-        VelocityContext velocityContext = new VelocityContext();
-        velocityContext.put("tplCategory", genTable.getTplCategory());
-        velocityContext.put("tableName", genTable.getTableName());
-        velocityContext.put("functionName", StringUtils.isNotEmpty(functionName) ? functionName : "銆愯濉啓鍔熻兘鍚嶇О銆�");
-        velocityContext.put("ClassName", genTable.getClassName());
-        velocityContext.put("className", StringUtils.uncapitalize(genTable.getClassName()));
-        velocityContext.put("moduleName", genTable.getModuleName());
-        velocityContext.put("BusinessName", StringUtils.capitalize(genTable.getBusinessName()));
-        velocityContext.put("businessName", genTable.getBusinessName());
-        velocityContext.put("basePackage", getPackagePrefix(packageName));
-        velocityContext.put("packageName", packageName);
-        velocityContext.put("author", genTable.getFunctionAuthor());
-        velocityContext.put("datetime", DateUtils.getDate());
-        velocityContext.put("pkColumn", genTable.getPkColumn());
-        velocityContext.put("importList", getImportList(genTable));
-        velocityContext.put("permissionPrefix", getPermissionPrefix(moduleName, businessName));
-        velocityContext.put("columns", genTable.getColumns());
-        velocityContext.put("table", genTable);
-        velocityContext.put("dicts", getDicts(genTable));
-        setMenuVelocityContext(velocityContext, genTable);
-        if (GenConstants.TPL_TREE.equals(tplCategory))
-        {
-            setTreeVelocityContext(velocityContext, genTable);
-        }
-        if (GenConstants.TPL_SUB.equals(tplCategory))
-        {
-            setSubVelocityContext(velocityContext, genTable);
-        }
-        return velocityContext;
-    }
-
-    public static void setMenuVelocityContext(VelocityContext context, GenTable genTable)
-    {
-        String options = genTable.getOptions();
-        JSONObject paramsObj = JSON.parseObject(options);
-        String parentMenuId = getParentMenuId(paramsObj);
-        context.put("parentMenuId", parentMenuId);
-    }
-
-    public static void setTreeVelocityContext(VelocityContext context, GenTable genTable)
-    {
-        String options = genTable.getOptions();
-        JSONObject paramsObj = JSON.parseObject(options);
-        String treeCode = getTreecode(paramsObj);
-        String treeParentCode = getTreeParentCode(paramsObj);
-        String treeName = getTreeName(paramsObj);
-
-        context.put("treeCode", treeCode);
-        context.put("treeParentCode", treeParentCode);
-        context.put("treeName", treeName);
-        context.put("expandColumn", getExpandColumn(genTable));
-        if (paramsObj.containsKey(GenConstants.TREE_PARENT_CODE))
-        {
-            context.put("tree_parent_code", paramsObj.getString(GenConstants.TREE_PARENT_CODE));
-        }
-        if (paramsObj.containsKey(GenConstants.TREE_NAME))
-        {
-            context.put("tree_name", paramsObj.getString(GenConstants.TREE_NAME));
-        }
-    }
-
-    public static void setSubVelocityContext(VelocityContext context, GenTable genTable)
-    {
-        GenTable subTable = genTable.getSubTable();
-        String subTableName = genTable.getSubTableName();
-        String subTableFkName = genTable.getSubTableFkName();
-        String subClassName = genTable.getSubTable().getClassName();
-        String subTableFkClassName = StringUtils.convertToCamelCase(subTableFkName);
-
-        context.put("subTable", subTable);
-        context.put("subTableName", subTableName);
-        context.put("subTableFkName", subTableFkName);
-        context.put("subTableFkClassName", subTableFkClassName);
-        context.put("subTableFkclassName", StringUtils.uncapitalize(subTableFkClassName));
-        context.put("subClassName", subClassName);
-        context.put("subclassName", StringUtils.uncapitalize(subClassName));
-        context.put("subImportList", getImportList(genTable.getSubTable()));
-    }
-
-    /**
-     * 鑾峰彇妯℃澘淇℃伅
-     * @param tplCategory 鐢熸垚鐨勬ā鏉�
-     * @param tplWebType 鍓嶇绫诲瀷
-     * @return 妯℃澘鍒楄〃
-     */
-    public static List<String> getTemplateList(String tplCategory, String tplWebType)
-    {
-        String useWebType = "vm/vue";
-        if ("element-plus".equals(tplWebType))
-        {
-            useWebType = "vm/vue/v3";
-        }
-        List<String> templates = new ArrayList<String>();
-        templates.add("vm/java/domain.java.vm");
-        templates.add("vm/java/mapper.java.vm");
-        templates.add("vm/java/service.java.vm");
-        templates.add("vm/java/serviceImpl.java.vm");
-        templates.add("vm/java/controller.java.vm");
-        templates.add("vm/xml/mapper.xml.vm");
-        templates.add("vm/sql/sql.vm");
-        templates.add("vm/js/api.js.vm");
-        if (GenConstants.TPL_CRUD.equals(tplCategory))
-        {
-            templates.add(useWebType + "/index.vue.vm");
-        }
-        else if (GenConstants.TPL_TREE.equals(tplCategory))
-        {
-            templates.add(useWebType + "/index-tree.vue.vm");
-        }
-        else if (GenConstants.TPL_SUB.equals(tplCategory))
-        {
-            templates.add(useWebType + "/index.vue.vm");
-            templates.add("vm/java/sub-domain.java.vm");
-        }
-        return templates;
-    }
-
-    /**
-     * 鑾峰彇鏂囦欢鍚�
-     */
-    public static String getFileName(String template, GenTable genTable)
-    {
-        // 鏂囦欢鍚嶇О
-        String fileName = "";
-        // 鍖呰矾寰�
-        String packageName = genTable.getPackageName();
-        // 妯″潡鍚�
-        String moduleName = genTable.getModuleName();
-        // 澶у啓绫诲悕
-        String className = genTable.getClassName();
-        // 涓氬姟鍚嶇О
-        String businessName = genTable.getBusinessName();
-
-        String javaPath = PROJECT_PATH + "/" + StringUtils.replace(packageName, ".", "/");
-        String mybatisPath = MYBATIS_PATH + "/" + moduleName;
-        String vuePath = "vue";
-
-        if (template.contains("domain.java.vm"))
-        {
-            fileName = StringUtils.format("{}/domain/{}.java", javaPath, className);
-        }
-        if (template.contains("sub-domain.java.vm") && StringUtils.equals(GenConstants.TPL_SUB, genTable.getTplCategory()))
-        {
-            fileName = StringUtils.format("{}/domain/{}.java", javaPath, genTable.getSubTable().getClassName());
-        }
-        else if (template.contains("mapper.java.vm"))
-        {
-            fileName = StringUtils.format("{}/mapper/{}Mapper.java", javaPath, className);
-        }
-        else if (template.contains("service.java.vm"))
-        {
-            fileName = StringUtils.format("{}/service/I{}Service.java", javaPath, className);
-        }
-        else if (template.contains("serviceImpl.java.vm"))
-        {
-            fileName = StringUtils.format("{}/service/impl/{}ServiceImpl.java", javaPath, className);
-        }
-        else if (template.contains("controller.java.vm"))
-        {
-            fileName = StringUtils.format("{}/controller/{}Controller.java", javaPath, className);
-        }
-        else if (template.contains("mapper.xml.vm"))
-        {
-            fileName = StringUtils.format("{}/{}Mapper.xml", mybatisPath, className);
-        }
-        else if (template.contains("sql.vm"))
-        {
-            fileName = businessName + "Menu.sql";
-        }
-        else if (template.contains("api.js.vm"))
-        {
-            fileName = StringUtils.format("{}/api/{}/{}.js", vuePath, moduleName, businessName);
-        }
-        else if (template.contains("index.vue.vm"))
-        {
-            fileName = StringUtils.format("{}/views/{}/{}/index.vue", vuePath, moduleName, businessName);
-        }
-        else if (template.contains("index-tree.vue.vm"))
-        {
-            fileName = StringUtils.format("{}/views/{}/{}/index.vue", vuePath, moduleName, businessName);
-        }
-        return fileName;
-    }
-
-    /**
-     * 鑾峰彇鍖呭墠缂�
-     *
-     * @param packageName 鍖呭悕绉�
-     * @return 鍖呭墠缂�鍚嶇О
-     */
-    public static String getPackagePrefix(String packageName)
-    {
-        int lastIndex = packageName.lastIndexOf(".");
-        return StringUtils.substring(packageName, 0, lastIndex);
-    }
-
-    /**
-     * 鏍规嵁鍒楃被鍨嬭幏鍙栧鍏ュ寘
-     * 
-     * @param genTable 涓氬姟琛ㄥ璞�
-     * @return 杩斿洖闇�瑕佸鍏ョ殑鍖呭垪琛�
-     */
-    public static HashSet<String> getImportList(GenTable genTable)
-    {
-        List<GenTableColumn> columns = genTable.getColumns();
-        GenTable subGenTable = genTable.getSubTable();
-        HashSet<String> importList = new HashSet<String>();
-        if (StringUtils.isNotNull(subGenTable))
-        {
-            importList.add("java.util.List");
-        }
-        for (GenTableColumn column : columns)
-        {
-            if (!column.isSuperColumn() && GenConstants.TYPE_DATE.equals(column.getJavaType()))
-            {
-                importList.add("java.util.Date");
-                importList.add("com.fasterxml.jackson.annotation.JsonFormat");
-            }
-            else if (!column.isSuperColumn() && GenConstants.TYPE_BIGDECIMAL.equals(column.getJavaType()))
-            {
-                importList.add("java.math.BigDecimal");
-            }
-        }
-        return importList;
-    }
-
-    /**
-     * 鏍规嵁鍒楃被鍨嬭幏鍙栧瓧鍏哥粍
-     * 
-     * @param genTable 涓氬姟琛ㄥ璞�
-     * @return 杩斿洖瀛楀吀缁�
-     */
-    public static String getDicts(GenTable genTable)
-    {
-        List<GenTableColumn> columns = genTable.getColumns();
-        Set<String> dicts = new HashSet<String>();
-        addDicts(dicts, columns);
-        if (StringUtils.isNotNull(genTable.getSubTable()))
-        {
-            List<GenTableColumn> subColumns = genTable.getSubTable().getColumns();
-            addDicts(dicts, subColumns);
-        }
-        return StringUtils.join(dicts, ", ");
-    }
-
-    /**
-     * 娣诲姞瀛楀吀鍒楄〃
-     * 
-     * @param dicts 瀛楀吀鍒楄〃
-     * @param columns 鍒楅泦鍚�
-     */
-    public static void addDicts(Set<String> dicts, List<GenTableColumn> columns)
-    {
-        for (GenTableColumn column : columns)
-        {
-            if (!column.isSuperColumn() && StringUtils.isNotEmpty(column.getDictType()) && StringUtils.equalsAny(
-                    column.getHtmlType(),
-                    new String[] { GenConstants.HTML_SELECT, GenConstants.HTML_RADIO, GenConstants.HTML_CHECKBOX }))
-            {
-                dicts.add("'" + column.getDictType() + "'");
-            }
-        }
-    }
-
-    /**
-     * 鑾峰彇鏉冮檺鍓嶇紑
-     *
-     * @param moduleName 妯″潡鍚嶇О
-     * @param businessName 涓氬姟鍚嶇О
-     * @return 杩斿洖鏉冮檺鍓嶇紑
-     */
-    public static String getPermissionPrefix(String moduleName, String businessName)
-    {
-        return StringUtils.format("{}:{}", moduleName, businessName);
-    }
-
-    /**
-     * 鑾峰彇涓婄骇鑿滃崟ID瀛楁
-     *
-     * @param paramsObj 鐢熸垚鍏朵粬閫夐」
-     * @return 涓婄骇鑿滃崟ID瀛楁
-     */
-    public static String getParentMenuId(JSONObject paramsObj)
-    {
-        if (StringUtils.isNotEmpty(paramsObj) && paramsObj.containsKey(GenConstants.PARENT_MENU_ID)
-                && StringUtils.isNotEmpty(paramsObj.getString(GenConstants.PARENT_MENU_ID)))
-        {
-            return paramsObj.getString(GenConstants.PARENT_MENU_ID);
-        }
-        return DEFAULT_PARENT_MENU_ID;
-    }
-
-    /**
-     * 鑾峰彇鏍戠紪鐮�
-     *
-     * @param paramsObj 鐢熸垚鍏朵粬閫夐」
-     * @return 鏍戠紪鐮�
-     */
-    public static String getTreecode(JSONObject paramsObj)
-    {
-        if (paramsObj.containsKey(GenConstants.TREE_CODE))
-        {
-            return StringUtils.toCamelCase(paramsObj.getString(GenConstants.TREE_CODE));
-        }
-        return StringUtils.EMPTY;
-    }
-
-    /**
-     * 鑾峰彇鏍戠埗缂栫爜
-     *
-     * @param paramsObj 鐢熸垚鍏朵粬閫夐」
-     * @return 鏍戠埗缂栫爜
-     */
-    public static String getTreeParentCode(JSONObject paramsObj)
-    {
-        if (paramsObj.containsKey(GenConstants.TREE_PARENT_CODE))
-        {
-            return StringUtils.toCamelCase(paramsObj.getString(GenConstants.TREE_PARENT_CODE));
-        }
-        return StringUtils.EMPTY;
-    }
-
-    /**
-     * 鑾峰彇鏍戝悕绉�
-     *
-     * @param paramsObj 鐢熸垚鍏朵粬閫夐」
-     * @return 鏍戝悕绉�
-     */
-    public static String getTreeName(JSONObject paramsObj)
-    {
-        if (paramsObj.containsKey(GenConstants.TREE_NAME))
-        {
-            return StringUtils.toCamelCase(paramsObj.getString(GenConstants.TREE_NAME));
-        }
-        return StringUtils.EMPTY;
-    }
-
-    /**
-     * 鑾峰彇闇�瑕佸湪鍝竴鍒椾笂闈㈡樉绀哄睍寮�鎸夐挳
-     *
-     * @param genTable 涓氬姟琛ㄥ璞�
-     * @return 灞曞紑鎸夐挳鍒楀簭鍙�
-     */
-    public static int getExpandColumn(GenTable genTable)
-    {
-        String options = genTable.getOptions();
-        JSONObject paramsObj = JSON.parseObject(options);
-        String treeName = paramsObj.getString(GenConstants.TREE_NAME);
-        int num = 0;
-        for (GenTableColumn column : genTable.getColumns())
-        {
-            if (column.isList())
-            {
-                num++;
-                String columnName = column.getColumnName();
-                if (columnName.equals(treeName))
-                {
-                    break;
-                }
-            }
-        }
-        return num;
-    }
-}
diff --git a/ruoyi-generator/src/main/resources/generator.yml b/ruoyi-generator/src/main/resources/generator.yml
deleted file mode 100644
index d1cbf48..0000000
--- a/ruoyi-generator/src/main/resources/generator.yml
+++ /dev/null
@@ -1,12 +0,0 @@
-# 浠g爜鐢熸垚
-gen:
-  # 浣滆��
-  author: ruoyi
-  # 榛樿鐢熸垚鍖呰矾寰� system 闇�鏀规垚鑷繁鐨勬ā鍧楀悕绉� 濡� system monitor tool
-  packageName: com.ruoyi.system
-  # 鑷姩鍘婚櫎琛ㄥ墠缂�锛岄粯璁ゆ槸false
-  autoRemovePre: false
-  # 琛ㄥ墠缂�锛堢敓鎴愮被鍚嶄笉浼氬寘鍚〃鍓嶇紑锛屽涓敤閫楀彿鍒嗛殧锛�
-  tablePrefix: sys_
-  # 鏄惁鍏佽鐢熸垚鏂囦欢瑕嗙洊鍒版湰鍦帮紙鑷畾涔夎矾寰勶級锛岄粯璁や笉鍏佽
-  allowOverwrite: false
\ No newline at end of file
diff --git a/ruoyi-generator/src/main/resources/mapper/generator/GenTableColumnMapper.xml b/ruoyi-generator/src/main/resources/mapper/generator/GenTableColumnMapper.xml
deleted file mode 100644
index 52857e8..0000000
--- a/ruoyi-generator/src/main/resources/mapper/generator/GenTableColumnMapper.xml
+++ /dev/null
@@ -1,127 +0,0 @@
-<?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.generator.mapper.GenTableColumnMapper">
-
-    <resultMap type="GenTableColumn" id="GenTableColumnResult">
-        <id     property="columnId"       column="column_id"      />
-        <result property="tableId"        column="table_id"       />
-        <result property="columnName"     column="column_name"    />
-        <result property="columnComment"  column="column_comment" />
-        <result property="columnType"     column="column_type"    />
-        <result property="javaType"       column="java_type"      />
-        <result property="javaField"      column="java_field"     />
-        <result property="isPk"           column="is_pk"          />
-        <result property="isIncrement"    column="is_increment"   />
-        <result property="isRequired"     column="is_required"    />
-        <result property="isInsert"       column="is_insert"      />
-        <result property="isEdit"         column="is_edit"        />
-        <result property="isList"         column="is_list"        />
-        <result property="isQuery"        column="is_query"       />
-        <result property="queryType"      column="query_type"     />
-        <result property="htmlType"       column="html_type"      />
-        <result property="dictType"       column="dict_type"      />
-        <result property="sort"           column="sort"           />
-        <result property="createBy"       column="create_by"      />
-        <result property="createTime"     column="create_time"    />
-        <result property="updateBy"       column="update_by"      />
-        <result property="updateTime"     column="update_time"    />
-    </resultMap>
-
-	<sql id="selectGenTableColumnVo">
-        select column_id, table_id, column_name, column_comment, column_type, java_type, java_field, is_pk, is_increment, is_required, is_insert, is_edit, is_list, is_query, query_type, html_type, dict_type, sort, create_by, create_time, update_by, update_time from gen_table_column
-    </sql>
-
-    <select id="selectGenTableColumnListByTableId" parameterType="Long" resultMap="GenTableColumnResult">
-        <include refid="selectGenTableColumnVo"/>
-        where table_id = #{tableId}
-        order by sort
-    </select>
-
-    <select id="selectDbTableColumnsByName" parameterType="String" resultMap="GenTableColumnResult">
-		select column_name, (case when (is_nullable = 'no' <![CDATA[ && ]]> column_key != 'PRI') then '1' else '0' end) as is_required, (case when column_key = 'PRI' then '1' else '0' end) as is_pk, ordinal_position as sort, column_comment, (case when extra = 'auto_increment' then '1' else '0' end) as is_increment, column_type
-		from information_schema.columns where table_schema = (select database()) and table_name = (#{tableName})
-		order by ordinal_position
-	</select>
-
-    <insert id="insertGenTableColumn" parameterType="GenTableColumn" useGeneratedKeys="true" keyProperty="columnId">
-        insert into gen_table_column (
-			<if test="tableId != null and tableId != ''">table_id,</if>
-			<if test="columnName != null and columnName != ''">column_name,</if>
-			<if test="columnComment != null and columnComment != ''">column_comment,</if>
-			<if test="columnType != null and columnType != ''">column_type,</if>
-			<if test="javaType != null and javaType != ''">java_type,</if>
-			<if test="javaField != null  and javaField != ''">java_field,</if>
-			<if test="isPk != null and isPk != ''">is_pk,</if>
-			<if test="isIncrement != null and isIncrement != ''">is_increment,</if>
-			<if test="isRequired != null and isRequired != ''">is_required,</if>
-			<if test="isInsert != null and isInsert != ''">is_insert,</if>
-			<if test="isEdit != null and isEdit != ''">is_edit,</if>
-			<if test="isList != null and isList != ''">is_list,</if>
-			<if test="isQuery != null and isQuery != ''">is_query,</if>
-			<if test="queryType != null and queryType != ''">query_type,</if>
-			<if test="htmlType != null and htmlType != ''">html_type,</if>
-			<if test="dictType != null and dictType != ''">dict_type,</if>
-			<if test="sort != null">sort,</if>
-			<if test="createBy != null and createBy != ''">create_by,</if>
-			create_time
-         )values(
-			<if test="tableId != null and tableId != ''">#{tableId},</if>
-			<if test="columnName != null and columnName != ''">#{columnName},</if>
-			<if test="columnComment != null and columnComment != ''">#{columnComment},</if>
-			<if test="columnType != null and columnType != ''">#{columnType},</if>
-			<if test="javaType != null and javaType != ''">#{javaType},</if>
-			<if test="javaField != null and javaField != ''">#{javaField},</if>
-			<if test="isPk != null and isPk != ''">#{isPk},</if>
-			<if test="isIncrement != null and isIncrement != ''">#{isIncrement},</if>
-			<if test="isRequired != null and isRequired != ''">#{isRequired},</if>
-			<if test="isInsert != null and isInsert != ''">#{isInsert},</if>
-			<if test="isEdit != null and isEdit != ''">#{isEdit},</if>
-			<if test="isList != null and isList != ''">#{isList},</if>
-			<if test="isQuery != null and isQuery != ''">#{isQuery},</if>
-			<if test="queryType != null and queryType != ''">#{queryType},</if>
-			<if test="htmlType != null and htmlType != ''">#{htmlType},</if>
-			<if test="dictType != null and dictType != ''">#{dictType},</if>
-			<if test="sort != null">#{sort},</if>
-			<if test="createBy != null and createBy != ''">#{createBy},</if>
-			sysdate()
-         )
-    </insert>
-
-    <update id="updateGenTableColumn" parameterType="GenTableColumn">
-        update gen_table_column
-        <set>
-            <if test="columnComment != null">column_comment = #{columnComment},</if>
-            <if test="javaType != null">java_type = #{javaType},</if>
-            <if test="javaField != null">java_field = #{javaField},</if>
-            <if test="isInsert != null">is_insert = #{isInsert},</if>
-            <if test="isEdit != null">is_edit = #{isEdit},</if>
-            <if test="isList != null">is_list = #{isList},</if>
-            <if test="isQuery != null">is_query = #{isQuery},</if>
-            <if test="isRequired != null">is_required = #{isRequired},</if>
-            <if test="queryType != null">query_type = #{queryType},</if>
-            <if test="htmlType != null">html_type = #{htmlType},</if>
-            <if test="dictType != null">dict_type = #{dictType},</if>
-            <if test="sort != null">sort = #{sort},</if>
-            <if test="updateBy != null">update_by = #{updateBy},</if>
-            update_time = sysdate()
-        </set>
-        where column_id = #{columnId}
-    </update>
-
-    <delete id="deleteGenTableColumnByIds" parameterType="Long">
-        delete from gen_table_column where table_id in
-        <foreach collection="array" item="tableId" open="(" separator="," close=")">
-            #{tableId}
-        </foreach>
-    </delete>
-
-    <delete id="deleteGenTableColumns">
-        delete from gen_table_column where column_id in
-        <foreach collection="list" item="item" open="(" separator="," close=")">
-            #{item.columnId}
-        </foreach>
-    </delete>
-
-</mapper>
\ No newline at end of file
diff --git a/ruoyi-generator/src/main/resources/mapper/generator/GenTableMapper.xml b/ruoyi-generator/src/main/resources/mapper/generator/GenTableMapper.xml
deleted file mode 100644
index d1110f7..0000000
--- a/ruoyi-generator/src/main/resources/mapper/generator/GenTableMapper.xml
+++ /dev/null
@@ -1,210 +0,0 @@
-<?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.generator.mapper.GenTableMapper">
-
-	<resultMap type="GenTable" id="GenTableResult">
-	    <id     property="tableId"        column="table_id"          />
-		<result property="tableName"      column="table_name"        />
-		<result property="tableComment"   column="table_comment"     />
-		<result property="subTableName"   column="sub_table_name"    />
-		<result property="subTableFkName" column="sub_table_fk_name" />
-		<result property="className"      column="class_name"        />
-		<result property="tplCategory"    column="tpl_category"      />
-		<result property="tplWebType"     column="tpl_web_type"      />
-		<result property="packageName"    column="package_name"      />
-		<result property="moduleName"     column="module_name"       />
-		<result property="businessName"   column="business_name"     />
-		<result property="functionName"   column="function_name"     />
-		<result property="functionAuthor" column="function_author"   />
-		<result property="genType"        column="gen_type"          />
-		<result property="genPath"        column="gen_path"          />
-		<result property="options"        column="options"           />
-		<result property="createBy"       column="create_by"         />
-		<result property="createTime"     column="create_time"       />
-		<result property="updateBy"       column="update_by"         />
-		<result property="updateTime"     column="update_time"       />
-		<result property="remark"         column="remark"            />
-		<collection  property="columns"   javaType="java.util.List"  resultMap="GenTableColumnResult" />
-	</resultMap>
-	
-	<resultMap type="GenTableColumn" id="GenTableColumnResult">
-        <id     property="columnId"       column="column_id"      />
-        <result property="tableId"        column="table_id"       />
-        <result property="columnName"     column="column_name"    />
-        <result property="columnComment"  column="column_comment" />
-        <result property="columnType"     column="column_type"    />
-        <result property="javaType"       column="java_type"      />
-        <result property="javaField"      column="java_field"     />
-        <result property="isPk"           column="is_pk"          />
-        <result property="isIncrement"    column="is_increment"   />
-        <result property="isRequired"     column="is_required"    />
-        <result property="isInsert"       column="is_insert"      />
-        <result property="isEdit"         column="is_edit"        />
-        <result property="isList"         column="is_list"        />
-        <result property="isQuery"        column="is_query"       />
-        <result property="queryType"      column="query_type"     />
-        <result property="htmlType"       column="html_type"      />
-        <result property="dictType"       column="dict_type"      />
-        <result property="sort"           column="sort"           />
-        <result property="createBy"       column="create_by"      />
-        <result property="createTime"     column="create_time"    />
-        <result property="updateBy"       column="update_by"      />
-        <result property="updateTime"     column="update_time"    />
-    </resultMap>
-	
-	<sql id="selectGenTableVo">
-        select table_id, table_name, table_comment, sub_table_name, sub_table_fk_name, class_name, tpl_category, tpl_web_type, package_name, module_name, business_name, function_name, function_author, gen_type, gen_path, options, create_by, create_time, update_by, update_time, remark from gen_table
-    </sql>
-    
-    <select id="selectGenTableList" parameterType="GenTable" resultMap="GenTableResult">
-		<include refid="selectGenTableVo"/>
-		<where>
-			<if test="tableName != null and tableName != ''">
-				AND lower(table_name) like lower(concat('%', #{tableName}, '%'))
-			</if>
-			<if test="tableComment != null and tableComment != ''">
-				AND lower(table_comment) like lower(concat('%', #{tableComment}, '%'))
-			</if>
-			<if test="params.beginTime != null and params.beginTime != ''"><!-- 寮�濮嬫椂闂存绱� -->
-				AND date_format(create_time,'%Y%m%d') &gt;= date_format(#{params.beginTime},'%Y%m%d')
-			</if>
-			<if test="params.endTime != null and params.endTime != ''"><!-- 缁撴潫鏃堕棿妫�绱� -->
-				AND date_format(create_time,'%Y%m%d') &lt;= date_format(#{params.endTime},'%Y%m%d')
-			</if>
-		</where>
-	</select>
-
-	<select id="selectDbTableList" parameterType="GenTable" resultMap="GenTableResult">
-		select table_name, table_comment, create_time, update_time from information_schema.tables
-		where table_schema = (select database())
-		AND table_name NOT LIKE 'qrtz\_%' AND table_name NOT LIKE 'gen\_%'
-		AND table_name NOT IN (select table_name from gen_table)
-		<if test="tableName != null and tableName != ''">
-			AND lower(table_name) like lower(concat('%', #{tableName}, '%'))
-		</if>
-		<if test="tableComment != null and tableComment != ''">
-			AND lower(table_comment) like lower(concat('%', #{tableComment}, '%'))
-		</if>
-		<if test="params.beginTime != null and params.beginTime != ''"><!-- 寮�濮嬫椂闂存绱� -->
-			AND date_format(create_time,'%Y%m%d') &gt;= date_format(#{params.beginTime},'%Y%m%d')
-		</if>
-		<if test="params.endTime != null and params.endTime != ''"><!-- 缁撴潫鏃堕棿妫�绱� -->
-			AND date_format(create_time,'%Y%m%d') &lt;= date_format(#{params.endTime},'%Y%m%d')
-		</if>
-        order by create_time desc
-	</select>
-	
-	<select id="selectDbTableListByNames" resultMap="GenTableResult">
-		select table_name, table_comment, create_time, update_time from information_schema.tables
-		where table_name NOT LIKE 'qrtz\_%' and table_name NOT LIKE 'gen\_%' and table_schema = (select database())
-		and table_name in
-	    <foreach collection="array" item="name" open="(" separator="," close=")">
- 			#{name}
-        </foreach> 
-	</select>
-	
-	<select id="selectTableByName" parameterType="String" resultMap="GenTableResult">
-		select table_name, table_comment, create_time, update_time from information_schema.tables
-		where table_comment <![CDATA[ <> ]]> '' and table_schema = (select database())
-		and table_name = #{tableName}
-	</select>
-	
-	<select id="selectGenTableById" parameterType="Long" resultMap="GenTableResult">
-	    SELECT t.table_id, t.table_name, t.table_comment, t.sub_table_name, t.sub_table_fk_name, t.class_name, t.tpl_category, t.tpl_web_type, t.package_name, t.module_name, t.business_name, t.function_name, t.function_author, t.gen_type, t.gen_path, t.options, t.remark,
-			   c.column_id, c.column_name, c.column_comment, c.column_type, c.java_type, c.java_field, c.is_pk, c.is_increment, c.is_required, c.is_insert, c.is_edit, c.is_list, c.is_query, c.query_type, c.html_type, c.dict_type, c.sort
-		FROM gen_table t
-			 LEFT JOIN gen_table_column c ON t.table_id = c.table_id
-		where t.table_id = #{tableId} order by c.sort
-	</select>
-	
-	<select id="selectGenTableByName" parameterType="String" resultMap="GenTableResult">
-	    SELECT t.table_id, t.table_name, t.table_comment, t.sub_table_name, t.sub_table_fk_name, t.class_name, t.tpl_category, t.tpl_web_type, t.package_name, t.module_name, t.business_name, t.function_name, t.function_author, t.gen_type, t.gen_path, t.options, t.remark,
-			   c.column_id, c.column_name, c.column_comment, c.column_type, c.java_type, c.java_field, c.is_pk, c.is_increment, c.is_required, c.is_insert, c.is_edit, c.is_list, c.is_query, c.query_type, c.html_type, c.dict_type, c.sort
-		FROM gen_table t
-			 LEFT JOIN gen_table_column c ON t.table_id = c.table_id
-		where t.table_name = #{tableName} order by c.sort
-	</select>
-	
-	<select id="selectGenTableAll" parameterType="String" resultMap="GenTableResult">
-	    SELECT t.table_id, t.table_name, t.table_comment, t.sub_table_name, t.sub_table_fk_name, t.class_name, t.tpl_category, t.tpl_web_type, t.package_name, t.module_name, t.business_name, t.function_name, t.function_author, t.options, t.remark,
-			   c.column_id, c.column_name, c.column_comment, c.column_type, c.java_type, c.java_field, c.is_pk, c.is_increment, c.is_required, c.is_insert, c.is_edit, c.is_list, c.is_query, c.query_type, c.html_type, c.dict_type, c.sort
-		FROM gen_table t
-			 LEFT JOIN gen_table_column c ON t.table_id = c.table_id
-		order by c.sort
-	</select>
-	
-	<insert id="insertGenTable" parameterType="GenTable" useGeneratedKeys="true" keyProperty="tableId">
-        insert into gen_table (
-			<if test="tableName != null">table_name,</if>
-			<if test="tableComment != null and tableComment != ''">table_comment,</if>
-			<if test="className != null and className != ''">class_name,</if>
-			<if test="tplCategory != null and tplCategory != ''">tpl_category,</if>
-			<if test="tplWebType != null and tplWebType != ''">tpl_web_type,</if>
-			<if test="packageName != null and packageName != ''">package_name,</if>
-			<if test="moduleName != null and moduleName != ''">module_name,</if>
-			<if test="businessName != null and businessName != ''">business_name,</if>
-			<if test="functionName != null and functionName != ''">function_name,</if>
-			<if test="functionAuthor != null and functionAuthor != ''">function_author,</if>
-			<if test="genType != null and genType != ''">gen_type,</if>
-			<if test="genPath != null and genPath != ''">gen_path,</if>
-			<if test="remark != null and remark != ''">remark,</if>
- 			<if test="createBy != null and createBy != ''">create_by,</if>
-			create_time
-         )values(
-			<if test="tableName != null">#{tableName},</if>
-			<if test="tableComment != null and tableComment != ''">#{tableComment},</if>
-			<if test="className != null and className != ''">#{className},</if>
-			<if test="tplCategory != null and tplCategory != ''">#{tplCategory},</if>
-			<if test="tplWebType != null and tplWebType != ''">#{tplWebType},</if>
-			<if test="packageName != null and packageName != ''">#{packageName},</if>
-			<if test="moduleName != null and moduleName != ''">#{moduleName},</if>
-			<if test="businessName != null and businessName != ''">#{businessName},</if>
-			<if test="functionName != null and functionName != ''">#{functionName},</if>
-			<if test="functionAuthor != null and functionAuthor != ''">#{functionAuthor},</if>
-			<if test="genType != null and genType != ''">#{genType},</if>
-			<if test="genPath != null and genPath != ''">#{genPath},</if>
-			<if test="remark != null and remark != ''">#{remark},</if>
- 			<if test="createBy != null and createBy != ''">#{createBy},</if>
-			sysdate()
-         )
-    </insert>
-    
-    <update id="createTable">
-        ${sql}
-    </update>
-    
-    <update id="updateGenTable" parameterType="GenTable">
-        update gen_table
-        <set>
-            <if test="tableName != null">table_name = #{tableName},</if>
-            <if test="tableComment != null and tableComment != ''">table_comment = #{tableComment},</if>
-            <if test="subTableName != null">sub_table_name = #{subTableName},</if>
-            <if test="subTableFkName != null">sub_table_fk_name = #{subTableFkName},</if>
-            <if test="className != null and className != ''">class_name = #{className},</if>
-            <if test="functionAuthor != null and functionAuthor != ''">function_author = #{functionAuthor},</if>
-            <if test="genType != null and genType != ''">gen_type = #{genType},</if>
-            <if test="genPath != null and genPath != ''">gen_path = #{genPath},</if>
-            <if test="tplCategory != null and tplCategory != ''">tpl_category = #{tplCategory},</if>
-            <if test="tplWebType != null and tplWebType != ''">tpl_web_type = #{tplWebType},</if>
-            <if test="packageName != null and packageName != ''">package_name = #{packageName},</if>
-            <if test="moduleName != null and moduleName != ''">module_name = #{moduleName},</if>
-            <if test="businessName != null and businessName != ''">business_name = #{businessName},</if>
-            <if test="functionName != null and functionName != ''">function_name = #{functionName},</if>
-            <if test="options != null and options != ''">options = #{options},</if>
-            <if test="updateBy != null and updateBy != ''">update_by = #{updateBy},</if>
-            <if test="remark != null">remark = #{remark},</if>
-            update_time = sysdate()
-        </set>
-        where table_id = #{tableId}
-    </update>
-    
-    <delete id="deleteGenTableByIds" parameterType="Long">
-        delete from gen_table where table_id in 
-        <foreach collection="array" item="tableId" open="(" separator="," close=")">
-            #{tableId}
-        </foreach>
-    </delete>
-
-</mapper>
\ No newline at end of file
diff --git a/ruoyi-generator/src/main/resources/vm/java/controller.java.vm b/ruoyi-generator/src/main/resources/vm/java/controller.java.vm
deleted file mode 100644
index 0eab21c..0000000
--- a/ruoyi-generator/src/main/resources/vm/java/controller.java.vm
+++ /dev/null
@@ -1,115 +0,0 @@
-package ${packageName}.controller;
-
-import java.util.List;
-import javax.servlet.http.HttpServletResponse;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.PutMapping;
-import org.springframework.web.bind.annotation.DeleteMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-import com.ruoyi.common.annotation.Log;
-import com.ruoyi.common.core.controller.BaseController;
-import com.ruoyi.common.core.domain.AjaxResult;
-import com.ruoyi.common.enums.BusinessType;
-import ${packageName}.domain.${ClassName};
-import ${packageName}.service.I${ClassName}Service;
-import com.ruoyi.common.utils.poi.ExcelUtil;
-#if($table.crud || $table.sub)
-import com.ruoyi.common.core.page.TableDataInfo;
-#elseif($table.tree)
-#end
-
-/**
- * ${functionName}Controller
- *
- * @author ${author}
- * @date ${datetime}
- */
-@RestController
-@RequestMapping("/${moduleName}/${businessName}")
-public class ${ClassName}Controller extends BaseController
-{
-    @Autowired
-    private I${ClassName}Service ${className}Service;
-
-    /**
-     * 鏌ヨ${functionName}鍒楄〃
-     */
-    @PreAuthorize("@ss.hasPermi('${permissionPrefix}:list')")
-    @GetMapping("/list")
-#if($table.crud || $table.sub)
-    public TableDataInfo list(${ClassName} ${className})
-    {
-        startPage();
-        List<${ClassName}> list = ${className}Service.select${ClassName}List(${className});
-        return getDataTable(list);
-    }
-#elseif($table.tree)
-    public AjaxResult list(${ClassName} ${className})
-    {
-        List<${ClassName}> list = ${className}Service.select${ClassName}List(${className});
-        return success(list);
-    }
-#end
-
-    /**
-     * 瀵煎嚭${functionName}鍒楄〃
-     */
-    @PreAuthorize("@ss.hasPermi('${permissionPrefix}:export')")
-    @Log(title = "${functionName}", businessType = BusinessType.EXPORT)
-    @PostMapping("/export")
-    public void export(HttpServletResponse response, ${ClassName} ${className})
-    {
-        List<${ClassName}> list = ${className}Service.select${ClassName}List(${className});
-        ExcelUtil<${ClassName}> util = new ExcelUtil<${ClassName}>(${ClassName}.class);
-        util.exportExcel(response, list, "${functionName}鏁版嵁");
-    }
-
-    /**
-     * 鑾峰彇${functionName}璇︾粏淇℃伅
-     */
-    @PreAuthorize("@ss.hasPermi('${permissionPrefix}:query')")
-    @GetMapping(value = "/{${pkColumn.javaField}}")
-    public AjaxResult getInfo(@PathVariable("${pkColumn.javaField}") ${pkColumn.javaType} ${pkColumn.javaField})
-    {
-        return success(${className}Service.select${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaField}));
-    }
-
-    /**
-     * 鏂板${functionName}
-     */
-    @PreAuthorize("@ss.hasPermi('${permissionPrefix}:add')")
-    @Log(title = "${functionName}", businessType = BusinessType.INSERT)
-    @PostMapping
-    public AjaxResult add(@RequestBody ${ClassName} ${className})
-    {
-        return toAjax(${className}Service.insert${ClassName}(${className}));
-    }
-
-    /**
-     * 淇敼${functionName}
-     */
-    @PreAuthorize("@ss.hasPermi('${permissionPrefix}:edit')")
-    @Log(title = "${functionName}", businessType = BusinessType.UPDATE)
-    @PutMapping
-    public AjaxResult edit(@RequestBody ${ClassName} ${className})
-    {
-        return toAjax(${className}Service.update${ClassName}(${className}));
-    }
-
-    /**
-     * 鍒犻櫎${functionName}
-     */
-    @PreAuthorize("@ss.hasPermi('${permissionPrefix}:remove')")
-    @Log(title = "${functionName}", businessType = BusinessType.DELETE)
-	@DeleteMapping("/{${pkColumn.javaField}s}")
-    public AjaxResult remove(@PathVariable ${pkColumn.javaType}[] ${pkColumn.javaField}s)
-    {
-        return toAjax(${className}Service.delete${ClassName}By${pkColumn.capJavaField}s(${pkColumn.javaField}s));
-    }
-}
diff --git a/ruoyi-generator/src/main/resources/vm/java/domain.java.vm b/ruoyi-generator/src/main/resources/vm/java/domain.java.vm
deleted file mode 100644
index bd51c17..0000000
--- a/ruoyi-generator/src/main/resources/vm/java/domain.java.vm
+++ /dev/null
@@ -1,105 +0,0 @@
-package ${packageName}.domain;
-
-#foreach ($import in $importList)
-import ${import};
-#end
-import org.apache.commons.lang3.builder.ToStringBuilder;
-import org.apache.commons.lang3.builder.ToStringStyle;
-import com.ruoyi.common.annotation.Excel;
-#if($table.crud || $table.sub)
-import com.ruoyi.common.core.domain.BaseEntity;
-#elseif($table.tree)
-import com.ruoyi.common.core.domain.TreeEntity;
-#end
-
-/**
- * ${functionName}瀵硅薄 ${tableName}
- * 
- * @author ${author}
- * @date ${datetime}
- */
-#if($table.crud || $table.sub)
-#set($Entity="BaseEntity")
-#elseif($table.tree)
-#set($Entity="TreeEntity")
-#end
-public class ${ClassName} extends ${Entity}
-{
-    private static final long serialVersionUID = 1L;
-
-#foreach ($column in $columns)
-#if(!$table.isSuperColumn($column.javaField))
-    /** $column.columnComment */
-#if($column.list)
-#set($parentheseIndex=$column.columnComment.indexOf("锛�"))
-#if($parentheseIndex != -1)
-#set($comment=$column.columnComment.substring(0, $parentheseIndex))
-#else
-#set($comment=$column.columnComment)
-#end
-#if($parentheseIndex != -1)
-    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
-#elseif($column.javaType == 'Date')
-    @JsonFormat(pattern = "yyyy-MM-dd")
-    @Excel(name = "${comment}", width = 30, dateFormat = "yyyy-MM-dd")
-#else
-    @Excel(name = "${comment}")
-#end
-#end
-    private $column.javaType $column.javaField;
-
-#end
-#end
-#if($table.sub)
-    /** $table.subTable.functionName淇℃伅 */
-    private List<${subClassName}> ${subclassName}List;
-
-#end
-#foreach ($column in $columns)
-#if(!$table.isSuperColumn($column.javaField))
-#if($column.javaField.length() > 2 && $column.javaField.substring(1,2).matches("[A-Z]"))
-#set($AttrName=$column.javaField)
-#else
-#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
-#end
-    public void set${AttrName}($column.javaType $column.javaField) 
-    {
-        this.$column.javaField = $column.javaField;
-    }
-
-    public $column.javaType get${AttrName}() 
-    {
-        return $column.javaField;
-    }
-#end
-#end
-
-#if($table.sub)
-    public List<${subClassName}> get${subClassName}List()
-    {
-        return ${subclassName}List;
-    }
-
-    public void set${subClassName}List(List<${subClassName}> ${subclassName}List)
-    {
-        this.${subclassName}List = ${subclassName}List;
-    }
-
-#end
-    @Override
-    public String toString() {
-        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
-#foreach ($column in $columns)
-#if($column.javaField.length() > 2 && $column.javaField.substring(1,2).matches("[A-Z]"))
-#set($AttrName=$column.javaField)
-#else
-#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
-#end
-            .append("${column.javaField}", get${AttrName}())
-#end
-#if($table.sub)
-            .append("${subclassName}List", get${subClassName}List())
-#end
-            .toString();
-    }
-}
diff --git a/ruoyi-generator/src/main/resources/vm/java/mapper.java.vm b/ruoyi-generator/src/main/resources/vm/java/mapper.java.vm
deleted file mode 100644
index 7e7d7c2..0000000
--- a/ruoyi-generator/src/main/resources/vm/java/mapper.java.vm
+++ /dev/null
@@ -1,91 +0,0 @@
-package ${packageName}.mapper;
-
-import java.util.List;
-import ${packageName}.domain.${ClassName};
-#if($table.sub)
-import ${packageName}.domain.${subClassName};
-#end
-
-/**
- * ${functionName}Mapper鎺ュ彛
- * 
- * @author ${author}
- * @date ${datetime}
- */
-public interface ${ClassName}Mapper 
-{
-    /**
-     * 鏌ヨ${functionName}
-     * 
-     * @param ${pkColumn.javaField} ${functionName}涓婚敭
-     * @return ${functionName}
-     */
-    public ${ClassName} select${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField});
-
-    /**
-     * 鏌ヨ${functionName}鍒楄〃
-     * 
-     * @param ${className} ${functionName}
-     * @return ${functionName}闆嗗悎
-     */
-    public List<${ClassName}> select${ClassName}List(${ClassName} ${className});
-
-    /**
-     * 鏂板${functionName}
-     * 
-     * @param ${className} ${functionName}
-     * @return 缁撴灉
-     */
-    public int insert${ClassName}(${ClassName} ${className});
-
-    /**
-     * 淇敼${functionName}
-     * 
-     * @param ${className} ${functionName}
-     * @return 缁撴灉
-     */
-    public int update${ClassName}(${ClassName} ${className});
-
-    /**
-     * 鍒犻櫎${functionName}
-     * 
-     * @param ${pkColumn.javaField} ${functionName}涓婚敭
-     * @return 缁撴灉
-     */
-    public int delete${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField});
-
-    /**
-     * 鎵归噺鍒犻櫎${functionName}
-     * 
-     * @param ${pkColumn.javaField}s 闇�瑕佸垹闄ょ殑鏁版嵁涓婚敭闆嗗悎
-     * @return 缁撴灉
-     */
-    public int delete${ClassName}By${pkColumn.capJavaField}s(${pkColumn.javaType}[] ${pkColumn.javaField}s);
-#if($table.sub)
-
-    /**
-     * 鎵归噺鍒犻櫎${subTable.functionName}
-     * 
-     * @param ${pkColumn.javaField}s 闇�瑕佸垹闄ょ殑鏁版嵁涓婚敭闆嗗悎
-     * @return 缁撴灉
-     */
-    public int delete${subClassName}By${subTableFkClassName}s(${pkColumn.javaType}[] ${pkColumn.javaField}s);
-    
-    /**
-     * 鎵归噺鏂板${subTable.functionName}
-     * 
-     * @param ${subclassName}List ${subTable.functionName}鍒楄〃
-     * @return 缁撴灉
-     */
-    public int batch${subClassName}(List<${subClassName}> ${subclassName}List);
-    
-
-    /**
-     * 閫氳繃${functionName}涓婚敭鍒犻櫎${subTable.functionName}淇℃伅
-     * 
-     * @param ${pkColumn.javaField} ${functionName}ID
-     * @return 缁撴灉
-     */
-    public int delete${subClassName}By${subTableFkClassName}(${pkColumn.javaType} ${pkColumn.javaField});
-#end
-}
diff --git a/ruoyi-generator/src/main/resources/vm/java/service.java.vm b/ruoyi-generator/src/main/resources/vm/java/service.java.vm
deleted file mode 100644
index 264882b..0000000
--- a/ruoyi-generator/src/main/resources/vm/java/service.java.vm
+++ /dev/null
@@ -1,61 +0,0 @@
-package ${packageName}.service;
-
-import java.util.List;
-import ${packageName}.domain.${ClassName};
-
-/**
- * ${functionName}Service鎺ュ彛
- * 
- * @author ${author}
- * @date ${datetime}
- */
-public interface I${ClassName}Service 
-{
-    /**
-     * 鏌ヨ${functionName}
-     * 
-     * @param ${pkColumn.javaField} ${functionName}涓婚敭
-     * @return ${functionName}
-     */
-    public ${ClassName} select${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField});
-
-    /**
-     * 鏌ヨ${functionName}鍒楄〃
-     * 
-     * @param ${className} ${functionName}
-     * @return ${functionName}闆嗗悎
-     */
-    public List<${ClassName}> select${ClassName}List(${ClassName} ${className});
-
-    /**
-     * 鏂板${functionName}
-     * 
-     * @param ${className} ${functionName}
-     * @return 缁撴灉
-     */
-    public int insert${ClassName}(${ClassName} ${className});
-
-    /**
-     * 淇敼${functionName}
-     * 
-     * @param ${className} ${functionName}
-     * @return 缁撴灉
-     */
-    public int update${ClassName}(${ClassName} ${className});
-
-    /**
-     * 鎵归噺鍒犻櫎${functionName}
-     * 
-     * @param ${pkColumn.javaField}s 闇�瑕佸垹闄ょ殑${functionName}涓婚敭闆嗗悎
-     * @return 缁撴灉
-     */
-    public int delete${ClassName}By${pkColumn.capJavaField}s(${pkColumn.javaType}[] ${pkColumn.javaField}s);
-
-    /**
-     * 鍒犻櫎${functionName}淇℃伅
-     * 
-     * @param ${pkColumn.javaField} ${functionName}涓婚敭
-     * @return 缁撴灉
-     */
-    public int delete${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField});
-}
diff --git a/ruoyi-generator/src/main/resources/vm/java/serviceImpl.java.vm b/ruoyi-generator/src/main/resources/vm/java/serviceImpl.java.vm
deleted file mode 100644
index 14746e1..0000000
--- a/ruoyi-generator/src/main/resources/vm/java/serviceImpl.java.vm
+++ /dev/null
@@ -1,169 +0,0 @@
-package ${packageName}.service.impl;
-
-import java.util.List;
-#foreach ($column in $columns)
-#if($column.javaField == 'createTime' || $column.javaField == 'updateTime')
-import com.ruoyi.common.utils.DateUtils;
-#break
-#end
-#end
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-#if($table.sub)
-import java.util.ArrayList;
-import com.ruoyi.common.utils.StringUtils;
-import org.springframework.transaction.annotation.Transactional;
-import ${packageName}.domain.${subClassName};
-#end
-import ${packageName}.mapper.${ClassName}Mapper;
-import ${packageName}.domain.${ClassName};
-import ${packageName}.service.I${ClassName}Service;
-
-/**
- * ${functionName}Service涓氬姟灞傚鐞�
- * 
- * @author ${author}
- * @date ${datetime}
- */
-@Service
-public class ${ClassName}ServiceImpl implements I${ClassName}Service 
-{
-    @Autowired
-    private ${ClassName}Mapper ${className}Mapper;
-
-    /**
-     * 鏌ヨ${functionName}
-     * 
-     * @param ${pkColumn.javaField} ${functionName}涓婚敭
-     * @return ${functionName}
-     */
-    @Override
-    public ${ClassName} select${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField})
-    {
-        return ${className}Mapper.select${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaField});
-    }
-
-    /**
-     * 鏌ヨ${functionName}鍒楄〃
-     * 
-     * @param ${className} ${functionName}
-     * @return ${functionName}
-     */
-    @Override
-    public List<${ClassName}> select${ClassName}List(${ClassName} ${className})
-    {
-        return ${className}Mapper.select${ClassName}List(${className});
-    }
-
-    /**
-     * 鏂板${functionName}
-     * 
-     * @param ${className} ${functionName}
-     * @return 缁撴灉
-     */
-#if($table.sub)
-    @Transactional
-#end
-    @Override
-    public int insert${ClassName}(${ClassName} ${className})
-    {
-#foreach ($column in $columns)
-#if($column.javaField == 'createTime')
-        ${className}.setCreateTime(DateUtils.getNowDate());
-#end
-#end
-#if($table.sub)
-        int rows = ${className}Mapper.insert${ClassName}(${className});
-        insert${subClassName}(${className});
-        return rows;
-#else
-        return ${className}Mapper.insert${ClassName}(${className});
-#end
-    }
-
-    /**
-     * 淇敼${functionName}
-     * 
-     * @param ${className} ${functionName}
-     * @return 缁撴灉
-     */
-#if($table.sub)
-    @Transactional
-#end
-    @Override
-    public int update${ClassName}(${ClassName} ${className})
-    {
-#foreach ($column in $columns)
-#if($column.javaField == 'updateTime')
-        ${className}.setUpdateTime(DateUtils.getNowDate());
-#end
-#end
-#if($table.sub)
-        ${className}Mapper.delete${subClassName}By${subTableFkClassName}(${className}.get${pkColumn.capJavaField}());
-        insert${subClassName}(${className});
-#end
-        return ${className}Mapper.update${ClassName}(${className});
-    }
-
-    /**
-     * 鎵归噺鍒犻櫎${functionName}
-     * 
-     * @param ${pkColumn.javaField}s 闇�瑕佸垹闄ょ殑${functionName}涓婚敭
-     * @return 缁撴灉
-     */
-#if($table.sub)
-    @Transactional
-#end
-    @Override
-    public int delete${ClassName}By${pkColumn.capJavaField}s(${pkColumn.javaType}[] ${pkColumn.javaField}s)
-    {
-#if($table.sub)
-        ${className}Mapper.delete${subClassName}By${subTableFkClassName}s(${pkColumn.javaField}s);
-#end
-        return ${className}Mapper.delete${ClassName}By${pkColumn.capJavaField}s(${pkColumn.javaField}s);
-    }
-
-    /**
-     * 鍒犻櫎${functionName}淇℃伅
-     * 
-     * @param ${pkColumn.javaField} ${functionName}涓婚敭
-     * @return 缁撴灉
-     */
-#if($table.sub)
-    @Transactional
-#end
-    @Override
-    public int delete${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField})
-    {
-#if($table.sub)
-        ${className}Mapper.delete${subClassName}By${subTableFkClassName}(${pkColumn.javaField});
-#end
-        return ${className}Mapper.delete${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaField});
-    }
-#if($table.sub)
-
-    /**
-     * 鏂板${subTable.functionName}淇℃伅
-     * 
-     * @param ${className} ${functionName}瀵硅薄
-     */
-    public void insert${subClassName}(${ClassName} ${className})
-    {
-        List<${subClassName}> ${subclassName}List = ${className}.get${subClassName}List();
-        ${pkColumn.javaType} ${pkColumn.javaField} = ${className}.get${pkColumn.capJavaField}();
-        if (StringUtils.isNotNull(${subclassName}List))
-        {
-            List<${subClassName}> list = new ArrayList<${subClassName}>();
-            for (${subClassName} ${subclassName} : ${subclassName}List)
-            {
-                ${subclassName}.set${subTableFkClassName}(${pkColumn.javaField});
-                list.add(${subclassName});
-            }
-            if (list.size() > 0)
-            {
-                ${className}Mapper.batch${subClassName}(list);
-            }
-        }
-    }
-#end
-}
diff --git a/ruoyi-generator/src/main/resources/vm/java/sub-domain.java.vm b/ruoyi-generator/src/main/resources/vm/java/sub-domain.java.vm
deleted file mode 100644
index a3f53eb..0000000
--- a/ruoyi-generator/src/main/resources/vm/java/sub-domain.java.vm
+++ /dev/null
@@ -1,76 +0,0 @@
-package ${packageName}.domain;
-
-#foreach ($import in $subImportList)
-import ${import};
-#end
-import org.apache.commons.lang3.builder.ToStringBuilder;
-import org.apache.commons.lang3.builder.ToStringStyle;
-import com.ruoyi.common.annotation.Excel;
-import com.ruoyi.common.core.domain.BaseEntity;
-
-/**
- * ${subTable.functionName}瀵硅薄 ${subTableName}
- * 
- * @author ${author}
- * @date ${datetime}
- */
-public class ${subClassName} extends BaseEntity
-{
-    private static final long serialVersionUID = 1L;
-
-#foreach ($column in $subTable.columns)
-#if(!$table.isSuperColumn($column.javaField))
-    /** $column.columnComment */
-#if($column.list)
-#set($parentheseIndex=$column.columnComment.indexOf("锛�"))
-#if($parentheseIndex != -1)
-#set($comment=$column.columnComment.substring(0, $parentheseIndex))
-#else
-#set($comment=$column.columnComment)
-#end
-#if($parentheseIndex != -1)
-    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
-#elseif($column.javaType == 'Date')
-    @JsonFormat(pattern = "yyyy-MM-dd")
-    @Excel(name = "${comment}", width = 30, dateFormat = "yyyy-MM-dd")
-#else
-    @Excel(name = "${comment}")
-#end
-#end
-    private $column.javaType $column.javaField;
-
-#end
-#end
-#foreach ($column in $subTable.columns)
-#if(!$table.isSuperColumn($column.javaField))
-#if($column.javaField.length() > 2 && $column.javaField.substring(1,2).matches("[A-Z]"))
-#set($AttrName=$column.javaField)
-#else
-#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
-#end
-    public void set${AttrName}($column.javaType $column.javaField) 
-    {
-        this.$column.javaField = $column.javaField;
-    }
-
-    public $column.javaType get${AttrName}() 
-    {
-        return $column.javaField;
-    }
-#end
-#end
-
-    @Override
-    public String toString() {
-        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
-#foreach ($column in $subTable.columns)
-#if($column.javaField.length() > 2 && $column.javaField.substring(1,2).matches("[A-Z]"))
-#set($AttrName=$column.javaField)
-#else
-#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
-#end
-            .append("${column.javaField}", get${AttrName}())
-#end
-            .toString();
-    }
-}
diff --git a/ruoyi-generator/src/main/resources/vm/js/api.js.vm b/ruoyi-generator/src/main/resources/vm/js/api.js.vm
deleted file mode 100644
index 9295524..0000000
--- a/ruoyi-generator/src/main/resources/vm/js/api.js.vm
+++ /dev/null
@@ -1,44 +0,0 @@
-import request from '@/utils/request'
-
-// 鏌ヨ${functionName}鍒楄〃
-export function list${BusinessName}(query) {
-  return request({
-    url: '/${moduleName}/${businessName}/list',
-    method: 'get',
-    params: query
-  })
-}
-
-// 鏌ヨ${functionName}璇︾粏
-export function get${BusinessName}(${pkColumn.javaField}) {
-  return request({
-    url: '/${moduleName}/${businessName}/' + ${pkColumn.javaField},
-    method: 'get'
-  })
-}
-
-// 鏂板${functionName}
-export function add${BusinessName}(data) {
-  return request({
-    url: '/${moduleName}/${businessName}',
-    method: 'post',
-    data: data
-  })
-}
-
-// 淇敼${functionName}
-export function update${BusinessName}(data) {
-  return request({
-    url: '/${moduleName}/${businessName}',
-    method: 'put',
-    data: data
-  })
-}
-
-// 鍒犻櫎${functionName}
-export function del${BusinessName}(${pkColumn.javaField}) {
-  return request({
-    url: '/${moduleName}/${businessName}/' + ${pkColumn.javaField},
-    method: 'delete'
-  })
-}
diff --git a/ruoyi-generator/src/main/resources/vm/sql/sql.vm b/ruoyi-generator/src/main/resources/vm/sql/sql.vm
deleted file mode 100644
index 0575583..0000000
--- a/ruoyi-generator/src/main/resources/vm/sql/sql.vm
+++ /dev/null
@@ -1,22 +0,0 @@
--- 鑿滃崟 SQL
-insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
-values('${functionName}', '${parentMenuId}', '1', '${businessName}', '${moduleName}/${businessName}/index', 1, 0, 'C', '0', '0', '${permissionPrefix}:list', '#', 'admin', sysdate(), '', null, '${functionName}鑿滃崟');
-
--- 鎸夐挳鐖惰彍鍗旾D
-SELECT @parentId := LAST_INSERT_ID();
-
--- 鎸夐挳 SQL
-insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
-values('${functionName}鏌ヨ', @parentId, '1',  '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:query',        '#', 'admin', sysdate(), '', null, '');
-
-insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
-values('${functionName}鏂板', @parentId, '2',  '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:add',          '#', 'admin', sysdate(), '', null, '');
-
-insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
-values('${functionName}淇敼', @parentId, '3',  '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:edit',         '#', 'admin', sysdate(), '', null, '');
-
-insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
-values('${functionName}鍒犻櫎', @parentId, '4',  '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:remove',       '#', 'admin', sysdate(), '', null, '');
-
-insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
-values('${functionName}瀵煎嚭', @parentId, '5',  '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:export',       '#', 'admin', sysdate(), '', null, '');
\ No newline at end of file
diff --git a/ruoyi-generator/src/main/resources/vm/vue/index-tree.vue.vm b/ruoyi-generator/src/main/resources/vm/vue/index-tree.vue.vm
deleted file mode 100644
index 4819c2a..0000000
--- a/ruoyi-generator/src/main/resources/vm/vue/index-tree.vue.vm
+++ /dev/null
@@ -1,505 +0,0 @@
-<template>
-  <div class="app-container">
-    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
-#foreach($column in $columns)
-#if($column.query)
-#set($dictType=$column.dictType)
-#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
-#set($parentheseIndex=$column.columnComment.indexOf("锛�"))
-#if($parentheseIndex != -1)
-#set($comment=$column.columnComment.substring(0, $parentheseIndex))
-#else
-#set($comment=$column.columnComment)
-#end
-#if($column.htmlType == "input")
-      <el-form-item label="${comment}" prop="${column.javaField}">
-        <el-input
-          v-model="queryParams.${column.javaField}"
-          placeholder="璇疯緭鍏�${comment}"
-          clearable
-          @keyup.enter.native="handleQuery"
-        />
-      </el-form-item>
-#elseif(($column.htmlType == "select" || $column.htmlType == "radio") && "" != $dictType)
-      <el-form-item label="${comment}" prop="${column.javaField}">
-        <el-select v-model="queryParams.${column.javaField}" placeholder="璇烽�夋嫨${comment}" clearable>
-          <el-option
-            v-for="dict in dict.type.${dictType}"
-            :key="dict.value"
-            :label="dict.label"
-            :value="dict.value"
-          />
-        </el-select>
-      </el-form-item>
-#elseif(($column.htmlType == "select" || $column.htmlType == "radio") && $dictType)
-      <el-form-item label="${comment}" prop="${column.javaField}">
-        <el-select v-model="queryParams.${column.javaField}" placeholder="璇烽�夋嫨${comment}" clearable>
-          <el-option label="璇烽�夋嫨瀛楀吀鐢熸垚" value="" />
-        </el-select>
-      </el-form-item>
-#elseif($column.htmlType == "datetime" && $column.queryType != "BETWEEN")
-      <el-form-item label="${comment}" prop="${column.javaField}">
-        <el-date-picker clearable
-          v-model="queryParams.${column.javaField}"
-          type="date"
-          value-format="yyyy-MM-dd"
-          placeholder="閫夋嫨${comment}">
-        </el-date-picker>
-      </el-form-item>
-#elseif($column.htmlType == "datetime" && $column.queryType == "BETWEEN")
-      <el-form-item label="${comment}">
-        <el-date-picker
-          v-model="daterange${AttrName}"
-          style="width: 240px"
-          value-format="yyyy-MM-dd"
-          type="daterange"
-          range-separator="-"
-          start-placeholder="寮�濮嬫棩鏈�"
-          end-placeholder="缁撴潫鏃ユ湡"
-        ></el-date-picker>
-      </el-form-item>
-#end
-#end
-#end
-      <el-form-item>
-	    <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">鎼滅储</el-button>
-        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">閲嶇疆</el-button>
-      </el-form-item>
-    </el-form>
-
-    <el-row :gutter="10" class="mb8">
-      <el-col :span="1.5">
-        <el-button
-          type="primary"
-          plain
-          icon="el-icon-plus"
-          size="mini"
-          @click="handleAdd"
-          v-hasPermi="['${moduleName}:${businessName}:add']"
-        >鏂板</el-button>
-      </el-col>
-      <el-col :span="1.5">
-        <el-button
-          type="info"
-          plain
-          icon="el-icon-sort"
-          size="mini"
-          @click="toggleExpandAll"
-        >灞曞紑/鎶樺彔</el-button>
-      </el-col>
-      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
-    </el-row>
-
-    <el-table
-      v-if="refreshTable"
-      v-loading="loading"
-      :data="${businessName}List"
-      row-key="${treeCode}"
-      :default-expand-all="isExpandAll"
-      :tree-props="{children: 'children', hasChildren: 'hasChildren'}"
-    >
-#foreach($column in $columns)
-#set($javaField=$column.javaField)
-#set($parentheseIndex=$column.columnComment.indexOf("锛�"))
-#if($parentheseIndex != -1)
-#set($comment=$column.columnComment.substring(0, $parentheseIndex))
-#else
-#set($comment=$column.columnComment)
-#end
-#if($column.pk)
-#elseif($column.list && $column.htmlType == "datetime")
-      <el-table-column label="${comment}" align="center" prop="${javaField}" width="180">
-        <template slot-scope="scope">
-          <span>{{ parseTime(scope.row.${javaField}, '{y}-{m}-{d}') }}</span>
-        </template>
-      </el-table-column>
-#elseif($column.list && $column.htmlType == "imageUpload")
-      <el-table-column label="${comment}" align="center" prop="${javaField}" width="100">
-        <template slot-scope="scope">
-          <image-preview :src="scope.row.${javaField}" :width="50" :height="50"/>
-        </template>
-      </el-table-column>
-#elseif($column.list && "" != $column.dictType)
-      <el-table-column label="${comment}" align="center" prop="${javaField}">
-        <template slot-scope="scope">
-#if($column.htmlType == "checkbox")
-          <dict-tag :options="dict.type.${column.dictType}" :value="scope.row.${javaField} ? scope.row.${javaField}.split(',') : []"/>
-#else
-          <dict-tag :options="dict.type.${column.dictType}" :value="scope.row.${javaField}"/>
-#end
-        </template>
-      </el-table-column>
-#elseif($column.list && "" != $javaField)
-#if(${foreach.index} == 1)
-      <el-table-column label="${comment}" prop="${javaField}" />
-#else
-      <el-table-column label="${comment}" align="center" prop="${javaField}" />
-#end
-#end
-#end
-      <el-table-column label="鎿嶄綔" align="center" class-name="small-padding fixed-width">
-        <template slot-scope="scope">
-          <el-button
-            size="mini"
-            type="text"
-            icon="el-icon-edit"
-            @click="handleUpdate(scope.row)"
-            v-hasPermi="['${moduleName}:${businessName}:edit']"
-          >淇敼</el-button>
-          <el-button
-            size="mini"
-            type="text"
-            icon="el-icon-plus"
-            @click="handleAdd(scope.row)"
-            v-hasPermi="['${moduleName}:${businessName}:add']"
-          >鏂板</el-button>
-          <el-button
-            size="mini"
-            type="text"
-            icon="el-icon-delete"
-            @click="handleDelete(scope.row)"
-            v-hasPermi="['${moduleName}:${businessName}:remove']"
-          >鍒犻櫎</el-button>
-        </template>
-      </el-table-column>
-    </el-table>
-
-    <!-- 娣诲姞鎴栦慨鏀�${functionName}瀵硅瘽妗� -->
-    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
-      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
-#foreach($column in $columns)
-#set($field=$column.javaField)
-#if($column.insert && !$column.pk)
-#if(($column.usableColumn) || (!$column.superColumn))
-#set($parentheseIndex=$column.columnComment.indexOf("锛�"))
-#if($parentheseIndex != -1)
-#set($comment=$column.columnComment.substring(0, $parentheseIndex))
-#else
-#set($comment=$column.columnComment)
-#end
-#set($dictType=$column.dictType)
-#if("" != $treeParentCode && $column.javaField == $treeParentCode)
-        <el-form-item label="${comment}" prop="${treeParentCode}">
-          <treeselect v-model="form.${treeParentCode}" :options="${businessName}Options" :normalizer="normalizer" placeholder="璇烽�夋嫨${comment}" />
-        </el-form-item>
-#elseif($column.htmlType == "input")
-        <el-form-item label="${comment}" prop="${field}">
-          <el-input v-model="form.${field}" placeholder="璇疯緭鍏�${comment}" />
-        </el-form-item>
-#elseif($column.htmlType == "imageUpload")
-        <el-form-item label="${comment}" prop="${field}">
-          <image-upload v-model="form.${field}"/>
-        </el-form-item>
-#elseif($column.htmlType == "fileUpload")
-        <el-form-item label="${comment}" prop="${field}">
-          <file-upload v-model="form.${field}"/>
-        </el-form-item>
-#elseif($column.htmlType == "editor")
-        <el-form-item label="${comment}">
-          <editor v-model="form.${field}" :min-height="192"/>
-        </el-form-item>
-#elseif($column.htmlType == "select" && "" != $dictType)
-        <el-form-item label="${comment}" prop="${field}">
-          <el-select v-model="form.${field}" placeholder="璇烽�夋嫨${comment}">
-            <el-option
-              v-for="dict in dict.type.${dictType}"
-              :key="dict.value"
-              :label="dict.label"
-#if($column.javaType == "Integer" || $column.javaType == "Long")
-              :value="parseInt(dict.value)"
-#else
-              :value="dict.value"
-#end
-            ></el-option>
-          </el-select>
-        </el-form-item>
-#elseif($column.htmlType == "select" && $dictType)
-        <el-form-item label="${comment}" prop="${field}">
-          <el-select v-model="form.${field}" placeholder="璇烽�夋嫨${comment}">
-            <el-option label="璇烽�夋嫨瀛楀吀鐢熸垚" value="" />
-          </el-select>
-        </el-form-item>
-#elseif($column.htmlType == "checkbox" && "" != $dictType)
-        <el-form-item label="${comment}" prop="${field}">
-          <el-checkbox-group v-model="form.${field}">
-            <el-checkbox
-              v-for="dict in dict.type.${dictType}"
-              :key="dict.value"
-              :label="dict.value">
-              {{dict.label}}
-            </el-checkbox>
-          </el-checkbox-group>
-        </el-form-item>
-#elseif($column.htmlType == "checkbox" && $dictType)
-        <el-form-item label="${comment}" prop="${field}">
-          <el-checkbox-group v-model="form.${field}">
-            <el-checkbox>璇烽�夋嫨瀛楀吀鐢熸垚</el-checkbox>
-          </el-checkbox-group>
-        </el-form-item>
-#elseif($column.htmlType == "radio" && "" != $dictType)
-        <el-form-item label="${comment}" prop="${field}">
-          <el-radio-group v-model="form.${field}">
-            <el-radio
-              v-for="dict in dict.type.${dictType}"
-              :key="dict.value"
-#if($column.javaType == "Integer" || $column.javaType == "Long")
-              :label="parseInt(dict.value)"
-#else
-              :label="dict.value"
-#end
-            >{{dict.label}}</el-radio>
-          </el-radio-group>
-        </el-form-item>
-#elseif($column.htmlType == "radio" && $dictType)
-        <el-form-item label="${comment}" prop="${field}">
-          <el-radio-group v-model="form.${field}">
-            <el-radio label="1">璇烽�夋嫨瀛楀吀鐢熸垚</el-radio>
-          </el-radio-group>
-        </el-form-item>
-#elseif($column.htmlType == "datetime")
-        <el-form-item label="${comment}" prop="${field}">
-          <el-date-picker clearable
-            v-model="form.${field}"
-            type="date"
-            value-format="yyyy-MM-dd"
-            placeholder="閫夋嫨${comment}">
-          </el-date-picker>
-        </el-form-item>
-#elseif($column.htmlType == "textarea")
-        <el-form-item label="${comment}" prop="${field}">
-          <el-input v-model="form.${field}" type="textarea" placeholder="璇疯緭鍏ュ唴瀹�" />
-        </el-form-item>
-#end
-#end
-#end
-#end
-      </el-form>
-      <div slot="footer" class="dialog-footer">
-        <el-button type="primary" @click="submitForm">纭� 瀹�</el-button>
-        <el-button @click="cancel">鍙� 娑�</el-button>
-      </div>
-    </el-dialog>
-  </div>
-</template>
-
-<script>
-import { list${BusinessName}, get${BusinessName}, del${BusinessName}, add${BusinessName}, update${BusinessName} } from "@/api/${moduleName}/${businessName}";
-import Treeselect from "@riophae/vue-treeselect";
-import "@riophae/vue-treeselect/dist/vue-treeselect.css";
-
-export default {
-  name: "${BusinessName}",
-#if(${dicts} != '')
-  dicts: [${dicts}],
-#end
-  components: {
-    Treeselect
-  },
-  data() {
-    return {
-      // 閬僵灞�
-      loading: true,
-      // 鏄剧ず鎼滅储鏉′欢
-      showSearch: true,
-      // ${functionName}琛ㄦ牸鏁版嵁
-      ${businessName}List: [],
-      // ${functionName}鏍戦�夐」
-      ${businessName}Options: [],
-      // 寮瑰嚭灞傛爣棰�
-      title: "",
-      // 鏄惁鏄剧ず寮瑰嚭灞�
-      open: false,
-      // 鏄惁灞曞紑锛岄粯璁ゅ叏閮ㄥ睍寮�
-      isExpandAll: true,
-      // 閲嶆柊娓叉煋琛ㄦ牸鐘舵��
-      refreshTable: true,
-#foreach ($column in $columns)
-#if($column.htmlType == "datetime" && $column.queryType == "BETWEEN")
-#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
-      // $comment鏃堕棿鑼冨洿
-      daterange${AttrName}: [],
-#end
-#end
-      // 鏌ヨ鍙傛暟
-      queryParams: {
-#foreach ($column in $columns)
-#if($column.query)
-        $column.javaField: null#if($foreach.count != $columns.size()),#end
-#end
-#end
-      },
-      // 琛ㄥ崟鍙傛暟
-      form: {},
-      // 琛ㄥ崟鏍¢獙
-      rules: {
-#foreach ($column in $columns)
-#if($column.required)
-#set($parentheseIndex=$column.columnComment.indexOf("锛�"))
-#if($parentheseIndex != -1)
-#set($comment=$column.columnComment.substring(0, $parentheseIndex))
-#else
-#set($comment=$column.columnComment)
-#end
-        $column.javaField: [
-          { required: true, message: "$comment涓嶈兘涓虹┖", trigger: #if($column.htmlType == "select" || $column.htmlType == "radio")"change"#else"blur"#end }
-        ]#if($foreach.count != $columns.size()),#end
-#end
-#end
-      }
-    };
-  },
-  created() {
-    this.getList();
-  },
-  methods: {
-    /** 鏌ヨ${functionName}鍒楄〃 */
-    getList() {
-      this.loading = true;
-#foreach ($column in $columns)
-#if($column.htmlType == "datetime" && $column.queryType == "BETWEEN")
-      this.queryParams.params = {};
-#break
-#end
-#end
-#foreach ($column in $columns)
-#if($column.htmlType == "datetime" && $column.queryType == "BETWEEN")
-#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
-      if (null != this.daterange${AttrName} && '' != this.daterange${AttrName}) {
-        this.queryParams.params["begin${AttrName}"] = this.daterange${AttrName}[0];
-        this.queryParams.params["end${AttrName}"] = this.daterange${AttrName}[1];
-      }
-#end
-#end
-      list${BusinessName}(this.queryParams).then(response => {
-        this.${businessName}List = this.handleTree(response.data, "${treeCode}", "${treeParentCode}");
-        this.loading = false;
-      });
-    },
-    /** 杞崲${functionName}鏁版嵁缁撴瀯 */
-    normalizer(node) {
-      if (node.children && !node.children.length) {
-        delete node.children;
-      }
-      return {
-        id: node.${treeCode},
-        label: node.${treeName},
-        children: node.children
-      };
-    },
-	/** 鏌ヨ${functionName}涓嬫媺鏍戠粨鏋� */
-    getTreeselect() {
-      list${BusinessName}().then(response => {
-        this.${businessName}Options = [];
-        const data = { ${treeCode}: 0, ${treeName}: '椤剁骇鑺傜偣', children: [] };
-        data.children = this.handleTree(response.data, "${treeCode}", "${treeParentCode}");
-        this.${businessName}Options.push(data);
-      });
-    },
-    // 鍙栨秷鎸夐挳
-    cancel() {
-      this.open = false;
-      this.reset();
-    },
-    // 琛ㄥ崟閲嶇疆
-    reset() {
-      this.form = {
-#foreach ($column in $columns)
-#if($column.htmlType == "checkbox")
-        $column.javaField: []#if($foreach.count != $columns.size()),#end
-#else
-        $column.javaField: null#if($foreach.count != $columns.size()),#end
-#end
-#end
-      };
-      this.resetForm("form");
-    },
-    /** 鎼滅储鎸夐挳鎿嶄綔 */
-    handleQuery() {
-      this.getList();
-    },
-    /** 閲嶇疆鎸夐挳鎿嶄綔 */
-    resetQuery() {
-#foreach ($column in $columns)
-#if($column.htmlType == "datetime" && $column.queryType == "BETWEEN")
-#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
-      this.daterange${AttrName} = [];
-#end
-#end
-      this.resetForm("queryForm");
-      this.handleQuery();
-    },
-    /** 鏂板鎸夐挳鎿嶄綔 */
-    handleAdd(row) {
-      this.reset();
-      this.getTreeselect();
-      if (row != null && row.${treeCode}) {
-        this.form.${treeParentCode} = row.${treeCode};
-      } else {
-        this.form.${treeParentCode} = 0;
-      }
-      this.open = true;
-      this.title = "娣诲姞${functionName}";
-    },
-    /** 灞曞紑/鎶樺彔鎿嶄綔 */
-    toggleExpandAll() {
-      this.refreshTable = false;
-      this.isExpandAll = !this.isExpandAll;
-      this.$nextTick(() => {
-        this.refreshTable = true;
-      });
-    },
-    /** 淇敼鎸夐挳鎿嶄綔 */
-    handleUpdate(row) {
-      this.reset();
-      this.getTreeselect();
-      if (row != null) {
-        this.form.${treeParentCode} = row.${treeParentCode};
-      }
-      get${BusinessName}(row.${pkColumn.javaField}).then(response => {
-        this.form = response.data;
-#foreach ($column in $columns)
-#if($column.htmlType == "checkbox")
-        this.form.$column.javaField = this.form.${column.javaField}.split(",");
-#end
-#end
-        this.open = true;
-        this.title = "淇敼${functionName}";
-      });
-    },
-    /** 鎻愪氦鎸夐挳 */
-    submitForm() {
-      this.#[[$]]#refs["form"].validate(valid => {
-        if (valid) {
-#foreach ($column in $columns)
-#if($column.htmlType == "checkbox")
-          this.form.$column.javaField = this.form.${column.javaField}.join(",");
-#end
-#end
-          if (this.form.${pkColumn.javaField} != null) {
-            update${BusinessName}(this.form).then(response => {
-              this.#[[$modal]]#.msgSuccess("淇敼鎴愬姛");
-              this.open = false;
-              this.getList();
-            });
-          } else {
-            add${BusinessName}(this.form).then(response => {
-              this.#[[$modal]]#.msgSuccess("鏂板鎴愬姛");
-              this.open = false;
-              this.getList();
-            });
-          }
-        }
-      });
-    },
-    /** 鍒犻櫎鎸夐挳鎿嶄綔 */
-    handleDelete(row) {
-      this.#[[$modal]]#.confirm('鏄惁纭鍒犻櫎${functionName}缂栧彿涓�"' + row.${pkColumn.javaField} + '"鐨勬暟鎹」锛�').then(function() {
-        return del${BusinessName}(row.${pkColumn.javaField});
-      }).then(() => {
-        this.getList();
-        this.#[[$modal]]#.msgSuccess("鍒犻櫎鎴愬姛");
-      }).catch(() => {});
-    }
-  }
-};
-</script>
diff --git a/ruoyi-generator/src/main/resources/vm/vue/index.vue.vm b/ruoyi-generator/src/main/resources/vm/vue/index.vue.vm
deleted file mode 100644
index 6296014..0000000
--- a/ruoyi-generator/src/main/resources/vm/vue/index.vue.vm
+++ /dev/null
@@ -1,602 +0,0 @@
-<template>
-  <div class="app-container">
-    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
-#foreach($column in $columns)
-#if($column.query)
-#set($dictType=$column.dictType)
-#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
-#set($parentheseIndex=$column.columnComment.indexOf("锛�"))
-#if($parentheseIndex != -1)
-#set($comment=$column.columnComment.substring(0, $parentheseIndex))
-#else
-#set($comment=$column.columnComment)
-#end
-#if($column.htmlType == "input")
-      <el-form-item label="${comment}" prop="${column.javaField}">
-        <el-input
-          v-model="queryParams.${column.javaField}"
-          placeholder="璇疯緭鍏�${comment}"
-          clearable
-          @keyup.enter.native="handleQuery"
-        />
-      </el-form-item>
-#elseif(($column.htmlType == "select" || $column.htmlType == "radio") && "" != $dictType)
-      <el-form-item label="${comment}" prop="${column.javaField}">
-        <el-select v-model="queryParams.${column.javaField}" placeholder="璇烽�夋嫨${comment}" clearable>
-          <el-option
-            v-for="dict in dict.type.${dictType}"
-            :key="dict.value"
-            :label="dict.label"
-            :value="dict.value"
-          />
-        </el-select>
-      </el-form-item>
-#elseif(($column.htmlType == "select" || $column.htmlType == "radio") && $dictType)
-      <el-form-item label="${comment}" prop="${column.javaField}">
-        <el-select v-model="queryParams.${column.javaField}" placeholder="璇烽�夋嫨${comment}" clearable>
-          <el-option label="璇烽�夋嫨瀛楀吀鐢熸垚" value="" />
-        </el-select>
-      </el-form-item>
-#elseif($column.htmlType == "datetime" && $column.queryType != "BETWEEN")
-      <el-form-item label="${comment}" prop="${column.javaField}">
-        <el-date-picker clearable
-          v-model="queryParams.${column.javaField}"
-          type="date"
-          value-format="yyyy-MM-dd"
-          placeholder="璇烽�夋嫨${comment}">
-        </el-date-picker>
-      </el-form-item>
-#elseif($column.htmlType == "datetime" && $column.queryType == "BETWEEN")
-      <el-form-item label="${comment}">
-        <el-date-picker
-          v-model="daterange${AttrName}"
-          style="width: 240px"
-          value-format="yyyy-MM-dd"
-          type="daterange"
-          range-separator="-"
-          start-placeholder="寮�濮嬫棩鏈�"
-          end-placeholder="缁撴潫鏃ユ湡"
-        ></el-date-picker>
-      </el-form-item>
-#end
-#end
-#end
-      <el-form-item>
-        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">鎼滅储</el-button>
-        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">閲嶇疆</el-button>
-      </el-form-item>
-    </el-form>
-
-    <el-row :gutter="10" class="mb8">
-      <el-col :span="1.5">
-        <el-button
-          type="primary"
-          plain
-          icon="el-icon-plus"
-          size="mini"
-          @click="handleAdd"
-          v-hasPermi="['${moduleName}:${businessName}:add']"
-        >鏂板</el-button>
-      </el-col>
-      <el-col :span="1.5">
-        <el-button
-          type="success"
-          plain
-          icon="el-icon-edit"
-          size="mini"
-          :disabled="single"
-          @click="handleUpdate"
-          v-hasPermi="['${moduleName}:${businessName}:edit']"
-        >淇敼</el-button>
-      </el-col>
-      <el-col :span="1.5">
-        <el-button
-          type="danger"
-          plain
-          icon="el-icon-delete"
-          size="mini"
-          :disabled="multiple"
-          @click="handleDelete"
-          v-hasPermi="['${moduleName}:${businessName}:remove']"
-        >鍒犻櫎</el-button>
-      </el-col>
-      <el-col :span="1.5">
-        <el-button
-          type="warning"
-          plain
-          icon="el-icon-download"
-          size="mini"
-          @click="handleExport"
-          v-hasPermi="['${moduleName}:${businessName}:export']"
-        >瀵煎嚭</el-button>
-      </el-col>
-      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
-    </el-row>
-
-    <el-table v-loading="loading" :data="${businessName}List" @selection-change="handleSelectionChange">
-      <el-table-column type="selection" width="55" align="center" />
-#foreach($column in $columns)
-#set($javaField=$column.javaField)
-#set($parentheseIndex=$column.columnComment.indexOf("锛�"))
-#if($parentheseIndex != -1)
-#set($comment=$column.columnComment.substring(0, $parentheseIndex))
-#else
-#set($comment=$column.columnComment)
-#end
-#if($column.pk)
-      <el-table-column label="${comment}" align="center" prop="${javaField}" />
-#elseif($column.list && $column.htmlType == "datetime")
-      <el-table-column label="${comment}" align="center" prop="${javaField}" width="180">
-        <template slot-scope="scope">
-          <span>{{ parseTime(scope.row.${javaField}, '{y}-{m}-{d}') }}</span>
-        </template>
-      </el-table-column>
-#elseif($column.list && $column.htmlType == "imageUpload")
-      <el-table-column label="${comment}" align="center" prop="${javaField}" width="100">
-        <template slot-scope="scope">
-          <image-preview :src="scope.row.${javaField}" :width="50" :height="50"/>
-        </template>
-      </el-table-column>
-#elseif($column.list && "" != $column.dictType)
-      <el-table-column label="${comment}" align="center" prop="${javaField}">
-        <template slot-scope="scope">
-#if($column.htmlType == "checkbox")
-          <dict-tag :options="dict.type.${column.dictType}" :value="scope.row.${javaField} ? scope.row.${javaField}.split(',') : []"/>
-#else
-          <dict-tag :options="dict.type.${column.dictType}" :value="scope.row.${javaField}"/>
-#end
-        </template>
-      </el-table-column>
-#elseif($column.list && "" != $javaField)
-      <el-table-column label="${comment}" align="center" prop="${javaField}" />
-#end
-#end
-      <el-table-column label="鎿嶄綔" align="center" class-name="small-padding fixed-width">
-        <template slot-scope="scope">
-          <el-button
-            size="mini"
-            type="text"
-            icon="el-icon-edit"
-            @click="handleUpdate(scope.row)"
-            v-hasPermi="['${moduleName}:${businessName}:edit']"
-          >淇敼</el-button>
-          <el-button
-            size="mini"
-            type="text"
-            icon="el-icon-delete"
-            @click="handleDelete(scope.row)"
-            v-hasPermi="['${moduleName}:${businessName}:remove']"
-          >鍒犻櫎</el-button>
-        </template>
-      </el-table-column>
-    </el-table>
-    
-    <pagination
-      v-show="total>0"
-      :total="total"
-      :page.sync="queryParams.pageNum"
-      :limit.sync="queryParams.pageSize"
-      @pagination="getList"
-    />
-
-    <!-- 娣诲姞鎴栦慨鏀�${functionName}瀵硅瘽妗� -->
-    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
-      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
-#foreach($column in $columns)
-#set($field=$column.javaField)
-#if($column.insert && !$column.pk)
-#if(($column.usableColumn) || (!$column.superColumn))
-#set($parentheseIndex=$column.columnComment.indexOf("锛�"))
-#if($parentheseIndex != -1)
-#set($comment=$column.columnComment.substring(0, $parentheseIndex))
-#else
-#set($comment=$column.columnComment)
-#end
-#set($dictType=$column.dictType)
-#if($column.htmlType == "input")
-        <el-form-item label="${comment}" prop="${field}">
-          <el-input v-model="form.${field}" placeholder="璇疯緭鍏�${comment}" />
-        </el-form-item>
-#elseif($column.htmlType == "imageUpload")
-        <el-form-item label="${comment}" prop="${field}">
-          <image-upload v-model="form.${field}"/>
-        </el-form-item>
-#elseif($column.htmlType == "fileUpload")
-        <el-form-item label="${comment}" prop="${field}">
-          <file-upload v-model="form.${field}"/>
-        </el-form-item>
-#elseif($column.htmlType == "editor")
-        <el-form-item label="${comment}">
-          <editor v-model="form.${field}" :min-height="192"/>
-        </el-form-item>
-#elseif($column.htmlType == "select" && "" != $dictType)
-        <el-form-item label="${comment}" prop="${field}">
-          <el-select v-model="form.${field}" placeholder="璇烽�夋嫨${comment}">
-            <el-option
-              v-for="dict in dict.type.${dictType}"
-              :key="dict.value"
-              :label="dict.label"
-#if($column.javaType == "Integer" || $column.javaType == "Long")
-              :value="parseInt(dict.value)"
-#else
-              :value="dict.value"
-#end
-            ></el-option>
-          </el-select>
-        </el-form-item>
-#elseif($column.htmlType == "select" && $dictType)
-        <el-form-item label="${comment}" prop="${field}">
-          <el-select v-model="form.${field}" placeholder="璇烽�夋嫨${comment}">
-            <el-option label="璇烽�夋嫨瀛楀吀鐢熸垚" value="" />
-          </el-select>
-        </el-form-item>
-#elseif($column.htmlType == "checkbox" && "" != $dictType)
-        <el-form-item label="${comment}" prop="${field}">
-          <el-checkbox-group v-model="form.${field}">
-            <el-checkbox
-              v-for="dict in dict.type.${dictType}"
-              :key="dict.value"
-              :label="dict.value">
-              {{dict.label}}
-            </el-checkbox>
-          </el-checkbox-group>
-        </el-form-item>
-#elseif($column.htmlType == "checkbox" && $dictType)
-        <el-form-item label="${comment}" prop="${field}">
-          <el-checkbox-group v-model="form.${field}">
-            <el-checkbox>璇烽�夋嫨瀛楀吀鐢熸垚</el-checkbox>
-          </el-checkbox-group>
-        </el-form-item>
-#elseif($column.htmlType == "radio" && "" != $dictType)
-        <el-form-item label="${comment}" prop="${field}">
-          <el-radio-group v-model="form.${field}">
-            <el-radio
-              v-for="dict in dict.type.${dictType}"
-              :key="dict.value"
-#if($column.javaType == "Integer" || $column.javaType == "Long")
-              :label="parseInt(dict.value)"
-#else
-              :label="dict.value"
-#end
-            >{{dict.label}}</el-radio>
-          </el-radio-group>
-        </el-form-item>
-#elseif($column.htmlType == "radio" && $dictType)
-        <el-form-item label="${comment}" prop="${field}">
-          <el-radio-group v-model="form.${field}">
-            <el-radio label="1">璇烽�夋嫨瀛楀吀鐢熸垚</el-radio>
-          </el-radio-group>
-        </el-form-item>
-#elseif($column.htmlType == "datetime")
-        <el-form-item label="${comment}" prop="${field}">
-          <el-date-picker clearable
-            v-model="form.${field}"
-            type="date"
-            value-format="yyyy-MM-dd"
-            placeholder="璇烽�夋嫨${comment}">
-          </el-date-picker>
-        </el-form-item>
-#elseif($column.htmlType == "textarea")
-        <el-form-item label="${comment}" prop="${field}">
-          <el-input v-model="form.${field}" type="textarea" placeholder="璇疯緭鍏ュ唴瀹�" />
-        </el-form-item>
-#end
-#end
-#end
-#end
-#if($table.sub)
-        <el-divider content-position="center">${subTable.functionName}淇℃伅</el-divider>
-        <el-row :gutter="10" class="mb8">
-          <el-col :span="1.5">
-            <el-button type="primary" icon="el-icon-plus" size="mini" @click="handleAdd${subClassName}">娣诲姞</el-button>
-          </el-col>
-          <el-col :span="1.5">
-            <el-button type="danger" icon="el-icon-delete" size="mini" @click="handleDelete${subClassName}">鍒犻櫎</el-button>
-          </el-col>
-        </el-row>
-        <el-table :data="${subclassName}List" :row-class-name="row${subClassName}Index" @selection-change="handle${subClassName}SelectionChange" ref="${subclassName}">
-          <el-table-column type="selection" width="50" align="center" />
-          <el-table-column label="搴忓彿" align="center" prop="index" width="50"/>
-#foreach($column in $subTable.columns)
-#set($javaField=$column.javaField)
-#set($parentheseIndex=$column.columnComment.indexOf("锛�"))
-#if($parentheseIndex != -1)
-#set($comment=$column.columnComment.substring(0, $parentheseIndex))
-#else
-#set($comment=$column.columnComment)
-#end
-#if($column.pk || $javaField == ${subTableFkclassName})
-#elseif($column.list && $column.htmlType == "input")
-          <el-table-column label="$comment" prop="${javaField}" width="150">
-            <template slot-scope="scope">
-              <el-input v-model="scope.row.$javaField" placeholder="璇疯緭鍏�$comment" />
-            </template>
-          </el-table-column>
-#elseif($column.list && $column.htmlType == "datetime")
-          <el-table-column label="$comment" prop="${javaField}" width="240">
-            <template slot-scope="scope">
-              <el-date-picker clearable v-model="scope.row.$javaField" type="date" value-format="yyyy-MM-dd" placeholder="璇烽�夋嫨$comment" />
-            </template>
-          </el-table-column>
-#elseif($column.list && ($column.htmlType == "select" || $column.htmlType == "radio") && "" != $column.dictType)
-          <el-table-column label="$comment" prop="${javaField}" width="150">
-            <template slot-scope="scope">
-              <el-select v-model="scope.row.$javaField" placeholder="璇烽�夋嫨$comment">
-                <el-option
-                  v-for="dict in dict.type.$column.dictType"
-                  :key="dict.value"
-                  :label="dict.label"
-                  :value="dict.value"
-                ></el-option>
-              </el-select>
-            </template>
-          </el-table-column>
-#elseif($column.list && ($column.htmlType == "select" || $column.htmlType == "radio") && "" == $column.dictType)
-          <el-table-column label="$comment" prop="${javaField}" width="150">
-            <template slot-scope="scope">
-              <el-select v-model="scope.row.$javaField" placeholder="璇烽�夋嫨$comment">
-                <el-option label="璇烽�夋嫨瀛楀吀鐢熸垚" value="" />
-              </el-select>
-            </template>
-          </el-table-column>
-#end
-#end
-        </el-table>
-#end
-      </el-form>
-      <div slot="footer" class="dialog-footer">
-        <el-button type="primary" @click="submitForm">纭� 瀹�</el-button>
-        <el-button @click="cancel">鍙� 娑�</el-button>
-      </div>
-    </el-dialog>
-  </div>
-</template>
-
-<script>
-import { list${BusinessName}, get${BusinessName}, del${BusinessName}, add${BusinessName}, update${BusinessName} } from "@/api/${moduleName}/${businessName}";
-
-export default {
-  name: "${BusinessName}",
-#if(${dicts} != '')
-  dicts: [${dicts}],
-#end
-  data() {
-    return {
-      // 閬僵灞�
-      loading: true,
-      // 閫変腑鏁扮粍
-      ids: [],
-#if($table.sub)
-      // 瀛愯〃閫変腑鏁版嵁
-      checked${subClassName}: [],
-#end
-      // 闈炲崟涓鐢�
-      single: true,
-      // 闈炲涓鐢�
-      multiple: true,
-      // 鏄剧ず鎼滅储鏉′欢
-      showSearch: true,
-      // 鎬绘潯鏁�
-      total: 0,
-      // ${functionName}琛ㄦ牸鏁版嵁
-      ${businessName}List: [],
-#if($table.sub)
-      // ${subTable.functionName}琛ㄦ牸鏁版嵁
-      ${subclassName}List: [],
-#end
-      // 寮瑰嚭灞傛爣棰�
-      title: "",
-      // 鏄惁鏄剧ず寮瑰嚭灞�
-      open: false,
-#foreach ($column in $columns)
-#if($column.htmlType == "datetime" && $column.queryType == "BETWEEN")
-#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
-      // $comment鏃堕棿鑼冨洿
-      daterange${AttrName}: [],
-#end
-#end
-      // 鏌ヨ鍙傛暟
-      queryParams: {
-        pageNum: 1,
-        pageSize: 10,
-#foreach ($column in $columns)
-#if($column.query)
-        $column.javaField: null#if($foreach.count != $columns.size()),#end
-#end
-#end
-      },
-      // 琛ㄥ崟鍙傛暟
-      form: {},
-      // 琛ㄥ崟鏍¢獙
-      rules: {
-#foreach ($column in $columns)
-#if($column.required)
-#set($parentheseIndex=$column.columnComment.indexOf("锛�"))
-#if($parentheseIndex != -1)
-#set($comment=$column.columnComment.substring(0, $parentheseIndex))
-#else
-#set($comment=$column.columnComment)
-#end
-        $column.javaField: [
-          { required: true, message: "$comment涓嶈兘涓虹┖", trigger: #if($column.htmlType == "select" || $column.htmlType == "radio")"change"#else"blur"#end }
-        ]#if($foreach.count != $columns.size()),#end
-#end
-#end
-      }
-    };
-  },
-  created() {
-    this.getList();
-  },
-  methods: {
-    /** 鏌ヨ${functionName}鍒楄〃 */
-    getList() {
-      this.loading = true;
-#foreach ($column in $columns)
-#if($column.htmlType == "datetime" && $column.queryType == "BETWEEN")
-      this.queryParams.params = {};
-#break
-#end
-#end
-#foreach ($column in $columns)
-#if($column.htmlType == "datetime" && $column.queryType == "BETWEEN")
-#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
-      if (null != this.daterange${AttrName} && '' != this.daterange${AttrName}) {
-        this.queryParams.params["begin${AttrName}"] = this.daterange${AttrName}[0];
-        this.queryParams.params["end${AttrName}"] = this.daterange${AttrName}[1];
-      }
-#end
-#end
-      list${BusinessName}(this.queryParams).then(response => {
-        this.${businessName}List = response.rows;
-        this.total = response.total;
-        this.loading = false;
-      });
-    },
-    // 鍙栨秷鎸夐挳
-    cancel() {
-      this.open = false;
-      this.reset();
-    },
-    // 琛ㄥ崟閲嶇疆
-    reset() {
-      this.form = {
-#foreach ($column in $columns)
-#if($column.htmlType == "checkbox")
-        $column.javaField: []#if($foreach.count != $columns.size()),#end
-#else
-        $column.javaField: null#if($foreach.count != $columns.size()),#end
-#end
-#end
-      };
-#if($table.sub)
-      this.${subclassName}List = [];
-#end
-      this.resetForm("form");
-    },
-    /** 鎼滅储鎸夐挳鎿嶄綔 */
-    handleQuery() {
-      this.queryParams.pageNum = 1;
-      this.getList();
-    },
-    /** 閲嶇疆鎸夐挳鎿嶄綔 */
-    resetQuery() {
-#foreach ($column in $columns)
-#if($column.htmlType == "datetime" && $column.queryType == "BETWEEN")
-#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
-      this.daterange${AttrName} = [];
-#end
-#end
-      this.resetForm("queryForm");
-      this.handleQuery();
-    },
-    // 澶氶�夋閫変腑鏁版嵁
-    handleSelectionChange(selection) {
-      this.ids = selection.map(item => item.${pkColumn.javaField})
-      this.single = selection.length!==1
-      this.multiple = !selection.length
-    },
-    /** 鏂板鎸夐挳鎿嶄綔 */
-    handleAdd() {
-      this.reset();
-      this.open = true;
-      this.title = "娣诲姞${functionName}";
-    },
-    /** 淇敼鎸夐挳鎿嶄綔 */
-    handleUpdate(row) {
-      this.reset();
-      const ${pkColumn.javaField} = row.${pkColumn.javaField} || this.ids
-      get${BusinessName}(${pkColumn.javaField}).then(response => {
-        this.form = response.data;
-#foreach ($column in $columns)
-#if($column.htmlType == "checkbox")
-        this.form.$column.javaField = this.form.${column.javaField}.split(",");
-#end
-#end
-#if($table.sub)
-        this.${subclassName}List = response.data.${subclassName}List;
-#end
-        this.open = true;
-        this.title = "淇敼${functionName}";
-      });
-    },
-    /** 鎻愪氦鎸夐挳 */
-    submitForm() {
-      this.#[[$]]#refs["form"].validate(valid => {
-        if (valid) {
-#foreach ($column in $columns)
-#if($column.htmlType == "checkbox")
-          this.form.$column.javaField = this.form.${column.javaField}.join(",");
-#end
-#end
-#if($table.sub)
-          this.form.${subclassName}List = this.${subclassName}List;
-#end
-          if (this.form.${pkColumn.javaField} != null) {
-            update${BusinessName}(this.form).then(response => {
-              this.#[[$modal]]#.msgSuccess("淇敼鎴愬姛");
-              this.open = false;
-              this.getList();
-            });
-          } else {
-            add${BusinessName}(this.form).then(response => {
-              this.#[[$modal]]#.msgSuccess("鏂板鎴愬姛");
-              this.open = false;
-              this.getList();
-            });
-          }
-        }
-      });
-    },
-    /** 鍒犻櫎鎸夐挳鎿嶄綔 */
-    handleDelete(row) {
-      const ${pkColumn.javaField}s = row.${pkColumn.javaField} || this.ids;
-      this.#[[$modal]]#.confirm('鏄惁纭鍒犻櫎${functionName}缂栧彿涓�"' + ${pkColumn.javaField}s + '"鐨勬暟鎹」锛�').then(function() {
-        return del${BusinessName}(${pkColumn.javaField}s);
-      }).then(() => {
-        this.getList();
-        this.#[[$modal]]#.msgSuccess("鍒犻櫎鎴愬姛");
-      }).catch(() => {});
-    },
-#if($table.sub)
-	/** ${subTable.functionName}搴忓彿 */
-    row${subClassName}Index({ row, rowIndex }) {
-      row.index = rowIndex + 1;
-    },
-    /** ${subTable.functionName}娣诲姞鎸夐挳鎿嶄綔 */
-    handleAdd${subClassName}() {
-      let obj = {};
-#foreach($column in $subTable.columns)
-#if($column.pk || $column.javaField == ${subTableFkclassName})
-#elseif($column.list && "" != $javaField)
-      obj.$column.javaField = "";
-#end
-#end
-      this.${subclassName}List.push(obj);
-    },
-    /** ${subTable.functionName}鍒犻櫎鎸夐挳鎿嶄綔 */
-    handleDelete${subClassName}() {
-      if (this.checked${subClassName}.length == 0) {
-        this.#[[$modal]]#.msgError("璇峰厛閫夋嫨瑕佸垹闄ょ殑${subTable.functionName}鏁版嵁");
-      } else {
-        const ${subclassName}List = this.${subclassName}List;
-        const checked${subClassName} = this.checked${subClassName};
-        this.${subclassName}List = ${subclassName}List.filter(function(item) {
-          return checked${subClassName}.indexOf(item.index) == -1
-        });
-      }
-    },
-    /** 澶嶉�夋閫変腑鏁版嵁 */
-    handle${subClassName}SelectionChange(selection) {
-      this.checked${subClassName} = selection.map(item => item.index)
-    },
-#end
-    /** 瀵煎嚭鎸夐挳鎿嶄綔 */
-    handleExport() {
-      this.download('${moduleName}/${businessName}/export', {
-        ...this.queryParams
-      }, `${businessName}_#[[${new Date().getTime()}]]#.xlsx`)
-    }
-  }
-};
-</script>
diff --git a/ruoyi-generator/src/main/resources/vm/vue/v3/index-tree.vue.vm b/ruoyi-generator/src/main/resources/vm/vue/v3/index-tree.vue.vm
deleted file mode 100644
index c54d62b..0000000
--- a/ruoyi-generator/src/main/resources/vm/vue/v3/index-tree.vue.vm
+++ /dev/null
@@ -1,474 +0,0 @@
-<template>
-  <div class="app-container">
-    <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
-#foreach($column in $columns)
-#if($column.query)
-#set($dictType=$column.dictType)
-#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
-#set($parentheseIndex=$column.columnComment.indexOf("锛�"))
-#if($parentheseIndex != -1)
-#set($comment=$column.columnComment.substring(0, $parentheseIndex))
-#else
-#set($comment=$column.columnComment)
-#end
-#if($column.htmlType == "input")
-      <el-form-item label="${comment}" prop="${column.javaField}">
-        <el-input
-          v-model="queryParams.${column.javaField}"
-          placeholder="璇疯緭鍏�${comment}"
-          clearable
-          @keyup.enter="handleQuery"
-        />
-      </el-form-item>
-#elseif(($column.htmlType == "select" || $column.htmlType == "radio") && "" != $dictType)
-      <el-form-item label="${comment}" prop="${column.javaField}">
-        <el-select v-model="queryParams.${column.javaField}" placeholder="璇烽�夋嫨${comment}" clearable>
-          <el-option
-            v-for="dict in ${dictType}"
-            :key="dict.value"
-            :label="dict.label"
-            :value="dict.value"
-          />
-        </el-select>
-      </el-form-item>
-#elseif(($column.htmlType == "select" || $column.htmlType == "radio") && $dictType)
-      <el-form-item label="${comment}" prop="${column.javaField}">
-        <el-select v-model="queryParams.${column.javaField}" placeholder="璇烽�夋嫨${comment}" clearable>
-          <el-option label="璇烽�夋嫨瀛楀吀鐢熸垚" value="" />
-        </el-select>
-      </el-form-item>
-#elseif($column.htmlType == "datetime" && $column.queryType != "BETWEEN")
-      <el-form-item label="${comment}" prop="${column.javaField}">
-        <el-date-picker clearable
-          v-model="queryParams.${column.javaField}"
-          type="date"
-          value-format="YYYY-MM-DD"
-          placeholder="閫夋嫨${comment}">
-        </el-date-picker>
-      </el-form-item>
-#elseif($column.htmlType == "datetime" && $column.queryType == "BETWEEN")
-      <el-form-item label="${comment}" style="width: 308px">
-        <el-date-picker
-          v-model="daterange${AttrName}"
-          value-format="YYYY-MM-DD"
-          type="daterange"
-          range-separator="-"
-          start-placeholder="寮�濮嬫棩鏈�"
-          end-placeholder="缁撴潫鏃ユ湡"
-        ></el-date-picker>
-      </el-form-item>
-#end
-#end
-#end
-      <el-form-item>
-        <el-button type="primary" icon="Search" @click="handleQuery">鎼滅储</el-button>
-        <el-button icon="Refresh" @click="resetQuery">閲嶇疆</el-button>
-      </el-form-item>
-    </el-form>
-
-    <el-row :gutter="10" class="mb8">
-      <el-col :span="1.5">
-        <el-button
-          type="primary"
-          plain
-          icon="Plus"
-          @click="handleAdd"
-          v-hasPermi="['${moduleName}:${businessName}:add']"
-        >鏂板</el-button>
-      </el-col>
-      <el-col :span="1.5">
-        <el-button
-          type="info"
-          plain
-          icon="Sort"
-          @click="toggleExpandAll"
-        >灞曞紑/鎶樺彔</el-button>
-      </el-col>
-      <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
-    </el-row>
-
-    <el-table
-      v-if="refreshTable"
-      v-loading="loading"
-      :data="${businessName}List"
-      row-key="${treeCode}"
-      :default-expand-all="isExpandAll"
-      :tree-props="{children: 'children', hasChildren: 'hasChildren'}"
-    >
-#foreach($column in $columns)
-#set($javaField=$column.javaField)
-#set($parentheseIndex=$column.columnComment.indexOf("锛�"))
-#if($parentheseIndex != -1)
-#set($comment=$column.columnComment.substring(0, $parentheseIndex))
-#else
-#set($comment=$column.columnComment)
-#end
-#if($column.pk)
-#elseif($column.list && $column.htmlType == "datetime")
-      <el-table-column label="${comment}" align="center" prop="${javaField}" width="180">
-        <template #default="scope">
-          <span>{{ parseTime(scope.row.${javaField}, '{y}-{m}-{d}') }}</span>
-        </template>
-      </el-table-column>
-#elseif($column.list && $column.htmlType == "imageUpload")
-      <el-table-column label="${comment}" align="center" prop="${javaField}" width="100">
-        <template #default="scope">
-          <image-preview :src="scope.row.${javaField}" :width="50" :height="50"/>
-        </template>
-      </el-table-column>
-#elseif($column.list && "" != $column.dictType)
-      <el-table-column label="${comment}" align="center" prop="${javaField}">
-        <template #default="scope">
-#if($column.htmlType == "checkbox")
-          <dict-tag :options="${column.dictType}" :value="scope.row.${javaField} ? scope.row.${javaField}.split(',') : []"/>
-#else
-          <dict-tag :options="${column.dictType}" :value="scope.row.${javaField}"/>
-#end
-        </template>
-      </el-table-column>
-#elseif($column.list && "" != $javaField)
-#if(${foreach.index} == 1)
-      <el-table-column label="${comment}" prop="${javaField}" />
-#else
-      <el-table-column label="${comment}" align="center" prop="${javaField}" />
-#end
-#end
-#end
-      <el-table-column label="鎿嶄綔" align="center" class-name="small-padding fixed-width">
-        <template #default="scope">
-          <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['${moduleName}:${businessName}:edit']">淇敼</el-button>
-          <el-button link type="primary" icon="Plus" @click="handleAdd(scope.row)" v-hasPermi="['${moduleName}:${businessName}:add']">鏂板</el-button>
-          <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['${moduleName}:${businessName}:remove']">鍒犻櫎</el-button>
-        </template>
-      </el-table-column>
-    </el-table>
-
-    <!-- 娣诲姞鎴栦慨鏀�${functionName}瀵硅瘽妗� -->
-    <el-dialog :title="title" v-model="open" width="500px" append-to-body>
-      <el-form ref="${businessName}Ref" :model="form" :rules="rules" label-width="80px">
-#foreach($column in $columns)
-#set($field=$column.javaField)
-#if($column.insert && !$column.pk)
-#if(($column.usableColumn) || (!$column.superColumn))
-#set($parentheseIndex=$column.columnComment.indexOf("锛�"))
-#if($parentheseIndex != -1)
-#set($comment=$column.columnComment.substring(0, $parentheseIndex))
-#else
-#set($comment=$column.columnComment)
-#end
-#set($dictType=$column.dictType)
-#if("" != $treeParentCode && $column.javaField == $treeParentCode)
-        <el-form-item label="${comment}" prop="${treeParentCode}">
-          <el-tree-select
-            v-model="form.${treeParentCode}"
-            :data="${businessName}Options"
-            :props="{ value: '${treeCode}', label: '${treeName}', children: 'children' }"
-            value-key="${treeCode}"
-            placeholder="璇烽�夋嫨${comment}"
-            check-strictly
-          />
-        </el-form-item>
-#elseif($column.htmlType == "input")
-        <el-form-item label="${comment}" prop="${field}">
-          <el-input v-model="form.${field}" placeholder="璇疯緭鍏�${comment}" />
-        </el-form-item>
-#elseif($column.htmlType == "imageUpload")
-        <el-form-item label="${comment}" prop="${field}">
-          <image-upload v-model="form.${field}"/>
-        </el-form-item>
-#elseif($column.htmlType == "fileUpload")
-        <el-form-item label="${comment}" prop="${field}">
-          <file-upload v-model="form.${field}"/>
-        </el-form-item>
-#elseif($column.htmlType == "editor")
-        <el-form-item label="${comment}">
-          <editor v-model="form.${field}" :min-height="192"/>
-        </el-form-item>
-#elseif($column.htmlType == "select" && "" != $dictType)
-        <el-form-item label="${comment}" prop="${field}">
-          <el-select v-model="form.${field}" placeholder="璇烽�夋嫨${comment}">
-            <el-option
-              v-for="dict in ${dictType}"
-              :key="dict.value"
-              :label="dict.label"
-#if($column.javaType == "Integer" || $column.javaType == "Long")
-              :value="parseInt(dict.value)"
-#else
-              :value="dict.value"
-#end
-            ></el-option>
-          </el-select>
-        </el-form-item>
-#elseif($column.htmlType == "select" && $dictType)
-        <el-form-item label="${comment}" prop="${field}">
-          <el-select v-model="form.${field}" placeholder="璇烽�夋嫨${comment}">
-            <el-option label="璇烽�夋嫨瀛楀吀鐢熸垚" value="" />
-          </el-select>
-        </el-form-item>
-#elseif($column.htmlType == "checkbox" && "" != $dictType)
-        <el-form-item label="${comment}" prop="${field}">
-          <el-checkbox-group v-model="form.${field}">
-            <el-checkbox
-              v-for="dict in ${dictType}"
-              :key="dict.value"
-              :label="dict.value">
-              {{dict.label}}
-            </el-checkbox>
-          </el-checkbox-group>
-        </el-form-item>
-#elseif($column.htmlType == "checkbox" && $dictType)
-        <el-form-item label="${comment}" prop="${field}">
-          <el-checkbox-group v-model="form.${field}">
-            <el-checkbox>璇烽�夋嫨瀛楀吀鐢熸垚</el-checkbox>
-          </el-checkbox-group>
-        </el-form-item>
-#elseif($column.htmlType == "radio" && "" != $dictType)
-        <el-form-item label="${comment}" prop="${field}">
-          <el-radio-group v-model="form.${field}">
-            <el-radio
-              v-for="dict in ${dictType}"
-              :key="dict.value"
-#if($column.javaType == "Integer" || $column.javaType == "Long")
-              :label="parseInt(dict.value)"
-#else
-              :label="dict.value"
-#end
-            >{{dict.label}}</el-radio>
-          </el-radio-group>
-        </el-form-item>
-#elseif($column.htmlType == "radio" && $dictType)
-        <el-form-item label="${comment}" prop="${field}">
-          <el-radio-group v-model="form.${field}">
-            <el-radio label="1">璇烽�夋嫨瀛楀吀鐢熸垚</el-radio>
-          </el-radio-group>
-        </el-form-item>
-#elseif($column.htmlType == "datetime")
-        <el-form-item label="${comment}" prop="${field}">
-          <el-date-picker clearable
-            v-model="form.${field}"
-            type="date"
-            value-format="YYYY-MM-DD"
-            placeholder="閫夋嫨${comment}">
-          </el-date-picker>
-        </el-form-item>
-#elseif($column.htmlType == "textarea")
-        <el-form-item label="${comment}" prop="${field}">
-          <el-input v-model="form.${field}" type="textarea" placeholder="璇疯緭鍏ュ唴瀹�" />
-        </el-form-item>
-#end
-#end
-#end
-#end
-      </el-form>
-      <template #footer>
-        <div class="dialog-footer">
-          <el-button type="primary" @click="submitForm">纭� 瀹�</el-button>
-          <el-button @click="cancel">鍙� 娑�</el-button>
-        </div>
-      </template>
-    </el-dialog>
-  </div>
-</template>
-
-<script setup name="${BusinessName}">
-import { list${BusinessName}, get${BusinessName}, del${BusinessName}, add${BusinessName}, update${BusinessName} } from "@/api/${moduleName}/${businessName}";
-
-const { proxy } = getCurrentInstance();
-#if(${dicts} != '')
-#set($dictsNoSymbol=$dicts.replace("'", ""))
-const { ${dictsNoSymbol} } = proxy.useDict(${dicts});
-#end
-
-const ${businessName}List = ref([]);
-const ${businessName}Options = ref([]);
-const open = ref(false);
-const loading = ref(true);
-const showSearch = ref(true);
-const title = ref("");
-const isExpandAll = ref(true);
-const refreshTable = ref(true);
-#foreach ($column in $columns)
-#if($column.htmlType == "datetime" && $column.queryType == "BETWEEN")
-#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
-const daterange${AttrName} = ref([]);
-#end
-#end
-
-const data = reactive({
-  form: {},
-  queryParams: {
-    #foreach ($column in $columns)
-#if($column.query)
-    $column.javaField: null#if($foreach.count != $columns.size()),#end
-#end
-#end
-  },
-  rules: {
-    #foreach ($column in $columns)
-#if($column.required)
-#set($parentheseIndex=$column.columnComment.indexOf("锛�"))
-#if($parentheseIndex != -1)
-#set($comment=$column.columnComment.substring(0, $parentheseIndex))
-#else
-#set($comment=$column.columnComment)
-#end
-    $column.javaField: [
-      { required: true, message: "$comment涓嶈兘涓虹┖", trigger: #if($column.htmlType == "select" || $column.htmlType == "radio")"change"#else"blur"#end }
-    ]#if($foreach.count != $columns.size()),#end
-#end
-#end
-  }
-});
-
-const { queryParams, form, rules } = toRefs(data);
-
-/** 鏌ヨ${functionName}鍒楄〃 */
-function getList() {
-  loading.value = true;
-#foreach ($column in $columns)
-#if($column.htmlType == "datetime" && $column.queryType == "BETWEEN")
-  queryParams.value.params = {};
-#break
-#end
-#end
-#foreach ($column in $columns)
-#if($column.htmlType == "datetime" && $column.queryType == "BETWEEN")
-#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
-  if (null != daterange${AttrName} && '' != daterange${AttrName}) {
-    queryParams.value.params["begin${AttrName}"] = daterange${AttrName}.value[0];
-    queryParams.value.params["end${AttrName}"] = daterange${AttrName}.value[1];
-  }
-#end
-#end
-  list${BusinessName}(queryParams.value).then(response => {
-    ${businessName}List.value = proxy.handleTree(response.data, "${treeCode}", "${treeParentCode}");
-    loading.value = false;
-  });
-}
-
-/** 鏌ヨ${functionName}涓嬫媺鏍戠粨鏋� */
-function getTreeselect() {
-  list${BusinessName}().then(response => {
-    ${businessName}Options.value = [];
-    const data = { ${treeCode}: 0, ${treeName}: '椤剁骇鑺傜偣', children: [] };
-    data.children = proxy.handleTree(response.data, "${treeCode}", "${treeParentCode}");
-    ${businessName}Options.value.push(data);
-  });
-}
-	
-// 鍙栨秷鎸夐挳
-function cancel() {
-  open.value = false;
-  reset();
-}
-
-// 琛ㄥ崟閲嶇疆
-function reset() {
-  form.value = {
-#foreach ($column in $columns)
-#if($column.htmlType == "checkbox")
-    $column.javaField: []#if($foreach.count != $columns.size()),#end
-#else
-    $column.javaField: null#if($foreach.count != $columns.size()),#end
-#end
-#end
-  };
-  proxy.resetForm("${businessName}Ref");
-}
-
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-function handleQuery() {
-  getList();
-}
-
-/** 閲嶇疆鎸夐挳鎿嶄綔 */
-function resetQuery() {
-#foreach ($column in $columns)
-#if($column.htmlType == "datetime" && $column.queryType == "BETWEEN")
-#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
-  daterange${AttrName}.value = [];
-#end
-#end
-  proxy.resetForm("queryRef");
-  handleQuery();
-}
-
-/** 鏂板鎸夐挳鎿嶄綔 */
-function handleAdd(row) {
-  reset();
-  getTreeselect();
-  if (row != null && row.${treeCode}) {
-    form.value.${treeParentCode} = row.${treeCode};
-  } else {
-    form.value.${treeParentCode} = 0;
-  }
-  open.value = true;
-  title.value = "娣诲姞${functionName}";
-}
-
-/** 灞曞紑/鎶樺彔鎿嶄綔 */
-function toggleExpandAll() {
-  refreshTable.value = false;
-  isExpandAll.value = !isExpandAll.value;
-  nextTick(() => {
-    refreshTable.value = true;
-  });
-}
-
-/** 淇敼鎸夐挳鎿嶄綔 */
-async function handleUpdate(row) {
-  reset();
-  await getTreeselect();
-  if (row != null) {
-    form.value.${treeParentCode} = row.${treeParentCode};
-  }
-  get${BusinessName}(row.${pkColumn.javaField}).then(response => {
-    form.value = response.data;
-#foreach ($column in $columns)
-#if($column.htmlType == "checkbox")
-    form.value.$column.javaField = form.value.${column.javaField}.split(",");
-#end
-#end
-    open.value = true;
-    title.value = "淇敼${functionName}";
-  });
-}
-
-/** 鎻愪氦鎸夐挳 */
-function submitForm() {
-  proxy.#[[$]]#refs["${businessName}Ref"].validate(valid => {
-    if (valid) {
-#foreach ($column in $columns)
-#if($column.htmlType == "checkbox")
-      form.value.$column.javaField = form.value.${column.javaField}.join(",");
-#end
-#end
-      if (form.value.${pkColumn.javaField} != null) {
-        update${BusinessName}(form.value).then(response => {
-          proxy.#[[$modal]]#.msgSuccess("淇敼鎴愬姛");
-          open.value = false;
-          getList();
-        });
-      } else {
-        add${BusinessName}(form.value).then(response => {
-          proxy.#[[$modal]]#.msgSuccess("鏂板鎴愬姛");
-          open.value = false;
-          getList();
-        });
-      }
-    }
-  });
-}
-
-/** 鍒犻櫎鎸夐挳鎿嶄綔 */
-function handleDelete(row) {
-  proxy.#[[$modal]]#.confirm('鏄惁纭鍒犻櫎${functionName}缂栧彿涓�"' + row.${pkColumn.javaField} + '"鐨勬暟鎹」锛�').then(function() {
-    return del${BusinessName}(row.${pkColumn.javaField});
-  }).then(() => {
-    getList();
-    proxy.#[[$modal]]#.msgSuccess("鍒犻櫎鎴愬姛");
-  }).catch(() => {});
-}
-
-getList();
-</script>
diff --git a/ruoyi-generator/src/main/resources/vm/vue/v3/index.vue.vm b/ruoyi-generator/src/main/resources/vm/vue/v3/index.vue.vm
deleted file mode 100644
index 8b25665..0000000
--- a/ruoyi-generator/src/main/resources/vm/vue/v3/index.vue.vm
+++ /dev/null
@@ -1,590 +0,0 @@
-<template>
-  <div class="app-container">
-    <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
-#foreach($column in $columns)
-#if($column.query)
-#set($dictType=$column.dictType)
-#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
-#set($parentheseIndex=$column.columnComment.indexOf("锛�"))
-#if($parentheseIndex != -1)
-#set($comment=$column.columnComment.substring(0, $parentheseIndex))
-#else
-#set($comment=$column.columnComment)
-#end
-#if($column.htmlType == "input")
-      <el-form-item label="${comment}" prop="${column.javaField}">
-        <el-input
-          v-model="queryParams.${column.javaField}"
-          placeholder="璇疯緭鍏�${comment}"
-          clearable
-          @keyup.enter="handleQuery"
-        />
-      </el-form-item>
-#elseif(($column.htmlType == "select" || $column.htmlType == "radio") && "" != $dictType)
-      <el-form-item label="${comment}" prop="${column.javaField}">
-        <el-select v-model="queryParams.${column.javaField}" placeholder="璇烽�夋嫨${comment}" clearable>
-          <el-option
-            v-for="dict in ${dictType}"
-            :key="dict.value"
-            :label="dict.label"
-            :value="dict.value"
-          />
-        </el-select>
-      </el-form-item>
-#elseif(($column.htmlType == "select" || $column.htmlType == "radio") && $dictType)
-      <el-form-item label="${comment}" prop="${column.javaField}">
-        <el-select v-model="queryParams.${column.javaField}" placeholder="璇烽�夋嫨${comment}" clearable>
-          <el-option label="璇烽�夋嫨瀛楀吀鐢熸垚" value="" />
-        </el-select>
-      </el-form-item>
-#elseif($column.htmlType == "datetime" && $column.queryType != "BETWEEN")
-      <el-form-item label="${comment}" prop="${column.javaField}">
-        <el-date-picker clearable
-          v-model="queryParams.${column.javaField}"
-          type="date"
-          value-format="YYYY-MM-DD"
-          placeholder="璇烽�夋嫨${comment}">
-        </el-date-picker>
-      </el-form-item>
-#elseif($column.htmlType == "datetime" && $column.queryType == "BETWEEN")
-      <el-form-item label="${comment}" style="width: 308px">
-        <el-date-picker
-          v-model="daterange${AttrName}"
-          value-format="YYYY-MM-DD"
-          type="daterange"
-          range-separator="-"
-          start-placeholder="寮�濮嬫棩鏈�"
-          end-placeholder="缁撴潫鏃ユ湡"
-        ></el-date-picker>
-      </el-form-item>
-#end
-#end
-#end
-      <el-form-item>
-        <el-button type="primary" icon="Search" @click="handleQuery">鎼滅储</el-button>
-        <el-button icon="Refresh" @click="resetQuery">閲嶇疆</el-button>
-      </el-form-item>
-    </el-form>
-
-    <el-row :gutter="10" class="mb8">
-      <el-col :span="1.5">
-        <el-button
-          type="primary"
-          plain
-          icon="Plus"
-          @click="handleAdd"
-          v-hasPermi="['${moduleName}:${businessName}:add']"
-        >鏂板</el-button>
-      </el-col>
-      <el-col :span="1.5">
-        <el-button
-          type="success"
-          plain
-          icon="Edit"
-          :disabled="single"
-          @click="handleUpdate"
-          v-hasPermi="['${moduleName}:${businessName}:edit']"
-        >淇敼</el-button>
-      </el-col>
-      <el-col :span="1.5">
-        <el-button
-          type="danger"
-          plain
-          icon="Delete"
-          :disabled="multiple"
-          @click="handleDelete"
-          v-hasPermi="['${moduleName}:${businessName}:remove']"
-        >鍒犻櫎</el-button>
-      </el-col>
-      <el-col :span="1.5">
-        <el-button
-          type="warning"
-          plain
-          icon="Download"
-          @click="handleExport"
-          v-hasPermi="['${moduleName}:${businessName}:export']"
-        >瀵煎嚭</el-button>
-      </el-col>
-      <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
-    </el-row>
-
-    <el-table v-loading="loading" :data="${businessName}List" @selection-change="handleSelectionChange">
-      <el-table-column type="selection" width="55" align="center" />
-#foreach($column in $columns)
-#set($javaField=$column.javaField)
-#set($parentheseIndex=$column.columnComment.indexOf("锛�"))
-#if($parentheseIndex != -1)
-#set($comment=$column.columnComment.substring(0, $parentheseIndex))
-#else
-#set($comment=$column.columnComment)
-#end
-#if($column.pk)
-      <el-table-column label="${comment}" align="center" prop="${javaField}" />
-#elseif($column.list && $column.htmlType == "datetime")
-      <el-table-column label="${comment}" align="center" prop="${javaField}" width="180">
-        <template #default="scope">
-          <span>{{ parseTime(scope.row.${javaField}, '{y}-{m}-{d}') }}</span>
-        </template>
-      </el-table-column>
-#elseif($column.list && $column.htmlType == "imageUpload")
-      <el-table-column label="${comment}" align="center" prop="${javaField}" width="100">
-        <template #default="scope">
-          <image-preview :src="scope.row.${javaField}" :width="50" :height="50"/>
-        </template>
-      </el-table-column>
-#elseif($column.list && "" != $column.dictType)
-      <el-table-column label="${comment}" align="center" prop="${javaField}">
-        <template #default="scope">
-#if($column.htmlType == "checkbox")
-          <dict-tag :options="${column.dictType}" :value="scope.row.${javaField} ? scope.row.${javaField}.split(',') : []"/>
-#else
-          <dict-tag :options="${column.dictType}" :value="scope.row.${javaField}"/>
-#end
-        </template>
-      </el-table-column>
-#elseif($column.list && "" != $javaField)
-      <el-table-column label="${comment}" align="center" prop="${javaField}" />
-#end
-#end
-      <el-table-column label="鎿嶄綔" align="center" class-name="small-padding fixed-width">
-        <template #default="scope">
-          <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['${moduleName}:${businessName}:edit']">淇敼</el-button>
-          <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['${moduleName}:${businessName}:remove']">鍒犻櫎</el-button>
-        </template>
-      </el-table-column>
-    </el-table>
-    
-    <pagination
-      v-show="total>0"
-      :total="total"
-      v-model:page="queryParams.pageNum"
-      v-model:limit="queryParams.pageSize"
-      @pagination="getList"
-    />
-
-    <!-- 娣诲姞鎴栦慨鏀�${functionName}瀵硅瘽妗� -->
-    <el-dialog :title="title" v-model="open" width="500px" append-to-body>
-      <el-form ref="${businessName}Ref" :model="form" :rules="rules" label-width="80px">
-#foreach($column in $columns)
-#set($field=$column.javaField)
-#if($column.insert && !$column.pk)
-#if(($column.usableColumn) || (!$column.superColumn))
-#set($parentheseIndex=$column.columnComment.indexOf("锛�"))
-#if($parentheseIndex != -1)
-#set($comment=$column.columnComment.substring(0, $parentheseIndex))
-#else
-#set($comment=$column.columnComment)
-#end
-#set($dictType=$column.dictType)
-#if($column.htmlType == "input")
-        <el-form-item label="${comment}" prop="${field}">
-          <el-input v-model="form.${field}" placeholder="璇疯緭鍏�${comment}" />
-        </el-form-item>
-#elseif($column.htmlType == "imageUpload")
-        <el-form-item label="${comment}" prop="${field}">
-          <image-upload v-model="form.${field}"/>
-        </el-form-item>
-#elseif($column.htmlType == "fileUpload")
-        <el-form-item label="${comment}" prop="${field}">
-          <file-upload v-model="form.${field}"/>
-        </el-form-item>
-#elseif($column.htmlType == "editor")
-        <el-form-item label="${comment}">
-          <editor v-model="form.${field}" :min-height="192"/>
-        </el-form-item>
-#elseif($column.htmlType == "select" && "" != $dictType)
-        <el-form-item label="${comment}" prop="${field}">
-          <el-select v-model="form.${field}" placeholder="璇烽�夋嫨${comment}">
-            <el-option
-              v-for="dict in ${dictType}"
-              :key="dict.value"
-              :label="dict.label"
-#if($column.javaType == "Integer" || $column.javaType == "Long")
-              :value="parseInt(dict.value)"
-#else
-              :value="dict.value"
-#end
-            ></el-option>
-          </el-select>
-        </el-form-item>
-#elseif($column.htmlType == "select" && $dictType)
-        <el-form-item label="${comment}" prop="${field}">
-          <el-select v-model="form.${field}" placeholder="璇烽�夋嫨${comment}">
-            <el-option label="璇烽�夋嫨瀛楀吀鐢熸垚" value="" />
-          </el-select>
-        </el-form-item>
-#elseif($column.htmlType == "checkbox" && "" != $dictType)
-        <el-form-item label="${comment}" prop="${field}">
-          <el-checkbox-group v-model="form.${field}">
-            <el-checkbox
-              v-for="dict in ${dictType}"
-              :key="dict.value"
-              :label="dict.value">
-              {{dict.label}}
-            </el-checkbox>
-          </el-checkbox-group>
-        </el-form-item>
-#elseif($column.htmlType == "checkbox" && $dictType)
-        <el-form-item label="${comment}" prop="${field}">
-          <el-checkbox-group v-model="form.${field}">
-            <el-checkbox>璇烽�夋嫨瀛楀吀鐢熸垚</el-checkbox>
-          </el-checkbox-group>
-        </el-form-item>
-#elseif($column.htmlType == "radio" && "" != $dictType)
-        <el-form-item label="${comment}" prop="${field}">
-          <el-radio-group v-model="form.${field}">
-            <el-radio
-              v-for="dict in ${dictType}"
-              :key="dict.value"
-#if($column.javaType == "Integer" || $column.javaType == "Long")
-              :label="parseInt(dict.value)"
-#else
-              :label="dict.value"
-#end
-            >{{dict.label}}</el-radio>
-          </el-radio-group>
-        </el-form-item>
-#elseif($column.htmlType == "radio" && $dictType)
-        <el-form-item label="${comment}" prop="${field}">
-          <el-radio-group v-model="form.${field}">
-            <el-radio label="1">璇烽�夋嫨瀛楀吀鐢熸垚</el-radio>
-          </el-radio-group>
-        </el-form-item>
-#elseif($column.htmlType == "datetime")
-        <el-form-item label="${comment}" prop="${field}">
-          <el-date-picker clearable
-            v-model="form.${field}"
-            type="date"
-            value-format="YYYY-MM-DD"
-            placeholder="璇烽�夋嫨${comment}">
-          </el-date-picker>
-        </el-form-item>
-#elseif($column.htmlType == "textarea")
-        <el-form-item label="${comment}" prop="${field}">
-          <el-input v-model="form.${field}" type="textarea" placeholder="璇疯緭鍏ュ唴瀹�" />
-        </el-form-item>
-#end
-#end
-#end
-#end
-#if($table.sub)
-        <el-divider content-position="center">${subTable.functionName}淇℃伅</el-divider>
-        <el-row :gutter="10" class="mb8">
-          <el-col :span="1.5">
-            <el-button type="primary" icon="Plus" @click="handleAdd${subClassName}">娣诲姞</el-button>
-          </el-col>
-          <el-col :span="1.5">
-            <el-button type="danger" icon="Delete" @click="handleDelete${subClassName}">鍒犻櫎</el-button>
-          </el-col>
-        </el-row>
-        <el-table :data="${subclassName}List" :row-class-name="row${subClassName}Index" @selection-change="handle${subClassName}SelectionChange" ref="${subclassName}">
-          <el-table-column type="selection" width="50" align="center" />
-          <el-table-column label="搴忓彿" align="center" prop="index" width="50"/>
-#foreach($column in $subTable.columns)
-#set($javaField=$column.javaField)
-#set($parentheseIndex=$column.columnComment.indexOf("锛�"))
-#if($parentheseIndex != -1)
-#set($comment=$column.columnComment.substring(0, $parentheseIndex))
-#else
-#set($comment=$column.columnComment)
-#end
-#if($column.pk || $javaField == ${subTableFkclassName})
-#elseif($column.list && $column.htmlType == "input")
-          <el-table-column label="$comment" prop="${javaField}" width="150">
-            <template #default="scope">
-              <el-input v-model="scope.row.$javaField" placeholder="璇疯緭鍏�$comment" />
-            </template>
-          </el-table-column>
-#elseif($column.list && $column.htmlType == "datetime")
-          <el-table-column label="$comment" prop="${javaField}" width="240">
-            <template #default="scope">
-              <el-date-picker clearable
-                v-model="scope.row.$javaField"
-                type="date"
-                value-format="YYYY-MM-DD"
-                placeholder="璇烽�夋嫨$comment">
-              </el-date-picker>
-            </template>
-          </el-table-column>
-#elseif($column.list && ($column.htmlType == "select" || $column.htmlType == "radio") && "" != $column.dictType)
-          <el-table-column label="$comment" prop="${javaField}" width="150">
-            <template #default="scope">
-              <el-select v-model="scope.row.$javaField" placeholder="璇烽�夋嫨$comment">
-                <el-option
-                  v-for="dict in $column.dictType"
-                  :key="dict.value"
-                  :label="dict.label"
-                  :value="dict.value"
-                ></el-option>
-              </el-select>
-            </template>
-          </el-table-column>
-#elseif($column.list && ($column.htmlType == "select" || $column.htmlType == "radio") && "" == $column.dictType)
-          <el-table-column label="$comment" prop="${javaField}" width="150">
-            <template #default="scope">
-              <el-select v-model="scope.row.$javaField" placeholder="璇烽�夋嫨$comment">
-                <el-option label="璇烽�夋嫨瀛楀吀鐢熸垚" value="" />
-              </el-select>
-            </template>
-          </el-table-column>
-#end
-#end
-        </el-table>
-#end
-      </el-form>
-      <template #footer>
-        <div class="dialog-footer">
-          <el-button type="primary" @click="submitForm">纭� 瀹�</el-button>
-          <el-button @click="cancel">鍙� 娑�</el-button>
-        </div>
-      </template>
-    </el-dialog>
-  </div>
-</template>
-
-<script setup name="${BusinessName}">
-import { list${BusinessName}, get${BusinessName}, del${BusinessName}, add${BusinessName}, update${BusinessName} } from "@/api/${moduleName}/${businessName}";
-
-const { proxy } = getCurrentInstance();
-#if(${dicts} != '')
-#set($dictsNoSymbol=$dicts.replace("'", ""))
-const { ${dictsNoSymbol} } = proxy.useDict(${dicts});
-#end
-
-const ${businessName}List = ref([]);
-#if($table.sub)
-const ${subclassName}List = ref([]);
-#end
-const open = ref(false);
-const loading = ref(true);
-const showSearch = ref(true);
-const ids = ref([]);
-#if($table.sub)
-const checked${subClassName} = ref([]);
-#end
-const single = ref(true);
-const multiple = ref(true);
-const total = ref(0);
-const title = ref("");
-#foreach ($column in $columns)
-#if($column.htmlType == "datetime" && $column.queryType == "BETWEEN")
-#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
-const daterange${AttrName} = ref([]);
-#end
-#end
-
-const data = reactive({
-  form: {},
-  queryParams: {
-    pageNum: 1,
-    pageSize: 10,
-    #foreach ($column in $columns)
-#if($column.query)
-    $column.javaField: null#if($foreach.count != $columns.size()),#end
-#end
-#end
-  },
-  rules: {
-    #foreach ($column in $columns)
-#if($column.required)
-#set($parentheseIndex=$column.columnComment.indexOf("锛�"))
-#if($parentheseIndex != -1)
-#set($comment=$column.columnComment.substring(0, $parentheseIndex))
-#else
-#set($comment=$column.columnComment)
-#end
-    $column.javaField: [
-      { required: true, message: "$comment涓嶈兘涓虹┖", trigger: #if($column.htmlType == "select" || $column.htmlType == "radio")"change"#else"blur"#end }
-    ]#if($foreach.count != $columns.size()),#end
-#end
-#end
-  }
-});
-
-const { queryParams, form, rules } = toRefs(data);
-
-/** 鏌ヨ${functionName}鍒楄〃 */
-function getList() {
-  loading.value = true;
-#foreach ($column in $columns)
-#if($column.htmlType == "datetime" && $column.queryType == "BETWEEN")
-  queryParams.value.params = {};
-#break
-#end
-#end
-#foreach ($column in $columns)
-#if($column.htmlType == "datetime" && $column.queryType == "BETWEEN")
-#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
-  if (null != daterange${AttrName} && '' != daterange${AttrName}) {
-    queryParams.value.params["begin${AttrName}"] = daterange${AttrName}.value[0];
-    queryParams.value.params["end${AttrName}"] = daterange${AttrName}.value[1];
-  }
-#end
-#end
-  list${BusinessName}(queryParams.value).then(response => {
-    ${businessName}List.value = response.rows;
-    total.value = response.total;
-    loading.value = false;
-  });
-}
-
-// 鍙栨秷鎸夐挳
-function cancel() {
-  open.value = false;
-  reset();
-}
-
-// 琛ㄥ崟閲嶇疆
-function reset() {
-  form.value = {
-#foreach ($column in $columns)
-#if($column.htmlType == "checkbox")
-    $column.javaField: []#if($foreach.count != $columns.size()),#end
-#else
-    $column.javaField: null#if($foreach.count != $columns.size()),#end
-#end
-#end
-  };
-#if($table.sub)
-  ${subclassName}List.value = [];
-#end
-  proxy.resetForm("${businessName}Ref");
-}
-
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-function handleQuery() {
-  queryParams.value.pageNum = 1;
-  getList();
-}
-
-/** 閲嶇疆鎸夐挳鎿嶄綔 */
-function resetQuery() {
-#foreach ($column in $columns)
-#if($column.htmlType == "datetime" && $column.queryType == "BETWEEN")
-#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
-  daterange${AttrName}.value = [];
-#end
-#end
-  proxy.resetForm("queryRef");
-  handleQuery();
-}
-
-// 澶氶�夋閫変腑鏁版嵁
-function handleSelectionChange(selection) {
-  ids.value = selection.map(item => item.${pkColumn.javaField});
-  single.value = selection.length != 1;
-  multiple.value = !selection.length;
-}
-
-/** 鏂板鎸夐挳鎿嶄綔 */
-function handleAdd() {
-  reset();
-  open.value = true;
-  title.value = "娣诲姞${functionName}";
-}
-
-/** 淇敼鎸夐挳鎿嶄綔 */
-function handleUpdate(row) {
-  reset();
-  const _${pkColumn.javaField} = row.${pkColumn.javaField} || ids.value
-  get${BusinessName}(_${pkColumn.javaField}).then(response => {
-    form.value = response.data;
-#foreach ($column in $columns)
-#if($column.htmlType == "checkbox")
-    form.value.$column.javaField = form.value.${column.javaField}.split(",");
-#end
-#end
-#if($table.sub)
-    ${subclassName}List.value = response.data.${subclassName}List;
-#end
-    open.value = true;
-    title.value = "淇敼${functionName}";
-  });
-}
-
-/** 鎻愪氦鎸夐挳 */
-function submitForm() {
-  proxy.#[[$]]#refs["${businessName}Ref"].validate(valid => {
-    if (valid) {
-#foreach ($column in $columns)
-#if($column.htmlType == "checkbox")
-      form.value.$column.javaField = form.value.${column.javaField}.join(",");
-#end
-#end
-#if($table.sub)
-      form.value.${subclassName}List = ${subclassName}List.value;
-#end
-      if (form.value.${pkColumn.javaField} != null) {
-        update${BusinessName}(form.value).then(response => {
-          proxy.#[[$modal]]#.msgSuccess("淇敼鎴愬姛");
-          open.value = false;
-          getList();
-        });
-      } else {
-        add${BusinessName}(form.value).then(response => {
-          proxy.#[[$modal]]#.msgSuccess("鏂板鎴愬姛");
-          open.value = false;
-          getList();
-        });
-      }
-    }
-  });
-}
-
-/** 鍒犻櫎鎸夐挳鎿嶄綔 */
-function handleDelete(row) {
-  const _${pkColumn.javaField}s = row.${pkColumn.javaField} || ids.value;
-  proxy.#[[$modal]]#.confirm('鏄惁纭鍒犻櫎${functionName}缂栧彿涓�"' + _${pkColumn.javaField}s + '"鐨勬暟鎹」锛�').then(function() {
-    return del${BusinessName}(_${pkColumn.javaField}s);
-  }).then(() => {
-    getList();
-    proxy.#[[$modal]]#.msgSuccess("鍒犻櫎鎴愬姛");
-  }).catch(() => {});
-}
-
-#if($table.sub)
-/** ${subTable.functionName}搴忓彿 */
-function row${subClassName}Index({ row, rowIndex }) {
-  row.index = rowIndex + 1;
-}
-
-/** ${subTable.functionName}娣诲姞鎸夐挳鎿嶄綔 */
-function handleAdd${subClassName}() {
-  let obj = {};
-#foreach($column in $subTable.columns)
-#if($column.pk || $column.javaField == ${subTableFkclassName})
-#elseif($column.list && "" != $javaField)
-  obj.$column.javaField = "";
-#end
-#end
-  ${subclassName}List.value.push(obj);
-}
-
-/** ${subTable.functionName}鍒犻櫎鎸夐挳鎿嶄綔 */
-function handleDelete${subClassName}() {
-  if (checked${subClassName}.value.length == 0) {
-    proxy.#[[$modal]]#.msgError("璇峰厛閫夋嫨瑕佸垹闄ょ殑${subTable.functionName}鏁版嵁");
-  } else {
-    const ${subclassName}s = ${subclassName}List.value;
-    const checked${subClassName}s = checked${subClassName}.value;
-    ${subclassName}List.value = ${subclassName}s.filter(function(item) {
-      return checked${subClassName}s.indexOf(item.index) == -1
-    });
-  }
-}
-
-/** 澶嶉�夋閫変腑鏁版嵁 */
-function handle${subClassName}SelectionChange(selection) {
-  checked${subClassName}.value = selection.map(item => item.index)
-}
-
-#end
-/** 瀵煎嚭鎸夐挳鎿嶄綔 */
-function handleExport() {
-  proxy.download('${moduleName}/${businessName}/export', {
-    ...queryParams.value
-  }, `${businessName}_#[[${new Date().getTime()}]]#.xlsx`)
-}
-
-getList();
-</script>
diff --git a/ruoyi-generator/src/main/resources/vm/xml/mapper.xml.vm b/ruoyi-generator/src/main/resources/vm/xml/mapper.xml.vm
deleted file mode 100644
index 456755b..0000000
--- a/ruoyi-generator/src/main/resources/vm/xml/mapper.xml.vm
+++ /dev/null
@@ -1,140 +0,0 @@
-<?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="${packageName}.mapper.${ClassName}Mapper">
-    
-    <resultMap type="${ClassName}" id="${ClassName}Result">
-#foreach ($column in $columns)
-        <result property="${column.javaField}"    column="${column.columnName}"    />
-#end
-    </resultMap>
-#if($table.sub)
-
-    <resultMap id="${ClassName}${subClassName}Result" type="${ClassName}" extends="${ClassName}Result">
-        <collection property="${subclassName}List" ofType="${subClassName}" column="${pkColumn.columnName}" select="select${subClassName}List" />
-    </resultMap>
-
-    <resultMap type="${subClassName}" id="${subClassName}Result">
-#foreach ($column in $subTable.columns)
-        <result property="${column.javaField}"    column="${column.columnName}"    />
-#end
-    </resultMap>
-#end
-
-    <sql id="select${ClassName}Vo">
-        select#foreach($column in $columns) $column.columnName#if($foreach.count != $columns.size()),#end#end from ${tableName}
-    </sql>
-
-    <select id="select${ClassName}List" parameterType="${ClassName}" resultMap="${ClassName}Result">
-        <include refid="select${ClassName}Vo"/>
-        <where>  
-#foreach($column in $columns)
-#set($queryType=$column.queryType)
-#set($javaField=$column.javaField)
-#set($javaType=$column.javaType)
-#set($columnName=$column.columnName)
-#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
-#if($column.query)
-#if($column.queryType == "EQ")
-            <if test="$javaField != null #if($javaType == 'String' ) and $javaField.trim() != ''#end"> and $columnName = #{$javaField}</if>
-#elseif($queryType == "NE")
-            <if test="$javaField != null #if($javaType == 'String' ) and $javaField.trim() != ''#end"> and $columnName != #{$javaField}</if>
-#elseif($queryType == "GT")
-            <if test="$javaField != null #if($javaType == 'String' ) and $javaField.trim() != ''#end"> and $columnName &gt; #{$javaField}</if>
-#elseif($queryType == "GTE")
-            <if test="$javaField != null #if($javaType == 'String' ) and $javaField.trim() != ''#end"> and $columnName &gt;= #{$javaField}</if>
-#elseif($queryType == "LT")
-            <if test="$javaField != null #if($javaType == 'String' ) and $javaField.trim() != ''#end"> and $columnName &lt; #{$javaField}</if>
-#elseif($queryType == "LTE")
-            <if test="$javaField != null #if($javaType == 'String' ) and $javaField.trim() != ''#end"> and $columnName &lt;= #{$javaField}</if>
-#elseif($queryType == "LIKE")
-            <if test="$javaField != null #if($javaType == 'String' ) and $javaField.trim() != ''#end"> and $columnName like concat('%', #{$javaField}, '%')</if>
-#elseif($queryType == "BETWEEN")
-            <if test="params.begin$AttrName != null and params.begin$AttrName != '' and params.end$AttrName != null and params.end$AttrName != ''"> and $columnName between #{params.begin$AttrName} and #{params.end$AttrName}</if>
-#end
-#end
-#end
-        </where>
-    </select>
-    
-    <select id="select${ClassName}By${pkColumn.capJavaField}" parameterType="${pkColumn.javaType}" resultMap="#if($table.sub)${ClassName}${subClassName}Result#else${ClassName}Result#end">
-#if($table.crud || $table.tree)
-        <include refid="select${ClassName}Vo"/>
-        where ${pkColumn.columnName} = #{${pkColumn.javaField}}
-#elseif($table.sub)
-        select#foreach($column in $columns) $column.columnName#if($foreach.count != $columns.size()),#end#end
-        from ${tableName}
-        where ${pkColumn.columnName} = #{${pkColumn.javaField}}
-#end
-    </select>
-#if($table.sub)
-
-    <select id="select${subClassName}List" resultMap="${subClassName}Result">
-        select#foreach ($column in $subTable.columns) $column.columnName#if($foreach.count != $subTable.columns.size()),#end#end
-        from ${subTableName}
-        where ${subTableFkName} = #{${subTableFkName}}
-    </select>
-#end
-
-    <insert id="insert${ClassName}" parameterType="${ClassName}"#if($pkColumn.increment) useGeneratedKeys="true" keyProperty="$pkColumn.javaField"#end>
-        insert into ${tableName}
-        <trim prefix="(" suffix=")" suffixOverrides=",">
-#foreach($column in $columns)
-#if($column.columnName != $pkColumn.columnName || !$pkColumn.increment)
-            <if test="$column.javaField != null#if($column.javaType == 'String' && $column.required) and $column.javaField != ''#end">$column.columnName,</if>
-#end
-#end
-         </trim>
-        <trim prefix="values (" suffix=")" suffixOverrides=",">
-#foreach($column in $columns)
-#if($column.columnName != $pkColumn.columnName || !$pkColumn.increment)
-            <if test="$column.javaField != null#if($column.javaType == 'String' && $column.required) and $column.javaField != ''#end">#{$column.javaField},</if>
-#end
-#end
-         </trim>
-    </insert>
-
-    <update id="update${ClassName}" parameterType="${ClassName}">
-        update ${tableName}
-        <trim prefix="SET" suffixOverrides=",">
-#foreach($column in $columns)
-#if($column.columnName != $pkColumn.columnName)
-            <if test="$column.javaField != null#if($column.javaType == 'String' && $column.required) and $column.javaField != ''#end">$column.columnName = #{$column.javaField},</if>
-#end
-#end
-        </trim>
-        where ${pkColumn.columnName} = #{${pkColumn.javaField}}
-    </update>
-
-    <delete id="delete${ClassName}By${pkColumn.capJavaField}" parameterType="${pkColumn.javaType}">
-        delete from ${tableName} where ${pkColumn.columnName} = #{${pkColumn.javaField}}
-    </delete>
-
-    <delete id="delete${ClassName}By${pkColumn.capJavaField}s" parameterType="String">
-        delete from ${tableName} where ${pkColumn.columnName} in 
-        <foreach item="${pkColumn.javaField}" collection="array" open="(" separator="," close=")">
-            #{${pkColumn.javaField}}
-        </foreach>
-    </delete>
-#if($table.sub)
-    
-    <delete id="delete${subClassName}By${subTableFkClassName}s" parameterType="String">
-        delete from ${subTableName} where ${subTableFkName} in 
-        <foreach item="${subTableFkclassName}" collection="array" open="(" separator="," close=")">
-            #{${subTableFkclassName}}
-        </foreach>
-    </delete>
-
-    <delete id="delete${subClassName}By${subTableFkClassName}" parameterType="${pkColumn.javaType}">
-        delete from ${subTableName} where ${subTableFkName} = #{${subTableFkclassName}}
-    </delete>
-
-    <insert id="batch${subClassName}">
-        insert into ${subTableName}(#foreach($column in $subTable.columns) $column.columnName#if($foreach.count != $subTable.columns.size()),#end#end) values
-        <foreach item="item" index="index" collection="list" separator=",">
-            (#foreach($column in $subTable.columns) #{item.$column.javaField}#if($foreach.count != $subTable.columns.size()),#end#end)
-        </foreach>
-    </insert>
-#end
-</mapper>
\ No newline at end of file
diff --git a/ruoyi-quartz/pom.xml b/ruoyi-quartz/pom.xml
deleted file mode 100644
index 0421087..0000000
--- a/ruoyi-quartz/pom.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <parent>
-        <artifactId>ruoyi</artifactId>
-        <groupId>com.ruoyi</groupId>
-        <version>3.8.9</version>
-    </parent>
-    <modelVersion>4.0.0</modelVersion>
-
-    <artifactId>ruoyi-quartz</artifactId>
-
-    <description>
-        quartz瀹氭椂浠诲姟
-    </description>
-
-    <dependencies>
-
-        <!-- 瀹氭椂浠诲姟 -->
-        <dependency>
-            <groupId>org.quartz-scheduler</groupId>
-            <artifactId>quartz</artifactId>
-            <exclusions>
-                <exclusion>
-                    <groupId>com.mchange</groupId>
-                    <artifactId>c3p0</artifactId>
-                </exclusion>
-            </exclusions>
-        </dependency>
-
-        <!-- 閫氱敤宸ュ叿-->
-        <dependency>
-            <groupId>com.ruoyi</groupId>
-            <artifactId>ruoyi-common</artifactId>
-        </dependency>
-
-    </dependencies>
-
-</project>
\ No newline at end of file
diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/config/ScheduleConfig.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/config/ScheduleConfig.java
deleted file mode 100644
index d4e065a..0000000
--- a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/config/ScheduleConfig.java
+++ /dev/null
@@ -1,57 +0,0 @@
-//package com.ruoyi.quartz.config;
-//
-//import org.springframework.context.annotation.Bean;
-//import org.springframework.context.annotation.Configuration;
-//import org.springframework.scheduling.quartz.SchedulerFactoryBean;
-//import javax.sql.DataSource;
-//import java.util.Properties;
-//
-///**
-// * 瀹氭椂浠诲姟閰嶇疆锛堝崟鏈洪儴缃插缓璁垹闄ゆ绫诲拰qrtz鏁版嵁搴撹〃锛岄粯璁よ蛋鍐呭瓨浼氭渶楂樻晥锛�
-// * 
-// * @author ruoyi
-// */
-//@Configuration
-//public class ScheduleConfig
-//{
-//    @Bean
-//    public SchedulerFactoryBean schedulerFactoryBean(DataSource dataSource)
-//    {
-//        SchedulerFactoryBean factory = new SchedulerFactoryBean();
-//        factory.setDataSource(dataSource);
-//
-//        // quartz鍙傛暟
-//        Properties prop = new Properties();
-//        prop.put("org.quartz.scheduler.instanceName", "RuoyiScheduler");
-//        prop.put("org.quartz.scheduler.instanceId", "AUTO");
-//        // 绾跨▼姹犻厤缃�
-//        prop.put("org.quartz.threadPool.class", "org.quartz.simpl.SimpleThreadPool");
-//        prop.put("org.quartz.threadPool.threadCount", "20");
-//        prop.put("org.quartz.threadPool.threadPriority", "5");
-//        // JobStore閰嶇疆
-//        prop.put("org.quartz.jobStore.class", "org.springframework.scheduling.quartz.LocalDataSourceJobStore");
-//        // 闆嗙兢閰嶇疆
-//        prop.put("org.quartz.jobStore.isClustered", "true");
-//        prop.put("org.quartz.jobStore.clusterCheckinInterval", "15000");
-//        prop.put("org.quartz.jobStore.maxMisfiresToHandleAtATime", "10");
-//        prop.put("org.quartz.jobStore.txIsolationLevelSerializable", "true");
-//
-//        // sqlserver 鍚敤
-//        // prop.put("org.quartz.jobStore.selectWithLockSQL", "SELECT * FROM {0}LOCKS UPDLOCK WHERE LOCK_NAME = ?");
-//        prop.put("org.quartz.jobStore.misfireThreshold", "12000");
-//        prop.put("org.quartz.jobStore.tablePrefix", "QRTZ_");
-//        factory.setQuartzProperties(prop);
-//
-//        factory.setSchedulerName("RuoyiScheduler");
-//        // 寤舵椂鍚姩
-//        factory.setStartupDelay(1);
-//        factory.setApplicationContextSchedulerContextKey("applicationContextKey");
-//        // 鍙�夛紝QuartzScheduler
-//        // 鍚姩鏃舵洿鏂板繁瀛樺湪鐨凧ob锛岃繖鏍峰氨涓嶇敤姣忔淇敼targetObject鍚庡垹闄rtz_job_details琛ㄥ搴旇褰曚簡
-//        factory.setOverwriteExistingJobs(true);
-//        // 璁剧疆鑷姩鍚姩锛岄粯璁や负true
-//        factory.setAutoStartup(true);
-//
-//        return factory;
-//    }
-//}
diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/controller/SysJobController.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/controller/SysJobController.java
deleted file mode 100644
index 4fd7aab..0000000
--- a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/controller/SysJobController.java
+++ /dev/null
@@ -1,185 +0,0 @@
-package com.ruoyi.quartz.controller;
-
-import java.util.List;
-import javax.servlet.http.HttpServletResponse;
-import org.quartz.SchedulerException;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.web.bind.annotation.DeleteMapping;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.PutMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-import com.ruoyi.common.annotation.Log;
-import com.ruoyi.common.constant.Constants;
-import com.ruoyi.common.core.controller.BaseController;
-import com.ruoyi.common.core.domain.AjaxResult;
-import com.ruoyi.common.core.page.TableDataInfo;
-import com.ruoyi.common.enums.BusinessType;
-import com.ruoyi.common.exception.job.TaskException;
-import com.ruoyi.common.utils.StringUtils;
-import com.ruoyi.common.utils.poi.ExcelUtil;
-import com.ruoyi.quartz.domain.SysJob;
-import com.ruoyi.quartz.service.ISysJobService;
-import com.ruoyi.quartz.util.CronUtils;
-import com.ruoyi.quartz.util.ScheduleUtils;
-
-/**
- * 璋冨害浠诲姟淇℃伅鎿嶄綔澶勭悊
- *
- * @author ruoyi
- */
-@RestController
-@RequestMapping("/monitor/job")
-public class SysJobController extends BaseController
-{
-    @Autowired
-    private ISysJobService jobService;
-
-    /**
-     * 鏌ヨ瀹氭椂浠诲姟鍒楄〃
-     */
-    @PreAuthorize("@ss.hasPermi('monitor:job:list')")
-    @GetMapping("/list")
-    public TableDataInfo list(SysJob sysJob)
-    {
-        startPage();
-        List<SysJob> list = jobService.selectJobList(sysJob);
-        return getDataTable(list);
-    }
-
-    /**
-     * 瀵煎嚭瀹氭椂浠诲姟鍒楄〃
-     */
-    @PreAuthorize("@ss.hasPermi('monitor:job:export')")
-    @Log(title = "瀹氭椂浠诲姟", businessType = BusinessType.EXPORT)
-    @PostMapping("/export")
-    public void export(HttpServletResponse response, SysJob sysJob)
-    {
-        List<SysJob> list = jobService.selectJobList(sysJob);
-        ExcelUtil<SysJob> util = new ExcelUtil<SysJob>(SysJob.class);
-        util.exportExcel(response, list, "瀹氭椂浠诲姟");
-    }
-
-    /**
-     * 鑾峰彇瀹氭椂浠诲姟璇︾粏淇℃伅
-     */
-    @PreAuthorize("@ss.hasPermi('monitor:job:query')")
-    @GetMapping(value = "/{jobId}")
-    public AjaxResult getInfo(@PathVariable("jobId") Long jobId)
-    {
-        return success(jobService.selectJobById(jobId));
-    }
-
-    /**
-     * 鏂板瀹氭椂浠诲姟
-     */
-    @PreAuthorize("@ss.hasPermi('monitor:job:add')")
-    @Log(title = "瀹氭椂浠诲姟", businessType = BusinessType.INSERT)
-    @PostMapping
-    public AjaxResult add(@RequestBody SysJob job) throws SchedulerException, TaskException
-    {
-        if (!CronUtils.isValid(job.getCronExpression()))
-        {
-            return error("鏂板浠诲姟'" + job.getJobName() + "'澶辫触锛孋ron琛ㄨ揪寮忎笉姝g‘");
-        }
-        else if (StringUtils.containsIgnoreCase(job.getInvokeTarget(), Constants.LOOKUP_RMI))
-        {
-            return error("鏂板浠诲姟'" + job.getJobName() + "'澶辫触锛岀洰鏍囧瓧绗︿覆涓嶅厑璁�'rmi'璋冪敤");
-        }
-        else if (StringUtils.containsAnyIgnoreCase(job.getInvokeTarget(), new String[] { Constants.LOOKUP_LDAP, Constants.LOOKUP_LDAPS }))
-        {
-            return error("鏂板浠诲姟'" + job.getJobName() + "'澶辫触锛岀洰鏍囧瓧绗︿覆涓嶅厑璁�'ldap(s)'璋冪敤");
-        }
-        else if (StringUtils.containsAnyIgnoreCase(job.getInvokeTarget(), new String[] { Constants.HTTP, Constants.HTTPS }))
-        {
-            return error("鏂板浠诲姟'" + job.getJobName() + "'澶辫触锛岀洰鏍囧瓧绗︿覆涓嶅厑璁�'http(s)'璋冪敤");
-        }
-        else if (StringUtils.containsAnyIgnoreCase(job.getInvokeTarget(), Constants.JOB_ERROR_STR))
-        {
-            return error("鏂板浠诲姟'" + job.getJobName() + "'澶辫触锛岀洰鏍囧瓧绗︿覆瀛樺湪杩濊");
-        }
-        else if (!ScheduleUtils.whiteList(job.getInvokeTarget()))
-        {
-            return error("鏂板浠诲姟'" + job.getJobName() + "'澶辫触锛岀洰鏍囧瓧绗︿覆涓嶅湪鐧藉悕鍗曞唴");
-        }
-        job.setCreateBy(getUsername());
-        return toAjax(jobService.insertJob(job));
-    }
-
-    /**
-     * 淇敼瀹氭椂浠诲姟
-     */
-    @PreAuthorize("@ss.hasPermi('monitor:job:edit')")
-    @Log(title = "瀹氭椂浠诲姟", businessType = BusinessType.UPDATE)
-    @PutMapping
-    public AjaxResult edit(@RequestBody SysJob job) throws SchedulerException, TaskException
-    {
-        if (!CronUtils.isValid(job.getCronExpression()))
-        {
-            return error("淇敼浠诲姟'" + job.getJobName() + "'澶辫触锛孋ron琛ㄨ揪寮忎笉姝g‘");
-        }
-        else if (StringUtils.containsIgnoreCase(job.getInvokeTarget(), Constants.LOOKUP_RMI))
-        {
-            return error("淇敼浠诲姟'" + job.getJobName() + "'澶辫触锛岀洰鏍囧瓧绗︿覆涓嶅厑璁�'rmi'璋冪敤");
-        }
-        else if (StringUtils.containsAnyIgnoreCase(job.getInvokeTarget(), new String[] { Constants.LOOKUP_LDAP, Constants.LOOKUP_LDAPS }))
-        {
-            return error("淇敼浠诲姟'" + job.getJobName() + "'澶辫触锛岀洰鏍囧瓧绗︿覆涓嶅厑璁�'ldap(s)'璋冪敤");
-        }
-        else if (StringUtils.containsAnyIgnoreCase(job.getInvokeTarget(), new String[] { Constants.HTTP, Constants.HTTPS }))
-        {
-            return error("淇敼浠诲姟'" + job.getJobName() + "'澶辫触锛岀洰鏍囧瓧绗︿覆涓嶅厑璁�'http(s)'璋冪敤");
-        }
-        else if (StringUtils.containsAnyIgnoreCase(job.getInvokeTarget(), Constants.JOB_ERROR_STR))
-        {
-            return error("淇敼浠诲姟'" + job.getJobName() + "'澶辫触锛岀洰鏍囧瓧绗︿覆瀛樺湪杩濊");
-        }
-        else if (!ScheduleUtils.whiteList(job.getInvokeTarget()))
-        {
-            return error("淇敼浠诲姟'" + job.getJobName() + "'澶辫触锛岀洰鏍囧瓧绗︿覆涓嶅湪鐧藉悕鍗曞唴");
-        }
-        job.setUpdateBy(getUsername());
-        return toAjax(jobService.updateJob(job));
-    }
-
-    /**
-     * 瀹氭椂浠诲姟鐘舵�佷慨鏀�
-     */
-    @PreAuthorize("@ss.hasPermi('monitor:job:changeStatus')")
-    @Log(title = "瀹氭椂浠诲姟", businessType = BusinessType.UPDATE)
-    @PutMapping("/changeStatus")
-    public AjaxResult changeStatus(@RequestBody SysJob job) throws SchedulerException
-    {
-        SysJob newJob = jobService.selectJobById(job.getJobId());
-        newJob.setStatus(job.getStatus());
-        return toAjax(jobService.changeStatus(newJob));
-    }
-
-    /**
-     * 瀹氭椂浠诲姟绔嬪嵆鎵ц涓�娆�
-     */
-    @PreAuthorize("@ss.hasPermi('monitor:job:changeStatus')")
-    @Log(title = "瀹氭椂浠诲姟", businessType = BusinessType.UPDATE)
-    @PutMapping("/run")
-    public AjaxResult run(@RequestBody SysJob job) throws SchedulerException
-    {
-        boolean result = jobService.run(job);
-        return result ? success() : error("浠诲姟涓嶅瓨鍦ㄦ垨宸茶繃鏈燂紒");
-    }
-
-    /**
-     * 鍒犻櫎瀹氭椂浠诲姟
-     */
-    @PreAuthorize("@ss.hasPermi('monitor:job:remove')")
-    @Log(title = "瀹氭椂浠诲姟", businessType = BusinessType.DELETE)
-    @DeleteMapping("/{jobIds}")
-    public AjaxResult remove(@PathVariable Long[] jobIds) throws SchedulerException, TaskException
-    {
-        jobService.deleteJobByIds(jobIds);
-        return success();
-    }
-}
diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/controller/SysJobLogController.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/controller/SysJobLogController.java
deleted file mode 100644
index 4f6bb63..0000000
--- a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/controller/SysJobLogController.java
+++ /dev/null
@@ -1,92 +0,0 @@
-package com.ruoyi.quartz.controller;
-
-import java.util.List;
-import javax.servlet.http.HttpServletResponse;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.web.bind.annotation.DeleteMapping;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-import com.ruoyi.common.annotation.Log;
-import com.ruoyi.common.core.controller.BaseController;
-import com.ruoyi.common.core.domain.AjaxResult;
-import com.ruoyi.common.core.page.TableDataInfo;
-import com.ruoyi.common.enums.BusinessType;
-import com.ruoyi.common.utils.poi.ExcelUtil;
-import com.ruoyi.quartz.domain.SysJobLog;
-import com.ruoyi.quartz.service.ISysJobLogService;
-
-/**
- * 璋冨害鏃ュ織鎿嶄綔澶勭悊
- *
- * @author ruoyi
- */
-@RestController
-@RequestMapping("/monitor/jobLog")
-public class SysJobLogController extends BaseController
-{
-    @Autowired
-    private ISysJobLogService jobLogService;
-
-    /**
-     * 鏌ヨ瀹氭椂浠诲姟璋冨害鏃ュ織鍒楄〃
-     */
-    @PreAuthorize("@ss.hasPermi('monitor:job:list')")
-    @GetMapping("/list")
-    public TableDataInfo list(SysJobLog sysJobLog)
-    {
-        startPage();
-        List<SysJobLog> list = jobLogService.selectJobLogList(sysJobLog);
-        return getDataTable(list);
-    }
-
-    /**
-     * 瀵煎嚭瀹氭椂浠诲姟璋冨害鏃ュ織鍒楄〃
-     */
-    @PreAuthorize("@ss.hasPermi('monitor:job:export')")
-    @Log(title = "浠诲姟璋冨害鏃ュ織", businessType = BusinessType.EXPORT)
-    @PostMapping("/export")
-    public void export(HttpServletResponse response, SysJobLog sysJobLog)
-    {
-        List<SysJobLog> list = jobLogService.selectJobLogList(sysJobLog);
-        ExcelUtil<SysJobLog> util = new ExcelUtil<SysJobLog>(SysJobLog.class);
-        util.exportExcel(response, list, "璋冨害鏃ュ織");
-    }
-
-    /**
-     * 鏍规嵁璋冨害缂栧彿鑾峰彇璇︾粏淇℃伅
-     */
-    @PreAuthorize("@ss.hasPermi('monitor:job:query')")
-    @GetMapping(value = "/{jobLogId}")
-    public AjaxResult getInfo(@PathVariable Long jobLogId)
-    {
-        return success(jobLogService.selectJobLogById(jobLogId));
-    }
-
-
-    /**
-     * 鍒犻櫎瀹氭椂浠诲姟璋冨害鏃ュ織
-     */
-    @PreAuthorize("@ss.hasPermi('monitor:job:remove')")
-    @Log(title = "瀹氭椂浠诲姟璋冨害鏃ュ織", businessType = BusinessType.DELETE)
-    @DeleteMapping("/{jobLogIds}")
-    public AjaxResult remove(@PathVariable Long[] jobLogIds)
-    {
-        return toAjax(jobLogService.deleteJobLogByIds(jobLogIds));
-    }
-
-    /**
-     * 娓呯┖瀹氭椂浠诲姟璋冨害鏃ュ織
-     */
-    @PreAuthorize("@ss.hasPermi('monitor:job:remove')")
-    @Log(title = "璋冨害鏃ュ織", businessType = BusinessType.CLEAN)
-    @DeleteMapping("/clean")
-    public AjaxResult clean()
-    {
-        jobLogService.cleanJobLog();
-        return success();
-    }
-}
diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/domain/SysJob.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/domain/SysJob.java
deleted file mode 100644
index 1f49695..0000000
--- a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/domain/SysJob.java
+++ /dev/null
@@ -1,171 +0,0 @@
-package com.ruoyi.quartz.domain;
-
-import java.util.Date;
-import javax.validation.constraints.NotBlank;
-import javax.validation.constraints.Size;
-import org.apache.commons.lang3.builder.ToStringBuilder;
-import org.apache.commons.lang3.builder.ToStringStyle;
-import com.fasterxml.jackson.annotation.JsonFormat;
-import com.ruoyi.common.annotation.Excel;
-import com.ruoyi.common.annotation.Excel.ColumnType;
-import com.ruoyi.common.constant.ScheduleConstants;
-import com.ruoyi.common.core.domain.BaseEntity;
-import com.ruoyi.common.utils.StringUtils;
-import com.ruoyi.quartz.util.CronUtils;
-
-/**
- * 瀹氭椂浠诲姟璋冨害琛� sys_job
- * 
- * @author ruoyi
- */
-public class SysJob extends BaseEntity
-{
-    private static final long serialVersionUID = 1L;
-
-    /** 浠诲姟ID */
-    @Excel(name = "浠诲姟搴忓彿", cellType = ColumnType.NUMERIC)
-    private Long jobId;
-
-    /** 浠诲姟鍚嶇О */
-    @Excel(name = "浠诲姟鍚嶇О")
-    private String jobName;
-
-    /** 浠诲姟缁勫悕 */
-    @Excel(name = "浠诲姟缁勫悕")
-    private String jobGroup;
-
-    /** 璋冪敤鐩爣瀛楃涓� */
-    @Excel(name = "璋冪敤鐩爣瀛楃涓�")
-    private String invokeTarget;
-
-    /** cron鎵ц琛ㄨ揪寮� */
-    @Excel(name = "鎵ц琛ㄨ揪寮� ")
-    private String cronExpression;
-
-    /** cron璁″垝绛栫暐 */
-    @Excel(name = "璁″垝绛栫暐 ", readConverterExp = "0=榛樿,1=绔嬪嵆瑙﹀彂鎵ц,2=瑙﹀彂涓�娆℃墽琛�,3=涓嶈Е鍙戠珛鍗虫墽琛�")
-    private String misfirePolicy = ScheduleConstants.MISFIRE_DEFAULT;
-
-    /** 鏄惁骞跺彂鎵ц锛�0鍏佽 1绂佹锛� */
-    @Excel(name = "骞跺彂鎵ц", readConverterExp = "0=鍏佽,1=绂佹")
-    private String concurrent;
-
-    /** 浠诲姟鐘舵�侊紙0姝e父 1鏆傚仠锛� */
-    @Excel(name = "浠诲姟鐘舵��", readConverterExp = "0=姝e父,1=鏆傚仠")
-    private String status;
-
-    public Long getJobId()
-    {
-        return jobId;
-    }
-
-    public void setJobId(Long jobId)
-    {
-        this.jobId = jobId;
-    }
-
-    @NotBlank(message = "浠诲姟鍚嶇О涓嶈兘涓虹┖")
-    @Size(min = 0, max = 64, message = "浠诲姟鍚嶇О涓嶈兘瓒呰繃64涓瓧绗�")
-    public String getJobName()
-    {
-        return jobName;
-    }
-
-    public void setJobName(String jobName)
-    {
-        this.jobName = jobName;
-    }
-
-    public String getJobGroup()
-    {
-        return jobGroup;
-    }
-
-    public void setJobGroup(String jobGroup)
-    {
-        this.jobGroup = jobGroup;
-    }
-
-    @NotBlank(message = "璋冪敤鐩爣瀛楃涓蹭笉鑳戒负绌�")
-    @Size(min = 0, max = 500, message = "璋冪敤鐩爣瀛楃涓查暱搴︿笉鑳借秴杩�500涓瓧绗�")
-    public String getInvokeTarget()
-    {
-        return invokeTarget;
-    }
-
-    public void setInvokeTarget(String invokeTarget)
-    {
-        this.invokeTarget = invokeTarget;
-    }
-
-    @NotBlank(message = "Cron鎵ц琛ㄨ揪寮忎笉鑳戒负绌�")
-    @Size(min = 0, max = 255, message = "Cron鎵ц琛ㄨ揪寮忎笉鑳借秴杩�255涓瓧绗�")
-    public String getCronExpression()
-    {
-        return cronExpression;
-    }
-
-    public void setCronExpression(String cronExpression)
-    {
-        this.cronExpression = cronExpression;
-    }
-
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
-    public Date getNextValidTime()
-    {
-        if (StringUtils.isNotEmpty(cronExpression))
-        {
-            return CronUtils.getNextExecution(cronExpression);
-        }
-        return null;
-    }
-
-    public String getMisfirePolicy()
-    {
-        return misfirePolicy;
-    }
-
-    public void setMisfirePolicy(String misfirePolicy)
-    {
-        this.misfirePolicy = misfirePolicy;
-    }
-
-    public String getConcurrent()
-    {
-        return concurrent;
-    }
-
-    public void setConcurrent(String concurrent)
-    {
-        this.concurrent = concurrent;
-    }
-
-    public String getStatus()
-    {
-        return status;
-    }
-
-    public void setStatus(String status)
-    {
-        this.status = status;
-    }
-
-    @Override
-    public String toString() {
-        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
-            .append("jobId", getJobId())
-            .append("jobName", getJobName())
-            .append("jobGroup", getJobGroup())
-            .append("cronExpression", getCronExpression())
-            .append("nextValidTime", getNextValidTime())
-            .append("misfirePolicy", getMisfirePolicy())
-            .append("concurrent", getConcurrent())
-            .append("status", getStatus())
-            .append("createBy", getCreateBy())
-            .append("createTime", getCreateTime())
-            .append("updateBy", getUpdateBy())
-            .append("updateTime", getUpdateTime())
-            .append("remark", getRemark())
-            .toString();
-    }
-}
diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/domain/SysJobLog.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/domain/SysJobLog.java
deleted file mode 100644
index 121c035..0000000
--- a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/domain/SysJobLog.java
+++ /dev/null
@@ -1,155 +0,0 @@
-package com.ruoyi.quartz.domain;
-
-import java.util.Date;
-import org.apache.commons.lang3.builder.ToStringBuilder;
-import org.apache.commons.lang3.builder.ToStringStyle;
-import com.ruoyi.common.annotation.Excel;
-import com.ruoyi.common.core.domain.BaseEntity;
-
-/**
- * 瀹氭椂浠诲姟璋冨害鏃ュ織琛� sys_job_log
- * 
- * @author ruoyi
- */
-public class SysJobLog extends BaseEntity
-{
-    private static final long serialVersionUID = 1L;
-
-    /** ID */
-    @Excel(name = "鏃ュ織搴忓彿")
-    private Long jobLogId;
-
-    /** 浠诲姟鍚嶇О */
-    @Excel(name = "浠诲姟鍚嶇О")
-    private String jobName;
-
-    /** 浠诲姟缁勫悕 */
-    @Excel(name = "浠诲姟缁勫悕")
-    private String jobGroup;
-
-    /** 璋冪敤鐩爣瀛楃涓� */
-    @Excel(name = "璋冪敤鐩爣瀛楃涓�")
-    private String invokeTarget;
-
-    /** 鏃ュ織淇℃伅 */
-    @Excel(name = "鏃ュ織淇℃伅")
-    private String jobMessage;
-
-    /** 鎵ц鐘舵�侊紙0姝e父 1澶辫触锛� */
-    @Excel(name = "鎵ц鐘舵��", readConverterExp = "0=姝e父,1=澶辫触")
-    private String status;
-
-    /** 寮傚父淇℃伅 */
-    @Excel(name = "寮傚父淇℃伅")
-    private String exceptionInfo;
-
-    /** 寮�濮嬫椂闂� */
-    private Date startTime;
-
-    /** 鍋滄鏃堕棿 */
-    private Date stopTime;
-
-    public Long getJobLogId()
-    {
-        return jobLogId;
-    }
-
-    public void setJobLogId(Long jobLogId)
-    {
-        this.jobLogId = jobLogId;
-    }
-
-    public String getJobName()
-    {
-        return jobName;
-    }
-
-    public void setJobName(String jobName)
-    {
-        this.jobName = jobName;
-    }
-
-    public String getJobGroup()
-    {
-        return jobGroup;
-    }
-
-    public void setJobGroup(String jobGroup)
-    {
-        this.jobGroup = jobGroup;
-    }
-
-    public String getInvokeTarget()
-    {
-        return invokeTarget;
-    }
-
-    public void setInvokeTarget(String invokeTarget)
-    {
-        this.invokeTarget = invokeTarget;
-    }
-
-    public String getJobMessage()
-    {
-        return jobMessage;
-    }
-
-    public void setJobMessage(String jobMessage)
-    {
-        this.jobMessage = jobMessage;
-    }
-
-    public String getStatus()
-    {
-        return status;
-    }
-
-    public void setStatus(String status)
-    {
-        this.status = status;
-    }
-
-    public String getExceptionInfo()
-    {
-        return exceptionInfo;
-    }
-
-    public void setExceptionInfo(String exceptionInfo)
-    {
-        this.exceptionInfo = exceptionInfo;
-    }
-
-    public Date getStartTime()
-    {
-        return startTime;
-    }
-
-    public void setStartTime(Date startTime)
-    {
-        this.startTime = startTime;
-    }
-    
-    public Date getStopTime()
-    {
-        return stopTime;
-    }
-
-    public void setStopTime(Date stopTime)
-    {
-        this.stopTime = stopTime;
-    }
-
-    @Override
-    public String toString() {
-        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
-            .append("jobLogId", getJobLogId())
-            .append("jobName", getJobName())
-            .append("jobGroup", getJobGroup())
-            .append("jobMessage", getJobMessage())
-            .append("status", getStatus())
-            .append("exceptionInfo", getExceptionInfo())
-            .append("startTime", getStartTime())
-            .append("stopTime", getStopTime())
-            .toString();
-    }
-}
diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/mapper/SysJobLogMapper.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/mapper/SysJobLogMapper.java
deleted file mode 100644
index 727d916..0000000
--- a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/mapper/SysJobLogMapper.java
+++ /dev/null
@@ -1,64 +0,0 @@
-package com.ruoyi.quartz.mapper;
-
-import java.util.List;
-import com.ruoyi.quartz.domain.SysJobLog;
-
-/**
- * 璋冨害浠诲姟鏃ュ織淇℃伅 鏁版嵁灞�
- * 
- * @author ruoyi
- */
-public interface SysJobLogMapper
-{
-    /**
-     * 鑾峰彇quartz璋冨害鍣ㄦ棩蹇楃殑璁″垝浠诲姟
-     * 
-     * @param jobLog 璋冨害鏃ュ織淇℃伅
-     * @return 璋冨害浠诲姟鏃ュ織闆嗗悎
-     */
-    public List<SysJobLog> selectJobLogList(SysJobLog jobLog);
-
-    /**
-     * 鏌ヨ鎵�鏈夎皟搴︿换鍔℃棩蹇�
-     *
-     * @return 璋冨害浠诲姟鏃ュ織鍒楄〃
-     */
-    public List<SysJobLog> selectJobLogAll();
-
-    /**
-     * 閫氳繃璋冨害浠诲姟鏃ュ織ID鏌ヨ璋冨害淇℃伅
-     * 
-     * @param jobLogId 璋冨害浠诲姟鏃ュ織ID
-     * @return 璋冨害浠诲姟鏃ュ織瀵硅薄淇℃伅
-     */
-    public SysJobLog selectJobLogById(Long jobLogId);
-
-    /**
-     * 鏂板浠诲姟鏃ュ織
-     * 
-     * @param jobLog 璋冨害鏃ュ織淇℃伅
-     * @return 缁撴灉
-     */
-    public int insertJobLog(SysJobLog jobLog);
-
-    /**
-     * 鎵归噺鍒犻櫎璋冨害鏃ュ織淇℃伅
-     * 
-     * @param logIds 闇�瑕佸垹闄ょ殑鏁版嵁ID
-     * @return 缁撴灉
-     */
-    public int deleteJobLogByIds(Long[] logIds);
-
-    /**
-     * 鍒犻櫎浠诲姟鏃ュ織
-     * 
-     * @param jobId 璋冨害鏃ュ織ID
-     * @return 缁撴灉
-     */
-    public int deleteJobLogById(Long jobId);
-
-    /**
-     * 娓呯┖浠诲姟鏃ュ織
-     */
-    public void cleanJobLog();
-}
diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/mapper/SysJobMapper.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/mapper/SysJobMapper.java
deleted file mode 100644
index 20f45db..0000000
--- a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/mapper/SysJobMapper.java
+++ /dev/null
@@ -1,67 +0,0 @@
-package com.ruoyi.quartz.mapper;
-
-import java.util.List;
-import com.ruoyi.quartz.domain.SysJob;
-
-/**
- * 璋冨害浠诲姟淇℃伅 鏁版嵁灞�
- * 
- * @author ruoyi
- */
-public interface SysJobMapper
-{
-    /**
-     * 鏌ヨ璋冨害浠诲姟鏃ュ織闆嗗悎
-     * 
-     * @param job 璋冨害淇℃伅
-     * @return 鎿嶄綔鏃ュ織闆嗗悎
-     */
-    public List<SysJob> selectJobList(SysJob job);
-
-    /**
-     * 鏌ヨ鎵�鏈夎皟搴︿换鍔�
-     * 
-     * @return 璋冨害浠诲姟鍒楄〃
-     */
-    public List<SysJob> selectJobAll();
-
-    /**
-     * 閫氳繃璋冨害ID鏌ヨ璋冨害浠诲姟淇℃伅
-     * 
-     * @param jobId 璋冨害ID
-     * @return 瑙掕壊瀵硅薄淇℃伅
-     */
-    public SysJob selectJobById(Long jobId);
-
-    /**
-     * 閫氳繃璋冨害ID鍒犻櫎璋冨害浠诲姟淇℃伅
-     * 
-     * @param jobId 璋冨害ID
-     * @return 缁撴灉
-     */
-    public int deleteJobById(Long jobId);
-
-    /**
-     * 鎵归噺鍒犻櫎璋冨害浠诲姟淇℃伅
-     * 
-     * @param ids 闇�瑕佸垹闄ょ殑鏁版嵁ID
-     * @return 缁撴灉
-     */
-    public int deleteJobByIds(Long[] ids);
-
-    /**
-     * 淇敼璋冨害浠诲姟淇℃伅
-     * 
-     * @param job 璋冨害浠诲姟淇℃伅
-     * @return 缁撴灉
-     */
-    public int updateJob(SysJob job);
-
-    /**
-     * 鏂板璋冨害浠诲姟淇℃伅
-     * 
-     * @param job 璋冨害浠诲姟淇℃伅
-     * @return 缁撴灉
-     */
-    public int insertJob(SysJob job);
-}
diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/ISysJobLogService.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/ISysJobLogService.java
deleted file mode 100644
index 8546792..0000000
--- a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/ISysJobLogService.java
+++ /dev/null
@@ -1,56 +0,0 @@
-package com.ruoyi.quartz.service;
-
-import java.util.List;
-import com.ruoyi.quartz.domain.SysJobLog;
-
-/**
- * 瀹氭椂浠诲姟璋冨害鏃ュ織淇℃伅淇℃伅 鏈嶅姟灞�
- * 
- * @author ruoyi
- */
-public interface ISysJobLogService
-{
-    /**
-     * 鑾峰彇quartz璋冨害鍣ㄦ棩蹇楃殑璁″垝浠诲姟
-     * 
-     * @param jobLog 璋冨害鏃ュ織淇℃伅
-     * @return 璋冨害浠诲姟鏃ュ織闆嗗悎
-     */
-    public List<SysJobLog> selectJobLogList(SysJobLog jobLog);
-
-    /**
-     * 閫氳繃璋冨害浠诲姟鏃ュ織ID鏌ヨ璋冨害淇℃伅
-     * 
-     * @param jobLogId 璋冨害浠诲姟鏃ュ織ID
-     * @return 璋冨害浠诲姟鏃ュ織瀵硅薄淇℃伅
-     */
-    public SysJobLog selectJobLogById(Long jobLogId);
-
-    /**
-     * 鏂板浠诲姟鏃ュ織
-     * 
-     * @param jobLog 璋冨害鏃ュ織淇℃伅
-     */
-    public void addJobLog(SysJobLog jobLog);
-
-    /**
-     * 鎵归噺鍒犻櫎璋冨害鏃ュ織淇℃伅
-     * 
-     * @param logIds 闇�瑕佸垹闄ょ殑鏃ュ織ID
-     * @return 缁撴灉
-     */
-    public int deleteJobLogByIds(Long[] logIds);
-
-    /**
-     * 鍒犻櫎浠诲姟鏃ュ織
-     * 
-     * @param jobId 璋冨害鏃ュ織ID
-     * @return 缁撴灉
-     */
-    public int deleteJobLogById(Long jobId);
-
-    /**
-     * 娓呯┖浠诲姟鏃ュ織
-     */
-    public void cleanJobLog();
-}
diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/ISysJobService.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/ISysJobService.java
deleted file mode 100644
index 437ade8..0000000
--- a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/ISysJobService.java
+++ /dev/null
@@ -1,102 +0,0 @@
-package com.ruoyi.quartz.service;
-
-import java.util.List;
-import org.quartz.SchedulerException;
-import com.ruoyi.common.exception.job.TaskException;
-import com.ruoyi.quartz.domain.SysJob;
-
-/**
- * 瀹氭椂浠诲姟璋冨害淇℃伅淇℃伅 鏈嶅姟灞�
- * 
- * @author ruoyi
- */
-public interface ISysJobService
-{
-    /**
-     * 鑾峰彇quartz璋冨害鍣ㄧ殑璁″垝浠诲姟
-     * 
-     * @param job 璋冨害淇℃伅
-     * @return 璋冨害浠诲姟闆嗗悎
-     */
-    public List<SysJob> selectJobList(SysJob job);
-
-    /**
-     * 閫氳繃璋冨害浠诲姟ID鏌ヨ璋冨害淇℃伅
-     * 
-     * @param jobId 璋冨害浠诲姟ID
-     * @return 璋冨害浠诲姟瀵硅薄淇℃伅
-     */
-    public SysJob selectJobById(Long jobId);
-
-    /**
-     * 鏆傚仠浠诲姟
-     * 
-     * @param job 璋冨害淇℃伅
-     * @return 缁撴灉
-     */
-    public int pauseJob(SysJob job) throws SchedulerException;
-
-    /**
-     * 鎭㈠浠诲姟
-     * 
-     * @param job 璋冨害淇℃伅
-     * @return 缁撴灉
-     */
-    public int resumeJob(SysJob job) throws SchedulerException;
-
-    /**
-     * 鍒犻櫎浠诲姟鍚庯紝鎵�瀵瑰簲鐨則rigger涔熷皢琚垹闄�
-     * 
-     * @param job 璋冨害淇℃伅
-     * @return 缁撴灉
-     */
-    public int deleteJob(SysJob job) throws SchedulerException;
-
-    /**
-     * 鎵归噺鍒犻櫎璋冨害淇℃伅
-     * 
-     * @param jobIds 闇�瑕佸垹闄ょ殑浠诲姟ID
-     * @return 缁撴灉
-     */
-    public void deleteJobByIds(Long[] jobIds) throws SchedulerException;
-
-    /**
-     * 浠诲姟璋冨害鐘舵�佷慨鏀�
-     * 
-     * @param job 璋冨害淇℃伅
-     * @return 缁撴灉
-     */
-    public int changeStatus(SysJob job) throws SchedulerException;
-
-    /**
-     * 绔嬪嵆杩愯浠诲姟
-     * 
-     * @param job 璋冨害淇℃伅
-     * @return 缁撴灉
-     */
-    public boolean run(SysJob job) throws SchedulerException;
-
-    /**
-     * 鏂板浠诲姟
-     * 
-     * @param job 璋冨害淇℃伅
-     * @return 缁撴灉
-     */
-    public int insertJob(SysJob job) throws SchedulerException, TaskException;
-
-    /**
-     * 鏇存柊浠诲姟
-     * 
-     * @param job 璋冨害淇℃伅
-     * @return 缁撴灉
-     */
-    public int updateJob(SysJob job) throws SchedulerException, TaskException;
-
-    /**
-     * 鏍¢獙cron琛ㄨ揪寮忔槸鍚︽湁鏁�
-     * 
-     * @param cronExpression 琛ㄨ揪寮�
-     * @return 缁撴灉
-     */
-    public boolean checkCronExpressionIsValid(String cronExpression);
-}
diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/impl/SysJobLogServiceImpl.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/impl/SysJobLogServiceImpl.java
deleted file mode 100644
index 812eed7..0000000
--- a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/impl/SysJobLogServiceImpl.java
+++ /dev/null
@@ -1,87 +0,0 @@
-package com.ruoyi.quartz.service.impl;
-
-import java.util.List;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-import com.ruoyi.quartz.domain.SysJobLog;
-import com.ruoyi.quartz.mapper.SysJobLogMapper;
-import com.ruoyi.quartz.service.ISysJobLogService;
-
-/**
- * 瀹氭椂浠诲姟璋冨害鏃ュ織淇℃伅 鏈嶅姟灞�
- * 
- * @author ruoyi
- */
-@Service
-public class SysJobLogServiceImpl implements ISysJobLogService
-{
-    @Autowired
-    private SysJobLogMapper jobLogMapper;
-
-    /**
-     * 鑾峰彇quartz璋冨害鍣ㄦ棩蹇楃殑璁″垝浠诲姟
-     * 
-     * @param jobLog 璋冨害鏃ュ織淇℃伅
-     * @return 璋冨害浠诲姟鏃ュ織闆嗗悎
-     */
-    @Override
-    public List<SysJobLog> selectJobLogList(SysJobLog jobLog)
-    {
-        return jobLogMapper.selectJobLogList(jobLog);
-    }
-
-    /**
-     * 閫氳繃璋冨害浠诲姟鏃ュ織ID鏌ヨ璋冨害淇℃伅
-     * 
-     * @param jobLogId 璋冨害浠诲姟鏃ュ織ID
-     * @return 璋冨害浠诲姟鏃ュ織瀵硅薄淇℃伅
-     */
-    @Override
-    public SysJobLog selectJobLogById(Long jobLogId)
-    {
-        return jobLogMapper.selectJobLogById(jobLogId);
-    }
-
-    /**
-     * 鏂板浠诲姟鏃ュ織
-     * 
-     * @param jobLog 璋冨害鏃ュ織淇℃伅
-     */
-    @Override
-    public void addJobLog(SysJobLog jobLog)
-    {
-        jobLogMapper.insertJobLog(jobLog);
-    }
-
-    /**
-     * 鎵归噺鍒犻櫎璋冨害鏃ュ織淇℃伅
-     * 
-     * @param logIds 闇�瑕佸垹闄ょ殑鏁版嵁ID
-     * @return 缁撴灉
-     */
-    @Override
-    public int deleteJobLogByIds(Long[] logIds)
-    {
-        return jobLogMapper.deleteJobLogByIds(logIds);
-    }
-
-    /**
-     * 鍒犻櫎浠诲姟鏃ュ織
-     * 
-     * @param jobId 璋冨害鏃ュ織ID
-     */
-    @Override
-    public int deleteJobLogById(Long jobId)
-    {
-        return jobLogMapper.deleteJobLogById(jobId);
-    }
-
-    /**
-     * 娓呯┖浠诲姟鏃ュ織
-     */
-    @Override
-    public void cleanJobLog()
-    {
-        jobLogMapper.cleanJobLog();
-    }
-}
diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/impl/SysJobServiceImpl.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/impl/SysJobServiceImpl.java
deleted file mode 100644
index 77fdbb5..0000000
--- a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/impl/SysJobServiceImpl.java
+++ /dev/null
@@ -1,261 +0,0 @@
-package com.ruoyi.quartz.service.impl;
-
-import java.util.List;
-import javax.annotation.PostConstruct;
-import org.quartz.JobDataMap;
-import org.quartz.JobKey;
-import org.quartz.Scheduler;
-import org.quartz.SchedulerException;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-import com.ruoyi.common.constant.ScheduleConstants;
-import com.ruoyi.common.exception.job.TaskException;
-import com.ruoyi.quartz.domain.SysJob;
-import com.ruoyi.quartz.mapper.SysJobMapper;
-import com.ruoyi.quartz.service.ISysJobService;
-import com.ruoyi.quartz.util.CronUtils;
-import com.ruoyi.quartz.util.ScheduleUtils;
-
-/**
- * 瀹氭椂浠诲姟璋冨害淇℃伅 鏈嶅姟灞�
- * 
- * @author ruoyi
- */
-@Service
-public class SysJobServiceImpl implements ISysJobService
-{
-    @Autowired
-    private Scheduler scheduler;
-
-    @Autowired
-    private SysJobMapper jobMapper;
-
-    /**
-     * 椤圭洰鍚姩鏃讹紝鍒濆鍖栧畾鏃跺櫒 涓昏鏄槻姝㈡墜鍔ㄤ慨鏀规暟鎹簱瀵艰嚧鏈悓姝ュ埌瀹氭椂浠诲姟澶勭悊锛堟敞锛氫笉鑳芥墜鍔ㄤ慨鏀规暟鎹簱ID鍜屼换鍔$粍鍚嶏紝鍚﹀垯浼氬鑷磋剰鏁版嵁锛�
-     */
-    @PostConstruct
-    public void init() throws SchedulerException, TaskException
-    {
-        scheduler.clear();
-        List<SysJob> jobList = jobMapper.selectJobAll();
-        for (SysJob job : jobList)
-        {
-            ScheduleUtils.createScheduleJob(scheduler, job);
-        }
-    }
-
-    /**
-     * 鑾峰彇quartz璋冨害鍣ㄧ殑璁″垝浠诲姟鍒楄〃
-     * 
-     * @param job 璋冨害淇℃伅
-     * @return
-     */
-    @Override
-    public List<SysJob> selectJobList(SysJob job)
-    {
-        return jobMapper.selectJobList(job);
-    }
-
-    /**
-     * 閫氳繃璋冨害浠诲姟ID鏌ヨ璋冨害淇℃伅
-     * 
-     * @param jobId 璋冨害浠诲姟ID
-     * @return 璋冨害浠诲姟瀵硅薄淇℃伅
-     */
-    @Override
-    public SysJob selectJobById(Long jobId)
-    {
-        return jobMapper.selectJobById(jobId);
-    }
-
-    /**
-     * 鏆傚仠浠诲姟
-     * 
-     * @param job 璋冨害淇℃伅
-     */
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public int pauseJob(SysJob job) throws SchedulerException
-    {
-        Long jobId = job.getJobId();
-        String jobGroup = job.getJobGroup();
-        job.setStatus(ScheduleConstants.Status.PAUSE.getValue());
-        int rows = jobMapper.updateJob(job);
-        if (rows > 0)
-        {
-            scheduler.pauseJob(ScheduleUtils.getJobKey(jobId, jobGroup));
-        }
-        return rows;
-    }
-
-    /**
-     * 鎭㈠浠诲姟
-     * 
-     * @param job 璋冨害淇℃伅
-     */
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public int resumeJob(SysJob job) throws SchedulerException
-    {
-        Long jobId = job.getJobId();
-        String jobGroup = job.getJobGroup();
-        job.setStatus(ScheduleConstants.Status.NORMAL.getValue());
-        int rows = jobMapper.updateJob(job);
-        if (rows > 0)
-        {
-            scheduler.resumeJob(ScheduleUtils.getJobKey(jobId, jobGroup));
-        }
-        return rows;
-    }
-
-    /**
-     * 鍒犻櫎浠诲姟鍚庯紝鎵�瀵瑰簲鐨則rigger涔熷皢琚垹闄�
-     * 
-     * @param job 璋冨害淇℃伅
-     */
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public int deleteJob(SysJob job) throws SchedulerException
-    {
-        Long jobId = job.getJobId();
-        String jobGroup = job.getJobGroup();
-        int rows = jobMapper.deleteJobById(jobId);
-        if (rows > 0)
-        {
-            scheduler.deleteJob(ScheduleUtils.getJobKey(jobId, jobGroup));
-        }
-        return rows;
-    }
-
-    /**
-     * 鎵归噺鍒犻櫎璋冨害淇℃伅
-     * 
-     * @param jobIds 闇�瑕佸垹闄ょ殑浠诲姟ID
-     * @return 缁撴灉
-     */
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public void deleteJobByIds(Long[] jobIds) throws SchedulerException
-    {
-        for (Long jobId : jobIds)
-        {
-            SysJob job = jobMapper.selectJobById(jobId);
-            deleteJob(job);
-        }
-    }
-
-    /**
-     * 浠诲姟璋冨害鐘舵�佷慨鏀�
-     * 
-     * @param job 璋冨害淇℃伅
-     */
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public int changeStatus(SysJob job) throws SchedulerException
-    {
-        int rows = 0;
-        String status = job.getStatus();
-        if (ScheduleConstants.Status.NORMAL.getValue().equals(status))
-        {
-            rows = resumeJob(job);
-        }
-        else if (ScheduleConstants.Status.PAUSE.getValue().equals(status))
-        {
-            rows = pauseJob(job);
-        }
-        return rows;
-    }
-
-    /**
-     * 绔嬪嵆杩愯浠诲姟
-     * 
-     * @param job 璋冨害淇℃伅
-     */
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public boolean run(SysJob job) throws SchedulerException
-    {
-        boolean result = false;
-        Long jobId = job.getJobId();
-        String jobGroup = job.getJobGroup();
-        SysJob properties = selectJobById(job.getJobId());
-        // 鍙傛暟
-        JobDataMap dataMap = new JobDataMap();
-        dataMap.put(ScheduleConstants.TASK_PROPERTIES, properties);
-        JobKey jobKey = ScheduleUtils.getJobKey(jobId, jobGroup);
-        if (scheduler.checkExists(jobKey))
-        {
-            result = true;
-            scheduler.triggerJob(jobKey, dataMap);
-        }
-        return result;
-    }
-
-    /**
-     * 鏂板浠诲姟
-     * 
-     * @param job 璋冨害淇℃伅 璋冨害淇℃伅
-     */
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public int insertJob(SysJob job) throws SchedulerException, TaskException
-    {
-        job.setStatus(ScheduleConstants.Status.PAUSE.getValue());
-        int rows = jobMapper.insertJob(job);
-        if (rows > 0)
-        {
-            ScheduleUtils.createScheduleJob(scheduler, job);
-        }
-        return rows;
-    }
-
-    /**
-     * 鏇存柊浠诲姟鐨勬椂闂磋〃杈惧紡
-     * 
-     * @param job 璋冨害淇℃伅
-     */
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public int updateJob(SysJob job) throws SchedulerException, TaskException
-    {
-        SysJob properties = selectJobById(job.getJobId());
-        int rows = jobMapper.updateJob(job);
-        if (rows > 0)
-        {
-            updateSchedulerJob(job, properties.getJobGroup());
-        }
-        return rows;
-    }
-
-    /**
-     * 鏇存柊浠诲姟
-     * 
-     * @param job 浠诲姟瀵硅薄
-     * @param jobGroup 浠诲姟缁勫悕
-     */
-    public void updateSchedulerJob(SysJob job, String jobGroup) throws SchedulerException, TaskException
-    {
-        Long jobId = job.getJobId();
-        // 鍒ゆ柇鏄惁瀛樺湪
-        JobKey jobKey = ScheduleUtils.getJobKey(jobId, jobGroup);
-        if (scheduler.checkExists(jobKey))
-        {
-            // 闃叉鍒涘缓鏃跺瓨鍦ㄦ暟鎹棶棰� 鍏堢Щ闄わ紝鐒跺悗鍦ㄦ墽琛屽垱寤烘搷浣�
-            scheduler.deleteJob(jobKey);
-        }
-        ScheduleUtils.createScheduleJob(scheduler, job);
-    }
-
-    /**
-     * 鏍¢獙cron琛ㄨ揪寮忔槸鍚︽湁鏁�
-     * 
-     * @param cronExpression 琛ㄨ揪寮�
-     * @return 缁撴灉
-     */
-    @Override
-    public boolean checkCronExpressionIsValid(String cronExpression)
-    {
-        return CronUtils.isValid(cronExpression);
-    }
-}
diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/RyTask.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/RyTask.java
deleted file mode 100644
index 853243b..0000000
--- a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/RyTask.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package com.ruoyi.quartz.task;
-
-import org.springframework.stereotype.Component;
-import com.ruoyi.common.utils.StringUtils;
-
-/**
- * 瀹氭椂浠诲姟璋冨害娴嬭瘯
- * 
- * @author ruoyi
- */
-@Component("ryTask")
-public class RyTask
-{
-    public void ryMultipleParams(String s, Boolean b, Long l, Double d, Integer i)
-    {
-        System.out.println(StringUtils.format("鎵ц澶氬弬鏂规硶锛� 瀛楃涓茬被鍨媨}锛屽竷灏旂被鍨媨}锛岄暱鏁村瀷{}锛屾诞鐐瑰瀷{}锛屾暣褰}", s, b, l, d, i));
-    }
-
-    public void ryParams(String params)
-    {
-        System.out.println("鎵ц鏈夊弬鏂规硶锛�" + params);
-    }
-
-    public void ryNoParams()
-    {
-        System.out.println("鎵ц鏃犲弬鏂规硶");
-    }
-}
diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/util/AbstractQuartzJob.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/util/AbstractQuartzJob.java
deleted file mode 100644
index 731a5eb..0000000
--- a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/util/AbstractQuartzJob.java
+++ /dev/null
@@ -1,107 +0,0 @@
-package com.ruoyi.quartz.util;
-
-import java.util.Date;
-import org.quartz.Job;
-import org.quartz.JobExecutionContext;
-import org.quartz.JobExecutionException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import com.ruoyi.common.constant.Constants;
-import com.ruoyi.common.constant.ScheduleConstants;
-import com.ruoyi.common.utils.ExceptionUtil;
-import com.ruoyi.common.utils.StringUtils;
-import com.ruoyi.common.utils.bean.BeanUtils;
-import com.ruoyi.common.utils.spring.SpringUtils;
-import com.ruoyi.quartz.domain.SysJob;
-import com.ruoyi.quartz.domain.SysJobLog;
-import com.ruoyi.quartz.service.ISysJobLogService;
-
-/**
- * 鎶借薄quartz璋冪敤
- *
- * @author ruoyi
- */
-public abstract class AbstractQuartzJob implements Job
-{
-    private static final Logger log = LoggerFactory.getLogger(AbstractQuartzJob.class);
-
-    /**
-     * 绾跨▼鏈湴鍙橀噺
-     */
-    private static ThreadLocal<Date> threadLocal = new ThreadLocal<>();
-
-    @Override
-    public void execute(JobExecutionContext context) throws JobExecutionException
-    {
-        SysJob sysJob = new SysJob();
-        BeanUtils.copyBeanProp(sysJob, context.getMergedJobDataMap().get(ScheduleConstants.TASK_PROPERTIES));
-        try
-        {
-            before(context, sysJob);
-            if (sysJob != null)
-            {
-                doExecute(context, sysJob);
-            }
-            after(context, sysJob, null);
-        }
-        catch (Exception e)
-        {
-            log.error("浠诲姟鎵ц寮傚父  - 锛�", e);
-            after(context, sysJob, e);
-        }
-    }
-
-    /**
-     * 鎵ц鍓�
-     *
-     * @param context 宸ヤ綔鎵ц涓婁笅鏂囧璞�
-     * @param sysJob 绯荤粺璁″垝浠诲姟
-     */
-    protected void before(JobExecutionContext context, SysJob sysJob)
-    {
-        threadLocal.set(new Date());
-    }
-
-    /**
-     * 鎵ц鍚�
-     *
-     * @param context 宸ヤ綔鎵ц涓婁笅鏂囧璞�
-     * @param sysJob 绯荤粺璁″垝浠诲姟
-     */
-    protected void after(JobExecutionContext context, SysJob sysJob, Exception e)
-    {
-        Date startTime = threadLocal.get();
-        threadLocal.remove();
-
-        final SysJobLog sysJobLog = new SysJobLog();
-        sysJobLog.setJobName(sysJob.getJobName());
-        sysJobLog.setJobGroup(sysJob.getJobGroup());
-        sysJobLog.setInvokeTarget(sysJob.getInvokeTarget());
-        sysJobLog.setStartTime(startTime);
-        sysJobLog.setStopTime(new Date());
-        long runMs = sysJobLog.getStopTime().getTime() - sysJobLog.getStartTime().getTime();
-        sysJobLog.setJobMessage(sysJobLog.getJobName() + " 鎬诲叡鑰楁椂锛�" + runMs + "姣");
-        if (e != null)
-        {
-            sysJobLog.setStatus(Constants.FAIL);
-            String errorMsg = StringUtils.substring(ExceptionUtil.getExceptionMessage(e), 0, 2000);
-            sysJobLog.setExceptionInfo(errorMsg);
-        }
-        else
-        {
-            sysJobLog.setStatus(Constants.SUCCESS);
-        }
-
-        // 鍐欏叆鏁版嵁搴撳綋涓�
-        SpringUtils.getBean(ISysJobLogService.class).addJobLog(sysJobLog);
-    }
-
-    /**
-     * 鎵ц鏂规硶锛岀敱瀛愮被閲嶈浇
-     *
-     * @param context 宸ヤ綔鎵ц涓婁笅鏂囧璞�
-     * @param sysJob 绯荤粺璁″垝浠诲姟
-     * @throws Exception 鎵ц杩囩▼涓殑寮傚父
-     */
-    protected abstract void doExecute(JobExecutionContext context, SysJob sysJob) throws Exception;
-}
diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/util/CronUtils.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/util/CronUtils.java
deleted file mode 100644
index dd53839..0000000
--- a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/util/CronUtils.java
+++ /dev/null
@@ -1,63 +0,0 @@
-package com.ruoyi.quartz.util;
-
-import java.text.ParseException;
-import java.util.Date;
-import org.quartz.CronExpression;
-
-/**
- * cron琛ㄨ揪寮忓伐鍏风被
- * 
- * @author ruoyi
- *
- */
-public class CronUtils
-{
-    /**
-     * 杩斿洖涓�涓竷灏斿�间唬琛ㄤ竴涓粰瀹氱殑Cron琛ㄨ揪寮忕殑鏈夋晥鎬�
-     *
-     * @param cronExpression Cron琛ㄨ揪寮�
-     * @return boolean 琛ㄨ揪寮忔槸鍚︽湁鏁�
-     */
-    public static boolean isValid(String cronExpression)
-    {
-        return CronExpression.isValidExpression(cronExpression);
-    }
-
-    /**
-     * 杩斿洖涓�涓瓧绗︿覆鍊�,琛ㄧず璇ユ秷鎭棤鏁圕ron琛ㄨ揪寮忕粰鍑烘湁鏁堟��
-     *
-     * @param cronExpression Cron琛ㄨ揪寮�
-     * @return String 鏃犳晥鏃惰繑鍥炶〃杈惧紡閿欒鎻忚堪,濡傛灉鏈夋晥杩斿洖null
-     */
-    public static String getInvalidMessage(String cronExpression)
-    {
-        try
-        {
-            new CronExpression(cronExpression);
-            return null;
-        }
-        catch (ParseException pe)
-        {
-            return pe.getMessage();
-        }
-    }
-
-    /**
-     * 杩斿洖涓嬩竴涓墽琛屾椂闂存牴鎹粰瀹氱殑Cron琛ㄨ揪寮�
-     *
-     * @param cronExpression Cron琛ㄨ揪寮�
-     * @return Date 涓嬫Cron琛ㄨ揪寮忔墽琛屾椂闂�
-     */
-    public static Date getNextExecution(String cronExpression)
-    {
-        try
-        {
-            CronExpression cron = new CronExpression(cronExpression);
-            return cron.getNextValidTimeAfter(new Date(System.currentTimeMillis()));
-        }
-        catch (ParseException e)
-        {
-            throw new IllegalArgumentException(e.getMessage());
-        }
-    }
-}
diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/util/JobInvokeUtil.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/util/JobInvokeUtil.java
deleted file mode 100644
index e3dc62c..0000000
--- a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/util/JobInvokeUtil.java
+++ /dev/null
@@ -1,182 +0,0 @@
-package com.ruoyi.quartz.util;
-
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.util.LinkedList;
-import java.util.List;
-import com.ruoyi.common.utils.StringUtils;
-import com.ruoyi.common.utils.spring.SpringUtils;
-import com.ruoyi.quartz.domain.SysJob;
-
-/**
- * 浠诲姟鎵ц宸ュ叿
- *
- * @author ruoyi
- */
-public class JobInvokeUtil
-{
-    /**
-     * 鎵ц鏂规硶
-     *
-     * @param sysJob 绯荤粺浠诲姟
-     */
-    public static void invokeMethod(SysJob sysJob) throws Exception
-    {
-        String invokeTarget = sysJob.getInvokeTarget();
-        String beanName = getBeanName(invokeTarget);
-        String methodName = getMethodName(invokeTarget);
-        List<Object[]> methodParams = getMethodParams(invokeTarget);
-
-        if (!isValidClassName(beanName))
-        {
-            Object bean = SpringUtils.getBean(beanName);
-            invokeMethod(bean, methodName, methodParams);
-        }
-        else
-        {
-            Object bean = Class.forName(beanName).getDeclaredConstructor().newInstance();
-            invokeMethod(bean, methodName, methodParams);
-        }
-    }
-
-    /**
-     * 璋冪敤浠诲姟鏂规硶
-     *
-     * @param bean 鐩爣瀵硅薄
-     * @param methodName 鏂规硶鍚嶇О
-     * @param methodParams 鏂规硶鍙傛暟
-     */
-    private static void invokeMethod(Object bean, String methodName, List<Object[]> methodParams)
-            throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException,
-            InvocationTargetException
-    {
-        if (StringUtils.isNotNull(methodParams) && methodParams.size() > 0)
-        {
-            Method method = bean.getClass().getMethod(methodName, getMethodParamsType(methodParams));
-            method.invoke(bean, getMethodParamsValue(methodParams));
-        }
-        else
-        {
-            Method method = bean.getClass().getMethod(methodName);
-            method.invoke(bean);
-        }
-    }
-
-    /**
-     * 鏍¢獙鏄惁涓轰负class鍖呭悕
-     * 
-     * @param invokeTarget 鍚嶇О
-     * @return true鏄� false鍚�
-     */
-    public static boolean isValidClassName(String invokeTarget)
-    {
-        return StringUtils.countMatches(invokeTarget, ".") > 1;
-    }
-
-    /**
-     * 鑾峰彇bean鍚嶇О
-     * 
-     * @param invokeTarget 鐩爣瀛楃涓�
-     * @return bean鍚嶇О
-     */
-    public static String getBeanName(String invokeTarget)
-    {
-        String beanName = StringUtils.substringBefore(invokeTarget, "(");
-        return StringUtils.substringBeforeLast(beanName, ".");
-    }
-
-    /**
-     * 鑾峰彇bean鏂规硶
-     * 
-     * @param invokeTarget 鐩爣瀛楃涓�
-     * @return method鏂规硶
-     */
-    public static String getMethodName(String invokeTarget)
-    {
-        String methodName = StringUtils.substringBefore(invokeTarget, "(");
-        return StringUtils.substringAfterLast(methodName, ".");
-    }
-
-    /**
-     * 鑾峰彇method鏂规硶鍙傛暟鐩稿叧鍒楄〃
-     * 
-     * @param invokeTarget 鐩爣瀛楃涓�
-     * @return method鏂规硶鐩稿叧鍙傛暟鍒楄〃
-     */
-    public static List<Object[]> getMethodParams(String invokeTarget)
-    {
-        String methodStr = StringUtils.substringBetween(invokeTarget, "(", ")");
-        if (StringUtils.isEmpty(methodStr))
-        {
-            return null;
-        }
-        String[] methodParams = methodStr.split(",(?=([^\"']*[\"'][^\"']*[\"'])*[^\"']*$)");
-        List<Object[]> classs = new LinkedList<>();
-        for (int i = 0; i < methodParams.length; i++)
-        {
-            String str = StringUtils.trimToEmpty(methodParams[i]);
-            // String瀛楃涓茬被鍨嬶紝浠�'鎴�"寮�澶�
-            if (StringUtils.startsWithAny(str, "'", "\""))
-            {
-                classs.add(new Object[] { StringUtils.substring(str, 1, str.length() - 1), String.class });
-            }
-            // boolean甯冨皵绫诲瀷锛岀瓑浜巘rue鎴栬�協alse
-            else if ("true".equalsIgnoreCase(str) || "false".equalsIgnoreCase(str))
-            {
-                classs.add(new Object[] { Boolean.valueOf(str), Boolean.class });
-            }
-            // long闀挎暣褰紝浠缁撳熬
-            else if (StringUtils.endsWith(str, "L"))
-            {
-                classs.add(new Object[] { Long.valueOf(StringUtils.substring(str, 0, str.length() - 1)), Long.class });
-            }
-            // double娴偣绫诲瀷锛屼互D缁撳熬
-            else if (StringUtils.endsWith(str, "D"))
-            {
-                classs.add(new Object[] { Double.valueOf(StringUtils.substring(str, 0, str.length() - 1)), Double.class });
-            }
-            // 鍏朵粬绫诲瀷褰掔被涓烘暣褰�
-            else
-            {
-                classs.add(new Object[] { Integer.valueOf(str), Integer.class });
-            }
-        }
-        return classs;
-    }
-
-    /**
-     * 鑾峰彇鍙傛暟绫诲瀷
-     * 
-     * @param methodParams 鍙傛暟鐩稿叧鍒楄〃
-     * @return 鍙傛暟绫诲瀷鍒楄〃
-     */
-    public static Class<?>[] getMethodParamsType(List<Object[]> methodParams)
-    {
-        Class<?>[] classs = new Class<?>[methodParams.size()];
-        int index = 0;
-        for (Object[] os : methodParams)
-        {
-            classs[index] = (Class<?>) os[1];
-            index++;
-        }
-        return classs;
-    }
-
-    /**
-     * 鑾峰彇鍙傛暟鍊�
-     * 
-     * @param methodParams 鍙傛暟鐩稿叧鍒楄〃
-     * @return 鍙傛暟鍊煎垪琛�
-     */
-    public static Object[] getMethodParamsValue(List<Object[]> methodParams)
-    {
-        Object[] classs = new Object[methodParams.size()];
-        int index = 0;
-        for (Object[] os : methodParams)
-        {
-            classs[index] = (Object) os[0];
-            index++;
-        }
-        return classs;
-    }
-}
diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/util/QuartzDisallowConcurrentExecution.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/util/QuartzDisallowConcurrentExecution.java
deleted file mode 100644
index 5e13558..0000000
--- a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/util/QuartzDisallowConcurrentExecution.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package com.ruoyi.quartz.util;
-
-import org.quartz.DisallowConcurrentExecution;
-import org.quartz.JobExecutionContext;
-import com.ruoyi.quartz.domain.SysJob;
-
-/**
- * 瀹氭椂浠诲姟澶勭悊锛堢姝㈠苟鍙戞墽琛岋級
- * 
- * @author ruoyi
- *
- */
-@DisallowConcurrentExecution
-public class QuartzDisallowConcurrentExecution extends AbstractQuartzJob
-{
-    @Override
-    protected void doExecute(JobExecutionContext context, SysJob sysJob) throws Exception
-    {
-        JobInvokeUtil.invokeMethod(sysJob);
-    }
-}
diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/util/QuartzJobExecution.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/util/QuartzJobExecution.java
deleted file mode 100644
index e975326..0000000
--- a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/util/QuartzJobExecution.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package com.ruoyi.quartz.util;
-
-import org.quartz.JobExecutionContext;
-import com.ruoyi.quartz.domain.SysJob;
-
-/**
- * 瀹氭椂浠诲姟澶勭悊锛堝厑璁稿苟鍙戞墽琛岋級
- * 
- * @author ruoyi
- *
- */
-public class QuartzJobExecution extends AbstractQuartzJob
-{
-    @Override
-    protected void doExecute(JobExecutionContext context, SysJob sysJob) throws Exception
-    {
-        JobInvokeUtil.invokeMethod(sysJob);
-    }
-}
diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/util/ScheduleUtils.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/util/ScheduleUtils.java
deleted file mode 100644
index 21fedae..0000000
--- a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/util/ScheduleUtils.java
+++ /dev/null
@@ -1,141 +0,0 @@
-package com.ruoyi.quartz.util;
-
-import org.quartz.CronScheduleBuilder;
-import org.quartz.CronTrigger;
-import org.quartz.Job;
-import org.quartz.JobBuilder;
-import org.quartz.JobDetail;
-import org.quartz.JobKey;
-import org.quartz.Scheduler;
-import org.quartz.SchedulerException;
-import org.quartz.TriggerBuilder;
-import org.quartz.TriggerKey;
-import com.ruoyi.common.constant.Constants;
-import com.ruoyi.common.constant.ScheduleConstants;
-import com.ruoyi.common.exception.job.TaskException;
-import com.ruoyi.common.exception.job.TaskException.Code;
-import com.ruoyi.common.utils.StringUtils;
-import com.ruoyi.common.utils.spring.SpringUtils;
-import com.ruoyi.quartz.domain.SysJob;
-
-/**
- * 瀹氭椂浠诲姟宸ュ叿绫�
- * 
- * @author ruoyi
- *
- */
-public class ScheduleUtils
-{
-    /**
-     * 寰楀埌quartz浠诲姟绫�
-     *
-     * @param sysJob 鎵ц璁″垝
-     * @return 鍏蜂綋鎵ц浠诲姟绫�
-     */
-    private static Class<? extends Job> getQuartzJobClass(SysJob sysJob)
-    {
-        boolean isConcurrent = "0".equals(sysJob.getConcurrent());
-        return isConcurrent ? QuartzJobExecution.class : QuartzDisallowConcurrentExecution.class;
-    }
-
-    /**
-     * 鏋勫缓浠诲姟瑙﹀彂瀵硅薄
-     */
-    public static TriggerKey getTriggerKey(Long jobId, String jobGroup)
-    {
-        return TriggerKey.triggerKey(ScheduleConstants.TASK_CLASS_NAME + jobId, jobGroup);
-    }
-
-    /**
-     * 鏋勫缓浠诲姟閿璞�
-     */
-    public static JobKey getJobKey(Long jobId, String jobGroup)
-    {
-        return JobKey.jobKey(ScheduleConstants.TASK_CLASS_NAME + jobId, jobGroup);
-    }
-
-    /**
-     * 鍒涘缓瀹氭椂浠诲姟
-     */
-    public static void createScheduleJob(Scheduler scheduler, SysJob job) throws SchedulerException, TaskException
-    {
-        Class<? extends Job> jobClass = getQuartzJobClass(job);
-        // 鏋勫缓job淇℃伅
-        Long jobId = job.getJobId();
-        String jobGroup = job.getJobGroup();
-        JobDetail jobDetail = JobBuilder.newJob(jobClass).withIdentity(getJobKey(jobId, jobGroup)).build();
-
-        // 琛ㄨ揪寮忚皟搴︽瀯寤哄櫒
-        CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(job.getCronExpression());
-        cronScheduleBuilder = handleCronScheduleMisfirePolicy(job, cronScheduleBuilder);
-
-        // 鎸夋柊鐨刢ronExpression琛ㄨ揪寮忔瀯寤轰竴涓柊鐨則rigger
-        CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(getTriggerKey(jobId, jobGroup))
-                .withSchedule(cronScheduleBuilder).build();
-
-        // 鏀惧叆鍙傛暟锛岃繍琛屾椂鐨勬柟娉曞彲浠ヨ幏鍙�
-        jobDetail.getJobDataMap().put(ScheduleConstants.TASK_PROPERTIES, job);
-
-        // 鍒ゆ柇鏄惁瀛樺湪
-        if (scheduler.checkExists(getJobKey(jobId, jobGroup)))
-        {
-            // 闃叉鍒涘缓鏃跺瓨鍦ㄦ暟鎹棶棰� 鍏堢Щ闄わ紝鐒跺悗鍦ㄦ墽琛屽垱寤烘搷浣�
-            scheduler.deleteJob(getJobKey(jobId, jobGroup));
-        }
-
-        // 鍒ゆ柇浠诲姟鏄惁杩囨湡
-        if (StringUtils.isNotNull(CronUtils.getNextExecution(job.getCronExpression())))
-        {
-            // 鎵ц璋冨害浠诲姟
-            scheduler.scheduleJob(jobDetail, trigger);
-        }
-
-        // 鏆傚仠浠诲姟
-        if (job.getStatus().equals(ScheduleConstants.Status.PAUSE.getValue()))
-        {
-            scheduler.pauseJob(ScheduleUtils.getJobKey(jobId, jobGroup));
-        }
-    }
-
-    /**
-     * 璁剧疆瀹氭椂浠诲姟绛栫暐
-     */
-    public static CronScheduleBuilder handleCronScheduleMisfirePolicy(SysJob job, CronScheduleBuilder cb)
-            throws TaskException
-    {
-        switch (job.getMisfirePolicy())
-        {
-            case ScheduleConstants.MISFIRE_DEFAULT:
-                return cb;
-            case ScheduleConstants.MISFIRE_IGNORE_MISFIRES:
-                return cb.withMisfireHandlingInstructionIgnoreMisfires();
-            case ScheduleConstants.MISFIRE_FIRE_AND_PROCEED:
-                return cb.withMisfireHandlingInstructionFireAndProceed();
-            case ScheduleConstants.MISFIRE_DO_NOTHING:
-                return cb.withMisfireHandlingInstructionDoNothing();
-            default:
-                throw new TaskException("The task misfire policy '" + job.getMisfirePolicy()
-                        + "' cannot be used in cron schedule tasks", Code.CONFIG_ERROR);
-        }
-    }
-
-    /**
-     * 妫�鏌ュ寘鍚嶆槸鍚︿负鐧藉悕鍗曢厤缃�
-     * 
-     * @param invokeTarget 鐩爣瀛楃涓�
-     * @return 缁撴灉
-     */
-    public static boolean whiteList(String invokeTarget)
-    {
-        String packageName = StringUtils.substringBefore(invokeTarget, "(");
-        int count = StringUtils.countMatches(packageName, ".");
-        if (count > 1)
-        {
-            return StringUtils.containsAnyIgnoreCase(invokeTarget, Constants.JOB_WHITELIST_STR);
-        }
-        Object obj = SpringUtils.getBean(StringUtils.split(invokeTarget, ".")[0]);
-        String beanPackageName = obj.getClass().getPackage().getName();
-        return StringUtils.containsAnyIgnoreCase(beanPackageName, Constants.JOB_WHITELIST_STR)
-                && !StringUtils.containsAnyIgnoreCase(beanPackageName, Constants.JOB_ERROR_STR);
-    }
-}
diff --git a/ruoyi-quartz/src/main/resources/mapper/quartz/SysJobLogMapper.xml b/ruoyi-quartz/src/main/resources/mapper/quartz/SysJobLogMapper.xml
deleted file mode 100644
index ba1b683..0000000
--- a/ruoyi-quartz/src/main/resources/mapper/quartz/SysJobLogMapper.xml
+++ /dev/null
@@ -1,94 +0,0 @@
-<?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.quartz.mapper.SysJobLogMapper">
-
-	<resultMap type="SysJobLog" id="SysJobLogResult">
-		<id     property="jobLogId"       column="job_log_id"      />
-		<result property="jobName"        column="job_name"        />
-		<result property="jobGroup"       column="job_group"       />
-		<result property="invokeTarget"   column="invoke_target"   />
-		<result property="jobMessage"     column="job_message"     />
-		<result property="status"         column="status"          />
-		<result property="exceptionInfo"  column="exception_info"  />
-		<result property="createTime"     column="create_time"     />
-	</resultMap>
-	
-	<sql id="selectJobLogVo">
-        select job_log_id, job_name, job_group, invoke_target, job_message, status, exception_info, create_time 
-		from sys_job_log
-    </sql>
-	
-	<select id="selectJobLogList" parameterType="SysJobLog" resultMap="SysJobLogResult">
-		<include refid="selectJobLogVo"/>
-		<where>
-			<if test="jobName != null and jobName != ''">
-				AND job_name like concat('%', #{jobName}, '%')
-			</if>
-			<if test="jobGroup != null and jobGroup != ''">
-				AND job_group = #{jobGroup}
-			</if>
-			<if test="status != null and status != ''">
-				AND status = #{status}
-			</if>
-			<if test="invokeTarget != null and invokeTarget != ''">
-				AND invoke_target like concat('%', #{invokeTarget}, '%')
-			</if>
-			<if test="params.beginTime != null and params.beginTime != ''"><!-- 寮�濮嬫椂闂存绱� -->
-				and date_format(create_time,'%Y%m%d') &gt;= date_format(#{params.beginTime},'%Y%m%d')
-			</if>
-			<if test="params.endTime != null and params.endTime != ''"><!-- 缁撴潫鏃堕棿妫�绱� -->
-				and date_format(create_time,'%Y%m%d') &lt;= date_format(#{params.endTime},'%Y%m%d')
-			</if>
-		</where>
-		order by create_time desc
-	</select>
-	
-	<select id="selectJobLogAll" resultMap="SysJobLogResult">
-		<include refid="selectJobLogVo"/>
-	</select>
-	
-	<select id="selectJobLogById" parameterType="Long" resultMap="SysJobLogResult">
-		<include refid="selectJobLogVo"/>
-		where job_log_id = #{jobLogId}
-	</select>
-	
-	<delete id="deleteJobLogById" parameterType="Long">
- 		delete from sys_job_log where job_log_id = #{jobLogId}
- 	</delete>
- 	
- 	<delete id="deleteJobLogByIds" parameterType="Long">
- 		delete from sys_job_log where job_log_id in
- 		<foreach collection="array" item="jobLogId" open="(" separator="," close=")">
- 			#{jobLogId}
-        </foreach> 
- 	</delete>
- 	
- 	<update id="cleanJobLog">
-        truncate table sys_job_log
-    </update>
- 	
- 	<insert id="insertJobLog" parameterType="SysJobLog">
- 		insert into sys_job_log(
- 			<if test="jobLogId != null and jobLogId != 0">job_log_id,</if>
- 			<if test="jobName != null and jobName != ''">job_name,</if>
- 			<if test="jobGroup != null and jobGroup != ''">job_group,</if>
- 			<if test="invokeTarget != null and invokeTarget != ''">invoke_target,</if>
- 			<if test="jobMessage != null and jobMessage != ''">job_message,</if>
- 			<if test="status != null and status != ''">status,</if>
- 			<if test="exceptionInfo != null and exceptionInfo != ''">exception_info,</if>
- 			create_time
- 		)values(
- 			<if test="jobLogId != null and jobLogId != 0">#{jobLogId},</if>
- 			<if test="jobName != null and jobName != ''">#{jobName},</if>
- 			<if test="jobGroup != null and jobGroup != ''">#{jobGroup},</if>
- 			<if test="invokeTarget != null and invokeTarget != ''">#{invokeTarget},</if>
- 			<if test="jobMessage != null and jobMessage != ''">#{jobMessage},</if>
- 			<if test="status != null and status != ''">#{status},</if>
- 			<if test="exceptionInfo != null and exceptionInfo != ''">#{exceptionInfo},</if>
- 			sysdate()
- 		)
-	</insert>
-
-</mapper> 
\ No newline at end of file
diff --git a/ruoyi-quartz/src/main/resources/mapper/quartz/SysJobMapper.xml b/ruoyi-quartz/src/main/resources/mapper/quartz/SysJobMapper.xml
deleted file mode 100644
index 5605c44..0000000
--- a/ruoyi-quartz/src/main/resources/mapper/quartz/SysJobMapper.xml
+++ /dev/null
@@ -1,111 +0,0 @@
-<?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.quartz.mapper.SysJobMapper">
-
-	<resultMap type="SysJob" id="SysJobResult">
-		<id     property="jobId"          column="job_id"          />
-		<result property="jobName"        column="job_name"        />
-		<result property="jobGroup"       column="job_group"       />
-		<result property="invokeTarget"   column="invoke_target"   />
-		<result property="cronExpression" column="cron_expression" />
-		<result property="misfirePolicy"  column="misfire_policy"  />
-		<result property="concurrent"     column="concurrent"      />
-		<result property="status"         column="status"          />
-		<result property="createBy"       column="create_by"       />
-		<result property="createTime"     column="create_time"     />
-		<result property="updateBy"       column="update_by"       />
-		<result property="updateTime"     column="update_time"     />
-		<result property="remark"         column="remark"          />
-	</resultMap>
-	
-	<sql id="selectJobVo">
-        select job_id, job_name, job_group, invoke_target, cron_expression, misfire_policy, concurrent, status, create_by, create_time, remark 
-		from sys_job
-    </sql>
-	
-	<select id="selectJobList" parameterType="SysJob" resultMap="SysJobResult">
-		<include refid="selectJobVo"/>
-		<where>
-			<if test="jobName != null and jobName != ''">
-				AND job_name like concat('%', #{jobName}, '%')
-			</if>
-			<if test="jobGroup != null and jobGroup != ''">
-				AND job_group = #{jobGroup}
-			</if>
-			<if test="status != null and status != ''">
-				AND status = #{status}
-			</if>
-			<if test="invokeTarget != null and invokeTarget != ''">
-				AND invoke_target like concat('%', #{invokeTarget}, '%')
-			</if>
-		</where>
-	</select>
-	
-	<select id="selectJobAll" resultMap="SysJobResult">
-		<include refid="selectJobVo"/>
-	</select>
-	
-	<select id="selectJobById" parameterType="Long" resultMap="SysJobResult">
-		<include refid="selectJobVo"/>
-		where job_id = #{jobId}
-	</select>
-	
-	<delete id="deleteJobById" parameterType="Long">
- 		delete from sys_job where job_id = #{jobId}
- 	</delete>
- 	
- 	<delete id="deleteJobByIds" parameterType="Long">
- 		delete from sys_job where job_id in
- 		<foreach collection="array" item="jobId" open="(" separator="," close=")">
- 			#{jobId}
-        </foreach> 
- 	</delete>
- 	
- 	<update id="updateJob" parameterType="SysJob">
- 		update sys_job
- 		<set>
- 			<if test="jobName != null and jobName != ''">job_name = #{jobName},</if>
- 			<if test="jobGroup != null and jobGroup != ''">job_group = #{jobGroup},</if>
- 			<if test="invokeTarget != null and invokeTarget != ''">invoke_target = #{invokeTarget},</if>
- 			<if test="cronExpression != null and cronExpression != ''">cron_expression = #{cronExpression},</if>
- 			<if test="misfirePolicy != null and misfirePolicy != ''">misfire_policy = #{misfirePolicy},</if>
- 			<if test="concurrent != null and concurrent != ''">concurrent = #{concurrent},</if>
- 			<if test="status !=null">status = #{status},</if>
- 			<if test="remark != null and remark != ''">remark = #{remark},</if>
- 			<if test="updateBy != null and updateBy != ''">update_by = #{updateBy},</if>
- 			update_time = sysdate()
- 		</set>
- 		where job_id = #{jobId}
-	</update>
- 	
- 	<insert id="insertJob" parameterType="SysJob" useGeneratedKeys="true" keyProperty="jobId">
- 		insert into sys_job(
- 			<if test="jobId != null and jobId != 0">job_id,</if>
- 			<if test="jobName != null and jobName != ''">job_name,</if>
- 			<if test="jobGroup != null and jobGroup != ''">job_group,</if>
- 			<if test="invokeTarget != null and invokeTarget != ''">invoke_target,</if>
- 			<if test="cronExpression != null and cronExpression != ''">cron_expression,</if>
- 			<if test="misfirePolicy != null and misfirePolicy != ''">misfire_policy,</if>
- 			<if test="concurrent != null and concurrent != ''">concurrent,</if>
- 			<if test="status != null and status != ''">status,</if>
- 			<if test="remark != null and remark != ''">remark,</if>
- 			<if test="createBy != null and createBy != ''">create_by,</if>
- 			create_time
- 		)values(
- 			<if test="jobId != null and jobId != 0">#{jobId},</if>
- 			<if test="jobName != null and jobName != ''">#{jobName},</if>
- 			<if test="jobGroup != null and jobGroup != ''">#{jobGroup},</if>
- 			<if test="invokeTarget != null and invokeTarget != ''">#{invokeTarget},</if>
- 			<if test="cronExpression != null and cronExpression != ''">#{cronExpression},</if>
- 			<if test="misfirePolicy != null and misfirePolicy != ''">#{misfirePolicy},</if>
- 			<if test="concurrent != null and concurrent != ''">#{concurrent},</if>
- 			<if test="status != null and status != ''">#{status},</if>
- 			<if test="remark != null and remark != ''">#{remark},</if>
- 			<if test="createBy != null and createBy != ''">#{createBy},</if>
- 			sysdate()
- 		)
-	</insert>
-
-</mapper> 
\ No newline at end of file
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/ISysDictTypeService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDictTypeService.java
index 10e27a8..909260d 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDictTypeService.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDictTypeService.java
@@ -1,6 +1,8 @@
 package com.ruoyi.system.service;
 
 import java.util.List;
+import java.util.Map;
+
 import com.ruoyi.common.core.domain.entity.SysDictData;
 import com.ruoyi.common.core.domain.entity.SysDictType;
 
@@ -103,4 +105,6 @@
      * @return 缁撴灉
      */
     public boolean checkDictTypeUnique(SysDictType dictType);
+
+    Map<String, List<SysDictData>> selectEnumListByCategory(List<String> asList);
 }
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/java/com/ruoyi/system/service/impl/SysDictTypeServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDictTypeServiceImpl.java
index 05c999f..61c9d56 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDictTypeServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDictTypeServiceImpl.java
@@ -1,6 +1,7 @@
 package com.ruoyi.system.service.impl;
 
 import java.util.Comparator;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
@@ -235,4 +236,16 @@
         }
         return UserConstants.UNIQUE;
     }
+
+    @Override
+    public Map<String, List<SysDictData>> selectEnumListByCategory(List<String> categoryList) {
+        Map<String,List<SysDictData>> resultList = new HashMap<>();
+        if(!categoryList.isEmpty()){
+            for (String category : categoryList) {
+                List<SysDictData> enums = selectDictDataByName(category);
+                resultList.put(category,enums);
+            }
+        }
+        return resultList;
+    }
 }
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