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