From aa6487d1279f4c8fa36d52b1399944203849eb00 Mon Sep 17 00:00:00 2001
From: zhuo <2089219845@qq.com>
Date: 星期一, 24 二月 2025 10:04:00 +0800
Subject: [PATCH] 人员培训计划移植
---
cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonTrainingServiceImpl.java | 429 +++++++
cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonTrainingDetailedFileMapper.java | 15
cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonTrainingDto.java | 23
cnas-personnel/src/main/java/com/ruoyi/personnel/excel/PersonTrainingDetailedUpload.java | 35
cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonTrainingDetailed.java | 99 +
cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonTrainingController.java | 246 ++++
cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonBasicInfoWorkDto.java | 16
cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonTrainingDetailedServiceImpl.java | 85 +
cnas-personnel/src/main/resources/mapper/PersonTrainingRecordMapper.xml | 126 ++
cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonTrainingRecord.java | 41
cnas-personnel/src/main/resources/mapper/PersonTrainingMapper.xml | 46
cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonBasicInfoServiceImpl.java | 676 ++++++------
cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonTrainingRecordServiceImpl.java | 177 +++
cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonTrainingRecordSubmitDto.java | 35
cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonBasicInfoController.java | 454 ++++----
cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonTrainingDetailedFile.java | 49
cnas-personnel/src/main/java/com/ruoyi/personnel/dto/TrainingRecordExportDto.java | 32
cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonTrainingRecordDto.java | 23
cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonTrainingRecordListDto.java | 37
cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonTrainingDetailedService.java | 29
cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonTraining.java | 83 +
cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonTrainingDetailedDto.java | 29
cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonTrainingRecordMapper.java | 67 +
cnas-personnel/src/main/java/com/ruoyi/personnel/dto/TrainingRecordPersonDetailedDto.java | 26
cnas-personnel/src/main/java/com/ruoyi/personnel/excel/PersonTrainingDetailedListener.java | 42
cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonTrainingDetailedMapper.java | 48
cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonBasicInfoDetailsDto.java | 65 +
cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonTrainingMapper.java | 20
cnas-personnel/src/main/resources/mapper/PersonBasicInfoMapper.xml | 65 +
cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonTrainingRecordService.java | 59 +
cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonTrainingService.java | 63 +
31 files changed, 2,679 insertions(+), 561 deletions(-)
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonBasicInfoController.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonBasicInfoController.java
index 32b9224..01b44d4 100644
--- a/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonBasicInfoController.java
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonBasicInfoController.java
@@ -1,225 +1,229 @@
-//package com.ruoyi.personnel.controller;
-//
-//import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-//import com.baomidou.mybatisplus.core.metadata.IPage;
-//import com.baomidou.mybatisplus.core.toolkit.Wrappers;
-//import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-//import com.ruoyi.personnel.service.AnnexService;
-//import com.ruoyi.personnel.service.PersonBasicInfoFileService;
-//import com.ruoyi.personnel.service.PersonBasicInfoService;
-//import com.ruoyi.personnel.service.PersonBasicInfoWorkService;
-//import io.swagger.annotations.Api;
-//import io.swagger.annotations.ApiOperation;
-//import org.springframework.web.bind.annotation.RequestMapping;
-//import org.springframework.web.bind.annotation.RestController;
-//import org.springframework.web.multipart.MultipartFile;
-//
-//import javax.annotation.Resource;
-//import javax.servlet.http.HttpServletResponse;
-//import java.util.List;
-//import java.util.Map;
-//
-///**
-// * <p>
-// * 鍓嶇鎺у埗鍣�
-// * </p>
-// *
-// * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
-// * @since 2024-08-30 09:19:57
-// */
-//@Api(tags = "浜哄憳-浜哄憳鍩烘湰淇℃伅")
-//@RestController
-//@RequestMapping("/personBasicInfo")
-//public class PersonBasicInfoController {
-//
-// @Resource
-// private PersonBasicInfoService personBasicInfoService;
-//
-// @Resource
-// private PersonBasicInfoFileService personBasicInfoFileService;
-// @Resource
-// private PersonBasicInfoWorkService personBasicInfoWorkService;
-//
-// @Resource
-// private AnnexService annexService;
-//
-//
-// @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.uploadWordFile(file);
-// return Result.success("涓婁紶鎴愬姛", s);
-// }
-//
-// @GetMapping("/getAnnexByUserId")
-// public Result<List<Annex>> getAnnexByUserId(Integer userId) {
-// List<Annex> list = annexService.list(new LambdaQueryWrapper<Annex>().eq(Annex::getUserId, userId));
-// return Result.success(list);
-// }
-//
-// // 鍒犻櫎鏂囦欢
-// @DeleteMapping("/deleteCNASFile")
-// public Result saveFile(String fileName) {
-// String[] split = fileName.split(",");
-// for (String s : split) {
-// FileSaveUtil.DeleteFile(s);
-// }
-// return Result.success();
-//
-// }
-//
-// /**
-// * 浜哄憳鍩烘湰淇℃伅闄勪欢鏂板
-// */
-// @PostMapping("/addAnnex")
-// public Result addAnnex(@RequestBody Annex annex) {
-// annexService.save(annex);
-// return Result.success();
-// }
-//
-// @GetMapping("/getAnnex")
-// public Result<Annex> getAnnex(Integer id) {
-// return Result.success(annexService.getById(id));
-// }
-// /**
-// * 浜哄憳鍩烘湰淇℃伅闄勪欢鍒犻櫎
-// */
-// @DeleteMapping("/deleteAnnex/{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鍗�")
-// @GetMapping("/exportPersonBasicInfoById")
-// public Result exportPersonBasicInfoById(Integer id, HttpServletResponse response) {
-// return Result.success(personBasicInfoService.exportPersonBasicInfoById(id,response));
-// }
-//
-// /**
-// * 浜哄憳鍩硅鍩烘湰淇℃伅闄勪欢鏂板
-// * @param userId
-// * @param file
-// * @return
-// */
-// @ApiOperation(value = "浜哄憳鍩硅鍩烘湰淇℃伅闄勪欢鏂板")
-// @PostMapping("/uploadBasicInfoFile")
-// public Result<?> uploadBasicInfoFile(Integer userId, MultipartFile file) {
-// return Result.success(personBasicInfoService.uploadBasicInfoFile(userId, file));
-// }
-//
-//
-// /**
-// * 浜哄憳鍩硅鍩烘湰淇℃伅闄勪欢鍒楄〃
-// * @return
-// */
-// @ApiOperation(value = "浜哄憳鍩硅鍩烘湰淇℃伅闄勪欢鍒楄〃")
-// @GetMapping("/getBasicInfoFileList")
-// public Result<List<PersonBasicInfoFile>> getBasicInfoFileList(Integer userId){
-// return Result.success(personBasicInfoFileService.list(Wrappers.<PersonBasicInfoFile>lambdaQuery()
-// .eq(PersonBasicInfoFile::getUserId, userId)));
-// }
-//
-// /**
-// * 浜哄憳鍩硅鍩烘湰淇℃伅闄勪欢鍒犻櫎
-// * @return
-// */
-// @ApiOperation(value = "浜哄憳鍩硅鍩烘湰淇℃伅闄勪欢鍒犻櫎")
-// @GetMapping("/delBasicInfoFileList")
-// public Result delBasicInfoFileList(Integer basicInfoFileId){
-// return Result.success(personBasicInfoFileService.removeById(basicInfoFileId));
-// }
-//
-// /**
-// * 浜哄憳鍩硅鍩烘湰淇℃伅宸ヤ綔缁忓巻鏂板
-// * @return
-// */
-// @ApiOperation(value = "浜哄憳鍩硅鍩烘湰淇℃伅宸ヤ綔缁忓巻鏂板")
-// @PostMapping("/addBasicInfoWork")
-// public Result<?> addBasicInfoWork(@RequestBody PersonBasicInfoWork basicInfoWork) {
-// if (basicInfoWork.getUserId() == null) {
-// throw new ErrorException("缂哄皯浜哄憳id");
-// }
-// basicInfoWork.setUserId(basicInfoWork.getUserId());
-// return Result.success(personBasicInfoWorkService.save(basicInfoWork));
-// }
-//
-//
-// /**
-// * 浜哄憳宸ヤ綔缁忓巻鍒楄〃
-// * @return
-// */
-// @ApiOperation(value = "浜哄憳宸ヤ綔缁忓巻鍒楄〃")
-// @GetMapping("/getBasicInfoWorkList")
-// public Result<List<PersonBasicInfoWork>> getBasicInfoWorkList(Integer userId){
-// return Result.success(personBasicInfoWorkService.list(Wrappers.<PersonBasicInfoWork>lambdaQuery()
-// .eq(PersonBasicInfoWork::getUserId, userId)));
-// }
-//
-// /**
-// * 浜哄憳宸ヤ綔缁忓巻鍒犻櫎
-// * @return
-// */
-// @ApiOperation(value = "浜哄憳宸ヤ綔缁忓巻鍒犻櫎")
-// @GetMapping("/delBasicInfoWorkList")
-// public Result delBasicInfoWorkList(Integer basicInfoWorkId){
-// return Result.success(personBasicInfoWorkService.removeById(basicInfoWorkId));
-// }
-//
-// /**
-// * 浜哄憳鍩烘湰淇℃伅闄勪欢鍒犻櫎
-// * @return
-// */
-// @ApiOperation(value = "浜哄憳宸ヤ綔缁忓巻淇敼")
-// @PostMapping("/updateBasicInfoWorkList")
-// public Result updateBasicInfoWorkList(@RequestBody PersonBasicInfoWork basicInfoWork){
-// return Result.success(personBasicInfoWorkService.updateById(basicInfoWork));
-// }
-//}
+package com.ruoyi.personnel.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.common.core.domain.entity.DepartmentDto;
+import com.ruoyi.common.utils.FileSaveUtil;
+import com.ruoyi.framework.exception.ErrorException;
+import com.ruoyi.personnel.dto.PersonBasicInfoDetailsDto;
+import com.ruoyi.personnel.dto.PersonBasicInfoDto;
+import com.ruoyi.personnel.dto.UserPageDto;
+import com.ruoyi.personnel.pojo.Annex;
+import com.ruoyi.personnel.pojo.PersonBasicInfoFile;
+import com.ruoyi.personnel.pojo.PersonBasicInfoWork;
+import com.ruoyi.personnel.service.AnnexService;
+import com.ruoyi.personnel.service.PersonBasicInfoFileService;
+import com.ruoyi.personnel.service.PersonBasicInfoService;
+import com.ruoyi.personnel.service.PersonBasicInfoWorkService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-08-30 09:19:57
+ */
+@Api(tags = "浜哄憳-浜哄憳鍩烘湰淇℃伅")
+@RestController
+@RequestMapping("/personBasicInfo")
+public class PersonBasicInfoController {
+
+ @Resource
+ private PersonBasicInfoService personBasicInfoService;
+
+ @Resource
+ private PersonBasicInfoFileService personBasicInfoFileService;
+ @Resource
+ private PersonBasicInfoWorkService personBasicInfoWorkService;
+
+ @Resource
+ private AnnexService annexService;
+
+
+ @ApiOperation(value = "鏌ヨCNAS浜哄憳渚ц竟鏍�")
+ @GetMapping("/selectCNSAPersonTree")
+ public Result<List<DepartmentDto>> selectCNSAPersonTree() {
+ return Result.success(personBasicInfoService.selectCNSAPersonTree());
+ }
+
+ @ApiOperation(value = "鑾峰彇CNAS浜哄憳鍩烘湰淇℃伅")
+ @GetMapping("/getCNASPersonnelInfo")
+ public Result getCNASPersonnelInfo(Integer userId) {
+ return Result.success(personBasicInfoService.getCNASPersonnelInfo(userId));
+ }
+
+ @ApiOperation(value = "淇濆瓨CNAS浜哄憳鍩烘湰淇℃伅")
+ @PostMapping("/saveCNASPersonnelInfo")
+ public Result saveCNASPersonnelInfo(@RequestBody PersonBasicInfoDto personBasicInfoDto) {
+ personBasicInfoService.saveCNASPersonnelInfo(personBasicInfoDto);
+ return Result.success();
+ }
+
+ @ApiOperation(value = "浜哄憳鏄庣粏鍒嗛〉鏌ヨ")
+ @GetMapping("basicInformationOfPersonnelSelectPage")
+ public Result<IPage<Map<String, Object>>> basicInformationOfPersonnelSelectPage(Page<List<PersonBasicInfoDetailsDto>> page, String name, Integer departmentId) {
+ return Result.success(personBasicInfoService.basicInformationOfPersonnelSelectPage(page, name, departmentId));
+ }
+
+ // 涓婁紶鏂囦欢鎺ュ彛
+ @ApiOperation(value = "涓婁紶鏂囦欢鎺ュ彛")
+ @PostMapping("/saveCNASFile")
+ public Result saveFile(@RequestPart("file") MultipartFile file) {
+ String s = FileSaveUtil.uploadWordFile(file);
+ return Result.success("涓婁紶鎴愬姛", s);
+ }
+
+ @GetMapping("/getAnnexByUserId")
+ public Result<List<Annex>> getAnnexByUserId(Integer userId) {
+ List<Annex> list = annexService.list(new LambdaQueryWrapper<Annex>().eq(Annex::getUserId, userId));
+ return Result.success(list);
+ }
+
+ // 鍒犻櫎鏂囦欢
+ @DeleteMapping("/deleteCNASFile")
+ public Result saveFile(String fileName) {
+ String[] split = fileName.split(",");
+ for (String s : split) {
+ FileSaveUtil.DeleteFile(s);
+ }
+ return Result.success();
+
+ }
+
+ /**
+ * 浜哄憳鍩烘湰淇℃伅闄勪欢鏂板
+ */
+ @PostMapping("/addAnnex")
+ public Result addAnnex(@RequestBody Annex annex) {
+ annexService.save(annex);
+ return Result.success();
+ }
+
+ @GetMapping("/getAnnex")
+ public Result<Annex> getAnnex(Integer id) {
+ return Result.success(annexService.getById(id));
+ }
+ /**
+ * 浜哄憳鍩烘湰淇℃伅闄勪欢鍒犻櫎
+ */
+ @DeleteMapping("/deleteAnnex")
+ public Result deleteAnnex(Integer id) {
+ annexService.removeById(id);
+ return Result.success();
+ }
+
+ /**
+ * 浜哄憳鍩烘湰淇℃伅闄勪欢淇敼
+ *
+ */
+ @PostMapping("/updateAnnex")
+ public Result updateAnnex(@RequestBody Annex annex) {
+ annexService.updateById(annex);
+ return Result.success();
+ }
+
+ @ApiOperation(value = "瀵煎嚭浜哄憳鍩烘湰淇℃伅")
+ @GetMapping("/exportPersonBasicInfo")
+ public void exportPersonBasicInfo(UserPageDto userPageDto, HttpServletResponse response) throws Exception {
+ personBasicInfoService.exportPersonBasicInfo(userPageDto,response);
+ }
+
+ @ApiOperation(value = "涓嬭浇浜哄憳妗f鍗�")
+ @GetMapping("/exportPersonBasicInfoById")
+ public Result exportPersonBasicInfoById(Integer id, HttpServletResponse response) {
+ return Result.success(personBasicInfoService.exportPersonBasicInfoById(id,response));
+ }
+
+ /**
+ * 浜哄憳鍩硅鍩烘湰淇℃伅闄勪欢鏂板
+ * @param userId
+ * @param file
+ * @return
+ */
+ @ApiOperation(value = "浜哄憳鍩硅鍩烘湰淇℃伅闄勪欢鏂板")
+ @PostMapping("/uploadBasicInfoFile")
+ public Result<?> uploadBasicInfoFile(Integer userId, MultipartFile file) {
+ return Result.success(personBasicInfoService.uploadBasicInfoFile(userId, file));
+ }
+
+
+ /**
+ * 浜哄憳鍩硅鍩烘湰淇℃伅闄勪欢鍒楄〃
+ * @return
+ */
+ @ApiOperation(value = "浜哄憳鍩硅鍩烘湰淇℃伅闄勪欢鍒楄〃")
+ @GetMapping("/getBasicInfoFileList")
+ public Result<List<PersonBasicInfoFile>> getBasicInfoFileList(Integer userId){
+ return Result.success(personBasicInfoFileService.list(Wrappers.<PersonBasicInfoFile>lambdaQuery()
+ .eq(PersonBasicInfoFile::getUserId, userId)));
+ }
+
+ /**
+ * 浜哄憳鍩硅鍩烘湰淇℃伅闄勪欢鍒犻櫎
+ * @return
+ */
+ @ApiOperation(value = "浜哄憳鍩硅鍩烘湰淇℃伅闄勪欢鍒犻櫎")
+ @GetMapping("/delBasicInfoFileList")
+ public Result delBasicInfoFileList(Integer basicInfoFileId){
+ return Result.success(personBasicInfoFileService.removeById(basicInfoFileId));
+ }
+
+ /**
+ * 浜哄憳鍩硅鍩烘湰淇℃伅宸ヤ綔缁忓巻鏂板
+ * @return
+ */
+ @ApiOperation(value = "浜哄憳鍩硅鍩烘湰淇℃伅宸ヤ綔缁忓巻鏂板")
+ @PostMapping("/addBasicInfoWork")
+ public Result<?> addBasicInfoWork(@RequestBody PersonBasicInfoWork basicInfoWork) {
+ if (basicInfoWork.getUserId() == null) {
+ throw new ErrorException("缂哄皯浜哄憳id");
+ }
+ basicInfoWork.setUserId(basicInfoWork.getUserId());
+ return Result.success(personBasicInfoWorkService.save(basicInfoWork));
+ }
+
+
+ /**
+ * 浜哄憳宸ヤ綔缁忓巻鍒楄〃
+ * @return
+ */
+ @ApiOperation(value = "浜哄憳宸ヤ綔缁忓巻鍒楄〃")
+ @GetMapping("/getBasicInfoWorkList")
+ public Result<List<PersonBasicInfoWork>> getBasicInfoWorkList(Integer userId){
+ return Result.success(personBasicInfoWorkService.list(Wrappers.<PersonBasicInfoWork>lambdaQuery()
+ .eq(PersonBasicInfoWork::getUserId, userId)));
+ }
+
+ /**
+ * 浜哄憳宸ヤ綔缁忓巻鍒犻櫎
+ * @return
+ */
+ @ApiOperation(value = "浜哄憳宸ヤ綔缁忓巻鍒犻櫎")
+ @GetMapping("/delBasicInfoWorkList")
+ public Result delBasicInfoWorkList(Integer basicInfoWorkId){
+ return Result.success(personBasicInfoWorkService.removeById(basicInfoWorkId));
+ }
+
+ /**
+ * 浜哄憳鍩烘湰淇℃伅闄勪欢鍒犻櫎
+ * @return
+ */
+ @ApiOperation(value = "浜哄憳宸ヤ綔缁忓巻淇敼")
+ @PostMapping("/updateBasicInfoWorkList")
+ public Result updateBasicInfoWorkList(@RequestBody PersonBasicInfoWork basicInfoWork){
+ return Result.success(personBasicInfoWorkService.updateById(basicInfoWork));
+ }
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonTrainingController.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonTrainingController.java
new file mode 100644
index 0000000..aee7f41
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonTrainingController.java
@@ -0,0 +1,246 @@
+package com.ruoyi.personnel.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.common.numgen.NumberGenerator;
+import com.ruoyi.personnel.dto.PersonTrainingDetailedDto;
+import com.ruoyi.personnel.dto.PersonTrainingDto;
+import com.ruoyi.personnel.dto.PersonTrainingRecordDto;
+import com.ruoyi.personnel.dto.PersonTrainingRecordSubmitDto;
+import com.ruoyi.personnel.mapper.PersonTrainingDetailedFileMapper;
+import com.ruoyi.personnel.pojo.PersonTraining;
+import com.ruoyi.personnel.pojo.PersonTrainingDetailed;
+import com.ruoyi.personnel.pojo.PersonTrainingDetailedFile;
+import com.ruoyi.personnel.pojo.PersonTrainingRecord;
+import com.ruoyi.personnel.service.PersonTrainingDetailedService;
+import com.ruoyi.personnel.service.PersonTrainingRecordService;
+import com.ruoyi.personnel.service.PersonTrainingService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+
+/**
+ * <p>
+ * 鍩硅璁″垝 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-10-11 01:11:49
+ */
+@Api(tags = "浜哄憳 - 鍩硅璁″垝")
+@RestController
+@RequestMapping("/personTraining")
+public class PersonTrainingController {
+
+ @Autowired
+ private PersonTrainingService personTrainingService;
+
+ @Autowired
+ private PersonTrainingDetailedService personTrainingDetailedService;
+
+ @Autowired
+ private PersonTrainingRecordService personTrainingRecordService;
+
+ @Autowired
+ private PersonTrainingDetailedFileMapper personTrainingDetailedFileMapper;
+
+ @Autowired
+ private NumberGenerator<PersonTrainingDetailed> numberGenerator;
+
+ @ApiOperation(value = "鍩硅璁″垝 瀵煎叆")
+ @PostMapping("personTrainingImport")
+ public Result<?> personTrainingImport(@RequestPart("file") MultipartFile file, PersonTraining training) {
+ personTrainingService.personTrainingImport(file, training);
+ return Result.success();
+ }
+
+ @ApiOperation(value = "鍩硅璁″垝 鍒犻櫎")
+ @DeleteMapping("personTrainingDelete")
+ public Result<?> personTrainingDelete(@RequestParam("id") Integer id) {
+ personTrainingService.personTrainingDelete(id);
+ return Result.success();
+ }
+
+ @ApiOperation(value = "鍩硅璁″垝 鏌ヨ")
+ @GetMapping("personTrainingSelect")
+ public Result<IPage<PersonTrainingDto>> personTrainingSelect(Page page, String compilerName, String departmentId) {
+ IPage<PersonTrainingDto> iPage = personTrainingService.personTrainingSelect(page, compilerName, departmentId);
+ return Result.success(iPage);
+ }
+
+ @ApiOperation(value = "骞村害鍩硅璁″垝 瀹℃牳")
+ @PostMapping("reviewAnnualPersonnelTraining")
+ public Result<?> reviewAnnualPersonnelTraining(@RequestBody PersonTraining training) {
+ personTrainingService.reviewAnnualPersonnelTraining(training);
+ return Result.success();
+ }
+
+ @ApiOperation(value = "鍩硅璁″垝 鎵瑰噯")
+ @PostMapping("approveAnnualPersonnelTraining")
+ public Result<?> approveAnnualPersonnelTraining(@RequestBody PersonTraining training) {
+ personTrainingService.approveAnnualPersonnelTraining(training);
+ return Result.success();
+ }
+
+
+ @ApiOperation(value = "骞村害璁″垝鏄庣粏琛� 鏂板/缂栬緫")
+ @PostMapping("addOrUpdatePersonTrainingDetailed")
+ public Result<?> addOrUpdatePersonTrainingDetailed(@RequestBody PersonTrainingDetailed personTrainingDetailed) {
+ if (ObjectUtils.isEmpty(personTrainingDetailed.getId())) {
+ personTrainingDetailed.setState(3);
+ }
+ personTrainingDetailedService.saveOrUpdate(personTrainingDetailed);
+ return Result.success();
+ }
+
+
+ @ApiOperation(value = "骞村害璁″垝鏄庣粏琛� 鎵归噺鍒犻櫎")
+ @DeleteMapping("deleteAnnualPlanDetailTable")
+ public Result<?> deleteAnnualPlanDetailTable(String ids) {
+ personTrainingDetailedService.deleteAnnualPlanDetailTable(ids);
+ return Result.success();
+ }
+
+
+ @ApiOperation(value = "骞村害璁″垝鏄庣粏琛� 鏌ヨ")
+ @GetMapping("queryTheAnnualPlanDetailsTable")
+ public Result<IPage<PersonTrainingDetailedDto>> queryTheAnnualPlanDetailsTable(Page page,
+ String trainingLecturerName, String courseCode,
+ String trainingDate, Integer id, Integer userId) {
+ IPage<PersonTrainingDetailedDto> iPage = personTrainingDetailedService.queryTheAnnualPlanDetailsTable(page,
+ trainingLecturerName, courseCode, trainingDate, id, userId);
+ return Result.success(iPage);
+ }
+
+
+ @ApiOperation(value = "鍩硅涓庤�冩牳璁板綍 鏌ヨ")
+ @GetMapping("trainingAndAssessmentRecordsPage")
+ public Result<List<PersonTrainingRecordDto>> trainingAndAssessmentRecordsPage(Integer trainingDetailedId,
+ String userName) {
+ List<PersonTrainingRecordDto> list = personTrainingRecordService.trainingAndAssessmentRecordsPage(trainingDetailedId, userName);
+ return Result.success(list);
+ }
+
+
+ @ApiOperation(value = "鍩硅涓庤�冩牳璁板綍 鏂板浜哄憳")
+ @PostMapping("newPersonnelAddedToTrainingRecords")
+ public Result<?> newPersonnelAddedToTrainingRecords(@RequestBody List<PersonTrainingRecord> personTrainingRecord) {
+ personTrainingRecordService.saveBatch(personTrainingRecord);
+ return Result.success();
+ }
+
+
+ @ApiOperation(value = "鍩硅涓庤�冩牳璁板綍 璁ら")
+ @PostMapping("claimOfTrainingAndAssessmentRecords")
+ public Result<?> claimOfTrainingAndAssessmentRecords(@RequestParam("claimAndClaim") Boolean claimAndClaim,
+ @RequestParam("courseId") Integer courseId) {
+ personTrainingRecordService.claimOfTrainingAndAssessmentRecords(claimAndClaim, courseId);
+ return Result.success();
+ }
+
+
+ @ApiOperation(value = "鍩硅涓庤�冩牳璁板綍 鎻愪氦/鎾ら攢")
+ @PostMapping("trainingAndAssessmentRecordsAdded")
+ public Result<?> trainingAndAssessmentRecordsAdded(@RequestBody PersonTrainingRecordSubmitDto personTrainingRecordSubmitDto) {
+ personTrainingRecordService.trainingAndAssessmentRecordsAdded(personTrainingRecordSubmitDto);
+ return Result.success();
+ }
+
+ @ApiOperation(value = "鍩硅涓庤�冩牳璁板綍 璇勪环")
+ @PostMapping("trainingAndAssessmentRecordsEvaluate")
+ public Result<?> trainingAndAssessmentRecordsEvaluate(@RequestBody PersonTrainingRecordSubmitDto personTrainingRecordSubmitDto) {
+ personTrainingDetailedService.update(Wrappers.<PersonTrainingDetailed>lambdaUpdate()
+ .eq(PersonTrainingDetailed::getId, personTrainingRecordSubmitDto.getTrainingDetailedId())
+ .set(PersonTrainingDetailed::getComprehensiveAssessment, personTrainingRecordSubmitDto.getComprehensiveAssessment())
+ .set(PersonTrainingDetailed::getAssessmentDate, personTrainingRecordSubmitDto.getAssessmentDate())
+ .set(PersonTrainingDetailed::getState, personTrainingRecordSubmitDto.getState()));
+ return Result.success();
+ }
+
+
+ @ApiOperation(value = "鍩硅涓庤�冩牳璁板綍 鍒犻櫎")
+ @DeleteMapping("deleteTrainingAndAssessmentRecords")
+ public Result<?> deleteTrainingAndAssessmentRecords(String ids) {
+ personTrainingRecordService.deleteTrainingAndAssessmentRecords(ids);
+ return Result.success();
+ }
+
+ @PostMapping("outOfFocusPreservation")
+ public Result<?> outOfFocusPreservation(@RequestBody PersonTrainingRecord personTrainingRecord) {
+ personTrainingRecordService.updateById(personTrainingRecord);
+ return Result.success();
+ }
+
+ /**
+ * 瀵煎嚭浜哄憳鍩硅璁″垝
+ * @return
+ */
+
+ @ApiOperation(value = "瀵煎嚭浜哄憳鍩硅璁″垝")
+ @GetMapping("/exportPersonTraining")
+ public void exportPersonTraining(Integer id, HttpServletResponse response){
+ personTrainingService.exportPersonTraining(id, response);
+ }
+
+ /**
+ * 瀵煎嚭浜哄憳鍩硅涓庤�冩牳璁板綍
+ * @return
+ */
+ @ApiOperation(value = "瀵煎嚭浜哄憳鍩硅涓庤�冩牳璁板綍")
+ @GetMapping("/exportPersonTrainingRecord")
+ public void exportPersonTrainingRecord(Integer id, HttpServletResponse response){
+ personTrainingService.exportPersonTrainingRecord(id, response);
+ }
+
+ /**
+ * 浜哄憳鍩硅璇︽儏闄勪欢鏂板
+ * @param trainingDetailedId
+ * @param file
+ * @return
+ */
+ @ApiOperation(value = "浜哄憳鍩硅璇︽儏闄勪欢鏂板")
+ @PostMapping("/uploadTrainingDetailedFile")
+ public Result<?> uploadTrainingDetailedFile(Integer trainingDetailedId, MultipartFile file) {
+ return Result.success(personTrainingService.uploadTrainingDetailedFile(trainingDetailedId, file));
+ }
+
+
+ /**
+ * 浜哄憳鍩硅璇︽儏闄勪欢鍒楄〃
+ * @return
+ */
+ @ApiOperation(value = "浜哄憳鍩硅璇︽儏闄勪欢鍒楄〃")
+ @GetMapping("/getTrainingDetailedFileList")
+ public Result<List<PersonTrainingDetailedFile>> getTrainingDetailedFileList(Integer trainingDetailedId){
+ return Result.success(personTrainingDetailedFileMapper.selectList(Wrappers.<PersonTrainingDetailedFile>lambdaQuery()
+ .eq(PersonTrainingDetailedFile::getTrainingDetailedId, trainingDetailedId)));
+ }
+
+ /**
+ * 浜哄憳鍩硅璇︽儏闄勪欢鍒犻櫎
+ * @return
+ */
+ @ApiOperation(value = "浜哄憳鍩硅璇︽儏闄勪欢鍒犻櫎")
+ @GetMapping("/delTrainingDetailedFileList")
+ public Result delTrainingDetailedFileList(Integer detailedFileId){
+ return Result.success(personTrainingDetailedFileMapper.deleteById(detailedFileId));
+ }
+
+ /**
+ * 鏌ヨ浠婂勾浜哄憳鍩硅淇℃伅
+ * @return
+ */
+ @ApiOperation(value = "鏌ヨ浠婂勾浜哄憳鍩硅淇℃伅")
+ @GetMapping("/getThisYearTrainingDetailed")
+ public Result<List<PersonTrainingDetailed>> getThisYearTrainingDetailed(){
+ return Result.success(personTrainingService.getThisYearTrainingDetailed());
+ }
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonBasicInfoDetailsDto.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonBasicInfoDetailsDto.java
new file mode 100644
index 0000000..ffdbdcc
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonBasicInfoDetailsDto.java
@@ -0,0 +1,65 @@
+package com.ruoyi.personnel.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+/**
+ * Author: yuan
+ * Date: 2024-12-13 鏄熸湡浜� 13:52:52
+ * Description:
+ */
+@Data
+public class PersonBasicInfoDetailsDto {
+
+ @ApiModelProperty("鐢ㄦ埛id")
+ private Integer userId;
+
+ @ApiModelProperty("鐢ㄦ埛濮撳悕")
+ private String name;
+
+ @ApiModelProperty("鍏ヨ亴鏃堕棿")
+ private String entryTimeStr;
+
+ @ApiModelProperty("瀹為檯瀹炰範缁撴潫")
+ private String endPracticalPracticeStr;
+
+ @ApiModelProperty("绫嶈疮")
+ private String nativePlace;
+
+ @ApiModelProperty("韬唤璇佸彿")
+ private String identityCard;
+
+ @ApiModelProperty("韬唤璇佸湴鍧�")
+ private String idAddress;
+
+ @ApiModelProperty("鐢ㄦ埛鎵嬫満鍙�")
+ private String phone;
+
+ @ApiModelProperty("姣曚笟闄㈡牎")
+ private String graduatedInstitutions1;
+
+ @ApiModelProperty("涓撲笟")
+ private String major1;
+
+ @ApiModelProperty("姣曚笟鏃堕棿1")
+ private LocalDateTime graduationTime1;
+
+ @ApiModelProperty("鏈�楂樺鍘�")
+ private String officialAcademicRedentials;
+
+ @ApiModelProperty("鏈�楂樺浣�")
+ private String highestDegree;
+
+ @ApiModelProperty("鑱岀О")
+ private String professionalTitle;
+
+ // 鑱屼笟鑳藉姏
+
+ @ApiModelProperty("绱ф�ヨ仈绯讳汉")
+ private String emergencyContact;
+
+ @ApiModelProperty("绱ф�ヨ仈绯讳汉鐢佃瘽")
+ private String emergencyContactPhone;
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonBasicInfoWorkDto.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonBasicInfoWorkDto.java
new file mode 100644
index 0000000..13cd08d
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonBasicInfoWorkDto.java
@@ -0,0 +1,16 @@
+package com.ruoyi.personnel.dto;
+
+import com.ruoyi.personnel.pojo.PersonBasicInfoWork;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @Author zhuo
+ * @Date 2025/1/14
+ */
+@Data
+public class PersonBasicInfoWorkDto extends PersonBasicInfoWork {
+
+ @ApiModelProperty("濉厖浣跨敤")
+ private String fill;
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonTrainingDetailedDto.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonTrainingDetailedDto.java
new file mode 100644
index 0000000..2c6f9aa
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonTrainingDetailedDto.java
@@ -0,0 +1,29 @@
+package com.ruoyi.personnel.dto;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.ruoyi.personnel.pojo.PersonTrainingDetailed;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class PersonTrainingDetailedDto extends PersonTrainingDetailed {
+
+ @ApiModelProperty("涓惧姙閮ㄩ棬鍚嶇О")
+ private String holdingDepartmentName;
+
+ @ApiModelProperty("鍩硅璁插笀鍚嶇О")
+ private String trainingLecturerName;
+
+ @ApiModelProperty("褰撳墠鐧诲綍浜烘槸鍚﹁棰�")
+ private Boolean whetherClaim;
+
+
+ @ApiModelProperty("鍩硅鏃ユ湡")
+ private String trainingDateString;
+
+ // 瀵煎嚭浣跨敤
+ @TableField(select = false, exist = false)
+ @ApiModelProperty("搴忓彿(瀵煎嚭浣跨敤)")
+ private Integer index;
+
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonTrainingDto.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonTrainingDto.java
new file mode 100644
index 0000000..c6ad50b
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonTrainingDto.java
@@ -0,0 +1,23 @@
+package com.ruoyi.personnel.dto;
+
+import com.ruoyi.personnel.pojo.PersonTraining;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel(value = "PersonTrainingDto瀵硅薄", description = "鍩硅璁″垝")
+public class PersonTrainingDto extends PersonTraining {
+
+ @ApiModelProperty("缂栧埗浜哄鍚�")
+ private String compilerName;
+
+ @ApiModelProperty("瀹℃牳浜哄鍚�")
+ private String reviewerName;
+
+ @ApiModelProperty("鎵瑰噯浜哄鍚�")
+ private String approverName;
+
+ @ApiModelProperty("鍒涘缓浜哄鍚�")
+ private String createUserName;
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonTrainingRecordDto.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonTrainingRecordDto.java
new file mode 100644
index 0000000..445bef7
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonTrainingRecordDto.java
@@ -0,0 +1,23 @@
+package com.ruoyi.personnel.dto;
+
+import com.ruoyi.personnel.pojo.PersonTrainingRecord;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class PersonTrainingRecordDto extends PersonTrainingRecord {
+ @ApiModelProperty(value = "濮撳悕")
+ private String userName;
+
+ @ApiModelProperty(value = "宸ュ彿")
+ private String account;
+
+ @ApiModelProperty(value = "瑙掕壊")
+ private String roleName;
+
+ @ApiModelProperty(value = "鐢佃瘽鍙风爜")
+ private String phone;
+
+ @ApiModelProperty(value = "閮ㄩ棬")
+ private String department;
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonTrainingRecordListDto.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonTrainingRecordListDto.java
new file mode 100644
index 0000000..da61ed1
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonTrainingRecordListDto.java
@@ -0,0 +1,37 @@
+package com.ruoyi.personnel.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Data
+public class PersonTrainingRecordListDto {
+
+ @ApiModelProperty(value = "鐢ㄦ埛id")
+ private Integer userId;
+
+ @ApiModelProperty("鍛樺伐缂栧彿")
+ private String account;
+
+ @ApiModelProperty("鐢ㄦ埛濮撳悕")
+ private String name;
+
+ @ApiModelProperty("鎵�鍦ㄩ儴闂�")
+ private String departLimsName;
+
+ @ApiModelProperty("鑱岀О")
+ private String professionalTitle;
+
+ @ApiModelProperty("鏈�楂樺鍘�")
+ private String officialAcademicRedentials;
+
+ @ApiModelProperty("鍏ュ崟浣嶆椂闂�")
+ private LocalDateTime unitTime;
+
+ @ApiModelProperty("鍏ュ崟浣嶆椂闂�")
+ private String unitTimeSting;
+
+ @ApiModelProperty("涓撲笟")
+ private String major1;
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonTrainingRecordSubmitDto.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonTrainingRecordSubmitDto.java
new file mode 100644
index 0000000..e24f5d2
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonTrainingRecordSubmitDto.java
@@ -0,0 +1,35 @@
+package com.ruoyi.personnel.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.time.LocalDate;
+
+@Data
+public class PersonTrainingRecordSubmitDto {
+
+ @ApiModelProperty("骞村害璁″垝鏄庣粏ID")
+ private Integer trainingDetailedId;
+
+ @ApiModelProperty("鍩硅鍦扮偣")
+ private String placeTraining;
+
+ @ApiModelProperty("鍩硅瀹屾垚鏃堕棿")
+ private LocalDate openingTime;
+
+ @ApiModelProperty("鑰冩牳鏂瑰紡")
+ private String assessmentMethod;
+
+ @ApiModelProperty("鏈鍩硅缁煎悎璇勪环")
+ private String comprehensiveAssessment;
+
+ @ApiModelProperty("璇勪环浜�")
+ private Integer assessmentUserId;
+
+ @ApiModelProperty("璇勪环鏃堕棿")
+ private LocalDate assessmentDate;
+
+ private Integer state;
+
+
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/TrainingRecordExportDto.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/TrainingRecordExportDto.java
new file mode 100644
index 0000000..320af2a
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/TrainingRecordExportDto.java
@@ -0,0 +1,32 @@
+package com.ruoyi.personnel.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @Author zhuo
+ * @Date 2024/11/25
+ */
+@Data
+public class TrainingRecordExportDto {
+
+ @ApiModelProperty("鐢ㄦ埛鍚嶇О1")
+ private String userName1;
+
+ @ApiModelProperty("閮ㄩ棬1")
+ private String department1;
+
+ @ApiModelProperty("鑰冩牳缁撴灉1")
+ private String examinationResults1;
+
+ @ApiModelProperty("鐢ㄦ埛鍚嶇О2")
+ private String userName2;
+
+ @ApiModelProperty("閮ㄩ棬1")
+ private String department2;
+
+ @ApiModelProperty("鑰冩牳缁撴灉1")
+ private String examinationResults2;
+
+
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/TrainingRecordPersonDetailedDto.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/TrainingRecordPersonDetailedDto.java
new file mode 100644
index 0000000..23f0a02
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/dto/TrainingRecordPersonDetailedDto.java
@@ -0,0 +1,26 @@
+package com.ruoyi.personnel.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class TrainingRecordPersonDetailedDto {
+
+ @ApiModelProperty("鍩硅鏃ユ湡")
+ private String trainingDateString;
+
+ @ApiModelProperty("鍩硅鏃ユ湡")
+ private String trainingDate;
+
+ @ApiModelProperty("鍩硅鍐呭")
+ private String trainingContent;
+
+ @ApiModelProperty("璇炬椂")
+ private Integer classHour;
+
+ @ApiModelProperty("鑰冩牳缁撴灉")
+ private String examinationResults;
+
+ @ApiModelProperty("澶囨敞")
+ private String remarks;
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/excel/PersonTrainingDetailedListener.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/excel/PersonTrainingDetailedListener.java
new file mode 100644
index 0000000..9effe23
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/excel/PersonTrainingDetailedListener.java
@@ -0,0 +1,42 @@
+package com.ruoyi.personnel.excel;
+
+import com.alibaba.excel.context.AnalysisContext;
+import com.alibaba.excel.event.AnalysisEventListener;
+import com.ruoyi.personnel.service.PersonTrainingDetailedService;
+import lombok.Data;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Data
+public class PersonTrainingDetailedListener extends AnalysisEventListener<PersonTrainingDetailedUpload> {
+
+ private Integer planId;
+
+ private static final int BATCH_COUNT = 1000;
+ List<PersonTrainingDetailedUpload> list = new ArrayList<>();
+
+ private PersonTrainingDetailedService personTrainingDetailedService;
+
+ public PersonTrainingDetailedListener(PersonTrainingDetailedService personTrainingDetailedService) {
+ this.personTrainingDetailedService = personTrainingDetailedService;
+ }
+
+ @Override
+ public void invoke(PersonTrainingDetailedUpload data, AnalysisContext context) {
+ list.add(data);
+ if (list.size() >= BATCH_COUNT) {
+ save();
+ list.clear();
+ }
+ }
+
+ @Override
+ public void doAfterAllAnalysed(AnalysisContext analysisContext) {
+ save();
+ }
+
+ private void save() {
+ personTrainingDetailedService.importExcel(list, this.planId);
+ }
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/excel/PersonTrainingDetailedUpload.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/excel/PersonTrainingDetailedUpload.java
new file mode 100644
index 0000000..7bc5876
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/excel/PersonTrainingDetailedUpload.java
@@ -0,0 +1,35 @@
+package com.ruoyi.personnel.excel;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import lombok.Data;
+
+@Data
+public class PersonTrainingDetailedUpload {
+
+ @ExcelProperty("鍩硅鐩爣")
+ private String trainingObjectives;
+
+ @ExcelProperty("鍩硅鍐呭")
+ private String trainingContent;
+
+ @ExcelProperty("鍩硅鏂瑰紡")
+ private String trainingMode;
+
+ @ExcelProperty("鍙傚姞瀵硅薄")
+ private String participants;
+
+ @ExcelProperty("涓惧姙閮ㄩ棬")
+ private String holdingDepartment;
+
+ @ExcelProperty("鍩硅璁插笀")
+ private String trainingLecturerName;
+
+ @ExcelProperty("鍩硅鏃堕棿")
+ private String trainingDate;
+
+ @ExcelProperty("璇炬椂")
+ private Integer classHour;
+
+ @ExcelProperty("澶囨敞")
+ private String remarks;
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonTrainingDetailedFileMapper.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonTrainingDetailedFileMapper.java
new file mode 100644
index 0000000..88b2531
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonTrainingDetailedFileMapper.java
@@ -0,0 +1,15 @@
+package com.ruoyi.personnel.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.personnel.pojo.PersonTrainingDetailedFile;
+
+/**
+ * 浜哄憳鍩硅璁″垝璇︽儏闄勪欢琛�(CnasPersonTrainingDetailedFile)$desc
+ *
+ * @author makejava
+ * @since 2024-12-25 14:18:22
+ */
+public interface PersonTrainingDetailedFileMapper extends BaseMapper<PersonTrainingDetailedFile> {
+
+}
+
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonTrainingDetailedMapper.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonTrainingDetailedMapper.java
new file mode 100644
index 0000000..47c397b
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonTrainingDetailedMapper.java
@@ -0,0 +1,48 @@
+package com.ruoyi.personnel.mapper;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.framework.mybatis_config.MyBaseMapper;
+import com.ruoyi.personnel.dto.PersonTrainingDetailedDto;
+import com.ruoyi.personnel.pojo.PersonTrainingDetailed;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 鍩硅璁″垝璇︽儏 Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-10-11 01:46:27
+ */
+public interface PersonTrainingDetailedMapper extends MyBaseMapper<PersonTrainingDetailed> {
+
+ IPage<PersonTrainingDetailedDto> queryTheAnnualPlanDetailsTable(Page page,
+ String trainingLecturerName,
+ String courseCode, String trainingDate,
+ Integer id,
+ Integer userId,
+ Integer loginUserId);
+
+ /**
+ * 鏍规嵁涓昏〃id鏌ヨ璇︽儏
+ * @param trainingId
+ * @return
+ */
+ List<PersonTrainingDetailedDto> selectTrainingList(@Param("trainingId") Integer trainingId);
+
+ /**
+ * 鏌ヨ璇︾粏
+ * @param id
+ * @return
+ */
+ PersonTrainingDetailedDto selectTrainingDetail(@Param("id") Integer id);
+
+ /**
+ * 鏌ヨ浠婂勾浜哄憳鍩硅淇℃伅
+ * @return
+ */
+ List<PersonTrainingDetailed> getThisYearTrainingDetailed();
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonTrainingMapper.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonTrainingMapper.java
new file mode 100644
index 0000000..f5dd8a6
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonTrainingMapper.java
@@ -0,0 +1,20 @@
+package com.ruoyi.personnel.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.personnel.dto.PersonTrainingDto;
+import com.ruoyi.personnel.pojo.PersonTraining;
+
+/**
+ * <p>
+ * 鍩硅璁″垝 Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-10-11 01:11:49
+ */
+public interface PersonTrainingMapper extends BaseMapper<PersonTraining> {
+
+ IPage<PersonTrainingDto> personTrainingSelect(Page page, String compilerName, String departLimsId);
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonTrainingRecordMapper.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonTrainingRecordMapper.java
new file mode 100644
index 0000000..a10ed81
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonTrainingRecordMapper.java
@@ -0,0 +1,67 @@
+package com.ruoyi.personnel.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.personnel.dto.PersonTrainingRecordDto;
+import com.ruoyi.personnel.dto.PersonTrainingRecordListDto;
+import com.ruoyi.personnel.dto.TrainingRecordPersonDetailedDto;
+import com.ruoyi.personnel.pojo.PersonTrainingRecord;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 鍩硅璁板綍 Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-10-12 04:50:48
+ */
+public interface PersonTrainingRecordMapper extends BaseMapper<PersonTrainingRecord> {
+
+ List<PersonTrainingRecordDto> trainingAndAssessmentRecordsPage(Integer trainingDetailedId, String userName);
+
+ IPage<PersonTrainingRecordListDto> personnelTrainingPersonnel(Page page, String userName, Integer userId, Integer departLimsId);
+
+ IPage<TrainingRecordPersonDetailedDto> queryPersonnelDetails(Page page, Integer userId);
+
+ /**
+ * 鏍规嵁璇︽儏id鏌ヨ鍩硅浜哄憳
+ * @param trainingDetailedId
+ * @return
+ */
+ List<PersonTrainingRecordDto> selectListByTrainingDetailedId(@Param("trainingDetailedId") Integer trainingDetailedId);
+
+ /**
+ * 鏌ヨ浜哄憳淇℃伅
+ * @param userId
+ * @return
+ */
+ PersonTrainingRecordListDto selectUserTraining(@Param("userId") Integer userId);
+
+ /**
+ * 鏍规嵁鐢ㄦ埛id鏌ヨ鍩硅璁板綍
+ * @param userId
+ * @return
+ */
+ List<TrainingRecordPersonDetailedDto> selectPersonDetailedDtos(Integer userId);
+
+ /**
+ * 鏍规嵁鐢ㄦ埛id鍜屽勾浠芥煡璇汉鍛樻槑缁� 鍩硅璁板綍
+ * @param page
+ * @param userId
+ * @param year
+ * @return
+ */
+ IPage<TrainingRecordPersonDetailedDto> queryPersonnelDetailsOfUserIdAndYear(Page page, Integer userId, Integer year);
+
+ /**
+ * 鏍规嵁鐢ㄦ埛id鍜屽勾浠芥煡璇汉鍛樻槑缁� 鍩硅璁板綍瀵煎嚭
+ * @param userId
+ * @param trainingDate
+ * @return
+ */
+ List<TrainingRecordPersonDetailedDto> selectPersonDetailedDtosByTrainingDate(Integer userId, Integer year);
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonTraining.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonTraining.java
new file mode 100644
index 0000000..526d947
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonTraining.java
@@ -0,0 +1,83 @@
+package com.ruoyi.personnel.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 鍩硅璁″垝
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-10-11 01:11:49
+ */
+@Getter
+@Setter
+@TableName("cnas_person_training")
+@ApiModel(value = "PersonTraining瀵硅薄", description = "鍩硅璁″垝")
+public class PersonTraining implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ @ApiModelProperty("涓婚敭id")
+ @TableId(value = "id", type = IdType.AUTO)
+ private Integer id;
+
+ @ApiModelProperty("鏂囦欢鍚嶇О")
+ private String fileName;
+
+ @ApiModelProperty("璁″垝骞翠唤")
+ private String planYear;
+
+ @ApiModelProperty("缂栧埗浜篿d")
+ private Integer compilerId;
+
+ @ApiModelProperty("缂栧埗鏃ユ湡")
+ private LocalDateTime compilationDate;
+
+ @ApiModelProperty("瀹℃牳浜篿d")
+ private Integer reviewerId;
+
+ @ApiModelProperty("瀹℃牳鏃ユ湡")
+ private LocalDateTime auditDate;
+
+ @ApiModelProperty("瀹℃牳鐘舵��")
+ private Integer reviewerStatus;
+
+ @ApiModelProperty("瀹℃牳澶囨敞")
+ private String auditRemarks;
+
+ @ApiModelProperty("鎵瑰噯浜篿d")
+ private Integer approverId;
+
+ @ApiModelProperty("鎵瑰噯澶囨敞")
+ private String approvalRemarks;
+
+ @ApiModelProperty("鎵瑰噯鐘舵��(1锛氭壒鍑嗭紱2锛氫笉鎵瑰噯)")
+ private Integer approvalStatus;
+
+ @ApiModelProperty("鎵瑰噯鏃ユ湡")
+ private LocalDateTime approvalDate;
+
+ @ApiModelProperty("鍒涘缓鏃ユ湡")
+ @TableField(fill = FieldFill.INSERT)
+ private LocalDateTime createTime;
+
+ @ApiModelProperty("鍒涘缓浜篿d")
+ @TableField(fill = FieldFill.INSERT)
+ private Integer createUser;
+
+ @ApiModelProperty("鏇存柊鏃堕棿")
+ @TableField(fill = FieldFill.INSERT_UPDATE)
+ private LocalDateTime updateTime;
+
+ @ApiModelProperty("鏇存柊浜篿d")
+ @TableField(fill = FieldFill.INSERT_UPDATE)
+ private Integer updateUser;
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonTrainingDetailed.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonTrainingDetailed.java
new file mode 100644
index 0000000..cac8233
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonTrainingDetailed.java
@@ -0,0 +1,99 @@
+package com.ruoyi.personnel.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 鍩硅璁″垝璇︽儏
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-10-11 01:46:27
+ */
+@Getter
+@Setter
+@TableName("cnas_person_training_detailed")
+@ApiModel(value = "PersonTrainingDetailed瀵硅薄", description = "鍩硅璁″垝璇︽儏")
+public class PersonTrainingDetailed implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ @ApiModelProperty("鍩硅璁″垝")
+ @TableId(value = "id", type = IdType.AUTO)
+ private Integer id;
+
+ @ApiModelProperty("鍩硅鐩爣")
+ private String trainingObjectives;
+
+ @ApiModelProperty("鍩硅鍐呭")
+ private String trainingContent;
+
+ @ApiModelProperty("鍩硅鏂瑰紡")
+ private String trainingMode;
+
+ @ApiModelProperty("鐘舵��(1锛氬凡瀹屾垚锛�2锛氬緟璇勪环锛�3: 鏈紑濮�)")
+ private Integer state;
+
+ @ApiModelProperty("鍙傚姞瀵硅薄")
+ private String participants;
+
+ @ApiModelProperty("涓惧姙閮ㄩ棬")
+ private String holdingDepartment;
+
+ @ApiModelProperty("鍩硅鍦扮偣")
+ private String placeTraining;
+
+ @ApiModelProperty("鍩硅璁插笀_id")
+ private Integer trainingLecturerId;
+
+ @ApiModelProperty("璁″垝鍩硅鏃ユ湡")
+ private String trainingDate;
+
+ @ApiModelProperty("鍩硅瀹屾垚鏃堕棿")
+ private LocalDate openingTime;
+
+ @ApiModelProperty("璇炬椂")
+ private Integer classHour;
+
+ @ApiModelProperty("澶囨敞")
+ private String remarks;
+
+ @ApiModelProperty("鍩硅璁″垝id")
+ private Integer planId;
+
+ @ApiModelProperty(value = "鍒涘缓鏃堕棿", hidden = true)
+ @TableField(fill = FieldFill.INSERT)
+ private LocalDateTime createTime;
+
+ @ApiModelProperty(value = "鍒涘缓浜篿d", hidden = true)
+ @TableField(fill = FieldFill.INSERT)
+ private Integer createUser;
+
+ @ApiModelProperty(value = "鏇存柊浜篿d", hidden = true)
+ @TableField(fill = FieldFill.INSERT_UPDATE)
+ private Integer updateUser;
+
+ @ApiModelProperty(value = "鏇存柊鏃堕棿", hidden = true)
+ @TableField(fill = FieldFill.INSERT_UPDATE)
+ private LocalDateTime updateTime;
+
+ @ApiModelProperty("鑰冩牳鏂瑰紡")
+ private String assessmentMethod;
+
+ @ApiModelProperty("鏈鍩硅缁煎悎璇勪环")
+ private String comprehensiveAssessment;
+
+ @ApiModelProperty("璇勪环浜�")
+ private Integer assessmentUserId;
+
+ @ApiModelProperty("璇勪环鏃堕棿")
+ private LocalDate assessmentDate;
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonTrainingDetailedFile.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonTrainingDetailedFile.java
new file mode 100644
index 0000000..cb17cdb
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonTrainingDetailedFile.java
@@ -0,0 +1,49 @@
+package com.ruoyi.personnel.pojo;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * 浜哄憳鍩硅璁″垝璇︽儏闄勪欢琛�(CnasPersonTrainingDetailedFile)$desc
+ *
+ * @author makejava
+ * @since 2024-12-25 14:18:22
+ */
+@Data
+@TableName("cnas_person_training_detailed_file")
+public class PersonTrainingDetailedFile {
+
+ @TableId(type = IdType.AUTO)
+ private Integer detailedFileId;
+
+ @ApiModelProperty("浜哄憳浣犲煿璁鍒掕鎯卛d")
+ private Integer trainingDetailedId;
+
+ @ApiModelProperty("绫诲瀷:1鍥剧墖/2鏂囦欢")
+ private Integer type;
+
+ @ApiModelProperty("闄勪欢璺緞")
+ private String fileUrl;
+
+ @ApiModelProperty("闄勪欢鍚嶇О")
+ private String fileName;
+
+ @ApiModelProperty("鍒涘缓浜�")
+ private Integer createUser;
+
+ @ApiModelProperty("鍒涘缓鏃堕棿")
+ private Date createTime;
+
+ @ApiModelProperty("淇敼浜�")
+ private Integer updateUser;
+
+ @ApiModelProperty("淇敼鏃堕棿")
+ private Date updateTime;
+
+}
+
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonTrainingRecord.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonTrainingRecord.java
new file mode 100644
index 0000000..593941b
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonTrainingRecord.java
@@ -0,0 +1,41 @@
+package com.ruoyi.personnel.pojo;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 鍩硅璁板綍
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-10-12 04:50:48
+ */
+@Getter
+@Setter
+@TableName("cnas_person_training_record")
+@ApiModel(value = "PersonTrainingRecord瀵硅薄", description = "鍩硅璁板綍")
+public class PersonTrainingRecord implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ @ApiModelProperty("涓婚敭id")
+ @TableId(value = "training_record_id", type = IdType.AUTO)
+ private Integer trainingRecordId;
+
+ @ApiModelProperty("鐢ㄦ埛琛ㄦ牸锛坲ser锛変富閿�")
+ private Integer userId;
+
+ @ApiModelProperty("鍩硅璁″垝璇︽儏 - 瀛� id")
+ private Integer courseId;
+
+ @ApiModelProperty("鑰冩牳缁撴灉")
+ private String examinationResults;
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonTrainingDetailedService.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonTrainingDetailedService.java
new file mode 100644
index 0000000..f5f52dc
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonTrainingDetailedService.java
@@ -0,0 +1,29 @@
+package com.ruoyi.personnel.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.personnel.dto.PersonTrainingDetailedDto;
+import com.ruoyi.personnel.excel.PersonTrainingDetailedUpload;
+import com.ruoyi.personnel.pojo.PersonTrainingDetailed;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 鍩硅璁″垝璇︽儏 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-10-11 01:46:27
+ */
+public interface PersonTrainingDetailedService extends IService<PersonTrainingDetailed> {
+
+ void importExcel(List<PersonTrainingDetailedUpload> list, Integer planId);
+
+ void deleteAnnualPlanDetailTable(String ids);
+
+ IPage<PersonTrainingDetailedDto> queryTheAnnualPlanDetailsTable(Page page,
+ String trainingLecturerName,
+ String courseCode, String trainingDate, Integer id, Integer userId);
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonTrainingRecordService.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonTrainingRecordService.java
new file mode 100644
index 0000000..265dca6
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonTrainingRecordService.java
@@ -0,0 +1,59 @@
+package com.ruoyi.personnel.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.personnel.dto.PersonTrainingRecordDto;
+import com.ruoyi.personnel.dto.PersonTrainingRecordListDto;
+import com.ruoyi.personnel.dto.PersonTrainingRecordSubmitDto;
+import com.ruoyi.personnel.dto.TrainingRecordPersonDetailedDto;
+import com.ruoyi.personnel.pojo.PersonTrainingRecord;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+
+/**
+ * <p>
+ * 鍩硅璁板綍 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-10-12 04:50:48
+ */
+public interface PersonTrainingRecordService extends IService<PersonTrainingRecord> {
+
+ List<PersonTrainingRecordDto> trainingAndAssessmentRecordsPage(Integer trainingDetailedId, String userName);
+
+ void deleteTrainingAndAssessmentRecords(String ids);
+
+ IPage<PersonTrainingRecordListDto> personnelTrainingPersonnel(Page page,
+ String userName, Integer userId, Integer departLimsId);
+
+
+ void claimOfTrainingAndAssessmentRecords(Boolean claimAndClaim, Integer courseId);
+
+
+ /**
+ * 鏍规嵁鐢ㄦ埛id鍜屽勾浠芥煡璇汉鍛樻槑缁� 鍩硅璁板綍
+ * @param page
+ * @param userId
+ * @param year
+ * @return
+ */
+ IPage<TrainingRecordPersonDetailedDto> queryPersonnelDetailsOfUserIdAndYear(Page page, Integer userId, Integer year);
+
+ /**
+ * 瀵煎嚭浜哄憳鍩硅璁板綍
+ * @param userId
+ * @param trainingDate
+ * @param response
+ */
+ void exportTrainingRecordAddTrainingDate(Integer userId, Integer trainingDate, HttpServletResponse response);
+
+ /**
+ * 鍩硅鎻愪氦
+ * @param personTrainingRecordSubmitDto
+ */
+ void trainingAndAssessmentRecordsAdded(PersonTrainingRecordSubmitDto personTrainingRecordSubmitDto);
+
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonTrainingService.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonTrainingService.java
new file mode 100644
index 0000000..046cf24
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonTrainingService.java
@@ -0,0 +1,63 @@
+package com.ruoyi.personnel.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.personnel.dto.PersonTrainingDto;
+import com.ruoyi.personnel.pojo.PersonTraining;
+import com.ruoyi.personnel.pojo.PersonTrainingDetailed;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+
+/**
+ * <p>
+ * 鍩硅璁″垝 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-10-11 01:11:49
+ */
+public interface PersonTrainingService extends IService<PersonTraining> {
+
+ IPage<PersonTrainingDto> personTrainingSelect(Page page,
+ String compilerName, String departmentId);
+
+ void personTrainingImport(MultipartFile file, PersonTraining training);
+
+ void personTrainingDelete(Integer id);
+
+ void reviewAnnualPersonnelTraining(PersonTraining training);
+
+ void approveAnnualPersonnelTraining(PersonTraining training);
+
+ /**
+ * 瀵煎嚭浜哄憳鍩硅璁″垝
+ * @param id
+ * @param response
+ */
+ void exportPersonTraining(Integer id, HttpServletResponse response);
+
+ /**
+ * 瀵煎嚭浜哄憳鍩硅涓庤�冩牳璁板綍
+ * @param id
+ * @param response
+ */
+ void exportPersonTrainingRecord(Integer id, HttpServletResponse response);
+
+ /**
+ * 浜哄憳鍩硅璇︽儏闄勪欢鏂板
+ * @param trainingDetailedId
+ * @param file
+ * @return
+ */
+ boolean uploadTrainingDetailedFile(Integer trainingDetailedId, MultipartFile file);
+
+ /**
+ * 鏌ヨ浠婂勾浜哄憳鍩硅淇℃伅
+ * @return
+ */
+ List<PersonTrainingDetailed> getThisYearTrainingDetailed();
+
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonBasicInfoServiceImpl.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonBasicInfoServiceImpl.java
index 7d0e695..0ae552c 100644
--- a/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonBasicInfoServiceImpl.java
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonBasicInfoServiceImpl.java
@@ -1,336 +1,340 @@
-//package com.ruoyi.personnel.service.impl;
-//
-//import com.alibaba.excel.EasyExcel;
-//import com.alibaba.excel.ExcelWriter;
-//import com.alibaba.excel.write.metadata.WriteSheet;
-//import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
-//import com.alibaba.fastjson2.JSON;
-//import com.alibaba.fastjson2.JSONObject;
-//import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-//import com.baomidou.mybatisplus.core.metadata.IPage;
-//import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
-//import com.baomidou.mybatisplus.core.toolkit.Wrappers;
-//import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-//import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-//import com.ruoyi.common.core.domain.entity.DepartmentDto;
-//import com.ruoyi.common.core.domain.entity.DepartmentLims;
-//import com.ruoyi.common.core.domain.entity.User;
-//import com.ruoyi.common.utils.QueryWrappers;
-//import com.ruoyi.framework.exception.ErrorException;
-//import com.ruoyi.personnel.dto.PersonBasicInfoDto;
-//import com.ruoyi.personnel.dto.UserPageDto;
-//import com.ruoyi.personnel.mapper.AnnexMapper;
-//import com.ruoyi.personnel.mapper.PersonBasicInfoFileMapper;
-//import com.ruoyi.personnel.mapper.PersonBasicInfoMapper;
-//import com.ruoyi.personnel.mapper.PersonBasicInfoWorkMapper;
-//import com.ruoyi.personnel.pojo.Annex;
-//import com.ruoyi.personnel.pojo.PersonBasicInfo;
-//import com.ruoyi.personnel.pojo.PersonBasicInfoFile;
-//import com.ruoyi.personnel.pojo.PersonBasicInfoWork;
-//import com.ruoyi.personnel.service.PersonBasicInfoService;
-//import com.ruoyi.system.mapper.DepartmentLimsMapper;
-//import com.ruoyi.system.mapper.UserMapper;
-//import org.apache.poi.xwpf.usermodel.XWPFTable;
-//import org.openxmlformats.schemas.wordprocessingml.x2006.main.STMerge;
-//import org.springframework.beans.BeanUtils;
-//import org.springframework.beans.factory.annotation.Autowired;
-//import org.springframework.beans.factory.annotation.Value;
-//import org.springframework.stereotype.Service;
-//import org.springframework.transaction.annotation.Transactional;
-//import org.springframework.web.multipart.MultipartFile;
-//
-//import javax.annotation.Resource;
-//import javax.servlet.http.HttpServletResponse;
-//import java.io.File;
-//import java.io.IOException;
-//import java.io.InputStream;
-//import java.io.OutputStream;
-//import java.net.URLEncoder;
-//import java.time.LocalDateTime;
-//import java.time.format.DateTimeFormatter;
-//import java.util.*;
-//import java.util.stream.Collectors;
-//
-///**
-// * <p>
-// * 鏈嶅姟瀹炵幇绫�
-// * </p>
-// *
-// * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
-// * @since 2024-08-30 09:19:57
-// */
-//
-//@Service
-//@Transactional(rollbackFor = Exception.class)
-//public class PersonBasicInfoServiceImpl extends ServiceImpl<PersonBasicInfoMapper, PersonBasicInfo> implements PersonBasicInfoService {
-//
-// @Autowired
-// private DepartmentLimsMapper departmentMapper;
-// @Value("${file.path}")
-// private String imgUrl;
-// @Value("${wordUrl}")
-// private String wordUrl;
-// @Resource
-// private UserMapper userMapper;
-// @Resource
-// private AnnexMapper annexMapper;
-// @Resource
-// private PersonBasicInfoFileMapper personBasicInfoFileMapper;
-// @Resource
-// private PersonBasicInfoWorkMapper personBasicInfoWorkMapper;
-//
-// @Override
-// public List<DepartmentDto> selectCNSAPersonTree() {
-// List<DepartmentDto> departments = departmentMapper.selectDepartment();
-// List<DepartmentDto> limsUser = baseMapper.selectLimsUser();
-// departments.addAll(limsUser);
-// //鑾峰彇鐖惰妭鐐�
-// return departments.stream().filter(m -> m.getFatherId() == null).peek(
-// (m) -> m.setChildren(getChildren(m, departments))
-// ).collect(Collectors.toList());
-// }
-//
-// @Override
-// public Map<String,Object> getCNASPersonnelInfo(Integer userId) {
-// Map<String, Object> map = new HashMap<>();
-// Map<Integer,List<DepartmentLims>> childrenMap = new HashMap<>();
-// List<DepartmentLims> deptS = departmentMapper.selectList(null);
-// for (DepartmentLims dept : deptS) {
-// if(!Objects.isNull(dept.getFatherId())) {
-// if(!childrenMap.containsKey(dept.getFatherId())) {
-// childrenMap.put(dept.getFatherId(),new ArrayList<>());
-// }
-// childrenMap.get(dept.getFatherId()).add(dept);
-// }
-// }
-// // 鐖惰妭鐐�
-// List<DepartmentLims> deptF = new ArrayList<>();
-// for (DepartmentLims dept : deptS) {
-// if(Objects.isNull(dept.getFatherId())) {
-// deptF.add(buildTree(dept,childrenMap));
-// }
-// }
-// map.put("department",deptF);
-// map.put("PersonBasicInfoDto",baseMapper.getCNASPersonnelInfo(userId));
-// map.put("annexList",annexMapper.selectList(new LambdaQueryWrapper<Annex>().eq(Annex::getUserId,userId)));
-// return map;
-// }
-//
-// private DepartmentLims buildTree(DepartmentLims departmentLims, Map<Integer,List<DepartmentLims>> childrenMap) {
-// if(childrenMap.containsKey(departmentLims.getId())) {
-// departmentLims.setChildren(childrenMap.get(departmentLims.getId()));
-// for (DepartmentLims departmentLims1 : departmentLims.getChildren()) {
-// buildTree(departmentLims1,childrenMap);
-// }
-// }
-// return departmentLims;
-// }
-//
-// @Override
-// public void saveCNASPersonnelInfo(PersonBasicInfoDto personBasicInfoDto) {
-// User user = new User();
-// user.setId(personBasicInfoDto.getUserId());
-// user.setAccount(personBasicInfoDto.getAccount());
-// user.setName(personBasicInfoDto.getName());
-// user.setNameEn(personBasicInfoDto.getNameEn());
-// user.setAge(personBasicInfoDto.getAge());
-// user.setPhone(personBasicInfoDto.getPhone());
-// user.setEmail(personBasicInfoDto.getEmail());
-// user.setSignatureUrl(personBasicInfoDto.getSignatureUrl());
-// user.setPictureUrl(personBasicInfoDto.getPictureUrl());
-// user.setDepartLimsId(personBasicInfoDto.getDepartLimsId());
-// userMapper.updateById(user);
-// PersonBasicInfo personBasicInfo = JSONObject.parseObject(JSON.toJSONString(personBasicInfoDto), PersonBasicInfo.class);
-// PersonBasicInfo one = baseMapper.selectOne(new LambdaQueryWrapper<PersonBasicInfo>()
-// .eq(PersonBasicInfo::getUserId, personBasicInfoDto.getUserId()));
-// if(Objects.isNull(one)) {
-// baseMapper.insert(personBasicInfo);
-// }else {
-// baseMapper.updateById(personBasicInfo);
-// }
-// }
-//
-// @Override
-// public IPage<Map<String, Object>> basicInformationOfPersonnelSelectPage(Page page, String name, Integer departmentId) {
-// return baseMapper.selectPersonBasecInfoAndUser(page, name, departmentId);
-// }
-//
-// @Override
-// public void exportPersonBasicInfo(UserPageDto userPageDto, HttpServletResponse response) throws Exception {
-// ArrayList<PersonBasicInfoDto> data = new ArrayList<>();
-// List<User> list = userMapper.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) {
-// Map<String, Object> userMap = baseMapper.selectexportPersonBasic(id);
-// User user = userMapper.selectById(id);
-// PersonBasicInfo personBasicInfo = baseMapper.selectOne(Wrappers.<PersonBasicInfo>lambdaQuery().eq(PersonBasicInfo::getUserId, user.getId()));
-// if (ObjectUtils.isEmpty(personBasicInfo)){
-// throw new ErrorException("璇ョ敤鎴风殑鍩烘湰淇℃伅娌℃湁褰曞叆,鏆傛棤娉曞鍑�");
-// }
-// // 璇佷欢
-// List<Annex> annexList = annexMapper.selectList(Wrappers.<Annex>lambdaQuery()
-// .eq(Annex::getUserId, id));
-// // 宸ヤ綔缁忓巻
-// List<PersonBasicInfoWork> personBasicInfoWorks = personBasicInfoWorkMapper.selectList(Wrappers.<PersonBasicInfoWork>lambdaQuery()
-// .eq(PersonBasicInfoWork::getUserId, id));
-//
-// List<PersonBasicInfoWorkDto> workList = personBasicInfoWorks.stream().map(basicInfoWork -> {
-// PersonBasicInfoWorkDto personBasicInfoWorkDto = new PersonBasicInfoWorkDto();
-// personBasicInfoWorkDto.setWorkExperience(basicInfoWork.getWorkExperience());
-// personBasicInfoWorkDto.setFill("涓昏宸ヤ綔缁忓巻\nMain work experience鈭�1");
-// return personBasicInfoWorkDto;
-// }).collect(Collectors.toList());
-//
-// // 妫�鏌ュ垪琛ㄩ暱搴﹀苟濉厖绌哄璞�
-// while (annexList.size() < 10) {
-// annexList.add(new Annex());
-// }
-//
-// // 妫�鏌ュ垪琛ㄩ暱搴﹀苟濉厖绌哄璞�
-// while (workList.size() < 4) {
-// workList.add(new PersonBasicInfoWorkDto());
-// }
-//
-// // 鑾峰彇璺緞
-// InputStream inputStream = this.getClass().getResourceAsStream("/static/person-basic-info.docx");
-// Configure configure = Configure.builder()
-// .bind("annexList", new HackLoopTableRenderPolicy())
-// .bind("workList", new HackLoopTableRenderPolicy())
-// .build();
-// XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
-// new HashMap<String, Object>() {{
-// put("user", userMap);
-// put("annexList", annexList);
-// put("workList", workList);
-// }});
-//
-// try {
-// response.setContentType("application/msword");
-// String fileName = URLEncoder.encode(
-// userMap.get("name") + "浜哄憳妗f", "UTF-8");
-// response.setHeader("Content-disposition",
-// "attachment;filename=" + fileName + ".docx");
-// OutputStream os = response.getOutputStream();
-// template.write(os);
-// os.flush();
-// os.close();
-// } catch (Exception e) {
-// e.printStackTrace();
-// throw new RuntimeException("瀵煎嚭澶辫触");
-// }
-//
-// return null;
-// }
-//
-// /**
-// * 浜哄憳鍩硅鍩烘湰淇℃伅闄勪欢鏂板
-// * @param userId
-// * @param file
-// * @return
-// */
-// @Override
-// public boolean uploadBasicInfoFile(Integer userId, MultipartFile file) {
-// if (userId == null) {
-// throw new ErrorException("缂哄皯浜哄憳id");
-// }
-//
-// String urlString;
-// String pathName;
-// String path;
-// String filename = file.getOriginalFilename();
-// String contentType = file.getContentType();
-// PersonBasicInfoFile personBasicInfoFile = new PersonBasicInfoFile();
-// personBasicInfoFile.setUserId(userId);
-// personBasicInfoFile.setFileName(filename);
-// if (contentType != null && contentType.startsWith("image/")) {
-// // 鏄浘鐗�
-// path = imgUrl;
-// personBasicInfoFile.setType(1);
-// } else {
-// // 鏄枃浠�
-// path = wordUrl;
-// personBasicInfoFile.setType(2);
-// }
-// try {
-// File realpath = new File(path);
-// if (!realpath.exists()) {
-// realpath.mkdirs();
-// }
-// pathName = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyMMddHHmmss")) + "_" + file.getOriginalFilename();
-// urlString = realpath + "/" + pathName;
-// file.transferTo(new File(urlString));
-// personBasicInfoFile.setFileUrl(pathName);
-// personBasicInfoFileMapper.insert(personBasicInfoFile);
-// return true;
-// } catch (Exception e) {
-// e.printStackTrace();
-// System.err.println("闄勪欢涓婁紶閿欒");
-// return false;
-// }
-// }
-//
-// /**
-// * 閫掑綊鏌ヨ瀛愯妭鐐�
-// * @param root 鏍硅妭鐐�
-// * @param all 鎵�鏈夎妭鐐�
-// * @return 鏍硅妭鐐逛俊鎭�
-// */
-// private List<DepartmentDto> getChildren(DepartmentDto root, List<DepartmentDto> all) {
-// if (ObjectUtils.isNotEmpty(root.getId())) {
-// return all.stream().filter(m -> Objects.equals(m.getFatherId(), root.getId())).peek(
-// (m) -> m.setChildren(getChildren(m, all))
-// ).collect(Collectors.toList());
-// } else {
-// return Collections.emptyList();
-// }
-// }
-//
-// // 姘村钩鍚堝苟鍗曞厓鏍�
-// private static void mergeCellsHorizontally(XWPFTable table, int row, int fromCol, int toCol) {
-// for (int i = fromCol; i <= toCol; i++) {
-// if (i == fromCol) {
-// table.getRow(row).getCell(i).getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.RESTART);
-// } else {
-// table.getRow(row).getCell(i).getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.CONTINUE);
-// }
-// }
-// }
-//
-// // 鍨傜洿鍚堝苟鍗曞厓鏍�
-// private static void mergeCellsVertically(XWPFTable table, int col, int fromRow, int toRow) {
-// for (int i = fromRow; i <= toRow; i++) {
-// if (i == fromRow) {
-// table.getRow(i).getCell(col).getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.RESTART);
-// } else {
-// table.getRow(i).getCell(col).getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.CONTINUE);
-// }
-// }
-// }
-//}
+package com.ruoyi.personnel.service.impl;
+
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.ExcelWriter;
+import com.alibaba.excel.write.metadata.WriteSheet;
+import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
+import com.alibaba.fastjson2.JSON;
+import com.alibaba.fastjson2.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.deepoove.poi.XWPFTemplate;
+import com.deepoove.poi.config.Configure;
+import com.ruoyi.common.core.domain.entity.DepartmentDto;
+import com.ruoyi.common.core.domain.entity.DepartmentLims;
+import com.ruoyi.common.core.domain.entity.User;
+import com.ruoyi.common.utils.QueryWrappers;
+import com.ruoyi.framework.exception.ErrorException;
+import com.ruoyi.inspect.util.HackLoopTableRenderPolicy;
+import com.ruoyi.personnel.dto.PersonBasicInfoDto;
+import com.ruoyi.personnel.dto.PersonBasicInfoWorkDto;
+import com.ruoyi.personnel.dto.UserPageDto;
+import com.ruoyi.personnel.mapper.AnnexMapper;
+import com.ruoyi.personnel.mapper.PersonBasicInfoFileMapper;
+import com.ruoyi.personnel.mapper.PersonBasicInfoMapper;
+import com.ruoyi.personnel.mapper.PersonBasicInfoWorkMapper;
+import com.ruoyi.personnel.pojo.Annex;
+import com.ruoyi.personnel.pojo.PersonBasicInfo;
+import com.ruoyi.personnel.pojo.PersonBasicInfoFile;
+import com.ruoyi.personnel.pojo.PersonBasicInfoWork;
+import com.ruoyi.personnel.service.PersonBasicInfoService;
+import com.ruoyi.system.mapper.DepartmentLimsMapper;
+import com.ruoyi.system.mapper.UserMapper;
+import org.apache.poi.xwpf.usermodel.XWPFTable;
+import org.openxmlformats.schemas.wordprocessingml.x2006.main.STMerge;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URLEncoder;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ * 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-08-30 09:19:57
+ */
+
+@Service
+@Transactional(rollbackFor = Exception.class)
+public class PersonBasicInfoServiceImpl extends ServiceImpl<PersonBasicInfoMapper, PersonBasicInfo> implements PersonBasicInfoService {
+
+ @Autowired
+ private DepartmentLimsMapper departmentMapper;
+ @Value("${file.path}")
+ private String imgUrl;
+ @Value("${wordUrl}")
+ private String wordUrl;
+ @Resource
+ private UserMapper userMapper;
+ @Resource
+ private AnnexMapper annexMapper;
+ @Resource
+ private PersonBasicInfoFileMapper personBasicInfoFileMapper;
+ @Resource
+ private PersonBasicInfoWorkMapper personBasicInfoWorkMapper;
+
+ @Override
+ public List<DepartmentDto> selectCNSAPersonTree() {
+ List<DepartmentDto> departments = departmentMapper.selectDepartment();
+ List<DepartmentDto> limsUser = baseMapper.selectLimsUser();
+ departments.addAll(limsUser);
+ //鑾峰彇鐖惰妭鐐�
+ return departments.stream().filter(m -> m.getFatherId() == null).peek(
+ (m) -> m.setChildren(getChildren(m, departments))
+ ).collect(Collectors.toList());
+ }
+
+ @Override
+ public Map<String,Object> getCNASPersonnelInfo(Integer userId) {
+ Map<String, Object> map = new HashMap<>();
+ Map<Integer,List<DepartmentLims>> childrenMap = new HashMap<>();
+ List<DepartmentLims> deptS = departmentMapper.selectList(null);
+ for (DepartmentLims dept : deptS) {
+ if(!Objects.isNull(dept.getFatherId())) {
+ if(!childrenMap.containsKey(dept.getFatherId())) {
+ childrenMap.put(dept.getFatherId(),new ArrayList<>());
+ }
+ childrenMap.get(dept.getFatherId()).add(dept);
+ }
+ }
+ // 鐖惰妭鐐�
+ List<DepartmentLims> deptF = new ArrayList<>();
+ for (DepartmentLims dept : deptS) {
+ if(Objects.isNull(dept.getFatherId())) {
+ deptF.add(buildTree(dept,childrenMap));
+ }
+ }
+ map.put("department",deptF);
+ map.put("PersonBasicInfoDto",baseMapper.getCNASPersonnelInfo(userId));
+ map.put("annexList",annexMapper.selectList(new LambdaQueryWrapper<Annex>().eq(Annex::getUserId,userId)));
+ return map;
+ }
+
+ private DepartmentLims buildTree(DepartmentLims departmentLims, Map<Integer,List<DepartmentLims>> childrenMap) {
+ if(childrenMap.containsKey(departmentLims.getId())) {
+ departmentLims.setChildren(childrenMap.get(departmentLims.getId()));
+ for (DepartmentLims departmentLims1 : departmentLims.getChildren()) {
+ buildTree(departmentLims1,childrenMap);
+ }
+ }
+ return departmentLims;
+ }
+
+ @Override
+ public void saveCNASPersonnelInfo(PersonBasicInfoDto personBasicInfoDto) {
+ User user = new User();
+ user.setId(personBasicInfoDto.getUserId());
+ user.setAccount(personBasicInfoDto.getAccount());
+ user.setName(personBasicInfoDto.getName());
+ user.setNameEn(personBasicInfoDto.getNameEn());
+ user.setAge(personBasicInfoDto.getAge());
+ user.setPhone(personBasicInfoDto.getPhone());
+ user.setEmail(personBasicInfoDto.getEmail());
+ user.setSignatureUrl(personBasicInfoDto.getSignatureUrl());
+ user.setPictureUrl(personBasicInfoDto.getPictureUrl());
+ user.setDepartLimsId(personBasicInfoDto.getDepartLimsId());
+ userMapper.updateById(user);
+ PersonBasicInfo personBasicInfo = JSONObject.parseObject(JSON.toJSONString(personBasicInfoDto), PersonBasicInfo.class);
+ PersonBasicInfo one = baseMapper.selectOne(new LambdaQueryWrapper<PersonBasicInfo>()
+ .eq(PersonBasicInfo::getUserId, personBasicInfoDto.getUserId()));
+ if(Objects.isNull(one)) {
+ baseMapper.insert(personBasicInfo);
+ }else {
+ baseMapper.updateById(personBasicInfo);
+ }
+ }
+
+ @Override
+ public IPage<Map<String, Object>> basicInformationOfPersonnelSelectPage(Page page, String name, Integer departmentId) {
+ return baseMapper.selectPersonBasecInfoAndUser(page, name, departmentId);
+ }
+
+ @Override
+ public void exportPersonBasicInfo(UserPageDto userPageDto, HttpServletResponse response) throws Exception {
+ ArrayList<PersonBasicInfoDto> data = new ArrayList<>();
+ List<User> list = userMapper.selectList(null);
+ for (User user : list) {
+ PersonBasicInfoDto personBasicInfoDto = new PersonBasicInfoDto();
+ PersonBasicInfo personBasicInfo = baseMapper.selectOne(Wrappers.<PersonBasicInfo>lambdaQuery().eq(PersonBasicInfo::getUserId, user.getId()));
+ if (ObjectUtils.isNotEmpty(personBasicInfo)) {
+ BeanUtils.copyProperties(personBasicInfo, personBasicInfoDto);
+ }
+ personBasicInfoDto.setName(user.getName());
+ personBasicInfoDto.setAccount(user.getAccount());
+ personBasicInfoDto.setPhone(ObjectUtils.isNotEmpty(user.getPhone()) ? user.getPhone() : " ");
+ data.add(personBasicInfoDto);
+ }
+ response.setContentType("application/vnd.ms-excel");
+ response.setCharacterEncoding("UTF-8");
+ String fileName = URLEncoder.encode("浜哄憳鍩烘湰淇℃伅鍒楄〃瀵煎嚭", "UTF-8");
+ response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
+ try {
+ // 鏂板缓ExcelWriter
+ ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()).build();
+ WriteSheet mainSheet = EasyExcel.writerSheet(0, "浜哄憳鍩烘湰淇℃伅瀵煎嚭").head(PersonBasicInfoDto.class).build();
+ excelWriter.write(data, mainSheet);
+ // 鍏抽棴娴�
+ excelWriter.finish();
+ } catch (IOException e) {
+ throw new RuntimeException("瀵煎嚭澶辫触");
+ }
+ }
+
+ @Override
+ public String exportPersonBasicInfoById(Integer id, HttpServletResponse response) {
+ Map<String, Object> userMap = baseMapper.selectexportPersonBasic(id);
+ User user = userMapper.selectById(id);
+ PersonBasicInfo personBasicInfo = baseMapper.selectOne(Wrappers.<PersonBasicInfo>lambdaQuery().eq(PersonBasicInfo::getUserId, user.getId()));
+ if (ObjectUtils.isEmpty(personBasicInfo)){
+ throw new ErrorException("璇ョ敤鎴风殑鍩烘湰淇℃伅娌℃湁褰曞叆,鏆傛棤娉曞鍑�");
+ }
+ // 璇佷欢
+ List<Annex> annexList = annexMapper.selectList(Wrappers.<Annex>lambdaQuery()
+ .eq(Annex::getUserId, id));
+ // 宸ヤ綔缁忓巻
+ List<PersonBasicInfoWork> personBasicInfoWorks = personBasicInfoWorkMapper.selectList(Wrappers.<PersonBasicInfoWork>lambdaQuery()
+ .eq(PersonBasicInfoWork::getUserId, id));
+
+ List<PersonBasicInfoWorkDto> workList = personBasicInfoWorks.stream().map(basicInfoWork -> {
+ PersonBasicInfoWorkDto personBasicInfoWorkDto = new PersonBasicInfoWorkDto();
+ personBasicInfoWorkDto.setWorkExperience(basicInfoWork.getWorkExperience());
+ personBasicInfoWorkDto.setFill("涓昏宸ヤ綔缁忓巻\nMain work experience鈭�1");
+ return personBasicInfoWorkDto;
+ }).collect(Collectors.toList());
+
+ // 妫�鏌ュ垪琛ㄩ暱搴﹀苟濉厖绌哄璞�
+ while (annexList.size() < 10) {
+ annexList.add(new Annex());
+ }
+
+ // 妫�鏌ュ垪琛ㄩ暱搴﹀苟濉厖绌哄璞�
+ while (workList.size() < 4) {
+ workList.add(new PersonBasicInfoWorkDto());
+ }
+
+ // 鑾峰彇璺緞
+ InputStream inputStream = this.getClass().getResourceAsStream("/static/person-basic-info.docx");
+ Configure configure = Configure.builder()
+ .bind("annexList", new HackLoopTableRenderPolicy())
+ .bind("workList", new HackLoopTableRenderPolicy())
+ .build();
+ XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
+ new HashMap<String, Object>() {{
+ put("user", userMap);
+ put("annexList", annexList);
+ put("workList", workList);
+ }});
+
+ try {
+ response.setContentType("application/msword");
+ String fileName = URLEncoder.encode(
+ userMap.get("name") + "浜哄憳妗f", "UTF-8");
+ response.setHeader("Content-disposition",
+ "attachment;filename=" + fileName + ".docx");
+ OutputStream os = response.getOutputStream();
+ template.write(os);
+ os.flush();
+ os.close();
+ } catch (Exception e) {
+ e.printStackTrace();
+ throw new RuntimeException("瀵煎嚭澶辫触");
+ }
+
+ return null;
+ }
+
+ /**
+ * 浜哄憳鍩硅鍩烘湰淇℃伅闄勪欢鏂板
+ * @param userId
+ * @param file
+ * @return
+ */
+ @Override
+ public boolean uploadBasicInfoFile(Integer userId, MultipartFile file) {
+ if (userId == null) {
+ throw new ErrorException("缂哄皯浜哄憳id");
+ }
+
+ String urlString;
+ String pathName;
+ String path;
+ String filename = file.getOriginalFilename();
+ String contentType = file.getContentType();
+ PersonBasicInfoFile personBasicInfoFile = new PersonBasicInfoFile();
+ personBasicInfoFile.setUserId(userId);
+ personBasicInfoFile.setFileName(filename);
+ if (contentType != null && contentType.startsWith("image/")) {
+ // 鏄浘鐗�
+ path = imgUrl;
+ personBasicInfoFile.setType(1);
+ } else {
+ // 鏄枃浠�
+ path = wordUrl;
+ personBasicInfoFile.setType(2);
+ }
+ try {
+ File realpath = new File(path);
+ if (!realpath.exists()) {
+ realpath.mkdirs();
+ }
+ pathName = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyMMddHHmmss")) + "_" + file.getOriginalFilename();
+ urlString = realpath + "/" + pathName;
+ file.transferTo(new File(urlString));
+ personBasicInfoFile.setFileUrl(pathName);
+ personBasicInfoFileMapper.insert(personBasicInfoFile);
+ return true;
+ } catch (Exception e) {
+ e.printStackTrace();
+ System.err.println("闄勪欢涓婁紶閿欒");
+ return false;
+ }
+ }
+
+ /**
+ * 閫掑綊鏌ヨ瀛愯妭鐐�
+ * @param root 鏍硅妭鐐�
+ * @param all 鎵�鏈夎妭鐐�
+ * @return 鏍硅妭鐐逛俊鎭�
+ */
+ private List<DepartmentDto> getChildren(DepartmentDto root, List<DepartmentDto> all) {
+ if (ObjectUtils.isNotEmpty(root.getId())) {
+ return all.stream().filter(m -> Objects.equals(m.getFatherId(), root.getId())).peek(
+ (m) -> m.setChildren(getChildren(m, all))
+ ).collect(Collectors.toList());
+ } else {
+ return Collections.emptyList();
+ }
+ }
+
+ // 姘村钩鍚堝苟鍗曞厓鏍�
+ private static void mergeCellsHorizontally(XWPFTable table, int row, int fromCol, int toCol) {
+ for (int i = fromCol; i <= toCol; i++) {
+ if (i == fromCol) {
+ table.getRow(row).getCell(i).getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.RESTART);
+ } else {
+ table.getRow(row).getCell(i).getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.CONTINUE);
+ }
+ }
+ }
+
+ // 鍨傜洿鍚堝苟鍗曞厓鏍�
+ private static void mergeCellsVertically(XWPFTable table, int col, int fromRow, int toRow) {
+ for (int i = fromRow; i <= toRow; i++) {
+ if (i == fromRow) {
+ table.getRow(i).getCell(col).getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.RESTART);
+ } else {
+ table.getRow(i).getCell(col).getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.CONTINUE);
+ }
+ }
+ }
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonTrainingDetailedServiceImpl.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonTrainingDetailedServiceImpl.java
new file mode 100644
index 0000000..3eaf942
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonTrainingDetailedServiceImpl.java
@@ -0,0 +1,85 @@
+package com.ruoyi.personnel.service.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.common.core.domain.entity.User;
+import com.ruoyi.common.numgen.NumberGenerator;
+import com.ruoyi.framework.exception.ErrorException;
+import com.ruoyi.personnel.dto.PersonTrainingDetailedDto;
+import com.ruoyi.personnel.excel.PersonTrainingDetailedUpload;
+import com.ruoyi.personnel.mapper.PersonTrainingDetailedMapper;
+import com.ruoyi.personnel.pojo.PersonTrainingDetailed;
+import com.ruoyi.personnel.service.PersonTrainingDetailedService;
+import com.ruoyi.system.mapper.UserMapper;
+import lombok.AllArgsConstructor;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * <p>
+ * 鍩硅璁″垝璇︽儏 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-10-11 01:46:27
+ */
+@Service
+@Transactional(rollbackFor = Exception.class)
+@AllArgsConstructor
+public class PersonTrainingDetailedServiceImpl extends ServiceImpl<PersonTrainingDetailedMapper, PersonTrainingDetailed> implements PersonTrainingDetailedService {
+
+
+ private UserMapper userMapper;
+
+ @Override
+ public void importExcel(List<PersonTrainingDetailedUpload> list, Integer planId) {
+ List<PersonTrainingDetailed> personTrainingDetailedList = new ArrayList<>();
+ list.forEach(i -> {
+ PersonTrainingDetailed personTrainingDetailed = new PersonTrainingDetailed();
+ BeanUtils.copyProperties(i, personTrainingDetailed);
+
+ // 鍖归厤璁插笀
+ User user = userMapper.selectOne(Wrappers.<User>lambdaQuery()
+ .eq(User::getName, i.getTrainingLecturerName()));
+ if (ObjectUtils.isEmpty(user)) {
+ throw new ErrorException("鏈壘鍒拌璁插笀锛�" + i.getTrainingLecturerName());
+ }
+ personTrainingDetailed.setTrainingLecturerId(user.getId());
+ personTrainingDetailed.setPlanId(planId);
+ personTrainingDetailed.setState(3);
+
+ personTrainingDetailed.setTrainingDate(i.getTrainingDate());
+
+
+ personTrainingDetailedList.add(personTrainingDetailed);
+ });
+ // 鎵归噺鏂板
+ if (CollectionUtils.isNotEmpty(personTrainingDetailedList)) {
+ baseMapper.insertBatchSomeColumn(personTrainingDetailedList);
+ }
+ }
+
+ @Override
+ public void deleteAnnualPlanDetailTable(String ids) {
+ String[] split = ids.split(",");
+ if (split.length > 0) {
+ for (String s : split) {
+ baseMapper.deleteById(s);
+ }
+ }
+ }
+
+ @Override
+ public IPage<PersonTrainingDetailedDto> queryTheAnnualPlanDetailsTable(Page page, String trainingLecturerName, String courseCode, String trainingDate, Integer id, Integer userId) {
+ return baseMapper.queryTheAnnualPlanDetailsTable(page, trainingLecturerName, courseCode, trainingDate, id, userId, null);
+ }
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonTrainingRecordServiceImpl.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonTrainingRecordServiceImpl.java
new file mode 100644
index 0000000..4b11bb5
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonTrainingRecordServiceImpl.java
@@ -0,0 +1,177 @@
+package com.ruoyi.personnel.service.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.deepoove.poi.XWPFTemplate;
+import com.deepoove.poi.config.Configure;
+import com.ruoyi.common.core.domain.entity.InformationNotification;
+import com.ruoyi.common.core.domain.entity.User;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.common.utils.WxCpUtils;
+import com.ruoyi.inspect.util.HackLoopTableRenderPolicy;
+import com.ruoyi.personnel.dto.PersonTrainingRecordDto;
+import com.ruoyi.personnel.dto.PersonTrainingRecordListDto;
+import com.ruoyi.personnel.dto.PersonTrainingRecordSubmitDto;
+import com.ruoyi.personnel.dto.TrainingRecordPersonDetailedDto;
+import com.ruoyi.personnel.mapper.PersonTrainingRecordMapper;
+import com.ruoyi.personnel.pojo.PersonTrainingDetailed;
+import com.ruoyi.personnel.pojo.PersonTrainingRecord;
+import com.ruoyi.personnel.service.PersonTrainingDetailedService;
+import com.ruoyi.personnel.service.PersonTrainingRecordService;
+import com.ruoyi.system.mapper.UserMapper;
+import com.ruoyi.system.service.InformationNotificationService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URLEncoder;
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * <p>
+ * 鍩硅璁板綍 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-10-12 04:50:48
+ */
+@Transactional(rollbackFor = Exception.class)
+@Service
+public class PersonTrainingRecordServiceImpl extends ServiceImpl<PersonTrainingRecordMapper, PersonTrainingRecord> implements PersonTrainingRecordService {
+
+ @Autowired
+ private PersonTrainingDetailedService personTrainingDetailedService;
+ @Resource
+ private InformationNotificationService informationNotificationService;
+ @Resource
+ private ThreadPoolTaskExecutor threadPoolTaskExecutor;
+ @Resource
+ private UserMapper userMapper;
+
+ @Override
+ public List<PersonTrainingRecordDto> trainingAndAssessmentRecordsPage(Integer trainingDetailedId, String userName) {
+ return baseMapper.trainingAndAssessmentRecordsPage(trainingDetailedId, userName);
+ }
+
+ @Override
+ public void deleteTrainingAndAssessmentRecords(String ids) {
+ String[] split = ids.split(",");
+ if (split.length > 0) {
+ for (String s : split) {
+ baseMapper.deleteById(s);
+ }
+ }
+ }
+
+ @Override
+ public IPage<PersonTrainingRecordListDto> personnelTrainingPersonnel(Page page, String userName, Integer userId, Integer departLimsId) {
+ return baseMapper.personnelTrainingPersonnel(page, userName, userId, departLimsId);
+ }
+
+ @Override
+ public void claimOfTrainingAndAssessmentRecords(Boolean claimAndClaim, Integer courseId) {
+
+ }
+
+
+ @Override
+ public IPage<TrainingRecordPersonDetailedDto> queryPersonnelDetailsOfUserIdAndYear(Page page, Integer userId, Integer year) {
+ return baseMapper.queryPersonnelDetailsOfUserIdAndYear(page, userId, year);
+ }
+
+ @Override
+ public void exportTrainingRecordAddTrainingDate(Integer userId, Integer trainingDate, HttpServletResponse response) {
+ // 鏌ヨ浜哄憳浜轰俊鎭�
+ PersonTrainingRecordListDto trainingRecordListDto = baseMapper.selectUserTraining(userId);
+
+ // 鏌ヨ鍩硅璁板綍
+ List<TrainingRecordPersonDetailedDto> personDetailedDtos = baseMapper.selectPersonDetailedDtosByTrainingDate(userId, trainingDate);
+
+
+ // 鑾峰彇璺緞
+ InputStream inputStream = this.getClass().getResourceAsStream("/static/training-record.docx");
+ Configure configure = Configure.builder()
+ .bind("personnelDetailsLisat", new HackLoopTableRenderPolicy())
+ .build();
+ XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
+ new HashMap<String, Object>() {{
+ put("traning", trainingRecordListDto);
+ put("personnelDetailsLisat", personDetailedDtos);
+ }});
+ try {
+ response.setContentType("application/msword");
+ String fileName = URLEncoder.encode(
+ "浜哄憳鍩硅璁板綍瀵煎嚭", "UTF-8");
+ response.setHeader("Content-disposition",
+ "attachment;filename=" + fileName + ".docx");
+ OutputStream os = response.getOutputStream();
+ template.write(os);
+ os.flush();
+ os.close();
+ } catch (Exception e) {
+ e.printStackTrace();
+ throw new RuntimeException("瀵煎嚭澶辫触");
+ }
+ }
+
+ /**
+ * 鍩硅鎻愪氦
+ * @param personTrainingRecordSubmitDto
+ */
+ @Override
+ public void trainingAndAssessmentRecordsAdded(PersonTrainingRecordSubmitDto personTrainingRecordSubmitDto) {
+ personTrainingDetailedService.update(Wrappers.<PersonTrainingDetailed>lambdaUpdate()
+ .eq(PersonTrainingDetailed::getId, personTrainingRecordSubmitDto.getTrainingDetailedId())
+ .set(PersonTrainingDetailed::getAssessmentMethod, personTrainingRecordSubmitDto.getAssessmentMethod())
+ .set(PersonTrainingDetailed::getPlaceTraining, personTrainingRecordSubmitDto.getPlaceTraining())
+ .set(PersonTrainingDetailed::getOpeningTime, personTrainingRecordSubmitDto.getOpeningTime())
+ .set(PersonTrainingDetailed::getAssessmentUserId, personTrainingRecordSubmitDto.getAssessmentUserId())
+ .set(PersonTrainingDetailed::getState, personTrainingRecordSubmitDto.getState()));
+
+ // 鍙戦�佹秷鎭�氱煡
+ if (personTrainingRecordSubmitDto.getState().equals(2)) {
+ PersonTrainingDetailed personPersonnelCapacity = personTrainingDetailedService.getById(personTrainingRecordSubmitDto.getTrainingDetailedId());
+
+ Integer userId = SecurityUtils.getUserId().intValue();
+ User user = userMapper.selectById(userId);
+ // 娑堟伅鍙戦��
+ InformationNotification info = new InformationNotification();
+ // 鍙戦�佷汉
+ info.setCreateUser(user.getName());
+ info.setMessageType("6");
+ info.setTheme("CNAS浜哄憳鍩硅璁″垝寰呰瘎浠�");
+ info.setContent("鍩硅鍐呭:" + personPersonnelCapacity.getTrainingContent() + "鐨勪汉鍛樺煿璁緟璇勪环");
+ info.setSenderId(userId);
+ // 鎺ユ敹浜�
+ info.setConsigneeId(personTrainingRecordSubmitDto.getAssessmentUserId());
+ info.setJumpPath("a6-personnel");
+ informationNotificationService.addInformationNotification(info);
+
+ // 鍙戦�佷紒涓氬井淇¢�氱煡
+ threadPoolTaskExecutor.execute(() -> {
+ // 鏌ヨ鎺ユ敹浜�
+ User personnel = userMapper.selectById(personTrainingRecordSubmitDto.getAssessmentUserId());
+
+ String message = "";
+ message += "CNAS浜哄憳鍩硅璁″垝寰呰瘎浠�";
+ message += "\n璇峰幓璧勬簮绠$悊-浜哄憳-浜哄憳鍩硅璁″垝";
+ message += "\n" + "鍩硅鍐呭:" + personPersonnelCapacity.getTrainingContent() + "鐨勪汉鍛樺煿璁緟璇勪环";
+ //鍙戦�佷紒涓氬井淇℃秷鎭�氱煡
+ try {
+ WxCpUtils.inform(personnel.getAccount(), message, null);
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ });
+ }
+ }
+
+}
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonTrainingServiceImpl.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonTrainingServiceImpl.java
new file mode 100644
index 0000000..3463126
--- /dev/null
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonTrainingServiceImpl.java
@@ -0,0 +1,429 @@
+package com.ruoyi.personnel.service.impl;
+
+import com.alibaba.excel.EasyExcel;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.deepoove.poi.XWPFTemplate;
+import com.deepoove.poi.config.Configure;
+import com.deepoove.poi.data.Pictures;
+import com.ruoyi.common.core.domain.entity.InformationNotification;
+import com.ruoyi.common.core.domain.entity.User;
+import com.ruoyi.common.utils.DateImageUtil;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.common.utils.WxCpUtils;
+import com.ruoyi.framework.exception.ErrorException;
+import com.ruoyi.inspect.util.HackLoopTableRenderPolicy;
+import com.ruoyi.personnel.dto.PersonTrainingDetailedDto;
+import com.ruoyi.personnel.dto.PersonTrainingDto;
+import com.ruoyi.personnel.dto.PersonTrainingRecordDto;
+import com.ruoyi.personnel.dto.TrainingRecordExportDto;
+import com.ruoyi.personnel.excel.PersonTrainingDetailedListener;
+import com.ruoyi.personnel.excel.PersonTrainingDetailedUpload;
+import com.ruoyi.personnel.mapper.PersonTrainingDetailedFileMapper;
+import com.ruoyi.personnel.mapper.PersonTrainingDetailedMapper;
+import com.ruoyi.personnel.mapper.PersonTrainingMapper;
+import com.ruoyi.personnel.mapper.PersonTrainingRecordMapper;
+import com.ruoyi.personnel.pojo.PersonTraining;
+import com.ruoyi.personnel.pojo.PersonTrainingDetailed;
+import com.ruoyi.personnel.pojo.PersonTrainingDetailedFile;
+import com.ruoyi.personnel.service.PersonTrainingDetailedService;
+import com.ruoyi.personnel.service.PersonTrainingService;
+import com.ruoyi.system.mapper.UserMapper;
+import com.ruoyi.system.service.InformationNotificationService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URLEncoder;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Optional;
+
+/**
+ * <p>
+ * 鍩硅璁″垝 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-10-11 01:11:49
+ */
+@Service
+@Transactional(rollbackFor = Exception.class)
+public class PersonTrainingServiceImpl extends ServiceImpl<PersonTrainingMapper, PersonTraining> implements PersonTrainingService {
+
+ @Autowired
+ private PersonTrainingDetailedService personTrainingDetailedService;
+ @Autowired
+ private UserMapper userMapper;
+ @Autowired
+ private PersonTrainingDetailedMapper personTrainingDetailedMapper;
+ @Autowired
+ private PersonTrainingRecordMapper personTrainingRecordMapper;
+ @Autowired
+ private PersonTrainingDetailedFileMapper personTrainingDetailedFileMapper;
+ @Resource
+ private InformationNotificationService informationNotificationService;
+ @Resource
+ private ThreadPoolTaskExecutor threadPoolTaskExecutor;
+ @Value("${file.path}")
+ private String imgUrl;
+
+ @Value("${wordUrl}")
+ private String wordUrl;
+
+ @Override
+ public IPage<PersonTrainingDto> personTrainingSelect(Page page, String compilerName, String departmentId) {
+
+ return baseMapper.personTrainingSelect(page, compilerName, departmentId);
+ }
+
+ @Override
+ public void personTrainingImport(MultipartFile file, PersonTraining training) {
+
+ Integer userId = SecurityUtils.getUserId().intValue();
+ // 骞村害璁″垝鐖剁骇鏂板鏁版嵁
+ PersonTraining personSupervisePlan = new PersonTraining();
+ String fileName = file.getOriginalFilename().substring(0, file.getOriginalFilename().lastIndexOf("."));
+ personSupervisePlan.setFileName(fileName);
+ personSupervisePlan.setPlanYear(training.getPlanYear());
+ personSupervisePlan.setCompilerId(userId);
+ personSupervisePlan.setReviewerId(training.getReviewerId());
+ personSupervisePlan.setCompilationDate(LocalDateTime.now());
+ baseMapper.insert(personSupervisePlan);
+ User user = userMapper.selectById(userId);
+ // 娑堟伅鍙戦��
+ InformationNotification info = new InformationNotification();
+ // 鍙戦�佷汉
+ info.setCreateUser(user.getName());
+ info.setMessageType("6");
+ info.setTheme("CNAS鍩硅璁″垝瀹℃牳閫氱煡");
+ info.setContent("鎮ㄦ湁涓�鏉″煿璁鍒掑緟瀹℃牳");
+ info.setSenderId(userId);
+ // 鎺ユ敹浜�
+ info.setConsigneeId(training.getApproverId());
+ info.setJumpPath("a6-personnel");
+ informationNotificationService.addInformationNotification(info);
+
+ // 鍙戦�佷紒涓氬井淇¢�氱煡
+ threadPoolTaskExecutor.execute(() -> {
+ // 鏌ヨ鎺ユ敹浜�
+ User personnel = userMapper.selectById(training.getApproverId());
+
+ String message = "";
+ message += "CNAS鍩硅璁″垝瀹℃牳閫氱煡";
+ message += "\n璇峰幓璧勬簮绠$悊-浜哄憳-鍩硅璁″垝濉啓";
+ message += "\n" + fileName + "鐨勫煿璁鍒掑緟瀹℃牳";
+ //鍙戦�佷紒涓氬井淇℃秷鎭�氱煡
+ try {
+ WxCpUtils.inform(personnel.getAccount(), message, null);
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ });
+
+ // 骞村害璁″垝璇︽儏 鏂板
+ try {
+ PersonTrainingDetailedListener personSupervisePlanDetailsListener = new PersonTrainingDetailedListener(personTrainingDetailedService);
+ personSupervisePlanDetailsListener.setPlanId(personSupervisePlan.getId());
+ EasyExcel.read(file.getInputStream(), PersonTrainingDetailedUpload.class, personSupervisePlanDetailsListener).sheet().doRead();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ @Override
+ public void personTrainingDelete(Integer id) {
+ personTrainingDetailedService.remove(Wrappers.<PersonTrainingDetailed>lambdaQuery()
+ .eq(PersonTrainingDetailed::getPlanId, id));
+ baseMapper.deleteById(id);
+ }
+
+ @Override
+ public void reviewAnnualPersonnelTraining(PersonTraining training) {
+ PersonTraining personTraining = new PersonTraining();
+ personTraining.setId(training.getId());
+ personTraining.setApproverId(training.getApproverId());// 娣诲姞鎵瑰噯浜�
+ personTraining.setAuditDate(LocalDateTime.now());
+ personTraining.setAuditRemarks(training.getAuditRemarks());
+ personTraining.setReviewerStatus(training.getReviewerStatus());
+
+ PersonTraining old = baseMapper.selectById(training.getId());
+
+ // 娑堟伅鍙戦��
+ Integer userId = SecurityUtils.getUserId().intValue();
+ User user = userMapper.selectById(userId);
+ InformationNotification info = new InformationNotification();
+ // 鍙戦�佷汉
+ info.setCreateUser(user.getName());
+ info.setMessageType("6");
+ info.setTheme("CNAS鍩硅璁″垝瀹℃牳閫氱煡");
+ info.setContent("鎮ㄦ湁涓�鏉″煿璁鍒掑緟鎵瑰噯");
+ info.setSenderId(userId);
+ // 鎺ユ敹浜�
+ info.setConsigneeId(training.getApproverId());
+ info.setJumpPath("a6-personnel");
+ informationNotificationService.addInformationNotification(info);
+
+ // 鍙戦�佷紒涓氬井淇¢�氱煡
+ threadPoolTaskExecutor.execute(() -> {
+ // 鏌ヨ鎺ユ敹浜�
+ User personnel = userMapper.selectById(training.getApproverId());
+
+ String message = "";
+ message += "CNAS鍩硅璁″垝鎵瑰噯閫氱煡";
+ message += "\n璇峰幓璧勬簮绠$悊-浜哄憳-鍩硅璁″垝濉啓";
+ message += "\n" + old.getFileName() + "鐨勫煿璁鍒掑緟鎵瑰噯";
+ //鍙戦�佷紒涓氬井淇℃秷鎭�氱煡
+ try {
+ WxCpUtils.inform(personnel.getAccount(), message, null);
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ });
+
+ baseMapper.updateById(personTraining);
+ }
+
+ @Override
+ public void approveAnnualPersonnelTraining(PersonTraining training) {
+ LambdaUpdateWrapper<PersonTraining> wrapper = Wrappers.<PersonTraining>lambdaUpdate()
+ .eq(PersonTraining::getId, training.getId())
+ .set(PersonTraining::getApprovalDate, LocalDateTime.now())
+ .set(PersonTraining::getApprovalRemarks, training.getApprovalRemarks())
+ .set(PersonTraining::getApprovalStatus, training.getApprovalStatus());
+ baseMapper.update(new PersonTraining(), wrapper);
+ }
+
+ /**
+ * 瀵煎嚭浜哄憳鍩硅璁″垝
+ * @param id
+ * @param response
+ */
+ @Override
+ public void exportPersonTraining(Integer id, HttpServletResponse response) {
+
+ // 鏌ヨ璇︽儏
+ PersonTraining personTraining = baseMapper.selectById(id);
+
+ //鑾峰彇鎻愪氦浜虹殑绛惧悕鍦板潃
+ String writeUrl = userMapper.selectById(personTraining.getCompilerId()).getSignatureUrl();
+ if (ObjectUtils.isEmpty(writeUrl) || writeUrl.equals("")) {
+ throw new ErrorException("鎵句笉鍒版楠屼汉鐨勭鍚�");
+ }
+
+ //鑾峰彇澶嶆牳浜虹殑绛惧悕鍦板潃
+ String examineUrl = null;
+ if (personTraining.getReviewerId() != null) {
+ examineUrl = userMapper.selectById(personTraining.getReviewerId()).getSignatureUrl();
+ if (StringUtils.isBlank(examineUrl)) {
+ throw new ErrorException("鎵句笉鍒板鏍镐汉鐨勭鍚�");
+ }
+ }
+
+ //鑾峰彇鎵瑰噯浜虹殑绛惧悕鍦板潃
+ String ratifyUrl = null;
+ if (personTraining.getApproverId() != null) {
+ ratifyUrl = userMapper.selectById(personTraining.getApproverId()).getSignatureUrl();
+ if (StringUtils.isBlank(ratifyUrl)) {
+ throw new ErrorException("鎵句笉鍒板鏍镐汉鐨勭鍚�");
+ }
+ }
+
+ // 鏌ヨ璇︽儏
+ List<PersonTrainingDetailedDto> detailedDtos = personTrainingDetailedMapper.selectTrainingList(id);
+
+ int index = 1;
+ for (PersonTrainingDetailedDto detailedDto : detailedDtos) {
+ detailedDto.setTrainingDateString(detailedDto.getTrainingDate());
+ detailedDto.setIndex(index);
+ index++;
+ }
+
+ // 鑾峰彇璺緞
+ InputStream inputStream = this.getClass().getResourceAsStream("/static/person-training.docx");
+ String finalExamineUrl = examineUrl;
+ String finalRatifyUrl = ratifyUrl;
+ Configure configure = Configure.builder()
+ .bind("trainingDetailedList", new HackLoopTableRenderPolicy())
+ .build();
+ XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
+ new HashMap<String, Object>() {{
+ put("year", personTraining.getPlanYear());
+ put("trainingDetailedList", detailedDtos);
+ put("writeUrl", StringUtils.isNotBlank(writeUrl) ? Pictures.ofLocal(imgUrl + "/" + writeUrl).create() : null);
+ put("examineUrl", StringUtils.isNotBlank(finalExamineUrl) ? Pictures.ofLocal(imgUrl + "/" + finalExamineUrl).create() : null);
+ put("ratifyUrl", StringUtils.isNotBlank(finalRatifyUrl) ? Pictures.ofLocal(imgUrl + "/" + finalRatifyUrl).create() : null);
+ put("writeDateUrl", personTraining.getCompilationDate() != null ?
+ Pictures.ofStream(DateImageUtil.createDateImage(personTraining.getCompilationDate())).create() : null);
+ put("examineDateUrl", personTraining.getAuditDate() != null ?
+ Pictures.ofStream(DateImageUtil.createDateImage(personTraining.getAuditDate())).create() : null);
+ put("ratifyDateUrl", personTraining.getApprovalDate() != null ?
+ Pictures.ofStream(DateImageUtil.createDateImage(personTraining.getApprovalDate())).create() : null);
+ }});
+ try {
+ response.setContentType("application/msword");
+ String fileName = URLEncoder.encode(
+ "浜哄憳鍩硅璁″垝瀵煎嚭", "UTF-8");
+ response.setHeader("Content-disposition",
+ "attachment;filename=" + fileName + ".docx");
+ OutputStream os = response.getOutputStream();
+ template.write(os);
+ os.flush();
+ os.close();
+ } catch (Exception e) {
+ e.printStackTrace();
+ throw new RuntimeException("瀵煎嚭澶辫触");
+ }
+
+ }
+
+ /**
+ * 瀵煎嚭浜哄憳鍩硅涓庤�冩牳璁板綍
+ * @param id
+ * @param response
+ */
+ @Override
+ public void exportPersonTrainingRecord(Integer id, HttpServletResponse response) {
+ // 鏌ヨ浜哄憳鍩硅鏄庣粏
+ PersonTrainingDetailedDto detailedDto = personTrainingDetailedMapper.selectTrainingDetail(id);
+
+ // 鏌ヨ鍩硅鐨勪汉鍛�
+ List<PersonTrainingRecordDto> recordDtos = personTrainingRecordMapper.selectListByTrainingDetailedId(id);
+
+ List<TrainingRecordExportDto> exportDtoList = new ArrayList<>();
+ TrainingRecordExportDto exportDto = new TrainingRecordExportDto();
+
+ int count = 0;
+ for (PersonTrainingRecordDto recordDto : recordDtos) {
+ switch (count) {
+ case 0:
+ exportDto.setUserName1(recordDto.getUserName());
+ exportDto.setDepartment1(recordDto.getDepartment());
+ exportDto.setExaminationResults1(recordDto.getExaminationResults());
+ count ++;
+ break;
+ case 1:
+ exportDto.setUserName2(recordDto.getUserName());
+ exportDto.setDepartment2(recordDto.getDepartment());
+ exportDto.setExaminationResults2(recordDto.getExaminationResults());
+ exportDtoList.add(exportDto);
+ exportDto = new TrainingRecordExportDto();
+ count = 0;
+ break;
+ }
+ }
+ exportDtoList.add(exportDto);
+
+ // 璐ㄩ噺璐熻矗浜�
+ String assessmentUserUrl = null;
+ if (detailedDto.getAssessmentUserId() != null) {
+ assessmentUserUrl = userMapper.selectById(detailedDto.getAssessmentUserId()).getSignatureUrl();
+ if (StringUtils.isBlank(assessmentUserUrl)) {
+ throw new ErrorException("鎵句笉鍒拌瘎浠蜂汉鐨勭鍚�");
+ }
+ }
+
+
+ // 鑾峰彇璺緞
+ InputStream inputStream = this.getClass().getResourceAsStream("/static/person-training-record.docx");
+ Configure configure = Configure.builder()
+ .bind("trainingRecordsList", new HackLoopTableRenderPolicy())
+ .build();
+ String finalAssessmentUserUrl = assessmentUserUrl;
+ XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
+ new HashMap<String, Object>() {{
+ put("trainingDetail", detailedDto);
+ put("trainingRecordsList", exportDtoList);
+ put("assessmentUserUrl", StringUtils.isNotBlank(finalAssessmentUserUrl) ? Pictures.ofLocal(imgUrl + "/" + finalAssessmentUserUrl).create() : null);
+ }});
+ try {
+ response.setContentType("application/msword");
+ String fileName = URLEncoder.encode(
+ "鍩硅涓庤�冩牳璁板綍瀵煎嚭", "UTF-8");
+ response.setHeader("Content-disposition",
+ "attachment;filename=" + fileName + ".docx");
+ OutputStream os = response.getOutputStream();
+ template.write(os);
+ os.flush();
+ os.close();
+ } catch (Exception e) {
+ e.printStackTrace();
+ throw new RuntimeException("瀵煎嚭澶辫触");
+ }
+
+
+ }
+
+ /**
+ * 浜哄憳鍩硅璇︽儏闄勪欢鏂板
+ * @param trainingDetailedId
+ * @param file
+ * @return
+ */
+ @Override
+ public boolean uploadTrainingDetailedFile(Integer trainingDetailedId, MultipartFile file) {
+ if (trainingDetailedId == null) {
+ throw new ErrorException("缂哄皯楠屾敹id");
+ }
+
+ String urlString;
+ String pathName;
+ String path;
+ String filename = file.getOriginalFilename();
+ String contentType = file.getContentType();
+ PersonTrainingDetailedFile detailedFile = new PersonTrainingDetailedFile();
+ detailedFile.setTrainingDetailedId(trainingDetailedId);
+ detailedFile.setFileName(filename);
+ if (contentType != null && contentType.startsWith("image/")) {
+ // 鏄浘鐗�
+ path = imgUrl;
+ detailedFile.setType(1);
+ } else {
+ // 鏄枃浠�
+ path = wordUrl;
+ detailedFile.setType(2);
+ }
+ try {
+ File realpath = new File(path);
+ if (!realpath.exists()) {
+ realpath.mkdirs();
+ }
+ pathName = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyMMddHHmmss")) + "_" + file.getOriginalFilename();
+ urlString = realpath + "/" + pathName;
+ file.transferTo(new File(urlString));
+ detailedFile.setFileUrl(pathName);
+ personTrainingDetailedFileMapper.insert(detailedFile);
+ return true;
+ } catch (Exception e) {
+ e.printStackTrace();
+ System.err.println("闄勪欢涓婁紶閿欒");
+ return false;
+ }
+ }
+
+ /**
+ * 鏌ヨ浠婂勾浜哄憳鍩硅淇℃伅
+ * @return
+ */
+ @Override
+ public List<PersonTrainingDetailed> getThisYearTrainingDetailed() {
+ return personTrainingDetailedMapper.getThisYearTrainingDetailed();
+ }
+}
diff --git a/cnas-personnel/src/main/resources/mapper/PersonBasicInfoMapper.xml b/cnas-personnel/src/main/resources/mapper/PersonBasicInfoMapper.xml
new file mode 100644
index 0000000..206013d
--- /dev/null
+++ b/cnas-personnel/src/main/resources/mapper/PersonBasicInfoMapper.xml
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.personnel.mapper.PersonBasicInfoMapper">
+
+ <select id="selectLimsUser" resultType="com.ruoyi.common.core.domain.entity.DepartmentDto">
+ SELECT u.id userId, u.name, SUBSTRING_INDEX(SUBSTRING_INDEX(u.depart_lims_id, ',', -2), ',', 1) AS fatherId
+ FROM user u
+ where u.is_custom = 0
+ and u.depart_lims_id is not null
+ and u.depart_lims_id != ''
+ </select>
+
+ <select id="getCNASPersonnelInfo" resultType="com.ruoyi.personnel.dto.PersonBasicInfoDto">
+ SELECT *
+ FROM user u
+ left join cnas_person_basic_info cpbi on cpbi.user_id = u.id
+ where u.id = #{userId}
+ </select>
+
+ <select id="selectPersonBasecInfoAndUser" resultType="java.util.Map">
+ select
+ u.id userId,
+ u.`name` name,
+ u.account account,
+ DATE_FORMAT(cpbi.group_time, '%Y-%m-%d') groupTime,
+ cpbi.native_place nativePlace,
+ cpbi.identity_card identityCard,
+ cpbi.id_address idAddress,
+ u.phone telephone,
+ cpbi.graduated_institutions1 graduatedInstitutions1,
+ cpbi.major1 major1,
+ DATE_FORMAT(cpbi.graduation_time1, '%Y-%m-%d') graduationTime1,
+ cpbi.official_academic_redentials officialAcademicRedentials,
+ cpbi.highest_degree highestDegree,
+ cpbi.professional_title professionalTitle
+ from user u
+ left join cnas_person_basic_info cpbi on cpbi.user_id = u.id
+ left join user u1 on u1.id = u.create_user
+ <where>
+ FIND_IN_SET(#{departmentId},u.depart_lims_id)
+ <if test="name != null and name != ''">
+ and u.name like concat('%',#{name},'%')
+ </if>
+ </where>
+ </select>
+
+ <!-- 瀵煎嚭鏌ヨ浜哄憳淇℃伅 -->
+ <select id="selectexportPersonBasic" resultType="java.util.Map">
+ select DATE_FORMAT(cpbi.last_update_time, '%Y骞�%m鏈�%d鏃�') lastUpdateTimeString,
+ u.account,
+ u.`name`,
+ cpbi.sex,
+ cpbi.post_name postName,
+ u.age,
+ DATE_FORMAT(cpbi.working_time, '%Y骞�%m鏈�') workingTimeString,
+ cpbi.major1,
+ DATE_FORMAT(cpbi.graduation_time1, '%Y骞�%m鏈�') graduationTime1string,
+ cpbi.official_academic_redentials officialAcademicRedentials,
+ cpbi.graduated_institutions1 graduatedInstitutions1,
+ cpbi.remarks
+ from user u
+ left join cnas_person_basic_info cpbi on cpbi.user_id = u.id
+ where u.id = #{userId}
+ </select>
+</mapper>
diff --git a/cnas-personnel/src/main/resources/mapper/PersonTrainingMapper.xml b/cnas-personnel/src/main/resources/mapper/PersonTrainingMapper.xml
new file mode 100644
index 0000000..147b493
--- /dev/null
+++ b/cnas-personnel/src/main/resources/mapper/PersonTrainingMapper.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.personnel.mapper.PersonTrainingMapper">
+
+ <!-- 鏍规嵁鍒涘缓浜虹殑閮ㄩ棬绛涢�夋暟鎹紝鍙槸鍒涘缓浜哄彲鑳芥湭鍒嗛厤閮ㄩ棬涔熼渶瑕佹煡鐪� -->
+ <select id="personTrainingSelect" resultType="com.ruoyi.personnel.dto.PersonTrainingDto">
+ SELECT
+ cpt.*,
+ u1.name compiler_name,
+ u2.name reviewer_name,
+ u3.name approver_name,
+ u4.name create_user_name
+ FROM
+ cnas_person_training cpt
+ LEFT JOIN user u1 ON cpt.compiler_id = u1.id
+ LEFT JOIN user u2 ON cpt.reviewer_id = u2.id
+ LEFT JOIN user u3 ON cpt.approver_id = u3.id
+ LEFT JOIN user u4 ON cpt.create_user = u4.id
+ <where>
+ <if test="departLimsId != null and departLimsId != ''">
+ and FIND_IN_SET(#{departLimsId}, u4.depart_lims_id)
+ </if>
+ <if test="compilerName != null and compilerName != ''">
+ and u4.name like concat('%', #{compilerName}, '%')
+ </if>
+ </where>
+ union
+ SELECT
+ cpt.*,
+ u1.name compiler_name,
+ u2.name reviewer_name,
+ u3.name approver_name,
+ u4.name create_user_name
+ FROM
+ cnas_person_training cpt
+ LEFT JOIN user u1 ON cpt.compiler_id = u1.id
+ LEFT JOIN user u2 ON cpt.reviewer_id = u2.id
+ LEFT JOIN user u3 ON cpt.approver_id = u3.id
+ LEFT JOIN user u4 ON cpt.create_user = u4.id
+ WHERE
+ u4.depart_lims_id is not null and length(u4.depart_lims_id) = 0
+ <if test="compilerName != null and compilerName != ''">
+ and u4.name like concat('%', #{compilerName}, '%')
+ </if>
+ </select>
+</mapper>
diff --git a/cnas-personnel/src/main/resources/mapper/PersonTrainingRecordMapper.xml b/cnas-personnel/src/main/resources/mapper/PersonTrainingRecordMapper.xml
new file mode 100644
index 0000000..c57dd3d
--- /dev/null
+++ b/cnas-personnel/src/main/resources/mapper/PersonTrainingRecordMapper.xml
@@ -0,0 +1,126 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.personnel.mapper.PersonTrainingRecordMapper">
+
+ <select id="trainingAndAssessmentRecordsPage" resultType="com.ruoyi.personnel.dto.PersonTrainingRecordDto">
+ select cptr.*, u.account, u.name user_name, u.phone, r.name role_name
+ from cnas_person_training_record cptr
+ left join user u on u.id = cptr.user_id
+ left join role r on r.id = u.role_id
+ where cptr.course_id = #{trainingDetailedId}
+ <if test="userName != null and userName != ''">
+ and u.name like concat('%', #{userName}, '%')
+ </if>
+ </select>
+
+ <select id="personnelTrainingPersonnel" resultType="com.ruoyi.personnel.dto.PersonTrainingRecordListDto">
+ select u.name, u.account, dl.name depart_lims_name, cpbi.professional_title,
+ cpbi.official_academic_redentials, u.id user_id
+ from user u
+ left join cnas_person_basic_info cpbi on cpbi.user_id = u.id
+ left join department_lims dl on dl.id = SUBSTRING_INDEX(SUBSTRING_INDEX(u.depart_lims_id, ',', -2), ',', 1)
+ where u.is_custom = 0
+ <if test="userName != '' and userName != null and userName != 'null'">
+ and u.name like concat('%', #{userName}, '%')
+ </if>
+ <if test="userId != null and userId != ''">
+ and u.id = #{userId}
+ </if>
+ <if test="departLimsId != null and departLimsId != ''">
+ and FIND_IN_SET(#{departLimsId}, u.depart_lims_id)
+ </if>
+ </select>
+
+ <select id="queryPersonnelDetails" resultType="com.ruoyi.personnel.dto.TrainingRecordPersonDetailedDto">
+ select cptd.training_date, cptd.training_content, cptd.class_hour, cptr.examination_results, cptd.remarks
+ from cnas_person_training_record cptr
+ inner join cnas_person_training_detailed cptd on cptd.id = cptr.course_id
+ <where>
+ <if test="userId != null and userId != ''">
+ and cptr.user_id = #{userId}
+ </if>
+ </where>
+ </select>
+
+ <!-- 鏍规嵁璇︽儏id鏌ヨ鍩硅淇℃伅 -->
+ <select id="selectListByTrainingDetailedId" resultType="com.ruoyi.personnel.dto.PersonTrainingRecordDto">
+ select cptr.*,
+ u.name userName,
+ dl.name department
+ from cnas_person_training_record cptr
+ left join user u on u.id = cptr.user_id
+ left join department_lims dl on find_in_set(dl.id, u.depart_lims_id) and dl.id != 1
+ where cptr.course_id = #{trainingDetailedId}
+ </select>
+
+ <!-- 鏍规嵁id鏌ヨ浜哄憳淇℃伅 -->
+ <select id="selectUserTraining" resultType="com.ruoyi.personnel.dto.PersonTrainingRecordListDto">
+ select u.name,
+ u.account,
+ dl.name depart_lims_name,
+ cpbi.professional_title,
+ cpbi.official_academic_redentials,
+ cpbi.unit_time,
+ cpbi.major1,
+ u.id user_id,
+ DATE_FORMAT(cpbi.unit_time, '%Y-%m-%d') AS unitTimeSting
+ from user u
+ left join cnas_person_basic_info cpbi on cpbi.user_id = u.id
+ left join department_lims dl on dl.id = SUBSTRING_INDEX(SUBSTRING_INDEX(u.depart_lims_id, ',', -2), ',', 1)
+ where u.is_custom = 0
+ and u.id = #{userId}
+ </select>
+
+ <!-- 鏍规嵁鐢ㄦ埛id鏌ヨ浜哄憳璁板綍 -->
+ <select id="selectPersonDetailedDtos" resultType="com.ruoyi.personnel.dto.TrainingRecordPersonDetailedDto">
+ select cptd.training_date,
+ cptd.training_content,
+ cptd.class_hour,
+ cptr.examination_results,
+ cptd.remarks,
+ DATE_FORMAT(cptd.training_date, '%Y-%m-%d') AS trainingDateString
+ from cnas_person_training_record cptr
+ inner join cnas_person_training_detailed cptd on cptd.id = cptr.course_id
+ and cptr.user_id = #{userId}
+ <where>
+ <if test="year!= null and year!= ''">
+ and YEAR(cptd.training_date) = ${year}
+ </if>
+ </where>
+ </select>
+
+ <!--鏍规嵁鐢ㄦ埛id鍜屽勾浠芥煡璇汉鍛樻槑缁� 鍩硅璁板綍-->
+ <select id="queryPersonnelDetailsOfUserIdAndYear"
+ resultType="com.ruoyi.personnel.dto.TrainingRecordPersonDetailedDto">
+ select cptd.training_date, cptd.training_content, cptd.class_hour, cptr.examination_results, cptd.remarks
+ from cnas_person_training_record cptr
+ inner join cnas_person_training_detailed cptd on cptd.id = cptr.course_id
+ <where>
+ <if test="userId != null and userId != ''">
+ and cptr.user_id = #{userId}
+ </if>
+ <if test="year!= null and year!= ''">
+ and YEAR(cptd.training_date) = ${year}
+ </if>
+ </where>
+ </select>
+
+ <!-- 鏍规嵁鐢ㄦ埛id鍜屽勾浠芥煡璇汉鍛樻槑缁� 鍩硅璁板綍瀵煎嚭 -->
+ <select id="selectPersonDetailedDtosByTrainingDate"
+ resultType="com.ruoyi.personnel.dto.TrainingRecordPersonDetailedDto">
+ select cptd.training_date,
+ cptd.training_content,
+ cptd.class_hour,
+ cptr.examination_results,
+ cptd.remarks,
+ DATE_FORMAT(cptd.training_date, '%Y-%m-%d') AS trainingDateString
+ from cnas_person_training_record cptr
+ inner join cnas_person_training_detailed cptd on cptd.id = cptr.course_id
+ and cptr.user_id = #{userId}
+ <where>
+ <if test="year!= null and year!= ''">
+ and YEAR(cptd.training_date) = ${year}
+ </if>
+ </where>
+ </select>
+</mapper>
--
Gitblit v1.9.3