From dfb1cbb378cb4577b6ce68ed91fb2525bf968a27 Mon Sep 17 00:00:00 2001
From: zss <zss@example.com>
Date: 星期六, 21 十二月 2024 10:24:42 +0800
Subject: [PATCH] cnas人员模块(更新至3077bd)

---
 cnas-personnel/src/main/java/com/yuanchu/mom/mapper/PersonTrackRecordMapper.java                           |   24 
 cnas-personnel/src/main/java/com/yuanchu/mom/service/impl/PersonSupervisionProcessingSheetServiceImpl.java |  121 
 system-run/src/main/java/com/yuanchu/mom/SystemRunApplication.java                                         |    2 
 cnas-personnel/src/main/java/com/yuanchu/mom/dto/PersonPersonnelCapacityExportDto.java                     |  101 
 cnas-personnel/src/main/java/com/yuanchu/mom/excel/PersonSupervisePlanDetailsListener.java                 |   43 
 cnas-personnel/src/main/java/com/yuanchu/mom/mapper/PersonRewardPunishmentRecordMapper.java                |   27 
 cnas-personnel/src/main/java/com/yuanchu/mom/pojo/PersonTrackRecord.java                                   |   83 
 cnas-personnel/src/main/java/com/yuanchu/mom/pojo/PersonTraining.java                                      |   83 
 cnas-personnel/src/main/java/com/yuanchu/mom/service/impl/PersonSupervisePlanServiceImpl.java              |  160 +
 cnas-personnel/src/main/resources/mapper/PersonTrainingRecordMapper.xml                                    |  134 
 cnas-personnel/src/main/java/com/yuanchu/mom/service/impl/PersonRewardPunishmentRecordServiceImpl.java     |   38 
 cnas-personnel/src/main/java/com/yuanchu/mom/service/PersonSupervisionControlSheetService.java             |   24 
 cnas-personnel/src/main/java/com/yuanchu/mom/service/impl/PersonCommunicationAbilityServiceImpl.java       |  117 
 cnas-personnel/src/main/resources/static/supervision-record.docx                                           |    0 
 cnas-personnel/src/main/java/com/yuanchu/mom/pojo/PersonRewardPunishmentRecord.java                        |   64 
 cnas-personnel/src/main/java/com/yuanchu/mom/dto/PersonTrainingRecordListDto.java                          |   37 
 cnas-personnel/src/main/java/com/yuanchu/mom/excel/PersonTrainingDetailedUpload.java                       |   37 
 cnas-personnel/src/main/java/com/yuanchu/mom/dto/PersonSupervisionRecordDto.java                           |   32 
 cnas-personnel/src/main/java/com/yuanchu/mom/pojo/PersonSupervisionProcessingSheet.java                    |   87 
 cnas-personnel/src/main/resources/static/supervision-processing-sheet.docx                                 |    0 
 cnas-personnel/src/main/java/com/yuanchu/mom/controller/PersonBasicInfoController.java                     |  146 +
 cnas-personnel/src/main/java/com/yuanchu/mom/mapper/PersonSupervisePlanMapper.java                         |   21 
 cnas-personnel/src/main/resources/mapper/PersonSupervisionProcessingSheetMapper.xml                        |   28 
 cnas-personnel/src/main/resources/static/communication-deal.docx                                           |    0 
 cnas-personnel/src/main/java/com/yuanchu/mom/controller/PersonPostAuthorizationRecordController.java       |   70 
 cnas-personnel/src/main/java/com/yuanchu/mom/excel/PersonRewardPunishmentRecordExcel.java                  |   36 
 cnas-personnel/src/main/java/com/yuanchu/mom/dto/PersonTrainingRecordDto.java                              |   23 
 cnas-personnel/src/main/resources/static/supervision-control-sheet.docx                                    |    0 
 cnas-personnel/src/main/java/com/yuanchu/mom/service/PersonSupervisePlanDetailsService.java                |   28 
 cnas-personnel/src/main/java/com/yuanchu/mom/pojo/PersonBasicInfo.java                                     |  251 +
 cnas-personnel/src/main/java/com/yuanchu/mom/dto/PersonSupervisePlanDetailsDto.java                        |   12 
 cnas-personnel/src/main/java/com/yuanchu/mom/schedule/PersonSchedule.java                                  |   49 
 cnas-personnel/src/main/java/com/yuanchu/mom/dto/PersonTrainingRecordSubmitDto.java                        |   30 
 cnas-personnel/src/main/resources/static/explain-deal.docx                                                 |    0 
 cnas-personnel/src/main/java/com/yuanchu/mom/mapper/PersonSupervisePlanDetailsMapper.java                  |   25 
 cnas-personnel/src/main/java/com/yuanchu/mom/dto/PersonBasicInfoDto.java                                   |   51 
 cnas-personnel/src/main/java/com/yuanchu/mom/controller/PersonTrainingRecordController.java                |   65 
 cnas-personnel/src/main/java/com/yuanchu/mom/service/impl/PersonBasicInfoServiceImpl.java                  |  759 +++++
 cnas-personnel/src/main/java/com/yuanchu/mom/pojo/PersonTrainingRecord.java                                |   40 
 framework/src/main/java/com/yuanchu/mom/numgen/SerializedLambda.java                                       |  143 
 cnas-personnel/src/main/java/com/yuanchu/mom/service/impl/PersonPostAuthorizationRecordServiceImpl.java    |  136 
 cnas-personnel/src/main/resources/mapper/PersonTrainingMapper.xml                                          |   65 
 cnas-personnel/src/main/java/com/yuanchu/mom/controller/SuperVisePlanController.java                       |  126 
 cnas-personnel/src/main/java/com/yuanchu/mom/excel/PersonTrainingDetailedListener.java                     |   42 
 cnas-personnel/src/main/resources/mapper/PersonSupervisionRecordMapper.xml                                 |   77 
 cnas-personnel/src/main/java/com/yuanchu/mom/mapper/PersonJobResponsibilitiesMapper.java                   |   20 
 cnas-personnel/src/main/java/com/yuanchu/mom/service/impl/AnnexServiceImpl.java                            |   13 
 cnas-personnel/src/main/java/com/yuanchu/mom/dto/PersonCommunicationAbilityDto.java                        |   16 
 cnas-personnel/pom.xml                                                                                     |   52 
 cnas-personnel/src/main/java/com/yuanchu/mom/service/AnnexService.java                                     |    7 
 cnas-personnel/src/main/java/com/yuanchu/mom/controller/PersonSupervisionRecordController.java             |  156 +
 cnas-personnel/src/main/java/com/yuanchu/mom/service/PersonPostAuthorizationRecordService.java             |   27 
 cnas-personnel/src/main/resources/static/credentials-deal.docx                                             |    0 
 cnas-personnel/src/main/java/com/yuanchu/mom/dto/TrainingRecordPersonDetailedDto.java                      |   28 
 cnas-personnel/src/main/resources/static/person-training-record.docx                                       |    0 
 cnas-personnel/src/main/resources/mapper/PersonJobResponsibilitiesMapper.xml                               |   40 
 cnas-personnel/src/main/java/com/yuanchu/mom/mapper/PersonSupervisionControlSheetMapper.java               |   25 
 cnas-personnel/src/main/java/com/yuanchu/mom/pojo/PersonSupervisionControlSheet.java                       |  112 
 cnas-personnel/src/main/java/com/yuanchu/mom/service/impl/PersonPersonnelCapacityServiceImpl.java          |  125 
 cnas-personnel/src/main/resources/mapper/PersonBasicInfoMapper.xml                                         |  101 
 cnas-personnel/src/main/java/com/yuanchu/mom/dto/PersonSupervisePlanDto.java                               |   18 
 cnas-personnel/src/main/java/com/yuanchu/mom/service/impl/PersonTrainingRecordServiceImpl.java             |  224 +
 cnas-personnel/src/main/resources/mapper/PersonTrainingDetailedMapper.xml                                  |   71 
 cnas-personnel/src/main/resources/static/personnel-capacity.docx                                           |    0 
 cnas-personnel/src/main/java/com/yuanchu/mom/service/PersonCommunicationAbilityService.java                |   25 
 cnas-personnel/src/main/resources/mapper/PersonRewardPunishmentRecordMapper.xml                            |   58 
 cnas-personnel/src/main/java/com/yuanchu/mom/controller/PersonTrackRecordController.java                   |   97 
 cnas-personnel/src/main/java/com/yuanchu/mom/mapper/PersonPostAuthorizationRecordMapper.java               |   20 
 cnas-personnel/src/main/java/com/yuanchu/mom/service/impl/PersonTrainingServiceImpl.java                   |  312 ++
 framework/src/main/java/com/yuanchu/mom/numgen/LambdaUtils.java                                            |  127 
 cnas-personnel/src/main/resources/static/person-training.docx                                              |    0 
 cnas-personnel/src/main/java/com/yuanchu/mom/mapper/PersonTrainingDetailedMapper.java                      |   45 
 cnas-personnel/src/main/java/com/yuanchu/mom/pojo/PersonSupervisePlanDetails.java                          |   77 
 cnas-personnel/src/main/java/com/yuanchu/mom/pojo/PersonSupervisionRecord.java                             |  107 
 cnas-personnel/src/main/java/com/yuanchu/mom/mapper/PersonSupervisionProcessingSheetMapper.java            |   24 
 cnas-personnel/src/main/java/com/yuanchu/mom/mapper/AnnexMapper.java                                       |    9 
 cnas-personnel/src/main/java/com/yuanchu/mom/pojo/PersonJobResponsibilities.java                           |   78 
 cnas-personnel/src/main/resources/mapper/PersonPersonnelCapacityMapper.xml                                 |  168 +
 cnas-personnel/src/main/java/com/yuanchu/mom/service/PersonTrackRecordService.java                         |   23 
 cnas-personnel/src/main/java/com/yuanchu/mom/dto/PersonPersonnelCapacityDto.java                           |   30 
 cnas-personnel/src/main/java/com/yuanchu/mom/controller/PersonCommunicationAbilityController.java          |   61 
 cnas-personnel/src/main/java/com/yuanchu/mom/mapper/PersonCommunicationAbilityMapper.java                  |   21 
 cnas-personnel/src/main/java/com/yuanchu/mom/mapper/PersonPersonnelCapacityMapper.java                     |   29 
 cnas-personnel/src/main/java/com/yuanchu/mom/service/PersonSupervisionProcessingSheetService.java          |   24 
 framework/src/main/java/com/yuanchu/mom/numgen/NumberGeneratorModelHelper.java                             |  107 
 cnas-personnel/src/main/resources/static/person-deal.docx                                                  |    0 
 cnas-personnel/src/main/java/com/yuanchu/mom/dto/PersonSupervisionControlSheetExportDto.java               |   76 
 cnas-personnel/src/main/java/com/yuanchu/mom/service/impl/PersonJobResponsibilitiesServiceImpl.java        |  118 
 cnas-personnel/src/main/java/com/yuanchu/mom/dto/TrainingRecordExportDto.java                              |   32 
 cnas-personnel/src/main/java/com/yuanchu/mom/mapper/PersonBasicInfoMapper.java                             |   37 
 cnas-personnel/src/main/java/com/yuanchu/mom/dto/PersonTrainingDto.java                                    |   23 
 framework/src/main/java/com/yuanchu/mom/numgen/NumberGenerator.java                                        |  146 +
 cnas-personnel/src/main/java/com/yuanchu/mom/service/PersonSupervisePlanService.java                       |   34 
 cnas-personnel/src/main/java/com/yuanchu/mom/controller/PersonTrainingController.java                      |  206 +
 cnas-personnel/src/main/resources/mapper/PersonSupervisePlanMapper.xml                                     |   33 
 cnas-personnel/src/main/java/com/yuanchu/mom/pojo/PersonPostAuthorizationRecord.java                       |   77 
 cnas-personnel/src/main/java/com/yuanchu/mom/service/PersonPersonnelCapacityService.java                   |   37 
 cnas-personnel/src/main/java/com/yuanchu/mom/controller/PersonRewardPunishmentRecordController.java        |  100 
 cnas-personnel/src/main/java/com/yuanchu/mom/dto/PersonTrainingDetailedDto.java                            |   31 
 cnas-personnel/src/main/java/com/yuanchu/mom/service/PersonTrainingService.java                            |   49 
 cnas-personnel/src/main/resources/mapper/PersonPostAuthorizationRecordMapper.xml                           |   40 
 cnas-personnel/src/main/java/com/yuanchu/mom/controller/PersonPersonnelCapacityController.java             |   97 
 cnas-personnel/src/main/java/com/yuanchu/mom/mapper/PersonTrainingMapper.java                              |   20 
 cnas-personnel/src/main/java/com/yuanchu/mom/service/impl/PersonSupervisionControlSheetServiceImpl.java    |  155 +
 cnas-personnel/src/main/resources/mapper/PersonTrackRecordMapper.xml                                       |   47 
 cnas-personnel/src/main/java/com/yuanchu/mom/excel/PersonSupervisePlanDetailsUpload.java                   |   28 
 cnas-personnel/src/main/resources/static/training-record.docx                                              |    0 
 cnas-personnel/src/main/java/com/yuanchu/mom/service/impl/PersonSupervisionRecordServiceImpl.java          |  126 
 cnas-personnel/src/main/java/com/yuanchu/mom/mapper/PersonSupervisionRecordMapper.java                     |   27 
 cnas-personnel/src/main/java/com/yuanchu/mom/service/impl/PersonSupervisePlanDetailsServiceImpl.java       |   44 
 cnas-personnel/src/main/resources/mapper/PersonSupervisePlanDetailsMapper.xml                              |   31 
 cnas-personnel/src/main/java/com/yuanchu/mom/controller/PersonJobResponsibilitiesController.java           |   63 
 cnas-personnel/src/main/java/com/yuanchu/mom/pojo/PersonCommunicationAbility.java                          |   66 
 cnas-personnel/src/main/java/com/yuanchu/mom/service/impl/PersonTrainingDetailedServiceImpl.java           |  109 
 framework/src/main/java/com/yuanchu/mom/numgen/NumberTableInfo.java                                        |   16 
 cnas-personnel/src/main/java/com/yuanchu/mom/pojo/Annex.java                                               |   50 
 cnas-personnel/src/main/java/com/yuanchu/mom/service/PersonJobResponsibilitiesService.java                 |   30 
 cnas-personnel/src/main/java/com/yuanchu/mom/dto/PersonRewardPunishmentRecordDto.java                      |   14 
 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/yuanchu/mom/dto/PersonTrainingUpdateDto.java                              |   17 
 framework/pom.xml                                                                                          |   12 
 cnas-personnel/src/main/java/com/yuanchu/mom/dto/PersonBasicInfoDetailsDto.java                            |   65 
 cnas-personnel/src/main/java/com/yuanchu/mom/dto/PersonPostAuthorizationRecordDto.java                     |   14 
 cnas-personnel/src/main/java/com/yuanchu/mom/pojo/PersonTrainingDetailed.java                              |  111 
 cnas-personnel/src/main/java/com/yuanchu/mom/dto/PersonSupervisionProcessingSheetDto.java                  |   39 
 cnas-personnel/src/main/resources/mapper/PersonCommunicationAbilityMapper.xml                              |   31 
 cnas-personnel/src/main/java/com/yuanchu/mom/service/PersonTrainingDetailedService.java                    |   32 
 cnas-server/src/main/java/com/yuanchu/mom/pojo/DepartmentLims.java                                         |    4 
 cnas-personnel/src/main/java/com/yuanchu/mom/dto/PersonJobResponsibilitiesDto.java                         |   16 
 cnas-personnel/src/main/java/com/yuanchu/mom/service/PersonSupervisionRecordService.java                   |   33 
 cnas-personnel/src/main/java/com/yuanchu/mom/service/PersonTrainingRecordService.java                      |   58 
 cnas-personnel/src/main/java/com/yuanchu/mom/service/PersonRewardPunishmentRecordService.java              |   32 
 cnas-personnel/src/main/java/com/yuanchu/mom/service/PersonBasicInfoService.java                           |   36 
 cnas-personnel/src/main/java/com/yuanchu/mom/service/impl/PersonTrackRecordServiceImpl.java                |   33 
 cnas-personnel/src/main/java/com/yuanchu/mom/pojo/PersonSupervisePlan.java                                 |   66 
 cnas-personnel/src/main/java/com/yuanchu/mom/mapper/PersonTrainingRecordMapper.java                        |   67 
 system-run/pom.xml                                                                                         |    5 
 cnas-personnel/src/main/java/com/yuanchu/mom/pojo/PersonPersonnelCapacity.java                             |  125 
 139 files changed, 8,713 insertions(+), 0 deletions(-)

diff --git a/cnas-personnel/pom.xml b/cnas-personnel/pom.xml
new file mode 100644
index 0000000..e33cdb0
--- /dev/null
+++ b/cnas-personnel/pom.xml
@@ -0,0 +1,52 @@
+<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <artifactId>cnas-personnel</artifactId>
+    <version>0.0.1-SNAPSHOT</version>
+    <name>cnas-personnel</name>
+    <description>cnas-personnel</description>
+
+    <packaging>jar</packaging>
+
+    <parent>
+        <artifactId>mom</artifactId>
+        <groupId>com.yuanchu.mom</groupId>
+        <version>1.0.0</version>
+    </parent>
+
+    <dependencies>
+        <dependency>
+            <groupId>com.yuanchu.mom</groupId>
+            <artifactId>user-server</artifactId>
+            <version>0.0.1-SNAPSHOT</version>
+            <scope>compile</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>com.yuanchu.mom</groupId>
+            <artifactId>framework</artifactId>
+            <version>0.0.1-SNAPSHOT</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.yuanchu.mom</groupId>
+            <artifactId>cnas-server</artifactId>
+            <version>0.0.1-SNAPSHOT</version>
+            <scope>compile</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>com.belerweb</groupId>
+            <artifactId>pinyin4j</artifactId>
+            <version>2.5.1</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi-ooxml-lite</artifactId>
+            <version>5.2.2</version>
+            <scope>compile</scope>
+        </dependency>
+    </dependencies>
+
+</project>
diff --git a/cnas-personnel/src/main/java/com/yuanchu/mom/controller/PersonBasicInfoController.java b/cnas-personnel/src/main/java/com/yuanchu/mom/controller/PersonBasicInfoController.java
new file mode 100644
index 0000000..bc6b4a0
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/yuanchu/mom/controller/PersonBasicInfoController.java
@@ -0,0 +1,146 @@
+package com.yuanchu.mom.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.yuanchu.mom.annotation.CustomClazzName;
+import com.yuanchu.mom.annotation.ValueClassify;
+import com.yuanchu.mom.dto.DepartmentDto;
+import com.yuanchu.mom.dto.PersonBasicInfoDetailsDto;
+import com.yuanchu.mom.dto.PersonBasicInfoDto;
+import com.yuanchu.mom.dto.UserPageDto;
+import com.yuanchu.mom.pojo.Annex;
+import com.yuanchu.mom.service.AnnexService;
+import com.yuanchu.mom.service.PersonBasicInfoService;
+import com.yuanchu.mom.utils.FileSaveUtil;
+import com.yuanchu.mom.utils.JackSonUtil;
+import com.yuanchu.mom.vo.Result;
+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")
+@CustomClazzName(name = "璧勬簮瑕佹眰",index = 8)
+public class PersonBasicInfoController {
+
+    @Resource
+    private PersonBasicInfoService personBasicInfoService;
+
+    @Resource
+    private AnnexService annexService;
+
+    @ValueClassify("浜哄憳鍩烘湰淇℃伅")
+    @ApiOperation(value = "鏌ヨCNAS浜哄憳渚ц竟鏍�")
+    @GetMapping("/selectCNSAPersonTree")
+    public Result<List<DepartmentDto>> selectCNSAPersonTree() {
+        return Result.success(personBasicInfoService.selectCNSAPersonTree());
+    }
+
+    @ValueClassify("浜哄憳鍩烘湰淇℃伅")
+    @ApiOperation(value = "鑾峰彇CNAS浜哄憳鍩烘湰淇℃伅")
+    @GetMapping("/getCNASPersonnelInfo")
+    public Result getCNASPersonnelInfo(Integer userId) {
+        return Result.success(personBasicInfoService.getCNASPersonnelInfo(userId));
+    }
+
+    @ValueClassify("浜哄憳鍩烘湰淇℃伅")
+    @ApiOperation(value = "淇濆瓨CNAS浜哄憳鍩烘湰淇℃伅")
+    @PostMapping("/saveCNASPersonnelInfo")
+    public Result saveCNASPersonnelInfo(@RequestBody PersonBasicInfoDto personBasicInfoDto) {
+        personBasicInfoService.saveCNASPersonnelInfo(personBasicInfoDto);
+        return Result.success();
+    }
+
+    @ApiOperation(value = "浜哄憳鏄庣粏鍒嗛〉鏌ヨ")
+    @ValueClassify("浜哄憳鍩烘湰淇℃伅")
+    @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.StoreFile(file);
+        return Result.success("涓婁紶鎴愬姛", s);
+    }
+
+    @GetMapping("/getAnnexByUserId")
+    public Result<List<Annex>> getAnnexByUserId(Integer userId) {
+        List<Annex> list = annexService.list(new LambdaQueryWrapper<Annex>().eq(Annex::getUserId, userId));
+        return Result.success(list);
+    }
+
+    // 鍒犻櫎鏂囦欢
+    @DeleteMapping("/deleteCNASFile")
+    public Result saveFile(String fileName) {
+        String[] split = fileName.split(",");
+        for (String s : split) {
+            FileSaveUtil.DeleteFile(s);
+        }
+        return Result.success();
+
+    }
+
+    /**
+     * 浜哄憳鍩烘湰淇℃伅闄勪欢鏂板
+     */
+    @PostMapping("/addAnnex")
+    public Result addAnnex(@RequestBody Annex annex) {
+        annexService.save(annex);
+        return Result.success();
+    }
+
+    @GetMapping("/getAnnex")
+    public Result<Annex> getAnnex(Integer id) {
+        return Result.success(annexService.getById(id));
+    }
+    /**
+     * 浜哄憳鍩烘湰淇℃伅闄勪欢鍒犻櫎
+     */
+    @DeleteMapping("/deleteAnnex/{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 = "瀵煎嚭浜哄憳鍩烘湰淇℃伅")
+    @PostMapping("/exportPersonBasicInfo")
+    public void exportPersonBasicInfo(@RequestBody Map<String, Object> data, HttpServletResponse response) throws Exception {
+        UserPageDto userPageDto = JackSonUtil.unmarshal(JackSonUtil.marshal(data.get("entity")), UserPageDto.class);
+        personBasicInfoService.exportPersonBasicInfo(userPageDto,response);
+    }
+
+    @ApiOperation(value = "涓嬭浇浜哄憳妗f鍗�")
+    @PostMapping("/exportPersonBasicInfoById")
+    public Result exportPersonBasicInfoById(Integer id, HttpServletResponse response) {
+        return Result.success(personBasicInfoService.exportPersonBasicInfoById(id,response));
+    }
+}
diff --git a/cnas-personnel/src/main/java/com/yuanchu/mom/controller/PersonCommunicationAbilityController.java b/cnas-personnel/src/main/java/com/yuanchu/mom/controller/PersonCommunicationAbilityController.java
new file mode 100644
index 0000000..07bdaf5
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/yuanchu/mom/controller/PersonCommunicationAbilityController.java
@@ -0,0 +1,61 @@
+package com.yuanchu.mom.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yuanchu.mom.dto.PersonCommunicationAbilityDto;
+import com.yuanchu.mom.pojo.PersonCommunicationAbility;
+import com.yuanchu.mom.service.PersonCommunicationAbilityService;
+import com.yuanchu.mom.vo.Result;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * <p>
+ * 娌熼�氳褰� 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-10-09 12:00:57
+ */
+@Api(tags = "浜哄憳 - 娌熼�氳褰�")
+@RestController
+@RequestMapping("/personCommunicationAbility")
+public class PersonCommunicationAbilityController {
+
+    @Autowired
+    private PersonCommunicationAbilityService personCommunicationAbilityService;
+
+    @ApiOperation(value = "鏂板/鏇存柊 娌熼�氳褰�")
+    @PostMapping("addOrUpdatePersonCommunicationAbility")
+    public Result<?> addOrUpdatePersonCommunicationAbility(@RequestBody PersonCommunicationAbility personCommunicationAbility) {
+        personCommunicationAbilityService.saveOrUpdate(personCommunicationAbility);
+        return Result.success();
+    }
+
+    @ApiOperation(value = "鍒犻櫎 娌熼�氳褰�")
+    @DeleteMapping("deletePersonCommunicationAbility")
+    public Result<?> deletePersonCommunicationAbility(@RequestParam("id") Integer id) {
+        personCommunicationAbilityService.removeById(id);
+        return Result.success();
+    }
+
+
+    @ApiOperation(value = "鏌ヨ 娌熼�氳褰�")
+    @GetMapping("personPersonCommunicationAbilityPage")
+    public Result<IPage<PersonCommunicationAbilityDto>> personPersonCommunicationAbilityPage(Page page,
+                                                                                             Integer departLimsId,
+                                                                                             Integer userId,
+                                                                                             String userName) {
+        return Result.success(personCommunicationAbilityService.personPersonCommunicationAbilityPage(page, departLimsId, userId, userName));
+    }
+
+    @ApiOperation(value = "瀵煎嚭娌熼�氳褰�")
+    @PostMapping("exportPersonCommunicationAbility")
+    public void exportPersonCommunicationAbility(Integer id, HttpServletResponse response) throws Exception{
+        personCommunicationAbilityService.exportPersonCommunicationAbility(id,response);
+    }
+}
diff --git a/cnas-personnel/src/main/java/com/yuanchu/mom/controller/PersonJobResponsibilitiesController.java b/cnas-personnel/src/main/java/com/yuanchu/mom/controller/PersonJobResponsibilitiesController.java
new file mode 100644
index 0000000..ecf526b
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/yuanchu/mom/controller/PersonJobResponsibilitiesController.java
@@ -0,0 +1,63 @@
+package com.yuanchu.mom.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yuanchu.mom.annotation.ValueClassify;
+import com.yuanchu.mom.dto.PersonJobResponsibilitiesDto;
+import com.yuanchu.mom.pojo.PersonJobResponsibilities;
+import com.yuanchu.mom.service.PersonJobResponsibilitiesService;
+import com.yuanchu.mom.vo.Result;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.Map;
+
+/**
+ * <p>
+ * 宀椾綅鑱岃矗 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-10-09 02:07:49
+ */
+@Api(tags = "浜哄憳 - 宀椾綅鑱岃矗")
+@RestController
+@RequestMapping("/personJobResponsibilities")
+public class PersonJobResponsibilitiesController {
+    @Autowired
+    private PersonJobResponsibilitiesService personJobResponsibilitiesService;
+
+    @ValueClassify("宀椾綅鑱岃矗")
+    @ApiOperation(value = "鏂板/鏇存柊 宀椾綅鑱岃矗")
+    @PostMapping("personJobResponsibilitiesSave")
+    public Result<?> personJobResponsibilitiesSave(@RequestBody PersonJobResponsibilities personJobResponsibilities) {
+        personJobResponsibilitiesService.saveOrUpdate(personJobResponsibilities);
+        return Result.success();
+    }
+
+    @ValueClassify("宀椾綅鑱岃矗")
+    @ApiOperation(value = "鍒犻櫎 宀椾綅鑱岃矗")
+    @DeleteMapping("personJobResponsibilitiesDelete")
+    public Result<?> personJobResponsibilitiesDelete(@RequestParam("id") Integer id) {
+        personJobResponsibilitiesService.removeById(id);
+        return Result.success();
+    }
+
+    @ValueClassify("宀椾綅鑱岃矗")
+    @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);
+    }
+
+    @ValueClassify("宀椾綅鑱岃矗")
+    @ApiOperation(value = "瀵煎嚭浠昏亴宀椾綅璇存槑璇�")
+    @PostMapping("/exportPersonJobResponsibilities")
+    public void exportPersonJobResponsibilities(Integer id, HttpServletResponse response){
+        personJobResponsibilitiesService.exportPersonJobResponsibilities(id,response);
+    }
+}
diff --git a/cnas-personnel/src/main/java/com/yuanchu/mom/controller/PersonPersonnelCapacityController.java b/cnas-personnel/src/main/java/com/yuanchu/mom/controller/PersonPersonnelCapacityController.java
new file mode 100644
index 0000000..f3e97c2
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/yuanchu/mom/controller/PersonPersonnelCapacityController.java
@@ -0,0 +1,97 @@
+package com.yuanchu.mom.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yuanchu.mom.annotation.ValueAuth;
+
+import com.yuanchu.mom.common.GetLook;
+import com.yuanchu.mom.dto.PersonPersonnelCapacityDto;
+import com.yuanchu.mom.pojo.PersonPersonnelCapacity;
+import com.yuanchu.mom.service.PersonPersonnelCapacityService;
+import com.yuanchu.mom.vo.Result;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiModelProperty;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 浜哄憳鑳藉姏 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-10-10 11:26:18
+ */
+@Api(tags = "浜哄憳 - 浜哄憳鑳藉姏")
+@RestController
+@RequestMapping("/personPersonnelCapacity")
+public class PersonPersonnelCapacityController {
+
+    @Autowired
+    private PersonPersonnelCapacityService personPersonnelCapacityService;
+
+    @Autowired
+    private GetLook getLook;
+
+    @ApiOperation(value = "鏂板/鏇存柊 浜哄憳鑳藉姏")
+    @PostMapping("addOrUpdatePersonPersonnelCapacity")
+    public Result<?> addOrUpdatePersonPersonnelCapacity(@RequestBody PersonPersonnelCapacity personPersonnelCapacity) {
+        personPersonnelCapacityService.saveOrUpdate(personPersonnelCapacity);
+        return Result.success();
+    }
+
+    @ApiOperation(value = "鍒犻櫎 浜哄憳鑳藉姏")
+    @DeleteMapping("deletePersonPersonnelCapacity")
+    public Result<?> deletePersonPersonnelCapacity(@RequestParam("id") Integer id) {
+        // 鍒犻櫎鏁版嵁
+        personPersonnelCapacityService.removeById(id);
+        return Result.success();
+    }
+
+    @ApiOperation(value = "鏌ヨ 浜哄憳鑳藉姏")
+    @GetMapping("personPersonnelCapacityPage")
+    public Result<IPage<PersonPersonnelCapacityDto>> personPersonnelCapacityPage(Page page,
+                                                                                 Integer departmentId,
+                                                                                 Integer userId,
+                                                                                 String userName) {
+        return Result.success(personPersonnelCapacityService.personPersonnelCapacityPage(page, departmentId, userId, userName));
+    }
+
+    @ApiOperation(value = "纭 浜哄憳鑳藉姏")
+    @GetMapping("confirmPersonnelCapability")
+    public Result<?> confirmPersonnelCapability(@RequestParam("id") Integer id) {
+        Integer userId = getLook.selectPowerByMethodAndUserId(null).get("userId");
+        personPersonnelCapacityService.update(Wrappers.<PersonPersonnelCapacity>lambdaUpdate()
+                .eq(PersonPersonnelCapacity::getId, id)
+                .set(PersonPersonnelCapacity::getConfirmOperatingPersonnelId, userId)
+                .set(PersonPersonnelCapacity::getConfirmDate, LocalDateTime.now()));
+        return Result.success();
+    }
+
+    /**
+     * 瀵煎嚭浜哄憳鑳藉姏
+     * @return
+     */
+    @ValueAuth
+    @ApiOperation(value = "瀵煎嚭浜哄憳鑳藉姏")
+    @GetMapping("/exportPersonnelCapacity")
+    public void exportPersonnelCapacity(Integer id, HttpServletResponse response){
+        personPersonnelCapacityService.exportPersonnelCapacity(id, response);
+    }
+
+    /**
+     * 浜哄憳鑳藉姏纭
+     * @return
+     */
+    @ValueAuth
+    @ApiOperation(value = "浜哄憳鑳藉姏纭")
+    @GetMapping("/confirmPersonnelCapacity")
+    public Result<?> confirmPersonnelCapacity(Integer id){
+        return Result.success(personPersonnelCapacityService.confirmPersonnelCapacity(id));
+    }
+}
diff --git a/cnas-personnel/src/main/java/com/yuanchu/mom/controller/PersonPostAuthorizationRecordController.java b/cnas-personnel/src/main/java/com/yuanchu/mom/controller/PersonPostAuthorizationRecordController.java
new file mode 100644
index 0000000..ca19034
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/yuanchu/mom/controller/PersonPostAuthorizationRecordController.java
@@ -0,0 +1,70 @@
+package com.yuanchu.mom.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yuanchu.mom.dto.PersonPostAuthorizationRecordDto;
+import com.yuanchu.mom.pojo.PersonPostAuthorizationRecord;
+import com.yuanchu.mom.pojo.PersonRewardPunishmentRecord;
+import com.yuanchu.mom.service.PersonPostAuthorizationRecordService;
+import com.yuanchu.mom.utils.FileSaveUtil;
+import com.yuanchu.mom.utils.JackSonUtil;
+import com.yuanchu.mom.vo.Result;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.Date;
+import java.util.Map;
+
+/**
+ * <p>
+ * 浠昏亴鎺堟潈璁板綍 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-10-09 10:48:17
+ */
+@Api(tags = "浜哄憳 - 浠昏亴鎺堟潈璁板綍")
+@RestController
+@RequestMapping("/personPostAuthorizationRecord")
+public class PersonPostAuthorizationRecordController {
+
+    @Autowired
+    private PersonPostAuthorizationRecordService personPostAuthorizationRecordService;
+
+    @ApiOperation(value = "鏂板/鏇存柊 浠昏亴鎺堟潈璁板綍")
+    @PostMapping("addOrUpdatePersonPostAuthorizationRecord")
+    public Result<?> addOrUpdatePersonPostAuthorizationRecord(@RequestBody PersonPostAuthorizationRecord personRewardPunishmentRecord) {
+        personPostAuthorizationRecordService.saveOrUpdate(personRewardPunishmentRecord);
+        return Result.success();
+    }
+
+    @ApiOperation(value = "鍒犻櫎 浠昏亴鎺堟潈璁板綍")
+    @DeleteMapping("deletePersonPostAuthorizationRecord")
+    public Result<?> deletePersonPostAuthorizationRecord(@RequestParam("id") Integer id) {
+        // 鍒犻櫎鏂囦欢
+        PersonPostAuthorizationRecord postAuthorizationRecord = personPostAuthorizationRecordService.getById(id);
+        FileSaveUtil.DeleteFile(postAuthorizationRecord.getSystemFileName());
+        // 鍒犻櫎鏁版嵁
+        personPostAuthorizationRecordService.removeById(id);
+        return Result.success();
+    }
+
+
+    @ApiOperation(value = "鏌ヨ 浠昏亴鎺堟潈璁板綍")
+    @GetMapping("PersonPostAuthorizationRecordPage")
+    public Result<IPage<PersonPostAuthorizationRecordDto>> PersonPostAuthorizationRecordPage(Page page,
+                                                                                             Integer departLimsId,
+                                                                                             Integer userId,
+                                                                                             String userName) {
+        return Result.success(personPostAuthorizationRecordService.personPostAuthorizationRecordPage(page, departLimsId, userId, userName));
+    }
+
+    @ApiOperation(value = "瀵煎嚭宀椾綅鑱屼笟璧勬牸璇佷功")
+    @PostMapping("/exportPersonPostAuthorizationRecord")
+    public void exportPersonPostAuthorizationRecord(Integer id, HttpServletResponse response){
+        personPostAuthorizationRecordService.exportPersonPostAuthorizationRecord(id,response);
+    }
+}
diff --git a/cnas-personnel/src/main/java/com/yuanchu/mom/controller/PersonRewardPunishmentRecordController.java b/cnas-personnel/src/main/java/com/yuanchu/mom/controller/PersonRewardPunishmentRecordController.java
new file mode 100644
index 0000000..10a1068
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/yuanchu/mom/controller/PersonRewardPunishmentRecordController.java
@@ -0,0 +1,100 @@
+package com.yuanchu.mom.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.yuanchu.mom.dto.PersonRewardPunishmentRecordDto;
+import com.yuanchu.mom.excel.PersonRewardPunishmentRecordExcel;
+import com.yuanchu.mom.pojo.PersonRewardPunishmentRecord;
+import com.yuanchu.mom.service.PersonRewardPunishmentRecordService;
+import com.yuanchu.mom.vo.Result;
+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 = "濂栨儵璁板綍瀵煎嚭")
+    @PostMapping("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/yuanchu/mom/controller/PersonSupervisionRecordController.java b/cnas-personnel/src/main/java/com/yuanchu/mom/controller/PersonSupervisionRecordController.java
new file mode 100644
index 0000000..df803e9
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/yuanchu/mom/controller/PersonSupervisionRecordController.java
@@ -0,0 +1,156 @@
+package com.yuanchu.mom.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yuanchu.mom.annotation.ValueAuth;
+import com.yuanchu.mom.dto.PersonSupervisionRecordDto;
+import com.yuanchu.mom.pojo.PersonSupervisionControlSheet;
+import com.yuanchu.mom.pojo.PersonSupervisionProcessingSheet;
+import com.yuanchu.mom.pojo.PersonSupervisionRecord;
+import com.yuanchu.mom.service.PersonSupervisionControlSheetService;
+import com.yuanchu.mom.service.PersonSupervisionProcessingSheetService;
+import com.yuanchu.mom.service.PersonSupervisionRecordService;
+import com.yuanchu.mom.vo.Result;
+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 java.time.LocalDate;
+import javax.servlet.http.HttpServletResponse;
+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("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
+     */
+    @ValueAuth
+    @ApiOperation(value = "瀵煎嚭浜哄憳鐩戠潱璁板綍")
+    @GetMapping("/exportPersonSupervisionRecord")
+    public void exportPersonSupervisionRecord(Integer id, HttpServletResponse response){
+        personSupervisionRecordService.exportPersonSupervisionRecord(id, response);
+    }
+
+
+    /**
+     * 瀵煎嚭浜哄憳鐩戠潱璁板綍绾犳鎺у埗鍗�
+     * @return
+     */
+    @ValueAuth
+    @ApiOperation(value = "瀵煎嚭浜哄憳鐩戠潱璁板綍绾犳鎺у埗鍗�")
+    @GetMapping("/exportSupervisionControlSheet")
+    public void exportSupervisionControlSheet(Integer supervisionRecordId, HttpServletResponse response){
+        personSupervisionControlSheetService.exportSupervisionControlSheet(supervisionRecordId, response);
+    }
+
+    /**
+     * 瀵煎嚭浜哄憳鐩戠潱璁板綍绾犳澶勭悊鍗�
+     * @return
+     */
+    @ValueAuth
+    @ApiOperation(value = "瀵煎嚭浜哄憳鐩戠潱璁板綍绾犳澶勭悊鍗�")
+    @GetMapping("/exportSupervisionProcessingSheet")
+    public void exportSupervisionProcessingSheet(Integer supervisionRecordId, HttpServletResponse response){
+        personSupervisionProcessingSheetService.exportSupervisionProcessingSheet(supervisionRecordId, response);
+    }
+}
diff --git a/cnas-personnel/src/main/java/com/yuanchu/mom/controller/PersonTrackRecordController.java b/cnas-personnel/src/main/java/com/yuanchu/mom/controller/PersonTrackRecordController.java
new file mode 100644
index 0000000..85b650d
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/yuanchu/mom/controller/PersonTrackRecordController.java
@@ -0,0 +1,97 @@
+package com.yuanchu.mom.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.yuanchu.mom.annotation.CustomClazzName;
+import com.yuanchu.mom.annotation.ValueClassify;
+import com.yuanchu.mom.common.GetLook;
+import com.yuanchu.mom.mapper.UserMapper;
+import com.yuanchu.mom.pojo.PersonTrackRecord;
+import com.yuanchu.mom.pojo.User;
+import com.yuanchu.mom.service.PersonTrackRecordService;
+import com.yuanchu.mom.vo.Result;
+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")
+@CustomClazzName(name = "璧勬簮瑕佹眰",index = 8)
+public class PersonTrackRecordController {
+
+    @Autowired
+    private PersonTrackRecordService personTrackRecordService;
+
+    private GetLook getLook;
+
+    private UserMapper userMapper;
+
+    @ValueClassify("宸ヤ綔灞ュ巻")
+    @ApiOperation(value = "鏂板宸ヤ綔灞ュ巻")
+    @PostMapping("personTrackRecordSave")
+    public Result<?> personTrackRecordSave(@RequestBody PersonTrackRecord personTrackRecord) {
+        Integer userId = getLook.selectPowerByMethodAndUserId(null).get("userId");
+        User user = userMapper.selectById(userId);
+        personTrackRecord.setCreateUser(user.getName());
+        personTrackRecordService.save(personTrackRecord);
+        return Result.success();
+    }
+
+    @ValueClassify("宸ヤ綔灞ュ巻")
+    @ApiOperation(value = "鍒犻櫎宸ヤ綔灞ュ巻")
+    @DeleteMapping("personTrackRecordDelete")
+    public Result<?> personTrackRecordDelete(@RequestParam("id") Integer id) {
+        personTrackRecordService.removeById(id);
+        return Result.success();
+    }
+
+    @ValueClassify("宸ヤ綔灞ュ巻")
+    @ApiOperation(value = "宸ヤ綔灞ュ巻鏇存柊")
+    @PutMapping("personTrackRecordUpdate")
+    public Result<?> personTrackRecordUpdate(@RequestBody PersonTrackRecord personTrackRecord) {
+        personTrackRecordService.updateById(personTrackRecord);
+        return Result.success();
+    }
+
+    @ValueClassify("宸ヤ綔灞ュ巻")
+    @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);
+    }
+
+    @ValueClassify("宸ヤ綔灞ュ巻")
+    @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/yuanchu/mom/controller/PersonTrainingController.java b/cnas-personnel/src/main/java/com/yuanchu/mom/controller/PersonTrainingController.java
new file mode 100644
index 0000000..095cc94
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/yuanchu/mom/controller/PersonTrainingController.java
@@ -0,0 +1,206 @@
+package com.yuanchu.mom.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yuanchu.mom.annotation.ValueAuth;
+import com.yuanchu.mom.annotation.ValueClassify;
+import com.yuanchu.mom.dto.*;
+import com.yuanchu.mom.numgen.NumberGenerator;
+import com.yuanchu.mom.pojo.PersonTraining;
+import com.yuanchu.mom.pojo.PersonTrainingDetailed;
+import com.yuanchu.mom.pojo.PersonTrainingRecord;
+import com.yuanchu.mom.service.PersonTrainingDetailedService;
+import com.yuanchu.mom.service.PersonTrainingRecordService;
+import com.yuanchu.mom.service.PersonTrainingService;
+import com.yuanchu.mom.vo.Result;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletResponse;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.List;
+import java.util.Locale;
+
+/**
+ * <p>
+ * 鍩硅璁″垝 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-10-11 01:11:49
+ */
+@Api(tags = "浜哄憳 - 鍩硅璁″垝")
+@RestController
+@RequestMapping("/personTraining")
+public class PersonTrainingController {
+
+    @Autowired
+    private PersonTrainingService personTrainingService;
+
+    @Autowired
+    private PersonTrainingDetailedService personTrainingDetailedService;
+
+    @Autowired
+    private PersonTrainingRecordService personTrainingRecordService;
+
+    @Autowired
+    private NumberGenerator<PersonTrainingDetailed> numberGenerator;
+
+    @ValueClassify("鍩硅璁″垝")
+    @ApiOperation(value = "鍩硅璁″垝 瀵煎叆")
+    @PostMapping("personTrainingImport")
+    public Result<?> personTrainingImport(@RequestPart("file") MultipartFile file) {
+        personTrainingService.personTrainingImport(file);
+        return Result.success();
+    }
+
+    @ValueClassify("鍩硅璁″垝")
+    @ApiOperation(value = "鍩硅璁″垝 鍒犻櫎")
+    @DeleteMapping("personTrainingDelete")
+    public Result<?> personTrainingDelete(@RequestParam("id") Integer id) {
+        personTrainingService.personTrainingDelete(id);
+        return Result.success();
+    }
+
+    @ValueClassify("鍩硅璁″垝")
+    @ApiOperation(value = "鍩硅璁″垝 鏌ヨ")
+    @GetMapping("personTrainingSelect")
+    public Result<IPage<PersonTrainingDto>> personTrainingSelect(Page page, String compilerName, String departmentId) {
+        IPage<PersonTrainingDto> iPage = personTrainingService.personTrainingSelect(page, compilerName, departmentId);
+        return Result.success(iPage);
+    }
+
+    @ValueClassify("鍩硅璁″垝")
+    @ApiOperation(value = "骞村害鍩硅璁″垝 瀹℃牳")
+    @PostMapping("reviewAnnualPersonnelTraining")
+    public Result<?> reviewAnnualPersonnelTraining(@RequestBody PersonTrainingUpdateDto personTrainingUpdateDto) {
+        personTrainingService.reviewAnnualPersonnelTraining(personTrainingUpdateDto);
+        return Result.success();
+    }
+
+    @ValueClassify("鍩硅璁″垝")
+    @ApiOperation(value = "鍩硅璁″垝 鎵瑰噯")
+    @PostMapping("approveAnnualPersonnelTraining")
+    public Result<?> approveAnnualPersonnelTraining(@RequestBody PersonTrainingUpdateDto personTrainingUpdateDto) {
+        personTrainingService.approveAnnualPersonnelTraining(personTrainingUpdateDto);
+        return Result.success();
+    }
+
+    @ValueClassify("鍩硅璁″垝")
+    @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);
+        }
+        personTrainingDetailedService.saveOrUpdate(personTrainingDetailed);
+        return Result.success();
+    }
+
+    @ValueClassify("鍩硅璁″垝")
+    @ApiOperation(value = "骞村害璁″垝鏄庣粏琛� 鎵归噺鍒犻櫎")
+    @PostMapping("deleteAnnualPlanDetailTable")
+    public Result<?> deleteAnnualPlanDetailTable(@RequestParam("ids") String ids) {
+        personTrainingDetailedService.deleteAnnualPlanDetailTable(ids);
+        return Result.success();
+    }
+
+    @ValueClassify("鍩硅璁″垝")
+    @ApiOperation(value = "骞村害璁″垝鏄庣粏琛� 鏌ヨ")
+    @GetMapping("queryTheAnnualPlanDetailsTable")
+    public Result<IPage<PersonTrainingDetailedDto>> queryTheAnnualPlanDetailsTable(Page page,
+                                                    String trainingLecturerName, String courseCode,
+                                                                                   String trainingDate, Integer id, Integer userId) {
+        IPage<PersonTrainingDetailedDto> iPage = personTrainingDetailedService.queryTheAnnualPlanDetailsTable(page,
+                trainingLecturerName, courseCode, trainingDate, id, userId);
+        return Result.success(iPage);
+    }
+
+    @ValueClassify("鍩硅璁″垝")
+    @ApiOperation(value = "鍩硅涓庤�冩牳璁板綍 鏌ヨ")
+    @GetMapping("trainingAndAssessmentRecordsPage")
+    public Result<List<PersonTrainingRecordDto>> trainingAndAssessmentRecordsPage(Integer trainingDetailedId,
+                                                                                   String userName) {
+        List<PersonTrainingRecordDto> list = personTrainingRecordService.trainingAndAssessmentRecordsPage(trainingDetailedId, userName);
+        return Result.success(list);
+    }
+
+    @ValueClassify("鍩硅璁″垝")
+    @ApiOperation(value = "鍩硅涓庤�冩牳璁板綍 鏂板浜哄憳")
+    @PostMapping("newPersonnelAddedToTrainingRecords")
+    public Result<?> newPersonnelAddedToTrainingRecords(@RequestBody List<PersonTrainingRecord> personTrainingRecord) {
+        personTrainingRecordService.saveBatch(personTrainingRecord);
+        return Result.success();
+    }
+
+    @ValueClassify("鍩硅璁″垝")
+    @ApiOperation(value = "鍩硅涓庤�冩牳璁板綍 璁ら")
+    @PostMapping("claimOfTrainingAndAssessmentRecords")
+    public Result<?> claimOfTrainingAndAssessmentRecords(@RequestParam("claimAndClaim") Boolean claimAndClaim,
+                                                         @RequestParam("courseId") Integer courseId) {
+        personTrainingRecordService.claimOfTrainingAndAssessmentRecords(claimAndClaim, courseId);
+        return Result.success();
+    }
+
+    @ValueClassify("鍩硅璁″垝")
+    @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::getState, personTrainingRecordSubmitDto.getState()));
+        return Result.success();
+    }
+
+    @ValueClassify("鍩硅璁″垝")
+    @ApiOperation(value = "鍩硅涓庤�冩牳璁板綍 鍒犻櫎")
+    @PostMapping("deleteTrainingAndAssessmentRecords")
+    public Result<?> deleteTrainingAndAssessmentRecords(@RequestParam("ids") String ids) {
+        personTrainingRecordService.deleteTrainingAndAssessmentRecords(ids);
+        return Result.success();
+    }
+
+    @PostMapping("outOfFocusPreservation")
+    public Result<?> outOfFocusPreservation(@RequestBody PersonTrainingRecord personTrainingRecord) {
+        personTrainingRecordService.updateById(personTrainingRecord);
+        return Result.success();
+    }
+
+    /**
+     * 瀵煎嚭浜哄憳鍩硅璁″垝
+     * @return
+     */
+    @ValueAuth
+    @ApiOperation(value = "瀵煎嚭浜哄憳鍩硅璁″垝")
+    @GetMapping("/exportPersonTraining")
+    public void exportPersonTraining(Integer id, HttpServletResponse response){
+        personTrainingService.exportPersonTraining(id, response);
+    }
+
+    /**
+     * 瀵煎嚭浜哄憳鍩硅涓庤�冩牳璁板綍
+     * @return
+     */
+    @ValueAuth
+    @ApiOperation(value = "瀵煎嚭浜哄憳鍩硅涓庤�冩牳璁板綍")
+    @GetMapping("/exportPersonTrainingRecord")
+    public void exportPersonTrainingRecord(Integer id, HttpServletResponse response){
+        personTrainingService.exportPersonTrainingRecord(id, response);
+    }
+}
diff --git a/cnas-personnel/src/main/java/com/yuanchu/mom/controller/PersonTrainingRecordController.java b/cnas-personnel/src/main/java/com/yuanchu/mom/controller/PersonTrainingRecordController.java
new file mode 100644
index 0000000..6d1577b
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/yuanchu/mom/controller/PersonTrainingRecordController.java
@@ -0,0 +1,65 @@
+package com.yuanchu.mom.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yuanchu.mom.annotation.ValueAuth;
+import com.yuanchu.mom.annotation.ValueClassify;
+import com.yuanchu.mom.dto.PersonTrainingRecordListDto;
+import com.yuanchu.mom.dto.TrainingRecordPersonDetailedDto;
+import com.yuanchu.mom.service.PersonTrainingRecordService;
+import com.yuanchu.mom.vo.Result;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.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;
+
+    @ValueClassify("鍩硅璁板綍")
+    @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);
+    }
+
+    @ValueClassify("鍩硅璁板綍")
+    @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
+     */
+    @ValueAuth
+    @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/yuanchu/mom/controller/SuperVisePlanController.java b/cnas-personnel/src/main/java/com/yuanchu/mom/controller/SuperVisePlanController.java
new file mode 100644
index 0000000..488a19e
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/yuanchu/mom/controller/SuperVisePlanController.java
@@ -0,0 +1,126 @@
+package com.yuanchu.mom.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yuanchu.mom.annotation.ValueAuth;
+import com.yuanchu.mom.annotation.ValueClassify;
+import com.yuanchu.mom.common.GetLook;
+import com.yuanchu.mom.dto.PersonSupervisePlanDetailsDto;
+import com.yuanchu.mom.dto.PersonSupervisePlanDto;
+import com.yuanchu.mom.pojo.PersonSupervisePlan;
+import com.yuanchu.mom.pojo.PersonSupervisePlanDetails;
+import com.yuanchu.mom.service.*;
+import com.yuanchu.mom.vo.Result;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletResponse;
+import java.time.LocalDateTime;
+import java.util.Date;
+
+/**
+ * <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 GetLook getLook;
+
+    @ValueClassify("鐩戠潱璁″垝")
+    @ApiOperation(value = "鏌ヨ 骞村害璁″垝")
+    @GetMapping("/yearPlanList")
+    public Result<IPage<PersonSupervisePlanDto>> yearPlanList(Integer size, Integer current, @RequestParam(value = "organizationPerson",required = false) String organizationPerson) {
+       return Result.success(personSupervisePlanService.yearPlanDtoIPage(new Page<>(current, size), organizationPerson));
+    }
+
+    @ValueClassify("鐩戠潱璁″垝")
+    @ApiOperation(value = "鎵瑰噯 骞村害璁″垝")
+    @GetMapping("/yearPlanDetailApproval")
+    public Result yearPlanDetailApproval(Integer id,Integer approvalStatus) {
+        personSupervisePlanService.update(Wrappers.<PersonSupervisePlan>lambdaUpdate()
+                .eq(PersonSupervisePlan::getId, id)
+                .set(PersonSupervisePlan::getApprovalStatus, approvalStatus)
+                .set(PersonSupervisePlan::getApprovalId,getLook.selectPowerByMethodAndUserId(null).get("userId"))
+                .set(PersonSupervisePlan::getApprovalDate, LocalDateTime.now()));
+        return Result.success("鏇存柊鎴愬姛");
+    }
+
+    @ValueClassify("鐩戠潱璁″垝")
+    @ApiOperation(value = "鍒犻櫎 骞村害璁″垝")
+    @DeleteMapping("/yearPlanDel")
+    public Result yearPlanDel(String id) {
+        personSupervisePlanService.removeById(id);
+        // 瀵瑰簲鐨勫勾搴﹁鍒掕鎯呬篃闇�鍒犻櫎
+        personSupervisePlanDetailsService.remove(Wrappers.<PersonSupervisePlanDetails>lambdaQuery()
+                .eq(PersonSupervisePlanDetails::getPlanId, id));
+        return Result.success();
+    }
+
+    @ValueClassify("鐩戠潱璁″垝")
+    @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));
+    }
+
+    @ValueClassify("鐩戠潱璁″垝")
+    @ApiOperation(value = "瀵煎叆 骞村害璁″垝")
+    @PostMapping("/yearPlanDetailImport")
+    public Result yearPlanDetailImport(@RequestPart("file") MultipartFile file) {
+        personSupervisePlanService.yearPlanDetailImport(file);
+        return Result.success();
+    }
+
+    @ValueClassify("鐩戠潱璁″垝")
+    @ApiOperation(value = "鍒犻櫎 骞村害璁″垝璇︽儏")
+    @DeleteMapping("/yearPlanDetailDel")
+    public Result yearPlanDetailDel(String id) {
+        return Result.success(personSupervisePlanDetailsService.removeById(id));
+    }
+
+    @ValueClassify("鐩戠潱璁″垝")
+    @ApiOperation(value = "鏂板 骞村害璁″垝璇︽儏")
+    @PostMapping("/yearPlanDetailAdd")
+    public Result yearPlanDetailAdd(@RequestBody PersonSupervisePlanDetails personSupervisePlanDetails) {
+        personSupervisePlanDetailsService.save(personSupervisePlanDetails);
+        return Result.success();
+    }
+
+    @ValueClassify("鐩戠潱璁″垝")
+    @ApiOperation(value = "缂栬緫 骞村害璁″垝璇︽儏")
+    @PostMapping("/yearPlanDetailEdit")
+    public Result yearPlanDetailEdit(@RequestBody PersonSupervisePlanDetails personSupervisePlanDetails) {
+        personSupervisePlanDetailsService.updateById(personSupervisePlanDetails);
+        return Result.success("淇濆瓨鎴愬姛");
+    }
+
+    /**
+     * 瀵煎嚭浜哄憳鐩戠潱璁″垝
+     * @return
+     */
+    @ValueAuth
+    @ApiOperation(value = "瀵煎嚭浜哄憳鐩戠潱璁″垝")
+    @PostMapping("/exportSuperVisePlan")
+    public void exportSuperVisePlan(Integer id, HttpServletResponse response){
+        personSupervisePlanService.exportSuperVisePlan(id, response);
+    }
+}
diff --git a/cnas-personnel/src/main/java/com/yuanchu/mom/dto/PersonBasicInfoDetailsDto.java b/cnas-personnel/src/main/java/com/yuanchu/mom/dto/PersonBasicInfoDetailsDto.java
new file mode 100644
index 0000000..91a9603
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/yuanchu/mom/dto/PersonBasicInfoDetailsDto.java
@@ -0,0 +1,65 @@
+package com.yuanchu.mom.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/yuanchu/mom/dto/PersonBasicInfoDto.java b/cnas-personnel/src/main/java/com/yuanchu/mom/dto/PersonBasicInfoDto.java
new file mode 100644
index 0000000..250e8c5
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/yuanchu/mom/dto/PersonBasicInfoDto.java
@@ -0,0 +1,51 @@
+package com.yuanchu.mom.dto;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.yuanchu.mom.pojo.Annex;
+import com.yuanchu.mom.pojo.PersonBasicInfo;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.w3c.dom.stylesheets.LinkStyle;
+
+import java.util.List;
+
+@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/yuanchu/mom/dto/PersonCommunicationAbilityDto.java b/cnas-personnel/src/main/java/com/yuanchu/mom/dto/PersonCommunicationAbilityDto.java
new file mode 100644
index 0000000..3945c35
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/yuanchu/mom/dto/PersonCommunicationAbilityDto.java
@@ -0,0 +1,16 @@
+package com.yuanchu.mom.dto;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.yuanchu.mom.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/yuanchu/mom/dto/PersonJobResponsibilitiesDto.java b/cnas-personnel/src/main/java/com/yuanchu/mom/dto/PersonJobResponsibilitiesDto.java
new file mode 100644
index 0000000..57c58c0
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/yuanchu/mom/dto/PersonJobResponsibilitiesDto.java
@@ -0,0 +1,16 @@
+package com.yuanchu.mom.dto;
+
+import com.yuanchu.mom.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/yuanchu/mom/dto/PersonPersonnelCapacityDto.java b/cnas-personnel/src/main/java/com/yuanchu/mom/dto/PersonPersonnelCapacityDto.java
new file mode 100644
index 0000000..606cf63
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/yuanchu/mom/dto/PersonPersonnelCapacityDto.java
@@ -0,0 +1,30 @@
+package com.yuanchu.mom.dto;
+
+import com.yuanchu.mom.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/yuanchu/mom/dto/PersonPersonnelCapacityExportDto.java b/cnas-personnel/src/main/java/com/yuanchu/mom/dto/PersonPersonnelCapacityExportDto.java
new file mode 100644
index 0000000..3838bdb
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/yuanchu/mom/dto/PersonPersonnelCapacityExportDto.java
@@ -0,0 +1,101 @@
+package com.yuanchu.mom.dto;
+
+import com.yuanchu.mom.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/yuanchu/mom/dto/PersonPostAuthorizationRecordDto.java b/cnas-personnel/src/main/java/com/yuanchu/mom/dto/PersonPostAuthorizationRecordDto.java
new file mode 100644
index 0000000..e91c2a1
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/yuanchu/mom/dto/PersonPostAuthorizationRecordDto.java
@@ -0,0 +1,14 @@
+package com.yuanchu.mom.dto;
+
+import com.yuanchu.mom.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/yuanchu/mom/dto/PersonRewardPunishmentRecordDto.java b/cnas-personnel/src/main/java/com/yuanchu/mom/dto/PersonRewardPunishmentRecordDto.java
new file mode 100644
index 0000000..c2d48df
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/yuanchu/mom/dto/PersonRewardPunishmentRecordDto.java
@@ -0,0 +1,14 @@
+package com.yuanchu.mom.dto;
+
+import com.yuanchu.mom.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/yuanchu/mom/dto/PersonSupervisePlanDetailsDto.java b/cnas-personnel/src/main/java/com/yuanchu/mom/dto/PersonSupervisePlanDetailsDto.java
new file mode 100644
index 0000000..85ae30e
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/yuanchu/mom/dto/PersonSupervisePlanDetailsDto.java
@@ -0,0 +1,12 @@
+package com.yuanchu.mom.dto;
+
+import com.yuanchu.mom.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/yuanchu/mom/dto/PersonSupervisePlanDto.java b/cnas-personnel/src/main/java/com/yuanchu/mom/dto/PersonSupervisePlanDto.java
new file mode 100644
index 0000000..4d26a81
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/yuanchu/mom/dto/PersonSupervisePlanDto.java
@@ -0,0 +1,18 @@
+package com.yuanchu.mom.dto;
+
+import com.yuanchu.mom.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;
+}
diff --git a/cnas-personnel/src/main/java/com/yuanchu/mom/dto/PersonSupervisionControlSheetExportDto.java b/cnas-personnel/src/main/java/com/yuanchu/mom/dto/PersonSupervisionControlSheetExportDto.java
new file mode 100644
index 0000000..4c1153e
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/yuanchu/mom/dto/PersonSupervisionControlSheetExportDto.java
@@ -0,0 +1,76 @@
+package com.yuanchu.mom.dto;
+
+import com.yuanchu.mom.pojo.PersonSupervisionControlSheet;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+/**
+ * @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/yuanchu/mom/dto/PersonSupervisionProcessingSheetDto.java b/cnas-personnel/src/main/java/com/yuanchu/mom/dto/PersonSupervisionProcessingSheetDto.java
new file mode 100644
index 0000000..74c8a4f
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/yuanchu/mom/dto/PersonSupervisionProcessingSheetDto.java
@@ -0,0 +1,39 @@
+package com.yuanchu.mom.dto;
+
+import com.yuanchu.mom.pojo.PersonSupervisionProcessingSheet;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+/**
+ * @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 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/yuanchu/mom/dto/PersonSupervisionRecordDto.java b/cnas-personnel/src/main/java/com/yuanchu/mom/dto/PersonSupervisionRecordDto.java
new file mode 100644
index 0000000..8264105
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/yuanchu/mom/dto/PersonSupervisionRecordDto.java
@@ -0,0 +1,32 @@
+package com.yuanchu.mom.dto;
+
+import com.yuanchu.mom.pojo.PersonSupervisionRecord;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@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;
+}
diff --git a/cnas-personnel/src/main/java/com/yuanchu/mom/dto/PersonTrainingDetailedDto.java b/cnas-personnel/src/main/java/com/yuanchu/mom/dto/PersonTrainingDetailedDto.java
new file mode 100644
index 0000000..49c66e0
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/yuanchu/mom/dto/PersonTrainingDetailedDto.java
@@ -0,0 +1,31 @@
+package com.yuanchu.mom.dto;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.yuanchu.mom.pojo.PersonTrainingDetailed;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class PersonTrainingDetailedDto extends PersonTrainingDetailed {
+
+    @ApiModelProperty("涓惧姙閮ㄩ棬鍚嶇О")
+    private String holdingDepartmentName;
+
+    @ApiModelProperty("鍩硅璁插笀鍚嶇О")
+    private String trainingLecturerName;
+
+    @ApiModelProperty("褰撳墠鐧诲綍浜烘槸鍚﹁棰�")
+    private Boolean whetherClaim;
+
+
+    @ApiModelProperty("鍩硅鏃ユ湡")
+    private String trainingDateString;
+
+    // 瀵煎嚭浣跨敤
+    @TableField(select = false, exist = false)
+    @ApiModelProperty("搴忓彿(瀵煎嚭浣跨敤)")
+    private Integer index;
+
+}
diff --git a/cnas-personnel/src/main/java/com/yuanchu/mom/dto/PersonTrainingDto.java b/cnas-personnel/src/main/java/com/yuanchu/mom/dto/PersonTrainingDto.java
new file mode 100644
index 0000000..d6c6fed
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/yuanchu/mom/dto/PersonTrainingDto.java
@@ -0,0 +1,23 @@
+package com.yuanchu.mom.dto;
+
+import com.yuanchu.mom.pojo.PersonTraining;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel(value = "PersonTrainingDto瀵硅薄", description = "鍩硅璁″垝")
+public class PersonTrainingDto extends PersonTraining {
+
+    @ApiModelProperty("缂栧埗浜哄鍚�")
+    private String compilerName;
+
+    @ApiModelProperty("瀹℃牳浜哄鍚�")
+    private String reviewerName;
+
+    @ApiModelProperty("鎵瑰噯浜哄鍚�")
+    private String approverName;
+
+    @ApiModelProperty("鍒涘缓浜哄鍚�")
+    private String createUserName;
+}
diff --git a/cnas-personnel/src/main/java/com/yuanchu/mom/dto/PersonTrainingRecordDto.java b/cnas-personnel/src/main/java/com/yuanchu/mom/dto/PersonTrainingRecordDto.java
new file mode 100644
index 0000000..74978ad
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/yuanchu/mom/dto/PersonTrainingRecordDto.java
@@ -0,0 +1,23 @@
+package com.yuanchu.mom.dto;
+
+import com.yuanchu.mom.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/yuanchu/mom/dto/PersonTrainingRecordListDto.java b/cnas-personnel/src/main/java/com/yuanchu/mom/dto/PersonTrainingRecordListDto.java
new file mode 100644
index 0000000..f48d038
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/yuanchu/mom/dto/PersonTrainingRecordListDto.java
@@ -0,0 +1,37 @@
+package com.yuanchu.mom.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/yuanchu/mom/dto/PersonTrainingRecordSubmitDto.java b/cnas-personnel/src/main/java/com/yuanchu/mom/dto/PersonTrainingRecordSubmitDto.java
new file mode 100644
index 0000000..307b34d
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/yuanchu/mom/dto/PersonTrainingRecordSubmitDto.java
@@ -0,0 +1,30 @@
+package com.yuanchu.mom.dto;
+
+import com.yuanchu.mom.pojo.PersonTrainingRecord;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class PersonTrainingRecordSubmitDto{
+
+    @ApiModelProperty("骞村害璁″垝鏄庣粏ID")
+    private Integer trainingDetailedId;
+
+    @ApiModelProperty("鑰冩牳鏂瑰紡")
+    private String assessmentMethod;
+
+    @ApiModelProperty("鏈鍩硅缁煎悎璇勪环")
+    private String comprehensiveAssessment;
+
+    @ApiModelProperty("璇勪环浜�")
+    private Integer assessmentUserId;
+
+    private String state;
+
+    @ApiModelProperty("璇炬椂")
+    private Integer classHour;
+
+
+}
diff --git a/cnas-personnel/src/main/java/com/yuanchu/mom/dto/PersonTrainingUpdateDto.java b/cnas-personnel/src/main/java/com/yuanchu/mom/dto/PersonTrainingUpdateDto.java
new file mode 100644
index 0000000..f713889
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/yuanchu/mom/dto/PersonTrainingUpdateDto.java
@@ -0,0 +1,17 @@
+package com.yuanchu.mom.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/yuanchu/mom/dto/TrainingRecordExportDto.java b/cnas-personnel/src/main/java/com/yuanchu/mom/dto/TrainingRecordExportDto.java
new file mode 100644
index 0000000..14c85e7
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/yuanchu/mom/dto/TrainingRecordExportDto.java
@@ -0,0 +1,32 @@
+package com.yuanchu.mom.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/yuanchu/mom/dto/TrainingRecordPersonDetailedDto.java b/cnas-personnel/src/main/java/com/yuanchu/mom/dto/TrainingRecordPersonDetailedDto.java
new file mode 100644
index 0000000..fc2b403
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/yuanchu/mom/dto/TrainingRecordPersonDetailedDto.java
@@ -0,0 +1,28 @@
+package com.yuanchu.mom.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/yuanchu/mom/excel/PersonRewardPunishmentRecordExcel.java b/cnas-personnel/src/main/java/com/yuanchu/mom/excel/PersonRewardPunishmentRecordExcel.java
new file mode 100644
index 0000000..34da4cb
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/yuanchu/mom/excel/PersonRewardPunishmentRecordExcel.java
@@ -0,0 +1,36 @@
+package com.yuanchu.mom.excel;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Data
+public class 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/yuanchu/mom/excel/PersonSupervisePlanDetailsListener.java b/cnas-personnel/src/main/java/com/yuanchu/mom/excel/PersonSupervisePlanDetailsListener.java
new file mode 100644
index 0000000..cd80c4d
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/yuanchu/mom/excel/PersonSupervisePlanDetailsListener.java
@@ -0,0 +1,43 @@
+package com.yuanchu.mom.excel;
+
+import com.alibaba.excel.context.AnalysisContext;
+import com.alibaba.excel.event.AnalysisEventListener;
+import com.yuanchu.mom.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/yuanchu/mom/excel/PersonSupervisePlanDetailsUpload.java b/cnas-personnel/src/main/java/com/yuanchu/mom/excel/PersonSupervisePlanDetailsUpload.java
new file mode 100644
index 0000000..084122e
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/yuanchu/mom/excel/PersonSupervisePlanDetailsUpload.java
@@ -0,0 +1,28 @@
+package com.yuanchu.mom.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/yuanchu/mom/excel/PersonTrainingDetailedListener.java b/cnas-personnel/src/main/java/com/yuanchu/mom/excel/PersonTrainingDetailedListener.java
new file mode 100644
index 0000000..02da65e
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/yuanchu/mom/excel/PersonTrainingDetailedListener.java
@@ -0,0 +1,42 @@
+package com.yuanchu.mom.excel;
+
+import com.alibaba.excel.context.AnalysisContext;
+import com.alibaba.excel.event.AnalysisEventListener;
+import com.yuanchu.mom.service.PersonTrainingDetailedService;
+import lombok.Data;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Data
+public class PersonTrainingDetailedListener extends AnalysisEventListener<PersonTrainingDetailedUpload> {
+
+    private Integer planId;
+
+    private static final int BATCH_COUNT = 1000;
+    List<PersonTrainingDetailedUpload> list = new ArrayList<>();
+
+    private PersonTrainingDetailedService personTrainingDetailedService;
+
+    public PersonTrainingDetailedListener(PersonTrainingDetailedService personTrainingDetailedService) {
+        this.personTrainingDetailedService = personTrainingDetailedService;
+    }
+
+    @Override
+    public void invoke(PersonTrainingDetailedUpload data, AnalysisContext context) {
+        list.add(data);
+        if (list.size() >= BATCH_COUNT) {
+            save();
+            list.clear();
+        }
+    }
+
+    @Override
+    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
+        save();
+    }
+
+    private void save() {
+        personTrainingDetailedService.importExcel(list, this.planId);
+    }
+}
diff --git a/cnas-personnel/src/main/java/com/yuanchu/mom/excel/PersonTrainingDetailedUpload.java b/cnas-personnel/src/main/java/com/yuanchu/mom/excel/PersonTrainingDetailedUpload.java
new file mode 100644
index 0000000..3afed10
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/yuanchu/mom/excel/PersonTrainingDetailedUpload.java
@@ -0,0 +1,37 @@
+package com.yuanchu.mom.excel;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Data
+public class PersonTrainingDetailedUpload {
+
+    @ExcelProperty("鍩硅鐩爣")
+    private String trainingObjectives;
+
+    @ExcelProperty("鍩硅鍐呭")
+    private String trainingContent;
+
+    @ExcelProperty("鍩硅鏂瑰紡")
+    private String trainingMode;
+
+    @ExcelProperty("鍙傚姞瀵硅薄")
+    private String participants;
+
+    @ExcelProperty("涓惧姙閮ㄩ棬")
+    private String holdingDepartment;
+
+    @ExcelProperty("鍩硅璁插笀")
+    private String trainingLecturerName;
+
+    @ExcelProperty("鍩硅鏃堕棿")
+    private LocalDateTime trainingDate;
+
+    @ExcelProperty("璇炬椂")
+    private Integer classHour;
+
+    @ExcelProperty("澶囨敞")
+    private String remarks;
+}
diff --git a/cnas-personnel/src/main/java/com/yuanchu/mom/mapper/AnnexMapper.java b/cnas-personnel/src/main/java/com/yuanchu/mom/mapper/AnnexMapper.java
new file mode 100644
index 0000000..51e7e49
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/yuanchu/mom/mapper/AnnexMapper.java
@@ -0,0 +1,9 @@
+package com.yuanchu.mom.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.yuanchu.mom.pojo.Annex;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface AnnexMapper extends BaseMapper<Annex> {
+}
diff --git a/cnas-personnel/src/main/java/com/yuanchu/mom/mapper/PersonBasicInfoMapper.java b/cnas-personnel/src/main/java/com/yuanchu/mom/mapper/PersonBasicInfoMapper.java
new file mode 100644
index 0000000..44b5ab9
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/yuanchu/mom/mapper/PersonBasicInfoMapper.java
@@ -0,0 +1,37 @@
+package com.yuanchu.mom.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yuanchu.mom.dto.DepartmentDto;
+import com.yuanchu.mom.dto.PersonBasicInfoDto;
+import com.yuanchu.mom.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/yuanchu/mom/mapper/PersonCommunicationAbilityMapper.java b/cnas-personnel/src/main/java/com/yuanchu/mom/mapper/PersonCommunicationAbilityMapper.java
new file mode 100644
index 0000000..d84aa36
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/yuanchu/mom/mapper/PersonCommunicationAbilityMapper.java
@@ -0,0 +1,21 @@
+package com.yuanchu.mom.mapper;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yuanchu.mom.dto.PersonCommunicationAbilityDto;
+import com.yuanchu.mom.pojo.PersonCommunicationAbility;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+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/yuanchu/mom/mapper/PersonJobResponsibilitiesMapper.java b/cnas-personnel/src/main/java/com/yuanchu/mom/mapper/PersonJobResponsibilitiesMapper.java
new file mode 100644
index 0000000..67bf184
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/yuanchu/mom/mapper/PersonJobResponsibilitiesMapper.java
@@ -0,0 +1,20 @@
+package com.yuanchu.mom.mapper;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yuanchu.mom.dto.PersonJobResponsibilitiesDto;
+import com.yuanchu.mom.pojo.PersonJobResponsibilities;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <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/yuanchu/mom/mapper/PersonPersonnelCapacityMapper.java b/cnas-personnel/src/main/java/com/yuanchu/mom/mapper/PersonPersonnelCapacityMapper.java
new file mode 100644
index 0000000..4f97cb1
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/yuanchu/mom/mapper/PersonPersonnelCapacityMapper.java
@@ -0,0 +1,29 @@
+package com.yuanchu.mom.mapper;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yuanchu.mom.dto.PersonPersonnelCapacityDto;
+import com.yuanchu.mom.dto.PersonPersonnelCapacityExportDto;
+import com.yuanchu.mom.pojo.PersonPersonnelCapacity;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+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/yuanchu/mom/mapper/PersonPostAuthorizationRecordMapper.java b/cnas-personnel/src/main/java/com/yuanchu/mom/mapper/PersonPostAuthorizationRecordMapper.java
new file mode 100644
index 0000000..6378e33
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/yuanchu/mom/mapper/PersonPostAuthorizationRecordMapper.java
@@ -0,0 +1,20 @@
+package com.yuanchu.mom.mapper;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yuanchu.mom.dto.PersonPostAuthorizationRecordDto;
+import com.yuanchu.mom.pojo.PersonPostAuthorizationRecord;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <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/yuanchu/mom/mapper/PersonRewardPunishmentRecordMapper.java b/cnas-personnel/src/main/java/com/yuanchu/mom/mapper/PersonRewardPunishmentRecordMapper.java
new file mode 100644
index 0000000..603f04b
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/yuanchu/mom/mapper/PersonRewardPunishmentRecordMapper.java
@@ -0,0 +1,27 @@
+package com.yuanchu.mom.mapper;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.yuanchu.mom.dto.PersonRewardPunishmentRecordDto;
+import com.yuanchu.mom.excel.PersonRewardPunishmentRecordExcel;
+import com.yuanchu.mom.pojo.PersonRewardPunishmentRecord;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+import java.time.LocalDateTime;
+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/yuanchu/mom/mapper/PersonSupervisePlanDetailsMapper.java b/cnas-personnel/src/main/java/com/yuanchu/mom/mapper/PersonSupervisePlanDetailsMapper.java
new file mode 100644
index 0000000..a193a78
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/yuanchu/mom/mapper/PersonSupervisePlanDetailsMapper.java
@@ -0,0 +1,25 @@
+package com.yuanchu.mom.mapper;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yuanchu.mom.dto.PersonSupervisePlanDetailsDto;
+import com.yuanchu.mom.mybatis_config.MyBaseMapper;
+import com.yuanchu.mom.pojo.PersonSupervisePlanDetails;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+import java.time.LocalDateTime;
+import java.util.Date;
+
+/**
+ * <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/yuanchu/mom/mapper/PersonSupervisePlanMapper.java b/cnas-personnel/src/main/java/com/yuanchu/mom/mapper/PersonSupervisePlanMapper.java
new file mode 100644
index 0000000..1e86168
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/yuanchu/mom/mapper/PersonSupervisePlanMapper.java
@@ -0,0 +1,21 @@
+package com.yuanchu.mom.mapper;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yuanchu.mom.dto.PersonSupervisePlanDto;
+import com.yuanchu.mom.pojo.PersonSupervisePlan;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 鐩戠潱璁″垝 - 鐖� Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-10-09 04:14:45
+ */
+public interface PersonSupervisePlanMapper extends BaseMapper<PersonSupervisePlan> {
+
+    IPage<PersonSupervisePlanDto> pageByPerson(Page page, String organizationPerson);
+
+}
diff --git a/cnas-personnel/src/main/java/com/yuanchu/mom/mapper/PersonSupervisionControlSheetMapper.java b/cnas-personnel/src/main/java/com/yuanchu/mom/mapper/PersonSupervisionControlSheetMapper.java
new file mode 100644
index 0000000..f684fdc
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/yuanchu/mom/mapper/PersonSupervisionControlSheetMapper.java
@@ -0,0 +1,25 @@
+package com.yuanchu.mom.mapper;
+
+import com.yuanchu.mom.dto.PersonSupervisionControlSheetExportDto;
+import com.yuanchu.mom.pojo.PersonSupervisionControlSheet;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+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/yuanchu/mom/mapper/PersonSupervisionProcessingSheetMapper.java b/cnas-personnel/src/main/java/com/yuanchu/mom/mapper/PersonSupervisionProcessingSheetMapper.java
new file mode 100644
index 0000000..b2f103a
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/yuanchu/mom/mapper/PersonSupervisionProcessingSheetMapper.java
@@ -0,0 +1,24 @@
+package com.yuanchu.mom.mapper;
+
+import com.yuanchu.mom.dto.PersonSupervisionProcessingSheetDto;
+import com.yuanchu.mom.pojo.PersonSupervisionProcessingSheet;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+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/yuanchu/mom/mapper/PersonSupervisionRecordMapper.java b/cnas-personnel/src/main/java/com/yuanchu/mom/mapper/PersonSupervisionRecordMapper.java
new file mode 100644
index 0000000..ec59a66
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/yuanchu/mom/mapper/PersonSupervisionRecordMapper.java
@@ -0,0 +1,27 @@
+package com.yuanchu.mom.mapper;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yuanchu.mom.dto.PersonSupervisionRecordDto;
+import com.yuanchu.mom.pojo.PersonSupervisionRecord;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <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/yuanchu/mom/mapper/PersonTrackRecordMapper.java b/cnas-personnel/src/main/java/com/yuanchu/mom/mapper/PersonTrackRecordMapper.java
new file mode 100644
index 0000000..7b5e990
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/yuanchu/mom/mapper/PersonTrackRecordMapper.java
@@ -0,0 +1,24 @@
+package com.yuanchu.mom.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yuanchu.mom.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/yuanchu/mom/mapper/PersonTrainingDetailedMapper.java b/cnas-personnel/src/main/java/com/yuanchu/mom/mapper/PersonTrainingDetailedMapper.java
new file mode 100644
index 0000000..5748e58
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/yuanchu/mom/mapper/PersonTrainingDetailedMapper.java
@@ -0,0 +1,45 @@
+package com.yuanchu.mom.mapper;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yuanchu.mom.dto.PersonTrainingDetailedDto;
+import com.yuanchu.mom.dto.PersonTrainingRecordDto;
+import com.yuanchu.mom.mybatis_config.MyBaseMapper;
+import com.yuanchu.mom.pojo.PersonTrainingDetailed;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * <p>
+ * 鍩硅璁″垝璇︽儏 Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-10-11 01:46:27
+ */
+public interface PersonTrainingDetailedMapper extends MyBaseMapper<PersonTrainingDetailed> {
+
+    IPage<PersonTrainingDetailedDto> queryTheAnnualPlanDetailsTable(Page page,
+                                                                    String trainingLecturerName,
+                                                                    String courseCode, String trainingDate,
+                                                                    Integer id,
+                                                                    Integer userId,
+                                                                    Integer loginUserId);
+
+    /**
+     * 鏍规嵁涓昏〃id鏌ヨ璇︽儏
+     * @param trainingId
+     * @return
+     */
+    List<PersonTrainingDetailedDto> selectTrainingList(@Param("trainingId") Integer trainingId);
+
+    /**
+     * 鏌ヨ璇︾粏
+     * @param id
+     * @return
+     */
+    PersonTrainingDetailedDto selectTrainingDetail(@Param("id") Integer id);
+}
diff --git a/cnas-personnel/src/main/java/com/yuanchu/mom/mapper/PersonTrainingMapper.java b/cnas-personnel/src/main/java/com/yuanchu/mom/mapper/PersonTrainingMapper.java
new file mode 100644
index 0000000..cf69663
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/yuanchu/mom/mapper/PersonTrainingMapper.java
@@ -0,0 +1,20 @@
+package com.yuanchu.mom.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yuanchu.mom.dto.PersonTrainingDto;
+import com.yuanchu.mom.pojo.PersonTraining;
+
+/**
+ * <p>
+ * 鍩硅璁″垝 Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-10-11 01:11:49
+ */
+public interface PersonTrainingMapper extends BaseMapper<PersonTraining> {
+
+    IPage<PersonTrainingDto> personTrainingSelect(Page page, String compilerName, String departLimsId);
+}
diff --git a/cnas-personnel/src/main/java/com/yuanchu/mom/mapper/PersonTrainingRecordMapper.java b/cnas-personnel/src/main/java/com/yuanchu/mom/mapper/PersonTrainingRecordMapper.java
new file mode 100644
index 0000000..054279a
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/yuanchu/mom/mapper/PersonTrainingRecordMapper.java
@@ -0,0 +1,67 @@
+package com.yuanchu.mom.mapper;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yuanchu.mom.dto.PersonTrainingRecordDto;
+import com.yuanchu.mom.dto.PersonTrainingRecordListDto;
+import com.yuanchu.mom.dto.TrainingRecordPersonDetailedDto;
+import com.yuanchu.mom.pojo.PersonTrainingRecord;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+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/yuanchu/mom/pojo/Annex.java b/cnas-personnel/src/main/java/com/yuanchu/mom/pojo/Annex.java
new file mode 100644
index 0000000..136dd53
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/yuanchu/mom/pojo/Annex.java
@@ -0,0 +1,50 @@
+package com.yuanchu.mom.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.yuanchu.mom.common.OrderBy;
+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/yuanchu/mom/pojo/PersonBasicInfo.java b/cnas-personnel/src/main/java/com/yuanchu/mom/pojo/PersonBasicInfo.java
new file mode 100644
index 0000000..0dee8c4
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/yuanchu/mom/pojo/PersonBasicInfo.java
@@ -0,0 +1,251 @@
+package com.yuanchu.mom.pojo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-08-30 09:19:57
+ */
+@Getter
+@Setter
+@TableName("cnas_person_basic_info")
+@ApiModel(value = "PersonBasicInfo瀵硅薄", description = "")
+public class PersonBasicInfo implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("涓婚敭id")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty("褰撳墠鐘舵��")
+    private String currentState;
+
+    @ApiModelProperty("鍏ヨ亴鏃堕棿")
+    @TableField(updateStrategy = FieldStrategy.IGNORED) // 涓虹┖鍙互鏇存柊
+    private LocalDateTime entryTime;
+
+    @ApiModelProperty("褰撳墠鑱屽姟")
+    private String currentPosition;
+
+    @ApiModelProperty("宀椾綅")
+    private String post;
+
+    @ApiModelProperty("鑱岀О")
+    @ExcelProperty("鑱岀О")
+    private String professionalTitle;
+
+    @ApiModelProperty("鎬у埆")
+    private String sex;
+
+    @ApiModelProperty("浜哄憳鍒嗙被")
+    private String personnelClassification;
+
+    @ApiModelProperty("鍑虹敓鏃ユ湡")
+    @TableField(updateStrategy = FieldStrategy.IGNORED) // 涓虹┖鍙互鏇存柊
+    private LocalDateTime dateBirth;
+
+    @ApiModelProperty("韬唤璇佸彿")
+    @ExcelProperty("璇佷欢鍙风爜")
+    private String identityCard;
+
+    @ApiModelProperty("姘戞棌")
+    private String nation;
+
+    @ApiModelProperty("鏀挎不闈㈣矊")
+    private String politicalStatus;
+
+    @ApiModelProperty("鏈�楂樺鍘�")
+    @ExcelProperty("鏈�楂樺鍘�")
+    private String officialAcademicRedentials;
+
+    @ApiModelProperty("姣曚笟鏃堕棿1")
+    @ExcelProperty("姣曚笟鏃堕棿")
+    private LocalDateTime graduationTime1;
+
+    @ApiModelProperty("姣曚笟闄㈡牎1")
+    @ExcelProperty("姣曚笟闄㈡牎")
+    private String graduatedInstitutions1;
+
+    @ApiModelProperty("涓撲笟1")
+    @ExcelProperty("鎵�瀛︿笓涓�")
+    private String major1;
+
+    @ApiModelProperty("姣曚笟鏃堕棿2")
+    @TableField(updateStrategy = FieldStrategy.IGNORED) // 涓虹┖鍙互鏇存柊
+    private LocalDateTime graduationTime2;
+
+    @ApiModelProperty("姣曚笟闄㈡牎2")
+    private String graduatedInstitutions2;
+
+    @ApiModelProperty("涓撲笟2")
+    private String major2;
+
+    @ApiModelProperty("鎵嬫満鍙�")
+    private String telephone;
+
+    @ApiModelProperty("璁″垝瀹炰範缁撴潫")
+    @TableField(updateStrategy = FieldStrategy.IGNORED) // 涓虹┖鍙互鏇存柊
+    private LocalDateTime endPlannedInternship;
+
+    @ApiModelProperty("瀹為檯瀹炰範缁撴潫")
+    @TableField(updateStrategy = FieldStrategy.IGNORED) // 涓虹┖鍙互鏇存柊
+    private LocalDateTime endPracticalPractice;
+
+    @ApiModelProperty("绂昏亴鏃ユ湡")
+    @TableField(updateStrategy = FieldStrategy.IGNORED) // 涓虹┖鍙互鏇存柊
+    private LocalDateTime dateDeparture;
+
+    @ApiModelProperty("妗岄潰鍥剧墖")
+    private String desktopPicture;
+
+    @ApiModelProperty("闄勪欢璧勬枡")
+    private String attachmentInformation;
+
+    @ApiModelProperty("澶囨敞")
+    private String remarks;
+
+    @ApiModelProperty("鐢ㄦ埛琛紙user锛塱d")
+    private Integer userId;
+//
+    @ApiModelProperty("宸ュ彿")
+    private Integer 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 HH:mm:ss",timezone = "GMT+8")
+    @TableField(updateStrategy = FieldStrategy.IGNORED) // 涓虹┖鍙互鏇存柊
+    @ExcelProperty("鍏ラ泦鍥㈡椂闂�")
+    private LocalDateTime groupTime;
+
+    @ApiModelProperty("鍏ュ崟浣嶆椂闂�")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
+    @TableField(updateStrategy = FieldStrategy.IGNORED) // 涓虹┖鍙互鏇存柊
+    @ExcelProperty("鍏ュ崟浣嶆椂闂�")
+    private LocalDateTime unitTime;
+
+
+    @ApiModelProperty("鐩存帴涓婄骇")
+    private String reportingTo;
+
+
+    @ApiModelProperty("鍔冲姩鍏崇郴")
+    private Integer laborRelations;
+
+    @ApiModelProperty("璇曠敤寮�濮嬫椂闂�")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
+    @TableField(updateStrategy = FieldStrategy.IGNORED) // 涓虹┖鍙互鏇存柊
+    private LocalDateTime trialStartTime;
+
+    @ApiModelProperty("璇曠敤缁撴潫鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
+    @TableField(updateStrategy = FieldStrategy.IGNORED) // 涓虹┖鍙互鏇存柊
+    private LocalDateTime trialEndTime;
+
+    @ApiModelProperty("绫嶈疮")
+    @ExcelProperty("绫嶈疮")
+    private String nativePlace;
+
+    @ApiModelProperty("璇佷欢绫诲瀷")
+    private String idType;
+
+    @ApiModelProperty("璇佷欢鏈夋晥鏈�")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
+    @TableField(updateStrategy = FieldStrategy.IGNORED) // 涓虹┖鍙互鏇存柊
+    private LocalDateTime validityPeriod;
+
+    @ApiModelProperty("濠氬Щ鐘跺喌")
+    private Integer maritalStatus;
+
+    @ApiModelProperty("璇佷欢鍦板潃")
+    @ExcelProperty("璇佷欢鍦板潃")
+    private String idAddress;
+
+    @ApiModelProperty("璇佷欢璇︾粏鍦板潃")
+    private String idDetailAddress;
+
+    @ApiModelProperty("鐜板眳鍦板潃")
+    private String currentAddress;
+
+    @ApiModelProperty("鐜板眳璇︾粏鍦板潃")
+    private String currentDetailAddress;
+
+    @ApiModelProperty("閫佽揪鍦板潃")
+    private String serviceAddress;
+
+    @ApiModelProperty("閫佽揪璇︾粏鍦板潃")
+    private String serviceDetailAddress;
+
+    @ApiModelProperty("鏄惁閫�浼嶅啗浜�")
+    private Integer retiredSoldiers;
+
+    @ApiModelProperty("鍏ュ厷/鍥㈡椂闂�")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
+    @TableField(updateStrategy = FieldStrategy.IGNORED) // 涓虹┖鍙互鏇存柊
+    private LocalDateTime 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("鏈�鍚庢洿鏂版椂闂�")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime lastUpdateTime;
+
+
+
+}
diff --git a/cnas-personnel/src/main/java/com/yuanchu/mom/pojo/PersonCommunicationAbility.java b/cnas-personnel/src/main/java/com/yuanchu/mom/pojo/PersonCommunicationAbility.java
new file mode 100644
index 0000000..e1708bd
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/yuanchu/mom/pojo/PersonCommunicationAbility.java
@@ -0,0 +1,66 @@
+package com.yuanchu.mom.pojo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <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/yuanchu/mom/pojo/PersonJobResponsibilities.java b/cnas-personnel/src/main/java/com/yuanchu/mom/pojo/PersonJobResponsibilities.java
new file mode 100644
index 0000000..3d2c47d
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/yuanchu/mom/pojo/PersonJobResponsibilities.java
@@ -0,0 +1,78 @@
+package com.yuanchu.mom.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <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/yuanchu/mom/pojo/PersonPersonnelCapacity.java b/cnas-personnel/src/main/java/com/yuanchu/mom/pojo/PersonPersonnelCapacity.java
new file mode 100644
index 0000000..3ba9a04
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/yuanchu/mom/pojo/PersonPersonnelCapacity.java
@@ -0,0 +1,125 @@
+package com.yuanchu.mom.pojo;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <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/yuanchu/mom/pojo/PersonPostAuthorizationRecord.java b/cnas-personnel/src/main/java/com/yuanchu/mom/pojo/PersonPostAuthorizationRecord.java
new file mode 100644
index 0000000..8be757a
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/yuanchu/mom/pojo/PersonPostAuthorizationRecord.java
@@ -0,0 +1,77 @@
+package com.yuanchu.mom.pojo;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <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/yuanchu/mom/pojo/PersonRewardPunishmentRecord.java b/cnas-personnel/src/main/java/com/yuanchu/mom/pojo/PersonRewardPunishmentRecord.java
new file mode 100644
index 0000000..9bdb20d
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/yuanchu/mom/pojo/PersonRewardPunishmentRecord.java
@@ -0,0 +1,64 @@
+package com.yuanchu.mom.pojo;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <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/yuanchu/mom/pojo/PersonSupervisePlan.java b/cnas-personnel/src/main/java/com/yuanchu/mom/pojo/PersonSupervisePlan.java
new file mode 100644
index 0000000..35d662d
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/yuanchu/mom/pojo/PersonSupervisePlan.java
@@ -0,0 +1,66 @@
+package com.yuanchu.mom.pojo;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * <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;
+}
diff --git a/cnas-personnel/src/main/java/com/yuanchu/mom/pojo/PersonSupervisePlanDetails.java b/cnas-personnel/src/main/java/com/yuanchu/mom/pojo/PersonSupervisePlanDetails.java
new file mode 100644
index 0000000..6cac12a
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/yuanchu/mom/pojo/PersonSupervisePlanDetails.java
@@ -0,0 +1,77 @@
+package com.yuanchu.mom.pojo;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import java.util.Date;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <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")
+    @ApiModelProperty("鐩戠潱鏃ユ湡")
+    private Date 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/yuanchu/mom/pojo/PersonSupervisionControlSheet.java b/cnas-personnel/src/main/java/com/yuanchu/mom/pojo/PersonSupervisionControlSheet.java
new file mode 100644
index 0000000..8f7ce58
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/yuanchu/mom/pojo/PersonSupervisionControlSheet.java
@@ -0,0 +1,112 @@
+package com.yuanchu.mom.pojo;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <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换閮ㄩ棬 璐熻矗浜篿d")
+    private Integer responsibleDepartmentPersonId;
+
+    @ApiModelProperty("3璐d换閮ㄩ棬 鏃ユ湡")
+    private LocalDateTime responsibleDepartmentDate;
+
+    @ApiModelProperty("4鏄惁闇�瑕侀噰鍙栫籂姝f帾鏂�")
+    private String 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/yuanchu/mom/pojo/PersonSupervisionProcessingSheet.java b/cnas-personnel/src/main/java/com/yuanchu/mom/pojo/PersonSupervisionProcessingSheet.java
new file mode 100644
index 0000000..4d12c5e
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/yuanchu/mom/pojo/PersonSupervisionProcessingSheet.java
@@ -0,0 +1,87 @@
+package com.yuanchu.mom.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <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 鎻愬嚭閮ㄩ棬 浜哄憳 id")
+    private Integer proposingDepartmentPersonId;
+
+    @ApiModelProperty("1 鎻愬嚭閮ㄩ棬 鏃ユ湡")
+    private LocalDateTime proposingDepartmentDate;
+
+    @ApiModelProperty("2 鍘熷洜鍒嗘瀽")
+    private String causeAnalysis;
+
+    @ApiModelProperty("2 鍘熷洜鍒嗘瀽 閮ㄩ棬 浜哄憳 id")
+    private Integer causeAnalysisPersonId;
+
+    @ApiModelProperty("2 鍘熷洜鍒嗘瀽 鏃ユ湡")
+    private LocalDateTime causeAnalysisDate;
+
+    @ApiModelProperty("3 绾犳鎺柦")
+    private String correctiveMeasure;
+
+    @ApiModelProperty("3 绾犳鎺柦 鎻愬嚭瑕佹眰閮ㄩ棬纭")
+    private String requestDepartmentConfirmation;
+
+    @ApiModelProperty("3 绾犳鎺柦 浜哄憳id")
+    private Integer correctiveActionId;
+
+    @ApiModelProperty("3 绾犳鎺柦 鏃ユ湡")
+    private LocalDateTime correctiveActionDate;
+
+    @ApiModelProperty("4 瀹炴柦楠岃瘉缁撴灉")
+    private String implementationVerificationResults;
+
+    @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/yuanchu/mom/pojo/PersonSupervisionRecord.java b/cnas-personnel/src/main/java/com/yuanchu/mom/pojo/PersonSupervisionRecord.java
new file mode 100644
index 0000000..8dcfed5
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/yuanchu/mom/pojo/PersonSupervisionRecord.java
@@ -0,0 +1,107 @@
+package com.yuanchu.mom.pojo;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <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 LocalDateTime 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;
+}
diff --git a/cnas-personnel/src/main/java/com/yuanchu/mom/pojo/PersonTrackRecord.java b/cnas-personnel/src/main/java/com/yuanchu/mom/pojo/PersonTrackRecord.java
new file mode 100644
index 0000000..6f946f1
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/yuanchu/mom/pojo/PersonTrackRecord.java
@@ -0,0 +1,83 @@
+package com.yuanchu.mom.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/yuanchu/mom/pojo/PersonTraining.java b/cnas-personnel/src/main/java/com/yuanchu/mom/pojo/PersonTraining.java
new file mode 100644
index 0000000..8eff270
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/yuanchu/mom/pojo/PersonTraining.java
@@ -0,0 +1,83 @@
+package com.yuanchu.mom.pojo;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <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;
+}
diff --git a/cnas-personnel/src/main/java/com/yuanchu/mom/pojo/PersonTrainingDetailed.java b/cnas-personnel/src/main/java/com/yuanchu/mom/pojo/PersonTrainingDetailed.java
new file mode 100644
index 0000000..2f5b8b2
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/yuanchu/mom/pojo/PersonTrainingDetailed.java
@@ -0,0 +1,111 @@
+package com.yuanchu.mom.pojo;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import java.util.Date;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <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 Integer trainingLecturerId;
+
+    @ApiModelProperty("鍩硅鏃ユ湡")
+    private Date trainingDate;
+
+    @ApiModelProperty("寮�濮嬫椂闂�")
+    private String openingTime;
+
+    @ApiModelProperty("缁撴潫鏃堕棿")
+    private String endTime;
+
+    @ApiModelProperty("璇鹃瀛﹀垎")
+    private String projectCredits;
+
+    @ApiModelProperty("璇炬椂")
+    private Integer classHour;
+
+    @ApiModelProperty("澶囨敞")
+    private String remarks;
+
+    @ApiModelProperty("鍩硅璁″垝id")
+    private Integer planId;
+
+    @ApiModelProperty(value = "鍒涘缓鏃堕棿", hidden = true)
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @ApiModelProperty(value = "鍒涘缓浜篿d", hidden = true)
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @ApiModelProperty(value = "鏇存柊浜篿d", hidden = true)
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    @ApiModelProperty(value = "鏇存柊鏃堕棿", hidden = true)
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+
+    @ApiModelProperty("鑰冩牳鏂瑰紡")
+    private String assessmentMethod;
+
+    @ApiModelProperty("鏈鍩硅缁煎悎璇勪环")
+    private String comprehensiveAssessment;
+
+    @ApiModelProperty("璇勪环浜�")
+    private Integer assessmentUserId;
+}
diff --git a/cnas-personnel/src/main/java/com/yuanchu/mom/pojo/PersonTrainingRecord.java b/cnas-personnel/src/main/java/com/yuanchu/mom/pojo/PersonTrainingRecord.java
new file mode 100644
index 0000000..944e116
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/yuanchu/mom/pojo/PersonTrainingRecord.java
@@ -0,0 +1,40 @@
+package com.yuanchu.mom.pojo;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <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/yuanchu/mom/schedule/PersonSchedule.java b/cnas-personnel/src/main/java/com/yuanchu/mom/schedule/PersonSchedule.java
new file mode 100644
index 0000000..1285052
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/yuanchu/mom/schedule/PersonSchedule.java
@@ -0,0 +1,49 @@
+package com.yuanchu.mom.schedule;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.yuanchu.mom.pojo.PersonTrainingDetailed;
+import com.yuanchu.mom.service.PersonTrainingDetailedService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.List;
+
+@Component
+public class PersonSchedule {
+
+    @Autowired
+    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)
+                .lt(PersonTrainingDetailed::getTrainingDate, newDate));
+        list.forEach(i -> {
+            String trainingDate = sdf.format(i.getTrainingDate());
+            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/yuanchu/mom/service/AnnexService.java b/cnas-personnel/src/main/java/com/yuanchu/mom/service/AnnexService.java
new file mode 100644
index 0000000..384e1e4
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/yuanchu/mom/service/AnnexService.java
@@ -0,0 +1,7 @@
+package com.yuanchu.mom.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.yuanchu.mom.pojo.Annex;
+
+public interface AnnexService extends IService<Annex> {
+}
diff --git a/cnas-personnel/src/main/java/com/yuanchu/mom/service/PersonBasicInfoService.java b/cnas-personnel/src/main/java/com/yuanchu/mom/service/PersonBasicInfoService.java
new file mode 100644
index 0000000..2dcf298
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/yuanchu/mom/service/PersonBasicInfoService.java
@@ -0,0 +1,36 @@
+package com.yuanchu.mom.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.yuanchu.mom.dto.DepartmentDto;
+import com.yuanchu.mom.dto.PersonBasicInfoDto;
+import com.yuanchu.mom.dto.UserPageDto;
+import com.yuanchu.mom.pojo.PersonBasicInfo;
+
+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);
+}
diff --git a/cnas-personnel/src/main/java/com/yuanchu/mom/service/PersonCommunicationAbilityService.java b/cnas-personnel/src/main/java/com/yuanchu/mom/service/PersonCommunicationAbilityService.java
new file mode 100644
index 0000000..b0a83bb
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/yuanchu/mom/service/PersonCommunicationAbilityService.java
@@ -0,0 +1,25 @@
+package com.yuanchu.mom.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yuanchu.mom.dto.PersonCommunicationAbilityDto;
+import com.yuanchu.mom.pojo.PersonCommunicationAbility;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+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/yuanchu/mom/service/PersonJobResponsibilitiesService.java b/cnas-personnel/src/main/java/com/yuanchu/mom/service/PersonJobResponsibilitiesService.java
new file mode 100644
index 0000000..f7c72fb
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/yuanchu/mom/service/PersonJobResponsibilitiesService.java
@@ -0,0 +1,30 @@
+package com.yuanchu.mom.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yuanchu.mom.dto.PersonJobResponsibilitiesDto;
+import com.yuanchu.mom.pojo.PersonJobResponsibilities;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+import javax.servlet.http.HttpServletResponse;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.Map;
+
+/**
+ * <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/yuanchu/mom/service/PersonPersonnelCapacityService.java b/cnas-personnel/src/main/java/com/yuanchu/mom/service/PersonPersonnelCapacityService.java
new file mode 100644
index 0000000..dd13415
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/yuanchu/mom/service/PersonPersonnelCapacityService.java
@@ -0,0 +1,37 @@
+package com.yuanchu.mom.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yuanchu.mom.dto.PersonPersonnelCapacityDto;
+import com.yuanchu.mom.pojo.PersonPersonnelCapacity;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+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/yuanchu/mom/service/PersonPostAuthorizationRecordService.java b/cnas-personnel/src/main/java/com/yuanchu/mom/service/PersonPostAuthorizationRecordService.java
new file mode 100644
index 0000000..21f415f
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/yuanchu/mom/service/PersonPostAuthorizationRecordService.java
@@ -0,0 +1,27 @@
+package com.yuanchu.mom.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yuanchu.mom.dto.PersonPostAuthorizationRecordDto;
+import com.yuanchu.mom.pojo.PersonPostAuthorizationRecord;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+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/yuanchu/mom/service/PersonRewardPunishmentRecordService.java b/cnas-personnel/src/main/java/com/yuanchu/mom/service/PersonRewardPunishmentRecordService.java
new file mode 100644
index 0000000..ebd8009
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/yuanchu/mom/service/PersonRewardPunishmentRecordService.java
@@ -0,0 +1,32 @@
+package com.yuanchu.mom.service;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.yuanchu.mom.dto.PersonRewardPunishmentRecordDto;
+import com.yuanchu.mom.excel.PersonRewardPunishmentRecordExcel;
+import com.yuanchu.mom.pojo.PersonRewardPunishmentRecord;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+import java.time.LocalDateTime;
+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/yuanchu/mom/service/PersonSupervisePlanDetailsService.java b/cnas-personnel/src/main/java/com/yuanchu/mom/service/PersonSupervisePlanDetailsService.java
new file mode 100644
index 0000000..17470d7
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/yuanchu/mom/service/PersonSupervisePlanDetailsService.java
@@ -0,0 +1,28 @@
+package com.yuanchu.mom.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yuanchu.mom.dto.PersonSupervisePlanDetailsDto;
+import com.yuanchu.mom.excel.PersonSupervisePlanDetailsUpload;
+import com.yuanchu.mom.pojo.PersonSupervisePlanDetails;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+import java.time.LocalDateTime;
+import java.util.Date;
+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/yuanchu/mom/service/PersonSupervisePlanService.java b/cnas-personnel/src/main/java/com/yuanchu/mom/service/PersonSupervisePlanService.java
new file mode 100644
index 0000000..023c8c3
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/yuanchu/mom/service/PersonSupervisePlanService.java
@@ -0,0 +1,34 @@
+package com.yuanchu.mom.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yuanchu.mom.dto.PersonSupervisePlanDto;
+import com.yuanchu.mom.excel.PersonSupervisePlanDetailsUpload;
+import com.yuanchu.mom.pojo.PersonSupervisePlan;
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+
+/**
+ * <p>
+ * 鐩戠潱璁″垝 - 鐖� 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-10-09 04:14:45
+ */
+public interface PersonSupervisePlanService extends IService<PersonSupervisePlan> {
+
+    IPage<PersonSupervisePlanDto> yearPlanDtoIPage(Page page, String organizationPerson);
+
+    void yearPlanDetailImport(MultipartFile file);
+
+    /**
+     * 瀵煎嚭浜哄憳鐩戠潱璁″垝
+     * @param id
+     * @param response
+     */
+    void exportSuperVisePlan(Integer id, HttpServletResponse response);
+}
diff --git a/cnas-personnel/src/main/java/com/yuanchu/mom/service/PersonSupervisionControlSheetService.java b/cnas-personnel/src/main/java/com/yuanchu/mom/service/PersonSupervisionControlSheetService.java
new file mode 100644
index 0000000..999e7d9
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/yuanchu/mom/service/PersonSupervisionControlSheetService.java
@@ -0,0 +1,24 @@
+package com.yuanchu.mom.service;
+
+import com.yuanchu.mom.pojo.PersonSupervisionControlSheet;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+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/yuanchu/mom/service/PersonSupervisionProcessingSheetService.java b/cnas-personnel/src/main/java/com/yuanchu/mom/service/PersonSupervisionProcessingSheetService.java
new file mode 100644
index 0000000..e6aba27
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/yuanchu/mom/service/PersonSupervisionProcessingSheetService.java
@@ -0,0 +1,24 @@
+package com.yuanchu.mom.service;
+
+import com.yuanchu.mom.pojo.PersonSupervisionProcessingSheet;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+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/yuanchu/mom/service/PersonSupervisionRecordService.java b/cnas-personnel/src/main/java/com/yuanchu/mom/service/PersonSupervisionRecordService.java
new file mode 100644
index 0000000..2896907
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/yuanchu/mom/service/PersonSupervisionRecordService.java
@@ -0,0 +1,33 @@
+package com.yuanchu.mom.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yuanchu.mom.dto.PersonSupervisionRecordDto;
+import com.yuanchu.mom.pojo.PersonSupervisionRecord;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+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/yuanchu/mom/service/PersonTrackRecordService.java b/cnas-personnel/src/main/java/com/yuanchu/mom/service/PersonTrackRecordService.java
new file mode 100644
index 0000000..35eff56
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/yuanchu/mom/service/PersonTrackRecordService.java
@@ -0,0 +1,23 @@
+package com.yuanchu.mom.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.yuanchu.mom.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/yuanchu/mom/service/PersonTrainingDetailedService.java b/cnas-personnel/src/main/java/com/yuanchu/mom/service/PersonTrainingDetailedService.java
new file mode 100644
index 0000000..722ed1b
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/yuanchu/mom/service/PersonTrainingDetailedService.java
@@ -0,0 +1,32 @@
+package com.yuanchu.mom.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yuanchu.mom.dto.PersonTrainingDetailedDto;
+import com.yuanchu.mom.dto.PersonTrainingRecordDto;
+import com.yuanchu.mom.dto.PersonTrainingRecordSubmitDto;
+import com.yuanchu.mom.excel.PersonTrainingDetailedUpload;
+import com.yuanchu.mom.pojo.PersonTrainingDetailed;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * <p>
+ * 鍩硅璁″垝璇︽儏 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-10-11 01:46:27
+ */
+public interface PersonTrainingDetailedService extends IService<PersonTrainingDetailed> {
+
+    void importExcel(List<PersonTrainingDetailedUpload> list, Integer planId);
+
+    void deleteAnnualPlanDetailTable(String ids);
+
+    IPage<PersonTrainingDetailedDto> queryTheAnnualPlanDetailsTable(Page page,
+                                                                    String trainingLecturerName,
+                                                                    String courseCode, String trainingDate, Integer id, Integer userId);
+}
diff --git a/cnas-personnel/src/main/java/com/yuanchu/mom/service/PersonTrainingRecordService.java b/cnas-personnel/src/main/java/com/yuanchu/mom/service/PersonTrainingRecordService.java
new file mode 100644
index 0000000..6c34e4d
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/yuanchu/mom/service/PersonTrainingRecordService.java
@@ -0,0 +1,58 @@
+package com.yuanchu.mom.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.yuanchu.mom.dto.PersonTrainingRecordDto;
+import com.yuanchu.mom.dto.PersonTrainingRecordListDto;
+import com.yuanchu.mom.dto.TrainingRecordPersonDetailedDto;
+import com.yuanchu.mom.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);
+}
diff --git a/cnas-personnel/src/main/java/com/yuanchu/mom/service/PersonTrainingService.java b/cnas-personnel/src/main/java/com/yuanchu/mom/service/PersonTrainingService.java
new file mode 100644
index 0000000..a7d6518
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/yuanchu/mom/service/PersonTrainingService.java
@@ -0,0 +1,49 @@
+package com.yuanchu.mom.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.yuanchu.mom.dto.PersonTrainingDetailedDto;
+import com.yuanchu.mom.dto.PersonTrainingDto;
+import com.yuanchu.mom.dto.PersonTrainingUpdateDto;
+import com.yuanchu.mom.pojo.PersonTraining;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.Date;
+
+/**
+ * <p>
+ * 鍩硅璁″垝 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-10-11 01:11:49
+ */
+public interface PersonTrainingService extends IService<PersonTraining> {
+
+    IPage<PersonTrainingDto> personTrainingSelect(Page page,
+                                                  String compilerName, String departmentId);
+
+    void personTrainingImport(MultipartFile file);
+
+    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/yuanchu/mom/service/impl/AnnexServiceImpl.java b/cnas-personnel/src/main/java/com/yuanchu/mom/service/impl/AnnexServiceImpl.java
new file mode 100644
index 0000000..9e6fd85
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/yuanchu/mom/service/impl/AnnexServiceImpl.java
@@ -0,0 +1,13 @@
+package com.yuanchu.mom.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.yuanchu.mom.mapper.AnnexMapper;
+import com.yuanchu.mom.pojo.Annex;
+import com.yuanchu.mom.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/yuanchu/mom/service/impl/PersonBasicInfoServiceImpl.java b/cnas-personnel/src/main/java/com/yuanchu/mom/service/impl/PersonBasicInfoServiceImpl.java
new file mode 100644
index 0000000..b2a0c6d
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/yuanchu/mom/service/impl/PersonBasicInfoServiceImpl.java
@@ -0,0 +1,759 @@
+package com.yuanchu.mom.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.ObjectUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.deepoove.poi.XWPFTemplate;
+import com.deepoove.poi.config.Configure;
+import com.deepoove.poi.config.ConfigureBuilder;
+import com.deepoove.poi.data.*;
+import com.deepoove.poi.data.style.*;
+import com.yuanchu.mom.dto.DepartmentDto;
+import com.yuanchu.mom.dto.PersonBasicInfoDto;
+import com.yuanchu.mom.dto.UserPageDto;
+import com.yuanchu.mom.exception.ErrorException;
+import com.yuanchu.mom.mapper.*;
+import com.yuanchu.mom.pojo.*;
+import com.yuanchu.mom.service.PersonBasicInfoService;
+import com.yuanchu.mom.utils.QueryWrappers;
+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 javax.annotation.Resource;
+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.format.DateTimeFormatter;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ *  鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-08-30 09:19:57
+ */
+
+@Service
+@Transactional(rollbackFor = Exception.class)
+public class PersonBasicInfoServiceImpl extends ServiceImpl<PersonBasicInfoMapper, PersonBasicInfo> implements PersonBasicInfoService {
+
+    @Autowired
+    private DepartmentLimsMapper departmentMapper;
+
+
+    @Value("${wordUrl}")
+    private String wordUrl;
+    @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 {
+            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.selectUserDtoPageList(new Page(-1, -1), QueryWrappers.queryWrappers(userPageDto)).getRecords();
+        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(org.apache.poi.xwpf.usermodel.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 root  鏍硅妭鐐�
+     * @param all   鎵�鏈夎妭鐐�
+     * @return 鏍硅妭鐐逛俊鎭�
+     */
+    private List<DepartmentDto> getChildren(DepartmentDto root, List<DepartmentDto> all) {
+        if (ObjectUtils.isNotEmpty(root.getId())) {
+            return all.stream().filter(m -> Objects.equals(m.getFatherId(), root.getId())).peek(
+                    (m) -> m.setChildren(getChildren(m, all))
+            ).collect(Collectors.toList());
+        } else {
+            return Collections.emptyList();
+        }
+    }
+
+    // 姘村钩鍚堝苟鍗曞厓鏍�
+    private static void mergeCellsHorizontally(XWPFTable table, int row, int fromCol, int toCol) {
+        for (int i = fromCol; i <= toCol; i++) {
+            if (i == fromCol) {
+                table.getRow(row).getCell(i).getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.RESTART);
+            } else {
+                table.getRow(row).getCell(i).getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.CONTINUE);
+            }
+        }
+    }
+
+    // 鍨傜洿鍚堝苟鍗曞厓鏍�
+    private static void mergeCellsVertically(XWPFTable table, int col, int fromRow, int toRow) {
+        for (int i = fromRow; i <= toRow; i++) {
+            if (i == fromRow) {
+                table.getRow(i).getCell(col).getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.RESTART);
+            } else {
+                table.getRow(i).getCell(col).getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.CONTINUE);
+            }
+        }
+    }
+}
diff --git a/cnas-personnel/src/main/java/com/yuanchu/mom/service/impl/PersonCommunicationAbilityServiceImpl.java b/cnas-personnel/src/main/java/com/yuanchu/mom/service/impl/PersonCommunicationAbilityServiceImpl.java
new file mode 100644
index 0000000..431a13d
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/yuanchu/mom/service/impl/PersonCommunicationAbilityServiceImpl.java
@@ -0,0 +1,117 @@
+package com.yuanchu.mom.service.impl;
+
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.ExcelWriter;
+import com.alibaba.excel.write.metadata.WriteSheet;
+import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.deepoove.poi.XWPFTemplate;
+import com.deepoove.poi.config.Configure;
+import com.deepoove.poi.config.ConfigureBuilder;
+import com.yuanchu.mom.dto.PersonCommunicationAbilityDto;
+import com.yuanchu.mom.mapper.UserMapper;
+import com.yuanchu.mom.pojo.PersonCommunicationAbility;
+import com.yuanchu.mom.mapper.PersonCommunicationAbilityMapper;
+import com.yuanchu.mom.pojo.User;
+import com.yuanchu.mom.service.PersonCommunicationAbilityService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+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/yuanchu/mom/service/impl/PersonJobResponsibilitiesServiceImpl.java b/cnas-personnel/src/main/java/com/yuanchu/mom/service/impl/PersonJobResponsibilitiesServiceImpl.java
new file mode 100644
index 0000000..cb087e1
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/yuanchu/mom/service/impl/PersonJobResponsibilitiesServiceImpl.java
@@ -0,0 +1,118 @@
+package com.yuanchu.mom.service.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.deepoove.poi.XWPFTemplate;
+import com.deepoove.poi.config.Configure;
+import com.deepoove.poi.config.ConfigureBuilder;
+import com.yuanchu.mom.dto.PersonJobResponsibilitiesDto;
+import com.yuanchu.mom.exception.ErrorException;
+import com.yuanchu.mom.mapper.UserMapper;
+import com.yuanchu.mom.pojo.PersonJobResponsibilities;
+import com.yuanchu.mom.mapper.PersonJobResponsibilitiesMapper;
+import com.yuanchu.mom.pojo.User;
+import com.yuanchu.mom.service.PersonJobResponsibilitiesService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+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.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.HashMap;
+
+import java.util.Map;
+
+/**
+ * <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/yuanchu/mom/service/impl/PersonPersonnelCapacityServiceImpl.java b/cnas-personnel/src/main/java/com/yuanchu/mom/service/impl/PersonPersonnelCapacityServiceImpl.java
new file mode 100644
index 0000000..b167554
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/yuanchu/mom/service/impl/PersonPersonnelCapacityServiceImpl.java
@@ -0,0 +1,125 @@
+package com.yuanchu.mom.service.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.deepoove.poi.XWPFTemplate;
+import com.deepoove.poi.config.Configure;
+import com.deepoove.poi.config.ConfigureBuilder;
+import com.deepoove.poi.data.Pictures;
+import com.yuanchu.mom.common.GetLook;
+import com.yuanchu.mom.dto.PersonPersonnelCapacityDto;
+import com.yuanchu.mom.dto.PersonPersonnelCapacityExportDto;
+import com.yuanchu.mom.dto.PersonSupervisionControlSheetExportDto;
+import com.yuanchu.mom.exception.ErrorException;
+import com.yuanchu.mom.mapper.UserMapper;
+import com.yuanchu.mom.pojo.PersonPersonnelCapacity;
+import com.yuanchu.mom.mapper.PersonPersonnelCapacityMapper;
+import com.yuanchu.mom.service.PersonPersonnelCapacityService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.yuanchu.mom.utils.DateImageUtil;
+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;
+
+    @Resource
+    private GetLook getLook;
+
+    @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 = getLook.selectPowerByMethodAndUserId(null).get("userId");
+        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/yuanchu/mom/service/impl/PersonPostAuthorizationRecordServiceImpl.java b/cnas-personnel/src/main/java/com/yuanchu/mom/service/impl/PersonPostAuthorizationRecordServiceImpl.java
new file mode 100644
index 0000000..8b934e5
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/yuanchu/mom/service/impl/PersonPostAuthorizationRecordServiceImpl.java
@@ -0,0 +1,136 @@
+package com.yuanchu.mom.service.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.deepoove.poi.XWPFTemplate;
+import com.deepoove.poi.config.Configure;
+import com.deepoove.poi.config.ConfigureBuilder;
+import com.deepoove.poi.data.FilePictureRenderData;
+import com.yuanchu.mom.dto.PersonPostAuthorizationRecordDto;
+import com.yuanchu.mom.exception.ErrorException;
+import com.yuanchu.mom.mapper.UserMapper;
+import com.yuanchu.mom.pojo.PersonPostAuthorizationRecord;
+import com.yuanchu.mom.mapper.PersonPostAuthorizationRecordMapper;
+import com.yuanchu.mom.pojo.User;
+import com.yuanchu.mom.service.PersonPostAuthorizationRecordService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+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/yuanchu/mom/service/impl/PersonRewardPunishmentRecordServiceImpl.java b/cnas-personnel/src/main/java/com/yuanchu/mom/service/impl/PersonRewardPunishmentRecordServiceImpl.java
new file mode 100644
index 0000000..aa71b34
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/yuanchu/mom/service/impl/PersonRewardPunishmentRecordServiceImpl.java
@@ -0,0 +1,38 @@
+package com.yuanchu.mom.service.impl;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.yuanchu.mom.dto.PersonRewardPunishmentRecordDto;
+import com.yuanchu.mom.excel.PersonRewardPunishmentRecordExcel;
+import com.yuanchu.mom.pojo.PersonRewardPunishmentRecord;
+import com.yuanchu.mom.mapper.PersonRewardPunishmentRecordMapper;
+import com.yuanchu.mom.service.PersonRewardPunishmentRecordService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalDateTime;
+import java.util.Collections;
+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/yuanchu/mom/service/impl/PersonSupervisePlanDetailsServiceImpl.java b/cnas-personnel/src/main/java/com/yuanchu/mom/service/impl/PersonSupervisePlanDetailsServiceImpl.java
new file mode 100644
index 0000000..0422342
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/yuanchu/mom/service/impl/PersonSupervisePlanDetailsServiceImpl.java
@@ -0,0 +1,44 @@
+package com.yuanchu.mom.service.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yuanchu.mom.dto.PersonSupervisePlanDetailsDto;
+import com.yuanchu.mom.excel.PersonSupervisePlanDetailsUpload;
+import com.yuanchu.mom.pojo.PersonSupervisePlanDetails;
+import com.yuanchu.mom.mapper.PersonSupervisePlanDetailsMapper;
+import com.yuanchu.mom.service.PersonSupervisePlanDetailsService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.Date;
+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) {
+        return baseMapper.pageByDate(page,date,project, planId);
+    }
+
+    @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/yuanchu/mom/service/impl/PersonSupervisePlanServiceImpl.java b/cnas-personnel/src/main/java/com/yuanchu/mom/service/impl/PersonSupervisePlanServiceImpl.java
new file mode 100644
index 0000000..b280e35
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/yuanchu/mom/service/impl/PersonSupervisePlanServiceImpl.java
@@ -0,0 +1,160 @@
+package com.yuanchu.mom.service.impl;
+
+import com.alibaba.excel.EasyExcel;
+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.deepoove.poi.XWPFTemplate;
+import com.deepoove.poi.config.Configure;
+import com.deepoove.poi.data.Pictures;
+import com.yuanchu.mom.common.GetLook;
+import com.yuanchu.mom.dto.PersonSupervisePlanDto;
+import com.yuanchu.mom.dto.PersonTrainingDetailedDto;
+import com.yuanchu.mom.excel.PersonSupervisePlanDetailsListener;
+import com.yuanchu.mom.excel.PersonSupervisePlanDetailsUpload;
+import com.yuanchu.mom.exception.ErrorException;
+import com.yuanchu.mom.mapper.UserMapper;
+import com.yuanchu.mom.pojo.PersonSupervisePlan;
+import com.yuanchu.mom.mapper.PersonSupervisePlanMapper;
+import com.yuanchu.mom.pojo.PersonSupervisePlanDetails;
+import com.yuanchu.mom.pojo.PersonTraining;
+import com.yuanchu.mom.service.PersonSupervisePlanDetailsService;
+import com.yuanchu.mom.service.PersonSupervisePlanService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.yuanchu.mom.utils.HackLoopTableRenderPolicy;
+import com.yuanchu.mom.utils.DateImageUtil;
+import com.yuanchu.mom.utils.Jwt;
+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.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.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 鐩戠潱璁″垝 - 鐖� 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-10-09 04:14:45
+ */
+@Service
+@Transactional(rollbackFor = Exception.class)
+public class PersonSupervisePlanServiceImpl extends ServiceImpl<PersonSupervisePlanMapper, PersonSupervisePlan> implements PersonSupervisePlanService {
+
+    @Autowired
+    private PersonSupervisePlanDetailsService personSupervisePlanDetailsService;
+
+    @Autowired
+    private GetLook getLook;
+
+    @Value("${file.path}")
+    private String imgUrl;
+
+    @Autowired
+    private UserMapper userMapper;
+
+    public IPage<PersonSupervisePlanDto> yearPlanDtoIPage(Page page, String organizationPerson) {
+        return baseMapper.pageByPerson(page, organizationPerson);
+    }
+
+    @Override
+    public void yearPlanDetailImport(MultipartFile file) {
+        Map<String, Integer> map1 = getLook.selectPowerByMethodAndUserId("selectInsOrderParameter");
+        // 骞村害璁″垝鐖剁骇鏂板鏁版嵁
+        PersonSupervisePlan personSupervisePlan = new PersonSupervisePlan();
+        String fileName = file.getOriginalFilename().substring(0, file.getOriginalFilename().lastIndexOf("."));
+        personSupervisePlan.setFileName(fileName);
+        personSupervisePlan.setOrganizationPersonId(map1.get("userId"));
+        personSupervisePlan.setOrganizationDate(LocalDateTime.now());
+        baseMapper.insert(personSupervisePlan);
+        // 骞村害璁″垝璇︽儏 鏂板
+        try {
+            PersonSupervisePlanDetailsListener personSupervisePlanDetailsListener = new PersonSupervisePlanDetailsListener(personSupervisePlanDetailsService);
+            personSupervisePlanDetailsListener.setPlanId(personSupervisePlan.getId());
+            EasyExcel.read(file.getInputStream(), PersonSupervisePlanDetailsUpload.class, personSupervisePlanDetailsListener).sheet().doRead();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * 瀵煎嚭浜哄憳鐩戠潱璁″垝
+     * @param id
+     * @param response
+     */
+    @Override
+    public void exportSuperVisePlan(Integer id, HttpServletResponse response) {
+        // 鏌ヨ璇︽儏
+        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));
+
+        int index = 1;
+        for (PersonSupervisePlanDetails detailedDto : detailedDtos) {
+            detailedDto.setIndex(index);
+            index++;
+        }
+
+        // 鑾峰彇璺緞
+        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("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/yuanchu/mom/service/impl/PersonSupervisionControlSheetServiceImpl.java b/cnas-personnel/src/main/java/com/yuanchu/mom/service/impl/PersonSupervisionControlSheetServiceImpl.java
new file mode 100644
index 0000000..4280cef
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/yuanchu/mom/service/impl/PersonSupervisionControlSheetServiceImpl.java
@@ -0,0 +1,155 @@
+package com.yuanchu.mom.service.impl;
+
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+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.yuanchu.mom.dto.PersonSupervisionControlSheetExportDto;
+import com.yuanchu.mom.exception.ErrorException;
+import com.yuanchu.mom.mapper.UserMapper;
+import com.yuanchu.mom.pojo.PersonSupervisionControlSheet;
+import com.yuanchu.mom.mapper.PersonSupervisionControlSheetMapper;
+import com.yuanchu.mom.service.PersonSupervisionControlSheetService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+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/yuanchu/mom/service/impl/PersonSupervisionProcessingSheetServiceImpl.java b/cnas-personnel/src/main/java/com/yuanchu/mom/service/impl/PersonSupervisionProcessingSheetServiceImpl.java
new file mode 100644
index 0000000..4bdf85c
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/yuanchu/mom/service/impl/PersonSupervisionProcessingSheetServiceImpl.java
@@ -0,0 +1,121 @@
+package com.yuanchu.mom.service.impl;
+
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+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.yuanchu.mom.dto.PersonSupervisionProcessingSheetDto;
+import com.yuanchu.mom.exception.ErrorException;
+import com.yuanchu.mom.mapper.UserMapper;
+import com.yuanchu.mom.pojo.PersonSupervisionProcessingSheet;
+import com.yuanchu.mom.mapper.PersonSupervisionProcessingSheetMapper;
+import com.yuanchu.mom.service.PersonSupervisionProcessingSheetService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URLEncoder;
+import java.time.format.DateTimeFormatter;
+import java.util.HashMap;
+
+/**
+ * <p>
+ * 鐩戠潱璁板綍 - 澶勭悊鍗� 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-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/yuanchu/mom/service/impl/PersonSupervisionRecordServiceImpl.java b/cnas-personnel/src/main/java/com/yuanchu/mom/service/impl/PersonSupervisionRecordServiceImpl.java
new file mode 100644
index 0000000..8966036
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/yuanchu/mom/service/impl/PersonSupervisionRecordServiceImpl.java
@@ -0,0 +1,126 @@
+package com.yuanchu.mom.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.deepoove.poi.XWPFTemplate;
+import com.deepoove.poi.config.Configure;
+import com.deepoove.poi.config.ConfigureBuilder;
+import com.deepoove.poi.data.Pictures;
+import com.yuanchu.mom.dto.PersonSupervisionRecordDto;
+import com.yuanchu.mom.exception.ErrorException;
+import com.yuanchu.mom.mapper.UserMapper;
+import com.yuanchu.mom.pojo.PersonSupervisionControlSheet;
+import com.yuanchu.mom.pojo.PersonSupervisionProcessingSheet;
+import com.yuanchu.mom.pojo.PersonSupervisionRecord;
+import com.yuanchu.mom.mapper.PersonSupervisionRecordMapper;
+import com.yuanchu.mom.service.PersonSupervisionControlSheetService;
+import com.yuanchu.mom.service.PersonSupervisionProcessingSheetService;
+import com.yuanchu.mom.service.PersonSupervisionRecordService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.yuanchu.mom.utils.DateImageUtil;
+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);
+
+        //鑾峰彇鎶�鏈礋璐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);
+                }});
+
+        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/yuanchu/mom/service/impl/PersonTrackRecordServiceImpl.java b/cnas-personnel/src/main/java/com/yuanchu/mom/service/impl/PersonTrackRecordServiceImpl.java
new file mode 100644
index 0000000..9489f45
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/yuanchu/mom/service/impl/PersonTrackRecordServiceImpl.java
@@ -0,0 +1,33 @@
+package com.yuanchu.mom.service.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.yuanchu.mom.mapper.PersonTrackRecordMapper;
+import com.yuanchu.mom.pojo.PersonTrackRecord;
+import com.yuanchu.mom.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/yuanchu/mom/service/impl/PersonTrainingDetailedServiceImpl.java b/cnas-personnel/src/main/java/com/yuanchu/mom/service/impl/PersonTrainingDetailedServiceImpl.java
new file mode 100644
index 0000000..577aca6
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/yuanchu/mom/service/impl/PersonTrainingDetailedServiceImpl.java
@@ -0,0 +1,109 @@
+package com.yuanchu.mom.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.core.toolkit.ObjectUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yuanchu.mom.common.GetLook;
+import com.yuanchu.mom.dto.PersonTrainingDetailedDto;
+import com.yuanchu.mom.dto.PersonTrainingRecordDto;
+import com.yuanchu.mom.dto.PersonTrainingRecordSubmitDto;
+import com.yuanchu.mom.excel.PersonTrainingDetailedUpload;
+import com.yuanchu.mom.exception.ErrorException;
+import com.yuanchu.mom.mapper.UserMapper;
+import com.yuanchu.mom.numgen.NumberGenerator;
+import com.yuanchu.mom.pojo.*;
+import com.yuanchu.mom.mapper.PersonTrainingDetailedMapper;
+import com.yuanchu.mom.service.DepartmentLimsService;
+import com.yuanchu.mom.service.PersonTrainingDetailedService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.yuanchu.mom.service.PersonTrainingRecordService;
+import lombok.AllArgsConstructor;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+/**
+ * <p>
+ * 鍩硅璁″垝璇︽儏 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-10-11 01:46:27
+ */
+@Service
+@Transactional(rollbackFor = Exception.class)
+@AllArgsConstructor
+public class PersonTrainingDetailedServiceImpl extends ServiceImpl<PersonTrainingDetailedMapper, PersonTrainingDetailed> implements PersonTrainingDetailedService {
+
+    private DepartmentLimsService departmentLimsService;
+
+    private UserMapper userMapper;
+
+    @Autowired
+    private GetLook getLook;
+
+    @Autowired
+    private NumberGenerator<PersonTrainingDetailed> numberGenerator;
+
+    @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);
+
+            // 鍖归厤涓惧姙閮ㄩ棬
+            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());
+
+            // 鍖归厤璁插笀
+            User user = userMapper.selectOne(Wrappers.<User>lambdaQuery()
+                    .eq(User::getName, i.getTrainingLecturerName()));
+            if (ObjectUtils.isEmpty(user)) {
+                throw new ErrorException("鏈壘鍒拌璁插笀锛�" + i.getTrainingLecturerName());
+            }
+            personTrainingDetailed.setTrainingLecturerId(user.getId());
+            personTrainingDetailed.setPlanId(planId);
+            personTrainingDetailed.setState(3);
+
+            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) {
+        Map<String, Integer> map1 = getLook.selectPowerByMethodAndUserId("selectInsOrderParameter");
+        return baseMapper.queryTheAnnualPlanDetailsTable(page, trainingLecturerName, courseCode, trainingDate, id, userId, map1.get("userId"));
+    }
+}
diff --git a/cnas-personnel/src/main/java/com/yuanchu/mom/service/impl/PersonTrainingRecordServiceImpl.java b/cnas-personnel/src/main/java/com/yuanchu/mom/service/impl/PersonTrainingRecordServiceImpl.java
new file mode 100644
index 0000000..ddef47e
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/yuanchu/mom/service/impl/PersonTrainingRecordServiceImpl.java
@@ -0,0 +1,224 @@
+package com.yuanchu.mom.service.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.deepoove.poi.XWPFTemplate;
+import com.deepoove.poi.config.Configure;
+import com.yuanchu.mom.common.GetLook;
+import com.yuanchu.mom.dto.PersonTrainingRecordDto;
+import com.yuanchu.mom.dto.PersonTrainingRecordListDto;
+import com.yuanchu.mom.dto.TrainingRecordPersonDetailedDto;
+import com.yuanchu.mom.exception.ErrorException;
+import com.yuanchu.mom.mapper.PersonTrainingRecordMapper;
+import com.yuanchu.mom.pojo.PersonTrainingDetailed;
+import com.yuanchu.mom.pojo.PersonTrainingRecord;
+import com.yuanchu.mom.service.PersonTrainingDetailedService;
+import com.yuanchu.mom.service.PersonTrainingRecordService;
+import com.yuanchu.mom.utils.HackLoopTableRenderPolicy;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URLEncoder;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 鍩硅璁板綍 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-10-12 04:50:48
+ */
+@Transactional(rollbackFor = Exception.class)
+@Service
+public class PersonTrainingRecordServiceImpl extends ServiceImpl<PersonTrainingRecordMapper, PersonTrainingRecord> implements PersonTrainingRecordService {
+
+    @Autowired
+    private GetLook getLook;
+
+    @Autowired
+    private PersonTrainingDetailedService personTrainingDetailedService;
+
+    @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) {
+        Map<String, Integer> map1 = getLook.selectPowerByMethodAndUserId("selectInsOrderParameter");
+        // 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, map1.get("userId")));
+        if (ObjectUtils.isNotEmpty(personTrainingRecord1)) {
+            throw new ErrorException("璇峰嬁閲嶅璁ら锛�");
+        }
+        // 3銆佸鏋滄湭閲嶅鏂板鍩硅璁板綍
+        // true 璁ら
+        if (claimAndClaim) {
+            PersonTrainingRecord personTrainingRecord = new PersonTrainingRecord();
+            personTrainingRecord.setUserId(map1.get("userId"));
+            personTrainingRecord.setCourseId(courseId);
+            baseMapper.insert(personTrainingRecord);
+        // 鍙栨秷璁ら
+        } else {
+            baseMapper.delete(Wrappers.<PersonTrainingRecord>lambdaQuery()
+                    .eq(PersonTrainingRecord::getUserId, map1.get("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("瀵煎嚭澶辫触");
+        }
+    }
+
+    /**
+     * 妫�楠岃鍩硅璇剧▼鏄惁鍏佽璁ら
+     * @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");
+        String originalDateStr = sdfWithoutTime.format(personTrainingDetailed.getTrainingDate());
+        SimpleDateFormat sdfWithTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        try {
+            // 娣诲姞鏃跺垎绉掑悗鐨勬棩鏈�
+            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/yuanchu/mom/service/impl/PersonTrainingServiceImpl.java b/cnas-personnel/src/main/java/com/yuanchu/mom/service/impl/PersonTrainingServiceImpl.java
new file mode 100644
index 0000000..0b32955
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/yuanchu/mom/service/impl/PersonTrainingServiceImpl.java
@@ -0,0 +1,312 @@
+package com.yuanchu.mom.service.impl;
+
+import com.alibaba.excel.EasyExcel;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.deepoove.poi.XWPFTemplate;
+import com.deepoove.poi.config.Configure;
+import com.deepoove.poi.data.Pictures;
+import com.yuanchu.mom.common.GetLook;
+import com.yuanchu.mom.dto.*;
+import com.yuanchu.mom.excel.PersonSupervisePlanDetailsUpload;
+import com.yuanchu.mom.excel.PersonTrainingDetailedListener;
+import com.yuanchu.mom.excel.PersonTrainingDetailedUpload;
+import com.yuanchu.mom.exception.ErrorException;
+import com.yuanchu.mom.mapper.PersonTrainingDetailedMapper;
+import com.yuanchu.mom.mapper.PersonTrainingMapper;
+import com.yuanchu.mom.mapper.UserMapper;
+import com.yuanchu.mom.mapper.PersonTrainingRecordMapper;
+import com.yuanchu.mom.mapper.UserMapper;
+import com.yuanchu.mom.pojo.PersonTraining;
+import com.yuanchu.mom.pojo.User;
+import com.yuanchu.mom.pojo.PersonTrainingDetailed;
+import com.yuanchu.mom.service.PersonTrainingDetailedService;
+import com.yuanchu.mom.service.PersonTrainingService;
+import com.yuanchu.mom.utils.HackLoopTableRenderPolicy;
+import com.yuanchu.mom.utils.XWPFDocumentUtils;
+import com.yuanchu.mom.utils.DateImageUtil;
+import lombok.AllArgsConstructor;
+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.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.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.stream.Collectors;
+import java.util.Optional;
+
+/**
+ * <p>
+ * 鍩硅璁″垝 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-10-11 01:11:49
+ */
+@Service
+@Transactional(rollbackFor = Exception.class)
+public class PersonTrainingServiceImpl extends ServiceImpl<PersonTrainingMapper, PersonTraining> implements PersonTrainingService {
+
+    @Autowired
+    private GetLook getLook;
+
+    @Autowired
+    private PersonTrainingDetailedService personTrainingDetailedService;
+
+    @Autowired
+    private UserMapper userMapper;
+
+
+    @Autowired
+    private PersonTrainingDetailedMapper personTrainingDetailedMapper;
+
+    @Autowired
+    private PersonTrainingRecordMapper personTrainingRecordMapper;
+
+    @Value("${file.path}")
+    private String imgUrl;
+
+    @Override
+    public IPage<PersonTrainingDto> personTrainingSelect(Page page, String compilerName, String departmentId) {
+        Integer userId = getLook.selectPowerByMethodAndUserId(null).get("userId");
+        User user = Optional.ofNullable(userMapper.selectById(userId)).orElse(new User());
+        if(3==user.getRoleId()){
+            departmentId=null;
+        }
+        return baseMapper.personTrainingSelect(page, compilerName, departmentId);
+    }
+
+    @Override
+    public void personTrainingImport(MultipartFile file) {
+        Map<String, Integer> map1 = getLook.selectPowerByMethodAndUserId("selectInsOrderParameter");
+        // 骞村害璁″垝鐖剁骇鏂板鏁版嵁
+        PersonTraining personSupervisePlan = new PersonTraining();
+        String fileName = file.getOriginalFilename().substring(0, file.getOriginalFilename().lastIndexOf("."));
+        personSupervisePlan.setFileName(fileName);
+        personSupervisePlan.setCompilerId(map1.get("userId"));
+        personSupervisePlan.setCompilationDate(LocalDateTime.now());
+        baseMapper.insert(personSupervisePlan);
+        // 骞村害璁″垝璇︽儏 鏂板
+        try {
+            PersonTrainingDetailedListener personSupervisePlanDetailsListener = new PersonTrainingDetailedListener(personTrainingDetailedService);
+            personSupervisePlanDetailsListener.setPlanId(personSupervisePlan.getId());
+            EasyExcel.read(file.getInputStream(), PersonTrainingDetailedUpload.class, personSupervisePlanDetailsListener).sheet().doRead();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+
+    @Override
+    public void personTrainingDelete(Integer id) {
+        personTrainingDetailedService.removeById(id);
+        baseMapper.deleteById(id);
+    }
+
+    @Override
+    public void reviewAnnualPersonnelTraining(PersonTrainingUpdateDto personTrainingUpdateDto) {
+        Map<String, Integer> map1 = getLook.selectPowerByMethodAndUserId("selectInsOrderParameter");
+        PersonTraining personTraining = new PersonTraining();
+        personTraining.setId(personTrainingUpdateDto.getId());
+        personTraining.setReviewerId(map1.get("userId"));
+        personTraining.setAuditDate(LocalDateTime.now());
+        personTraining.setAuditRemarks(personTrainingUpdateDto.getRemarks());
+        personTraining.setReviewerStatus(personTrainingUpdateDto.getStatus());
+        baseMapper.updateById(personTraining);
+    }
+
+    @Override
+    public void approveAnnualPersonnelTraining(PersonTrainingUpdateDto personTrainingUpdateDto) {
+        Map<String, Integer> map1 = getLook.selectPowerByMethodAndUserId("selectInsOrderParameter");
+        LambdaUpdateWrapper<PersonTraining> wrapper = Wrappers.<PersonTraining>lambdaUpdate()
+                .eq(PersonTraining::getId, personTrainingUpdateDto.getId())
+                .set(PersonTraining::getApproverId, map1.get("userId"))
+                .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) {
+            if (detailedDto.getTrainingDate() != null) {
+                SimpleDateFormat sdfWithoutTime = new SimpleDateFormat("yyyy-MM-dd");
+                detailedDto.setTrainingDateString(sdfWithoutTime.format(detailedDto.getTrainingDate()));
+            }
+
+            detailedDto.setIndex(index);
+            index++;
+        }
+
+        // 鑾峰彇璺緞
+        InputStream inputStream = this.getClass().getResourceAsStream("/static/person-training.docx");
+        String finalExamineUrl = examineUrl;
+        String finalRatifyUrl = ratifyUrl;
+        Configure configure = Configure.builder()
+                .bind("trainingDetailedList", new HackLoopTableRenderPolicy())
+                .build();
+        XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
+                new HashMap<String, Object>() {{
+                    put("year", personTraining.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);
+
+        // 鏌ヨ鍩硅鐨勪汉鍛�
+        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..fa7a67f
--- /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.yuanchu.mom.mapper.PersonBasicInfoMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.yuanchu.mom.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.yuanchu.mom.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.yuanchu.mom.dto.PersonBasicInfoDto">
+        SELECT *
+        FROM user u
+                 left join cnas_person_basic_info cpbi on cpbi.user_id = u.id
+        where u.id = #{userId}
+    </select>
+
+    <select id="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_user
+        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_user
+        <where>
+            FIND_IN_SET(#{departmentId},u.depart_lims_id)
+            <if test="name != null and name != ''">
+                and u.name like concat('%',#{name},'%')
+            </if>
+        </where>
+    </select>
+</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..e86ad74
--- /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.yuanchu.mom.mapper.PersonCommunicationAbilityMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.yuanchu.mom.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.yuanchu.mom.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..a74fcd8
--- /dev/null
+++ b/cnas-personnel/src/main/resources/mapper/PersonJobResponsibilitiesMapper.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.yuanchu.mom.mapper.PersonJobResponsibilitiesMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.yuanchu.mom.pojo.PersonJobResponsibilities">
+        <id column="id" property="id" />
+        <result column="post_name" property="postName" />
+        <result column="affiliated_function_id" property="affiliatedFunctionId" />
+        <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.yuanchu.mom.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..52d1009
--- /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.yuanchu.mom.mapper.PersonPersonnelCapacityMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.yuanchu.mom.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.yuanchu.mom.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.yuanchu.mom.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..437ea86
--- /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.yuanchu.mom.mapper.PersonPostAuthorizationRecordMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.yuanchu.mom.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.yuanchu.mom.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..508c947
--- /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.yuanchu.mom.mapper.PersonRewardPunishmentRecordMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.yuanchu.mom.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.yuanchu.mom.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.yuanchu.mom.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..55a1246
--- /dev/null
+++ b/cnas-personnel/src/main/resources/mapper/PersonSupervisePlanDetailsMapper.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.yuanchu.mom.mapper.PersonSupervisePlanDetailsMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.yuanchu.mom.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.yuanchu.mom.dto.PersonSupervisePlanDetailsDto">
+        select cpspd.*, 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 create_time desc
+    </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..02435b4
--- /dev/null
+++ b/cnas-personnel/src/main/resources/mapper/PersonSupervisePlanMapper.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.yuanchu.mom.mapper.PersonSupervisePlanMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.yuanchu.mom.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.yuanchu.mom.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>
+        </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..00d7a5a
--- /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.yuanchu.mom.mapper.PersonSupervisionControlSheetMapper">
+
+    <!-- 鏌ヨ鐩戠潱璁板綍鎺у埗鍗� -->
+
+    <select id="selectSupervisionControl"
+            resultType="com.yuanchu.mom.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..65c0a0c
--- /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.yuanchu.mom.mapper.PersonSupervisionProcessingSheetMapper">
+
+    <!-- 鏌ヨ浜哄憳鐩戠潱璁板綍澶勭悊鍗� -->
+    <select id="selectProcessingSheet" resultType="com.yuanchu.mom.dto.PersonSupervisionProcessingSheetDto">
+        select sps.*,
+               dl1.name                                                     proposing_department,
+               dl2.name                                                     cause_analysis,
+               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..121c234
--- /dev/null
+++ b/cnas-personnel/src/main/resources/mapper/PersonSupervisionRecordMapper.xml
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.yuanchu.mom.mapper.PersonSupervisionRecordMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.yuanchu.mom.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.yuanchu.mom.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>
+            <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)
+            </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.yuanchu.mom.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..5ff64f2
--- /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.yuanchu.mom.mapper.PersonTrackRecordMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.yuanchu.mom.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.yuanchu.mom.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..aaa318d
--- /dev/null
+++ b/cnas-personnel/src/main/resources/mapper/PersonTrainingDetailedMapper.xml
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.yuanchu.mom.mapper.PersonTrainingDetailedMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.yuanchu.mom.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.yuanchu.mom.dto.PersonTrainingDetailedDto">
+        SELECT cptd.*,
+        u1.name training_lecturer_name,
+        dl.name holding_department_name, !isnull(cptr.training_record_id) whether_claim
+        FROM cnas_person_training_detailed cptd
+        left join user u1 on cptd.training_lecturer_id = u1.id
+        left join department_lims dl on dl.id = cptd.holding_department
+        left join cnas_person_training_record cptr on cptr.user_id = #{loginUserId} and cptr.course_id = cptd.id
+        <where>
+            <if test="id != null">
+                and cptd.plan_id = #{id}
+            </if>
+            <if test="userId != null">
+                and u1.id = #{userId}
+            </if>
+            <if test="courseCode != null and courseCode != ''">
+                and cptd.course_code like concat('%', #{courseCode}, '%')
+            </if>
+            <if test="trainingLecturerName != null and trainingLecturerName != ''">
+                and u1.name like concat('%', #{trainingLecturerName}, '%')
+            </if>
+            <if test="trainingDate != null and trainingDate != ''">
+                and date_format(cptd.training_date,'%Y-%m-%d') = #{trainingDate}
+            </if>
+        </where>
+    </select>
+
+    <!-- 鏍规嵁涓昏〃id鏌ヨ璇︽儏 -->
+    <select id="selectTrainingList" resultType="com.yuanchu.mom.dto.PersonTrainingDetailedDto">
+        SELECT cptd.*,
+               u1.name training_lecturer_name
+        FROM cnas_person_training_detailed cptd
+                 left join user u1 on cptd.training_lecturer_id = u1.id
+        where cptd.plan_id = #{trainingId}
+    </select>
+
+    <!-- 鏌ヨ璇︾粏 -->
+    <select id="selectTrainingDetail" resultType="com.yuanchu.mom.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..8c7cd23
--- /dev/null
+++ b/cnas-personnel/src/main/resources/mapper/PersonTrainingMapper.xml
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.yuanchu.mom.mapper.PersonTrainingMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.yuanchu.mom.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.yuanchu.mom.dto.PersonTrainingDto">
+        SELECT
+        cpt.*,
+        u1.name compiler_name,
+        u2.name reviewer_name,
+        u3.name approver_name,
+        u4.name create_user_name
+        FROM
+        cnas_person_training cpt
+        LEFT JOIN user u1 ON cpt.compiler_id = u1.id
+        LEFT JOIN user u2 ON cpt.reviewer_id = u2.id
+        LEFT JOIN user u3 ON cpt.approver_id = u3.id
+        LEFT JOIN user u4 ON cpt.create_user = u4.id
+        <where>
+            <if test="departLimsId != null and departLimsId != ''">
+                and FIND_IN_SET(#{departLimsId}, u4.depart_lims_id)
+            </if>
+            <if test="compilerName != null and compilerName != ''">
+                and u4.name like concat('%', #{compilerName}, '%')
+            </if>
+        </where>
+        union
+        SELECT
+        cpt.*,
+        u1.name compiler_name,
+        u2.name reviewer_name,
+        u3.name approver_name,
+        u4.name create_user_name
+        FROM
+        cnas_person_training cpt
+        LEFT JOIN user u1 ON cpt.compiler_id = u1.id
+        LEFT JOIN user u2 ON cpt.reviewer_id = u2.id
+        LEFT JOIN user u3 ON cpt.approver_id = u3.id
+        LEFT JOIN user u4 ON cpt.create_user = u4.id
+        WHERE
+        u4.depart_lims_id is not null and length(u4.depart_lims_id) = 0
+        <if test="compilerName != null and compilerName != ''">
+            and u4.name like concat('%', #{compilerName}, '%')
+        </if>
+    </select>
+</mapper>
diff --git a/cnas-personnel/src/main/resources/mapper/PersonTrainingRecordMapper.xml b/cnas-personnel/src/main/resources/mapper/PersonTrainingRecordMapper.xml
new file mode 100644
index 0000000..724635c
--- /dev/null
+++ b/cnas-personnel/src/main/resources/mapper/PersonTrainingRecordMapper.xml
@@ -0,0 +1,134 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.yuanchu.mom.mapper.PersonTrainingRecordMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.yuanchu.mom.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.yuanchu.mom.dto.PersonTrainingRecordDto">
+        select cptr.*, u.account, u.name user_name, u.phone, r.name role_name
+        from cnas_person_training_record cptr
+                 left join user u on u.id = cptr.user_id
+                 left join role r on r.id = u.role_id
+        where cptr.course_id = #{trainingDetailedId}
+        <if test="userName != null and userName != ''">
+            and u.name like concat('%', #{userName}, '%')
+        </if>
+    </select>
+
+    <select id="personnelTrainingPersonnel" resultType="com.yuanchu.mom.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.yuanchu.mom.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.yuanchu.mom.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.yuanchu.mom.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.yuanchu.mom.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.yuanchu.mom.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.yuanchu.mom.dto.TrainingRecordPersonDetailedDto">
+        select cptd.training_date,
+        cptd.training_content,
+        cptd.class_hour,
+        cptr.examination_results,
+        cptd.remarks,
+        DATE_FORMAT(cptd.training_date, '%Y-%m-%d') AS trainingDateString
+        from cnas_person_training_record cptr
+        inner join cnas_person_training_detailed cptd on cptd.id = cptr.course_id
+        and cptr.user_id = #{userId}
+        <where>
+            <if test="year!= null and year!= ''">
+                and YEAR(cptd.training_date) = ${year}
+            </if>
+        </where>
+    </select>
+</mapper>
diff --git a/cnas-personnel/src/main/resources/static/communication-deal.docx b/cnas-personnel/src/main/resources/static/communication-deal.docx
new file mode 100644
index 0000000..9045072
--- /dev/null
+++ b/cnas-personnel/src/main/resources/static/communication-deal.docx
Binary files differ
diff --git a/cnas-personnel/src/main/resources/static/credentials-deal.docx b/cnas-personnel/src/main/resources/static/credentials-deal.docx
new file mode 100644
index 0000000..2fda5fd
--- /dev/null
+++ b/cnas-personnel/src/main/resources/static/credentials-deal.docx
Binary files differ
diff --git a/cnas-personnel/src/main/resources/static/explain-deal.docx b/cnas-personnel/src/main/resources/static/explain-deal.docx
new file mode 100644
index 0000000..7333bec
--- /dev/null
+++ b/cnas-personnel/src/main/resources/static/explain-deal.docx
Binary files differ
diff --git a/cnas-personnel/src/main/resources/static/person-deal.docx b/cnas-personnel/src/main/resources/static/person-deal.docx
new file mode 100644
index 0000000..5535a00
--- /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..8ce7a06
--- /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..82e4ddf
--- /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..8a5a41f
--- /dev/null
+++ b/cnas-personnel/src/main/resources/static/personnel-capacity.docx
Binary files differ
diff --git a/cnas-personnel/src/main/resources/static/super-vise-plan.docx b/cnas-personnel/src/main/resources/static/super-vise-plan.docx
new file mode 100644
index 0000000..8e5a56f
--- /dev/null
+++ b/cnas-personnel/src/main/resources/static/super-vise-plan.docx
Binary files differ
diff --git a/cnas-personnel/src/main/resources/static/supervision-control-sheet.docx b/cnas-personnel/src/main/resources/static/supervision-control-sheet.docx
new file mode 100644
index 0000000..dc398e3
--- /dev/null
+++ b/cnas-personnel/src/main/resources/static/supervision-control-sheet.docx
Binary files differ
diff --git a/cnas-personnel/src/main/resources/static/supervision-processing-sheet.docx b/cnas-personnel/src/main/resources/static/supervision-processing-sheet.docx
new file mode 100644
index 0000000..16775b0
--- /dev/null
+++ b/cnas-personnel/src/main/resources/static/supervision-processing-sheet.docx
Binary files differ
diff --git a/cnas-personnel/src/main/resources/static/supervision-record.docx b/cnas-personnel/src/main/resources/static/supervision-record.docx
new file mode 100644
index 0000000..ede4555
--- /dev/null
+++ b/cnas-personnel/src/main/resources/static/supervision-record.docx
Binary files differ
diff --git a/cnas-personnel/src/main/resources/static/training-record.docx b/cnas-personnel/src/main/resources/static/training-record.docx
new file mode 100644
index 0000000..1e6955d
--- /dev/null
+++ b/cnas-personnel/src/main/resources/static/training-record.docx
Binary files differ
diff --git a/cnas-server/src/main/java/com/yuanchu/mom/pojo/DepartmentLims.java b/cnas-server/src/main/java/com/yuanchu/mom/pojo/DepartmentLims.java
index a44d27b..8b7ab79 100644
--- a/cnas-server/src/main/java/com/yuanchu/mom/pojo/DepartmentLims.java
+++ b/cnas-server/src/main/java/com/yuanchu/mom/pojo/DepartmentLims.java
@@ -6,6 +6,7 @@
 
 import java.io.Serializable;
 import java.time.LocalDateTime;
+import java.util.List;
 
 /**
  * 閮ㄩ棬鏄庣粏
@@ -35,4 +36,7 @@
 
     @TableField(fill = FieldFill.INSERT_UPDATE)
     private LocalDateTime updateTime;
+
+    @TableField(exist = false)
+    private List<DepartmentLims> children;
 }
\ No newline at end of file
diff --git a/framework/pom.xml b/framework/pom.xml
index c56bafc..0c01a6a 100644
--- a/framework/pom.xml
+++ b/framework/pom.xml
@@ -45,5 +45,17 @@
             <version>3.3.3</version>
         </dependency>
 
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-text</artifactId>
+            <version>1.3</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.google.guava</groupId>
+            <artifactId>guava</artifactId>
+            <version>29.0-android</version> <!-- 璇锋牴鎹渶瑕侀�夋嫨鍚堥�傜殑鐗堟湰 -->
+        </dependency>
+
     </dependencies>
 </project>
diff --git a/framework/src/main/java/com/yuanchu/mom/numgen/LambdaUtils.java b/framework/src/main/java/com/yuanchu/mom/numgen/LambdaUtils.java
new file mode 100644
index 0000000..7f71990
--- /dev/null
+++ b/framework/src/main/java/com/yuanchu/mom/numgen/LambdaUtils.java
@@ -0,0 +1,127 @@
+/*
+ * Copyright (c) 2011-2020, baomidou (jobob@qq.com).
+ * <p>
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * <p>
+ * https://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.yuanchu.mom.numgen;
+
+import com.baomidou.mybatisplus.core.metadata.TableInfo;
+import com.baomidou.mybatisplus.core.metadata.TableInfoHelper;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.baomidou.mybatisplus.core.toolkit.support.ColumnCache;
+import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
+
+import java.lang.ref.WeakReference;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Optional;
+import java.util.concurrent.ConcurrentHashMap;
+
+import static java.util.Locale.ENGLISH;
+
+/**
+ * Lambda 瑙f瀽宸ュ叿绫�
+ *
+ * @author HCL, MieMie
+ * @since 2018-05-10
+ */
+public final class LambdaUtils {
+
+    /**
+     * 瀛楁鏄犲皠
+     */
+    private static final Map<String, Map<String, ColumnCache>> COLUMN_CACHE_MAP = new ConcurrentHashMap<>();
+
+    /**
+     * SerializedLambda 鍙嶅簭鍒楀寲缂撳瓨
+     */
+    private static final Map<String, WeakReference<SerializedLambda>> FUNC_CACHE = new ConcurrentHashMap<>();
+
+    /**
+     * 瑙f瀽 lambda 琛ㄨ揪寮�, 璇ユ柟娉曞彧鏄皟鐢ㄤ簡 {@link SerializedLambda#resolve(SFunction)} 涓殑鏂规硶锛屽湪姝ゅ熀纭�涓婂姞浜嗙紦瀛樸��
+     * 璇ョ紦瀛樺彲鑳戒細鍦ㄤ换鎰忎笉瀹氱殑鏃堕棿琚竻闄�
+     *
+     * @param func 闇�瑕佽В鏋愮殑 lambda 瀵硅薄
+     * @param <T>  绫诲瀷锛岃璋冪敤鐨� Function 瀵硅薄鐨勭洰鏍囩被鍨�
+     * @return 杩斿洖瑙f瀽鍚庣殑缁撴灉
+     * @see SerializedLambda#resolve(SFunction)
+     */
+    public static <T> SerializedLambda resolve(SFunction<T, ?> func) {
+        Class<?> clazz = func.getClass();
+        String canonicalName = clazz.getCanonicalName();
+        return Optional.ofNullable(FUNC_CACHE.get(canonicalName))
+            .map(WeakReference::get)
+            .orElseGet(() -> {
+                SerializedLambda lambda = SerializedLambda.resolve(func);
+                FUNC_CACHE.put(canonicalName, new WeakReference<>(lambda));
+                return lambda;
+            });
+    }
+
+    /**
+     * 鏍煎紡鍖� key 灏嗕紶鍏ョ殑 key 鍙樻洿涓哄ぇ鍐欐牸寮�
+     *
+     * <pre>
+     *     Assert.assertEquals("USERID", formatKey("userId"))
+     * </pre>
+     *
+     * @param key key
+     * @return 澶у啓鐨� key
+     */
+    public static String formatKey(String key) {
+        return key.toUpperCase(ENGLISH);
+    }
+
+    /**
+     * 灏嗕紶鍏ョ殑琛ㄤ俊鎭姞鍏ョ紦瀛�
+     *
+     * @param tableInfo 琛ㄤ俊鎭�
+     */
+    public static void installCache(TableInfo tableInfo) {
+        COLUMN_CACHE_MAP.put(tableInfo.getEntityType().getName(), createColumnCacheMap(tableInfo));
+    }
+
+    /**
+     * 缂撳瓨瀹炰綋瀛楁 MAP 淇℃伅
+     *
+     * @param info 琛ㄤ俊鎭�
+     * @return 缂撳瓨 map
+     */
+    private static Map<String, ColumnCache> createColumnCacheMap(TableInfo info) {
+        Map<String, ColumnCache> map = new HashMap<>();
+
+        String kp = info.getKeyProperty();
+        if (StringUtils.isNotBlank(kp)) {
+            map.put(formatKey(kp), new ColumnCache(info.getKeyColumn(), info.getKeySqlSelect()));
+        }
+
+        info.getFieldList().forEach(i ->
+            map.put(formatKey(i.getProperty()), new ColumnCache(i.getColumn(), i.getSqlSelect()))
+        );
+        return map;
+    }
+
+    /**
+     * 鑾峰彇瀹炰綋瀵瑰簲瀛楁 MAP
+     *
+     * @param clazz 瀹炰綋绫�
+     * @return 缂撳瓨 map
+     */
+    public static Map<String, ColumnCache> getColumnMap(Class<?> clazz) {
+        return COLUMN_CACHE_MAP.computeIfAbsent(clazz.getName(), key -> {
+            TableInfo info = TableInfoHelper.getTableInfo(clazz);
+            return info == null ? null : createColumnCacheMap(info);
+        });
+    }
+
+}
diff --git a/framework/src/main/java/com/yuanchu/mom/numgen/NumberGenerator.java b/framework/src/main/java/com/yuanchu/mom/numgen/NumberGenerator.java
new file mode 100644
index 0000000..c2d0b68
--- /dev/null
+++ b/framework/src/main/java/com/yuanchu/mom/numgen/NumberGenerator.java
@@ -0,0 +1,146 @@
+package com.yuanchu.mom.numgen;
+
+import com.baomidou.mybatisplus.core.metadata.TableFieldInfo;
+import com.baomidou.mybatisplus.core.metadata.TableInfo;
+import com.baomidou.mybatisplus.core.metadata.TableInfoHelper;
+import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.ibatis.reflection.property.PropertyNamer;
+import org.springframework.stereotype.Service;
+
+import java.util.Optional;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+
+/**
+ * 缂栧彿鐢熸垚鍣�
+ *
+ * @Author: zhangxy
+ * @Date: 2020-09-08 16:31
+ */
+@Slf4j
+@Service
+@AllArgsConstructor
+public class NumberGenerator<T> {
+
+	private static Pattern NUMBER_PATTERN = Pattern.compile("(.+)\\((\\d+)\\)");
+
+	private NumberGeneratorModelHelper numberGeneratorModelHelper;
+
+
+	public String getCopyValueOfUniqueField(final String value, SFunction<T, ?> column) {
+		if (value == null) {
+			return null;
+		} else {
+			Matcher matcher = NUMBER_PATTERN.matcher(value);
+			String oldValue = value;
+			int index = 1;
+			if (matcher.matches()) {
+				oldValue = matcher.group(1);
+				index = Integer.valueOf(matcher.group(2)) + 1;
+			}
+
+			NumberTableInfo info = initDbInfo(column);
+			while (true) {
+				String newValue = oldValue + "(" + (index++) + ")";
+				boolean exist = numberGeneratorModelHelper.numberExist(newValue, info);
+				if (!exist) {
+					return newValue;
+				}
+			}
+		}
+	}
+
+
+	/**
+	 * 鐢熸垚缂栧彿
+	 *
+	 * @param numOfDigits
+	 * @param column
+	 * @return
+	 */
+	public String generateNumber(final int numOfDigits, SFunction<T, ?> column) {
+		return generateNumberWithPrefix(numOfDigits, null, column);
+	}
+
+	/**
+	 * 鐢熸垚甯﹀墠缂�鐨勭紪鍙�
+	 *
+	 * @param numOfDigits
+	 * @param prefix
+	 * @param column
+	 * @return
+	 */
+	public String generateNumberWithPrefix(final int numOfDigits, final String prefix, SFunction<T, ?> column) {
+		NumberTableInfo info = initDbInfo(column);
+		String generatedNumber = generateNumberWithExtension(info, numOfDigits, prefix, "");
+		return prependPrefix(prefix, generatedNumber);
+	}
+
+
+	/**
+	 * 鐢熸垚甯﹀悗缂�鐨勭紪鍙�
+	 *
+	 * @param numOfDigits
+	 * @param suffix
+	 * @param column
+	 * @return
+	 */
+	public String generateNumberWithSuffix(final int numOfDigits, final String suffix, SFunction<T, ?> column) {
+		NumberTableInfo info = initDbInfo(column);
+		String generatedNumber = generateNumberWithExtension(info, numOfDigits, "", suffix);
+		return appendSuffix(suffix, generatedNumber);
+	}
+
+	/**
+	 * 鍒濆鍖栨暟鎹簱琛ㄥ悕銆佸瓧娈靛悕
+	 *
+	 * @param column
+	 * @return
+	 */
+	private NumberTableInfo initDbInfo(SFunction<T, ?> column) {
+		SerializedLambda ld = LambdaUtils.resolve(column);
+		TableInfo tableInfo = TableInfoHelper.getTableInfo(ld.getImplClass());
+		String fieldName = PropertyNamer.methodToProperty(ld.getImplMethodName());
+		Optional<TableFieldInfo> op = tableInfo.getFieldList().stream().filter(f -> fieldName.equals(f.getProperty())).findFirst();
+		if (!op.isPresent()) {
+			throw new RuntimeException("鑾峰彇鏁版嵁搴撳瓧娈靛嚭閿欙紝璇锋鏌ユ槧灏�");
+		}
+		TableFieldInfo fieldInfo = op.get();
+
+		NumberTableInfo info = new NumberTableInfo();
+		info.setLogicDelete(tableInfo.isLogicDelete());
+		info.setNumberFieldName(fieldInfo.getColumn());
+		info.setTableName(tableInfo.getTableName());
+		return info;
+	}
+
+
+	private String generateNumberWithExtension(NumberTableInfo numberTableInfo, int numOfDigits, String prefix, String suffix) {
+		Long dbMax = numberGeneratorModelHelper.getNumbersProjection(numberTableInfo, prefix, suffix);
+		Long greatestNumber = 0L;
+		if (dbMax != null) {
+			greatestNumber = dbMax;
+		}
+		return String.format("%0" + numOfDigits + "d", greatestNumber + 1);
+	}
+
+	private String prependPrefix(final String prefix, final String generatedNumber) {
+		if (prefix == null) {
+			return generatedNumber;
+		}
+		return prefix + generatedNumber;
+	}
+
+
+	private String appendSuffix(final String suffix, final String generatedNumber) {
+		if (suffix == null) {
+			return generatedNumber;
+		}
+		return generatedNumber + suffix;
+	}
+
+
+}
diff --git a/framework/src/main/java/com/yuanchu/mom/numgen/NumberGeneratorModelHelper.java b/framework/src/main/java/com/yuanchu/mom/numgen/NumberGeneratorModelHelper.java
new file mode 100644
index 0000000..30fa404
--- /dev/null
+++ b/framework/src/main/java/com/yuanchu/mom/numgen/NumberGeneratorModelHelper.java
@@ -0,0 +1,107 @@
+/**
+ * ***************************************************************************
+ * Copyright (c) 2010 Qcadoo Limited
+ * Project: Qcadoo Framework
+ * Version: 1.4
+ * <p>
+ * This file is part of Qcadoo.
+ * <p>
+ * Qcadoo is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published
+ * by the Free Software Foundation; either version 3 of the License,
+ * or (at your option) any later version.
+ * <p>
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ * See the GNU Affero General Public License for more details.
+ * <p>
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ * ***************************************************************************
+ */
+package com.yuanchu.mom.numgen;
+
+import com.google.common.collect.Maps;
+import lombok.AllArgsConstructor;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.text.StringSubstitutor;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.stereotype.Service;
+
+import java.util.Map;
+
+/**
+ * @author zhangxy
+ */
+@AllArgsConstructor
+@Service
+public class NumberGeneratorModelHelper {
+
+	private JdbcTemplate jdbcTemplate;
+
+
+	private static final String NUMBER_EXIST_QUERY_TEMPLATE = "select count(*) from ${TABLE_NAME} where ${NUMBER_FIELD}='${VALUE}'";
+
+
+	private static final String GET_NUMBERS_QUERY_TEMPLATE = "select MAX( CAST( "
+			+ " coalesce(TRIM(LEADING '0' from ${NUMBER_FIELD}), '0')   "
+			+ " AS UNSIGNED ) ) "
+			+ "from ${TABLE_NAME} where 1=1";
+
+	private static final String GET_PREFIX_AWARE_NUMBERS_QUERY_TEMPLATE = "select MAX( CAST( "
+			+ " TRIM(LEADING '0' from SUBSTRING(${NUMBER_FIELD}, ${NUMBER_STARTS_AT}))  "
+			+ " AS UNSIGNED ) ) "
+			+ "from ${TABLE_NAME}  where ${NUMBER_FIELD} like '${PREFIX}%'";
+
+	private static final String GET_SUFFIX_AWARE_NUMBERS_QUERY_TEMPLATE = "select MAX( CAST( "
+			+ " TRIM(LEADING '0' from SUBSTRING(${NUMBER_FIELD}, 1, POSITION('${SUFFIX}' IN ${NUMBER_FIELD}) - 1)) "
+			+ " AS UNSIGNED )) "
+			+ "from ${TABLE_NAME}  where ${NUMBER_FIELD} like '%${SUFFIX}'";
+
+
+	public boolean numberExist(final String value, final NumberTableInfo numberTableInfo) {
+		Map<String, String> placeholderValues = Maps.newHashMap();
+
+		placeholderValues.put("TABLE_NAME", numberTableInfo.getTableName());
+		placeholderValues.put("NUMBER_FIELD", numberTableInfo.getNumberFieldName());
+		placeholderValues.put("VALUE", value);
+		String query = new StringSubstitutor(placeholderValues, "${", "}").replace(NUMBER_EXIST_QUERY_TEMPLATE);
+		Long count = jdbcTemplate.queryForObject(query, Long.class);
+		return count > 0;
+	}
+
+	public Long getNumbersProjection(final NumberTableInfo numberTableInfo, final String prefix, final String suffix) {
+		String sqlQuery = buildQuery(numberTableInfo, prefix, suffix);
+		return jdbcTemplate.queryForObject(sqlQuery, Long.class);
+	}
+
+	private String buildQuery(final NumberTableInfo numberTableInfo,
+							  final String prefix, final String suffix) {
+		Map<String, String> placeholderValues = Maps.newHashMap();
+
+		placeholderValues.put("TABLE_NAME", numberTableInfo.getTableName());
+		placeholderValues.put("NUMBER_FIELD", numberTableInfo.getNumberFieldName());
+
+		String query;
+		if (StringUtils.isNotEmpty(prefix)) {
+			placeholderValues.put("PREFIX", prefix);
+			int prefixLength = StringUtils.length(prefix);
+			placeholderValues.put("NUMBER_STARTS_AT", String.valueOf(prefixLength + 1));
+			query = GET_PREFIX_AWARE_NUMBERS_QUERY_TEMPLATE;
+		} else if (StringUtils.isNotEmpty(suffix)) {
+			placeholderValues.put("SUFFIX", suffix);
+			query = GET_SUFFIX_AWARE_NUMBERS_QUERY_TEMPLATE;
+		} else {
+			query = GET_NUMBERS_QUERY_TEMPLATE;
+		}
+
+		if(numberTableInfo.isLogicDelete()){
+			query += " and active=true";
+		}
+		StringSubstitutor substitutor = new StringSubstitutor(placeholderValues, "${", "}");
+		return substitutor.replace(query);
+	}
+
+}
diff --git a/framework/src/main/java/com/yuanchu/mom/numgen/NumberTableInfo.java b/framework/src/main/java/com/yuanchu/mom/numgen/NumberTableInfo.java
new file mode 100644
index 0000000..5b2c95a
--- /dev/null
+++ b/framework/src/main/java/com/yuanchu/mom/numgen/NumberTableInfo.java
@@ -0,0 +1,16 @@
+package com.yuanchu.mom.numgen;
+
+import lombok.Data;
+
+/**
+ * @Author: zhangxy
+ * @Date: 2020-09-11 16:48
+ */
+@Data
+public class NumberTableInfo {
+
+	private String tableName;
+	private String numberFieldName;
+
+	private boolean logicDelete;
+}
diff --git a/framework/src/main/java/com/yuanchu/mom/numgen/SerializedLambda.java b/framework/src/main/java/com/yuanchu/mom/numgen/SerializedLambda.java
new file mode 100644
index 0000000..05faa0e
--- /dev/null
+++ b/framework/src/main/java/com/yuanchu/mom/numgen/SerializedLambda.java
@@ -0,0 +1,143 @@
+/*
+ * Copyright (c) 2011-2020, baomidou (jobob@qq.com).
+ * <p>
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * <p>
+ * https://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.yuanchu.mom.numgen;
+
+import com.baomidou.mybatisplus.core.toolkit.ClassUtils;
+import com.baomidou.mybatisplus.core.toolkit.ExceptionUtils;
+import com.baomidou.mybatisplus.core.toolkit.SerializationUtils;
+import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
+
+import java.io.*;
+
+/**
+ * 杩欎釜绫绘槸浠� {@link java.lang.invoke.SerializedLambda} 閲岄潰 copy 杩囨潵鐨勶紝
+ * 瀛楁淇℃伅瀹屽叏涓�鏍�
+ * <p>璐熻矗灏嗕竴涓敮鎸佸簭鍒楃殑 Function 搴忓垪鍖栦负 SerializedLambda</p>
+ *
+ * @author HCL
+ * @since 2018/05/10
+ */
+public class SerializedLambda implements Serializable {
+
+    private static final long serialVersionUID = 8025925345765570181L;
+
+    private Class<?> capturingClass;
+    private String functionalInterfaceClass;
+    private String functionalInterfaceMethodName;
+    private String functionalInterfaceMethodSignature;
+    private String implClass;
+    private String implMethodName;
+    private String implMethodSignature;
+    private int implMethodKind;
+    private String instantiatedMethodType;
+    private Object[] capturedArgs;
+
+    /**
+     * 閫氳繃鍙嶅簭鍒楀寲杞崲 lambda 琛ㄨ揪寮忥紝璇ユ柟娉曞彧鑳藉簭鍒楀寲 lambda 琛ㄨ揪寮忥紝涓嶈兘搴忓垪鍖栨帴鍙e疄鐜版垨鑰呮甯搁潪 lambda 鍐欐硶鐨勫璞�
+     *
+     * @param lambda lambda瀵硅薄
+     * @return 杩斿洖瑙f瀽鍚庣殑 SerializedLambda
+     */
+    public static SerializedLambda resolve(SFunction<?, ?> lambda) {
+        if (!lambda.getClass().isSynthetic()) {
+            throw ExceptionUtils.mpe("璇ユ柟娉曚粎鑳戒紶鍏� lambda 琛ㄨ揪寮忎骇鐢熺殑鍚堟垚绫�");
+        }
+        try (ObjectInputStream objIn = new ObjectInputStream(new ByteArrayInputStream(SerializationUtils.serialize(lambda))) {
+            @Override
+            protected Class<?> resolveClass(ObjectStreamClass objectStreamClass) throws IOException, ClassNotFoundException {
+                Class<?> clazz;
+                try {
+                    clazz = ClassUtils.toClassConfident(objectStreamClass.getName());
+                } catch (Exception ex) {
+                    clazz = super.resolveClass(objectStreamClass);
+                }
+                return clazz == java.lang.invoke.SerializedLambda.class ? SerializedLambda.class : clazz;
+            }
+        }) {
+            return (SerializedLambda) objIn.readObject();
+        } catch (ClassNotFoundException | IOException e) {
+            throw ExceptionUtils.mpe("This is impossible to happen", e);
+        }
+    }
+
+    /**
+     * 鑾峰彇鎺ュ彛 class
+     *
+     * @return 杩斿洖 class 鍚嶇О
+     */
+    public String getFunctionalInterfaceClassName() {
+        return normalizedName(functionalInterfaceClass);
+    }
+
+    /**
+     * 鑾峰彇瀹炵幇鐨� class
+     *
+     * @return 瀹炵幇绫�
+     */
+    public Class<?> getImplClass() {
+        return ClassUtils.toClassConfident(getImplClassName());
+    }
+
+    /**
+     * 鑾峰彇 class 鐨勫悕绉�
+     *
+     * @return 绫诲悕
+     */
+    public String getImplClassName() {
+        return normalizedName(implClass);
+    }
+
+    /**
+     * 鑾峰彇瀹炵幇鑰呯殑鏂规硶鍚嶇О
+     *
+     * @return 鏂规硶鍚嶇О
+     */
+    public String getImplMethodName() {
+        return implMethodName;
+    }
+
+    /**
+     * 姝e父鍖栫被鍚嶇О锛屽皢绫诲悕绉颁腑鐨� / 鏇挎崲涓� .
+     *
+     * @param name 鍚嶇О
+     * @return 姝e父鐨勭被鍚�
+     */
+    private String normalizedName(String name) {
+        return name.replace('/', '.');
+    }
+
+    /**
+     * @return 鑾峰彇瀹炰緥鍖栨柟娉曠殑绫诲瀷
+     */
+    public Class<?> getInstantiatedType() {
+        String instantiatedTypeName = normalizedName(instantiatedMethodType.substring(2, instantiatedMethodType.indexOf(';')));
+        return ClassUtils.toClassConfident(instantiatedTypeName);
+    }
+
+    /**
+     * @return 瀛楃涓插舰寮�
+     */
+    @Override
+    public String toString() {
+        String interfaceName = getFunctionalInterfaceClassName();
+        String implName = getImplClassName();
+        return String.format("%s -> %s::%s",
+                interfaceName.substring(interfaceName.lastIndexOf('.') + 1),
+                implName.substring(implName.lastIndexOf('.') + 1),
+                implMethodName);
+    }
+
+}
diff --git a/system-run/pom.xml b/system-run/pom.xml
index 4813ffe..935008a 100644
--- a/system-run/pom.xml
+++ b/system-run/pom.xml
@@ -68,6 +68,11 @@
             <artifactId>cnas-resource-require</artifactId>
             <version>0.0.1-SNAPSHOT</version>
         </dependency>
+        <dependency>
+            <groupId>com.yuanchu.mom</groupId>
+            <artifactId>cnas-personnel</artifactId>
+            <version>0.0.1-SNAPSHOT</version>
+        </dependency>
 
         <!--druid-->
         <dependency>
diff --git a/system-run/src/main/java/com/yuanchu/mom/SystemRunApplication.java b/system-run/src/main/java/com/yuanchu/mom/SystemRunApplication.java
index afeeb17..f2b8521 100644
--- a/system-run/src/main/java/com/yuanchu/mom/SystemRunApplication.java
+++ b/system-run/src/main/java/com/yuanchu/mom/SystemRunApplication.java
@@ -3,8 +3,10 @@
 import org.mybatis.spring.annotation.MapperScan;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.scheduling.annotation.EnableScheduling;
 import org.springframework.transaction.annotation.EnableTransactionManagement;
 
+@EnableScheduling
 @SpringBootApplication
 @MapperScan("com.yuanchu.mom.mapper")// 鎵弿Mybatis涓殑mapper鍖�
 @EnableTransactionManagement

--
Gitblit v1.9.3