From 72ceff5111fcd51e3afad277c55449bbf0a2de98 Mon Sep 17 00:00:00 2001 From: zss <zss@example.com> Date: 星期五, 07 三月 2025 11:40:21 +0800 Subject: [PATCH] 人员end --- cnas-personnel/src/main/java/com/ruoyi/personnel/controller/SuperVisePlanController.java | 136 +++++ cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonTrackRecordController.java | 88 +++ cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonTrainingRecordController.java | 60 ++ cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonBasicInfoController.java | 202 ++++++++ cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonTrainingController.java | 272 +++++++++++ ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/UserController.java | 2 cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonPersonnelCapacityController.java | 90 +++ cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonCommunicationAbilityController.java | 61 ++ cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonJobResponsibilitiesController.java | 57 ++ cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonSupervisePlanServiceImpl.java | 6 cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonPostAuthorizationRecordController.java | 66 ++ cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessComplainServiceImpl.java | 1 cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessMethodVerifyServiceImpl.java | 1 cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonSupervisionRecordController.java | 161 ++++++ performance-server/src/main/java/com/ruoyi/performance/controller/PerformanceShiftController.java | 2 cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonRewardPunishmentRecordController.java | 100 ++++ cnas-personnel/src/main/java/com/ruoyi/personnel/controller/FileGeneralController.java | 76 +++ 17 files changed, 1,377 insertions(+), 4 deletions(-) diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/FileGeneralController.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/FileGeneralController.java new file mode 100644 index 0000000..8d95587 --- /dev/null +++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/FileGeneralController.java @@ -0,0 +1,76 @@ +package com.ruoyi.personnel.controller; + +import com.ruoyi.common.core.domain.Result; +import com.ruoyi.personnel.service.FileGeneralService; +import io.swagger.annotations.Api; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; + +@RestController +@Api(tags = "鏂囦欢閫氱敤鎺ュ彛") +@RequestMapping("/fileGeneral") +public class FileGeneralController { + + @Autowired + private FileGeneralService fileGeneralService; + + /** + * 鏂囦欢涓婁紶 + * @param file 鏂囦欢鍐呭 + * @param suffix 鏂囦欢鍚庢渶 + * @param id 缁戝畾琛ㄧ殑id + * @param type 鏋氫妇绫诲瀷 + * @return + */ + + @PostMapping("/fileUpload") + public Result fileUpload(MultipartFile file, String suffix, Integer id,Integer type) { + fileGeneralService.fileUpload(file, suffix, id,type); + return Result.success(); + } + + /** + * 鏂囦欢鏁版嵁鏌ョ湅 + * @param id 缁戝畾id + * @param type 鏋氫妇绫诲瀷 + * @return + */ + + @GetMapping("/selectFile") + public Result selectFile(Integer id,Integer type) { + return Result.success(fileGeneralService.selectFile(id,type)); + } + + /** + * 鏂囦欢鍒犻櫎 + * @param id 鏂囦欢id + * @return + */ + @GetMapping("/delFile") + public Result delFile(Integer id) { + fileGeneralService.delFile(id); + return Result.success(); + } + + /** + * 鏂囦欢涓嬭浇 + * @param id 鏂囦欢id + * @return + */ + @PostMapping("/fileDownLoad") + public void fileDownLoad(Integer id,HttpServletResponse response) { + fileGeneralService.fileDownLoad(id,response); + } + + + + + + +} diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonBasicInfoController.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonBasicInfoController.java new file mode 100644 index 0000000..ec9b3d0 --- /dev/null +++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonBasicInfoController.java @@ -0,0 +1,202 @@ +package com.ruoyi.personnel.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.common.core.domain.Result; +import com.ruoyi.common.core.dto.DepartmentDto; +import com.ruoyi.common.core.dto.UserPageDto; +import com.ruoyi.common.utils.FileSaveUtil; +import com.ruoyi.common.utils.JackSonUtil; +import com.ruoyi.personnel.dto.PersonBasicInfoDetailsDto; +import com.ruoyi.personnel.dto.PersonBasicInfoDto; +import com.ruoyi.personnel.pojo.Annex; +import com.ruoyi.personnel.service.AnnexService; +import com.ruoyi.personnel.service.PersonBasicInfoService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Map; + +/** + * <p> + * 鍓嶇鎺у埗鍣� + * </p> + * + * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃 + * @since 2024-08-30 09:19:57 + */ +@Api(tags = "浜哄憳-浜哄憳鍩烘湰淇℃伅") +@RestController +@RequestMapping("/personBasicInfo") +public class PersonBasicInfoController { + + @Resource + private PersonBasicInfoService personBasicInfoService; + + @Resource + private AnnexService annexService; + + @ApiOperation(value = "鏌ヨCNAS浜哄憳渚ц竟鏍�") + @GetMapping("/selectCNSAPersonTree") + public Result<List<DepartmentDto>> selectCNSAPersonTree() { + return Result.success(personBasicInfoService.selectCNSAPersonTree()); + } + + @ApiOperation(value = "鑾峰彇CNAS浜哄憳鍩烘湰淇℃伅") + @GetMapping("/getCNASPersonnelInfo") + public Result getCNASPersonnelInfo(Integer userId) { + return Result.success(personBasicInfoService.getCNASPersonnelInfo(userId)); + } + + @ApiOperation(value = "淇濆瓨CNAS浜哄憳鍩烘湰淇℃伅") + @PostMapping("/saveCNASPersonnelInfo") + public Result saveCNASPersonnelInfo(@RequestBody PersonBasicInfoDto personBasicInfoDto) { + personBasicInfoService.saveCNASPersonnelInfo(personBasicInfoDto); + return Result.success(); + } + + @ApiOperation(value = "浜哄憳鏄庣粏鍒嗛〉鏌ヨ") + @GetMapping("basicInformationOfPersonnelSelectPage") + public Result<IPage<Map<String, Object>>> basicInformationOfPersonnelSelectPage(Page<List<PersonBasicInfoDetailsDto>> page, String name, Integer departmentId) { + return Result.success(personBasicInfoService.basicInformationOfPersonnelSelectPage(page, name, departmentId)); + } + + // 涓婁紶鏂囦欢鎺ュ彛 + @ApiOperation(value = "涓婁紶鏂囦欢鎺ュ彛") + @PostMapping("/saveCNASFile") + public Result saveFile(@RequestPart("file") MultipartFile file) { + String s = FileSaveUtil.StoreFile(file); + return Result.success("涓婁紶鎴愬姛", s); + } + + /** + * 璁惧鏍″噯 闄勪欢涓婁紶 + * @param file + * @param suffix + * @param id + * @return + */ + @ApiOperation(value = "璁惧鏍″噯 涓婁紶鏂囦欢鎺ュ彛") + @PostMapping("/saveDeviceCalibrationFile") + public Result saveDeviceCalibrationFile(@RequestParam("file") MultipartFile file,@RequestParam("suffix")String suffix,@RequestParam("id") Integer id) { + personBasicInfoService.saveDeviceCalibrationFile(file,suffix,id); + return Result.success(); + } + + /** + * 鏌ョ湅璁惧鏍″噯闄勪欢 + * @param id + * @return + */ + @ApiOperation(value = "璁惧鏍″噯 闄勪欢鏌ョ湅") + @GetMapping("/getDeviceCalibrationFile") + public Result getDeviceCalibrationFile(Integer id) { + return Result.success(personBasicInfoService.getDeviceCalibrationFile(id)); + } + + /** + * 鍒犻櫎璁惧鏍″噯闄勪欢 + * @param id + * @return + */ + @ApiOperation(value = "璁惧鏍″噯 闄勪欢鍒犻櫎") + @DeleteMapping("/delDeviceCalibrationFile") + public Result delDeviceCalibrationFile(Integer id) { + personBasicInfoService.delDeviceCalibrationFile(id); + return Result.success(); + } + + /** + * 涓嬭浇璁惧鏍¢獙闄勪欢涓嬭浇 + * @param id + * @return + */ + @ApiOperation(value = "璁惧鏍¢獙闄勪欢涓嬭浇") + @GetMapping("/downLoadDeviceCalibrationFile") + public Result downLoadDeviceCalibrationFile(Integer id,HttpServletResponse response) { + personBasicInfoService.downLoadDeviceCalibrationFile(id,response); + return Result.success(); + } + + + @GetMapping("/getAnnexByUserId") + public Result<List<Annex>> getAnnexByUserId(Integer userId) { + List<Annex> list = annexService.list(new LambdaQueryWrapper<Annex>().eq(Annex::getUserId, userId)); + return Result.success(list); + } + + // 鍒犻櫎鏂囦欢 + @DeleteMapping("/deleteCNASFile") + public Result saveFile(String fileName) { + String[] split = fileName.split(","); + for (String s : split) { + FileSaveUtil.DeleteFile(s); + } + return Result.success(); + + } + + /** + * 浜哄憳鍩烘湰淇℃伅闄勪欢鏂板 + */ + @PostMapping("/addAnnex") + public Result addAnnex(@RequestBody Annex annex) { + annexService.save(annex); + return Result.success(); + } + + @GetMapping("/getAnnex") + public Result<Annex> getAnnex(Integer id) { + return Result.success(annexService.getById(id)); + } + /** + * 浜哄憳鍩烘湰淇℃伅闄勪欢鍒犻櫎 + */ + @DeleteMapping("/deleteAnnex/{id}") + public Result deleteAnnex(@PathVariable("id") Integer id) { + annexService.removeById(id); + return Result.success(); + } + + /** + * 浜哄憳鍩烘湰淇℃伅闄勪欢淇敼 + * + */ + @PostMapping("/updateAnnex") + public Result updateAnnex(@RequestBody Annex annex) { + annexService.updateById(annex); + return Result.success(); + } + + @ApiOperation(value = "瀵煎嚭浜哄憳鍩烘湰淇℃伅") + @GetMapping("/exportPersonBasicInfo") + public void exportPersonBasicInfo(UserPageDto userPageDto, HttpServletResponse response) throws Exception { + personBasicInfoService.exportPersonBasicInfo(userPageDto,response); + } + + @ApiOperation(value = "涓嬭浇浜哄憳妗f鍗�") + @GetMapping("/exportPersonBasicInfoById") + public Result exportPersonBasicInfoById(Integer id, HttpServletResponse response) { + return Result.success(personBasicInfoService.exportPersonBasicInfoById(id,response)); + } + + @GetMapping("/getEmployees") + @ApiOperation(value = "瀵规帴浜哄憳骞冲彴 鑾峰彇鎵�鏈変汉鍛樹俊鎭�") + public Result getEmployees(Integer departId) { + personBasicInfoService.getEmployees(departId); + return Result.success(); + } + + @GetMapping("/getEmployee") + @ApiOperation(value = "瀵规帴浜哄憳骞冲彴 鏍规嵁宸ュ彿鑾峰彇浜哄憳淇℃伅") + public Result getEmployee(Integer userId) { + personBasicInfoService.getEmployee(userId); + return Result.success(); + } +} diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonCommunicationAbilityController.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonCommunicationAbilityController.java new file mode 100644 index 0000000..6fa8de7 --- /dev/null +++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonCommunicationAbilityController.java @@ -0,0 +1,61 @@ +package com.ruoyi.personnel.controller; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.common.core.domain.Result; +import com.ruoyi.personnel.dto.PersonCommunicationAbilityDto; +import com.ruoyi.personnel.pojo.PersonCommunicationAbility; +import com.ruoyi.personnel.service.PersonCommunicationAbilityService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; + +/** + * <p> + * 娌熼�氳褰� 鍓嶇鎺у埗鍣� + * </p> + * + * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃 + * @since 2024-10-09 12:00:57 + */ +@Api(tags = "浜哄憳 - 娌熼�氳褰�") +@RestController +@RequestMapping("/personCommunicationAbility") +public class PersonCommunicationAbilityController { + + @Autowired + private PersonCommunicationAbilityService personCommunicationAbilityService; + + @ApiOperation(value = "鏂板/鏇存柊 娌熼�氳褰�") + @PostMapping("addOrUpdatePersonCommunicationAbility") + public Result<?> addOrUpdatePersonCommunicationAbility(@RequestBody PersonCommunicationAbility personCommunicationAbility) { + personCommunicationAbilityService.saveOrUpdate(personCommunicationAbility); + return Result.success(); + } + + @ApiOperation(value = "鍒犻櫎 娌熼�氳褰�") + @DeleteMapping("deletePersonCommunicationAbility") + public Result<?> deletePersonCommunicationAbility(@RequestParam("id") Integer id) { + personCommunicationAbilityService.removeById(id); + return Result.success(); + } + + + @ApiOperation(value = "鏌ヨ 娌熼�氳褰�") + @GetMapping("personPersonCommunicationAbilityPage") + public Result<IPage<PersonCommunicationAbilityDto>> personPersonCommunicationAbilityPage(Page page, + Integer departLimsId, + Integer userId, + String userName) { + return Result.success(personCommunicationAbilityService.personPersonCommunicationAbilityPage(page, departLimsId, userId, userName)); + } + + @ApiOperation(value = "瀵煎嚭娌熼�氳褰�") + @GetMapping("exportPersonCommunicationAbility") + public void exportPersonCommunicationAbility(Integer id, HttpServletResponse response) throws Exception{ + personCommunicationAbilityService.exportPersonCommunicationAbility(id,response); + } +} diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonJobResponsibilitiesController.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonJobResponsibilitiesController.java new file mode 100644 index 0000000..e9838af --- /dev/null +++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonJobResponsibilitiesController.java @@ -0,0 +1,57 @@ +package com.ruoyi.personnel.controller; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.common.core.domain.Result; +import com.ruoyi.personnel.dto.PersonJobResponsibilitiesDto; +import com.ruoyi.personnel.pojo.PersonJobResponsibilities; +import com.ruoyi.personnel.service.PersonJobResponsibilitiesService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; + +/** + * <p> + * 宀椾綅鑱岃矗 鍓嶇鎺у埗鍣� + * </p> + * + * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃 + * @since 2024-10-09 02:07:49 + */ +@Api(tags = "浜哄憳 - 宀椾綅鑱岃矗") +@RestController +@RequestMapping("/personJobResponsibilities") +public class PersonJobResponsibilitiesController { + @Autowired + private PersonJobResponsibilitiesService personJobResponsibilitiesService; + + @ApiOperation(value = "鏂板/鏇存柊 宀椾綅鑱岃矗") + @PostMapping("personJobResponsibilitiesSave") + public Result<?> personJobResponsibilitiesSave(@RequestBody PersonJobResponsibilities personJobResponsibilities) { + personJobResponsibilitiesService.saveOrUpdate(personJobResponsibilities); + return Result.success(); + } + + @ApiOperation(value = "鍒犻櫎 宀椾綅鑱岃矗") + @DeleteMapping("personJobResponsibilitiesDelete") + public Result<?> personJobResponsibilitiesDelete(@RequestParam("id") Integer id) { + personJobResponsibilitiesService.removeById(id); + return Result.success(); + } + + @ApiOperation(value = "鏌ヨ 宀椾綅鑱岃矗") + @GetMapping("personJobResponsibilitiesSelect") + public Result<IPage<PersonJobResponsibilitiesDto>> personJobResponsibilitiesSelect(Page page, String userId, String departmentId, String userName) { + IPage<PersonJobResponsibilitiesDto> iPage = personJobResponsibilitiesService.personJobResponsibilitiesSelect(page, userId, departmentId, userName); + return Result.success(iPage); + } + + @ApiOperation(value = "瀵煎嚭浠昏亴宀椾綅璇存槑璇�") + @GetMapping("/exportPersonJobResponsibilities") + public void exportPersonJobResponsibilities(Integer id, HttpServletResponse response){ + personJobResponsibilitiesService.exportPersonJobResponsibilities(id,response); + } +} diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonPersonnelCapacityController.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonPersonnelCapacityController.java new file mode 100644 index 0000000..9192ced --- /dev/null +++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonPersonnelCapacityController.java @@ -0,0 +1,90 @@ +package com.ruoyi.personnel.controller; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.common.core.domain.Result; +import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.personnel.dto.PersonPersonnelCapacityDto; +import com.ruoyi.personnel.pojo.PersonPersonnelCapacity; +import com.ruoyi.personnel.service.PersonPersonnelCapacityService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.apache.catalina.security.SecurityUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import java.time.LocalDateTime; + +/** + * <p> + * 浜哄憳鑳藉姏 鍓嶇鎺у埗鍣� + * </p> + * + * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃 + * @since 2024-10-10 11:26:18 + */ +@Api(tags = "浜哄憳 - 浜哄憳鑳藉姏") +@RestController +@RequestMapping("/personPersonnelCapacity") +public class PersonPersonnelCapacityController { + + @Autowired + private PersonPersonnelCapacityService personPersonnelCapacityService; + + @ApiOperation(value = "鏂板/鏇存柊 浜哄憳鑳藉姏") + @PostMapping("addOrUpdatePersonPersonnelCapacity") + public Result<?> addOrUpdatePersonPersonnelCapacity(@RequestBody PersonPersonnelCapacity personPersonnelCapacity) { + personPersonnelCapacityService.saveOrUpdate(personPersonnelCapacity); + return Result.success(); + } + + @ApiOperation(value = "鍒犻櫎 浜哄憳鑳藉姏") + @DeleteMapping("deletePersonPersonnelCapacity") + public Result<?> deletePersonPersonnelCapacity(@RequestParam("id") Integer id) { + // 鍒犻櫎鏁版嵁 + personPersonnelCapacityService.removeById(id); + return Result.success(); + } + + @ApiOperation(value = "鏌ヨ 浜哄憳鑳藉姏") + @GetMapping("personPersonnelCapacityPage") + public Result<IPage<PersonPersonnelCapacityDto>> personPersonnelCapacityPage(Page page, + Integer departmentId, + Integer userId, + String userName) { + return Result.success(personPersonnelCapacityService.personPersonnelCapacityPage(page, departmentId, userId, userName)); + } + + @ApiOperation(value = "纭 浜哄憳鑳藉姏") + @PostMapping("confirmPersonnelCapability") + public Result<?> confirmPersonnelCapability(@RequestParam("id") Integer id) { + Integer userId = SecurityUtils.getUserId().intValue(); + personPersonnelCapacityService.update(Wrappers.<PersonPersonnelCapacity>lambdaUpdate() + .eq(PersonPersonnelCapacity::getId, id) + .set(PersonPersonnelCapacity::getConfirmOperatingPersonnelId, userId) + .set(PersonPersonnelCapacity::getConfirmDate, LocalDateTime.now())); + return Result.success(); + } + + /** + * 瀵煎嚭浜哄憳鑳藉姏 + * @return + */ + @ApiOperation(value = "瀵煎嚭浜哄憳鑳藉姏") + @GetMapping("/exportPersonnelCapacity") + public void exportPersonnelCapacity(Integer id, HttpServletResponse response){ + personPersonnelCapacityService.exportPersonnelCapacity(id, response); + } + + /** + * 浜哄憳鑳藉姏纭 + * @return + */ + @ApiOperation(value = "浜哄憳鑳藉姏纭") + @GetMapping("/confirmPersonnelCapacity") + public Result<?> confirmPersonnelCapacity(Integer id){ + return Result.success(personPersonnelCapacityService.confirmPersonnelCapacity(id)); + } +} diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonPostAuthorizationRecordController.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonPostAuthorizationRecordController.java new file mode 100644 index 0000000..b3c5614 --- /dev/null +++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonPostAuthorizationRecordController.java @@ -0,0 +1,66 @@ +package com.ruoyi.personnel.controller; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.common.core.domain.Result; +import com.ruoyi.common.utils.FileSaveUtil; +import com.ruoyi.personnel.dto.PersonPostAuthorizationRecordDto; +import com.ruoyi.personnel.pojo.PersonPostAuthorizationRecord; +import com.ruoyi.personnel.service.PersonPostAuthorizationRecordService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; + +/** + * <p> + * 浠昏亴鎺堟潈璁板綍 鍓嶇鎺у埗鍣� + * </p> + * + * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃 + * @since 2024-10-09 10:48:17 + */ +@Api(tags = "浜哄憳 - 浠昏亴鎺堟潈璁板綍") +@RestController +@RequestMapping("/personPostAuthorizationRecord") +public class PersonPostAuthorizationRecordController { + + @Autowired + private PersonPostAuthorizationRecordService personPostAuthorizationRecordService; + + @ApiOperation(value = "鏂板/鏇存柊 浠昏亴鎺堟潈璁板綍") + @PostMapping("addOrUpdatePersonPostAuthorizationRecord") + public Result<?> addOrUpdatePersonPostAuthorizationRecord(@RequestBody PersonPostAuthorizationRecord personRewardPunishmentRecord) { + personPostAuthorizationRecordService.saveOrUpdate(personRewardPunishmentRecord); + return Result.success(); + } + + @ApiOperation(value = "鍒犻櫎 浠昏亴鎺堟潈璁板綍") + @DeleteMapping("deletePersonPostAuthorizationRecord") + public Result<?> deletePersonPostAuthorizationRecord(@RequestParam("id") Integer id) { + // 鍒犻櫎鏂囦欢 + PersonPostAuthorizationRecord postAuthorizationRecord = personPostAuthorizationRecordService.getById(id); + FileSaveUtil.DeleteFile(postAuthorizationRecord.getSystemFileName()); + // 鍒犻櫎鏁版嵁 + personPostAuthorizationRecordService.removeById(id); + return Result.success(); + } + + + @ApiOperation(value = "鏌ヨ 浠昏亴鎺堟潈璁板綍") + @GetMapping("PersonPostAuthorizationRecordPage") + public Result<IPage<PersonPostAuthorizationRecordDto>> PersonPostAuthorizationRecordPage(Page page, + Integer departLimsId, + Integer userId, + String userName) { + return Result.success(personPostAuthorizationRecordService.personPostAuthorizationRecordPage(page, departLimsId, userId, userName)); + } + + @ApiOperation(value = "瀵煎嚭宀椾綅鑱屼笟璧勬牸璇佷功") + @GetMapping("/exportPersonPostAuthorizationRecord") + public void exportPersonPostAuthorizationRecord(Integer id, HttpServletResponse response){ + personPostAuthorizationRecordService.exportPersonPostAuthorizationRecord(id,response); + } +} diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonRewardPunishmentRecordController.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonRewardPunishmentRecordController.java new file mode 100644 index 0000000..0e35c94 --- /dev/null +++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonRewardPunishmentRecordController.java @@ -0,0 +1,100 @@ +package com.ruoyi.personnel.controller; + +import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.common.core.domain.Result; +import com.ruoyi.personnel.dto.PersonRewardPunishmentRecordDto; +import com.ruoyi.personnel.excel.PersonRewardPunishmentRecordExcel; +import com.ruoyi.personnel.pojo.PersonRewardPunishmentRecord; +import com.ruoyi.personnel.service.PersonRewardPunishmentRecordService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.SneakyThrows; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; + +/** + * <p> + * 濂栨儵璁板綍 鍓嶇鎺у埗鍣� + * </p> + * + * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃 + * @since 2024-10-08 11:25:02 + */ +@Api(tags = "浜哄憳 - 濂栨儵璁板綍") +@RestController +@RequestMapping("/personRewardPunishmentRecord") +public class PersonRewardPunishmentRecordController { + + @Autowired + private PersonRewardPunishmentRecordService personRewardPunishmentRecordService; + + @ApiOperation(value = "鏂板/鏇存柊 濂栨儵璁板綍") + @PostMapping("addOrUpdateRewardPunishment") + public Result<?> PersonTrainingSave(@RequestBody PersonRewardPunishmentRecord personRewardPunishmentRecord) { + personRewardPunishmentRecordService.saveOrUpdate(personRewardPunishmentRecord); + return Result.success(); + } + + @ApiOperation(value = "鍒犻櫎濂栨儵璁板綍") + @DeleteMapping("deleteRewardPunishment") + public Result<?> deleteRewardPunishment(@RequestParam("id") Integer id) { + personRewardPunishmentRecordService.removeById(id); + return Result.success(); + } + + @ApiOperation(value = "鏌ヨ 濂栨儵璁板綍") + @GetMapping("rewardPunishmentPage") + @SneakyThrows + public Result<IPage<PersonRewardPunishmentRecordDto>> rewardPunishmentPage(Page page, + Integer userId, + Integer departmentId, + String userName, + @RequestParam(value = "startTime",required = false) String startTimeStr, + @RequestParam(value = "endTime",required = false) String endTimeStr) { + Date startTime = null; + Date endTime = null; + if (StringUtils.isNotEmpty(startTimeStr) || StringUtils.isNotEmpty(endTimeStr)) { + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + startTime = formatter.parse(startTimeStr); + endTime = formatter.parse(endTimeStr); + } + return Result.success(personRewardPunishmentRecordService.rewardPunishmentPage(page, userId, userName, startTime, endTime, departmentId)); + } + + @ApiOperation(value = "濂栨儵璁板綍瀵煎嚭") + @GetMapping("rewardPunishmentExport") + public void rewardPunishmentExport(Integer userId, + Integer departmentId, + String userName, + @RequestParam(value = "startTime",required = false) String startTimeStr, + @RequestParam(value = "endTime",required = false) String endTimeStr, + HttpServletResponse response) throws Exception { + Date startTime = null; + Date endTime = null; + if (StringUtils.isNotEmpty(startTimeStr) || StringUtils.isNotEmpty(endTimeStr)) { + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + startTime = formatter.parse(startTimeStr); + endTime = formatter.parse(endTimeStr); + } + List<PersonRewardPunishmentRecordExcel> data = personRewardPunishmentRecordService.rewardPunishmentExport(userId, departmentId, userName, startTime, endTime); + response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); + response.setHeader("requestType", "excel"); + response.setHeader("Access-Control-Expose-Headers", "requestType"); + // 璁剧疆鍗曞厓鏍兼牱寮� + // 淇濆瓨鍒扮涓�涓猻heet涓� + EasyExcel.write(response.getOutputStream()) + .head(PersonRewardPunishmentRecordExcel.class) + .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()) // 鑷�傚簲鍒楀 + .sheet() + .doWrite(data); + } +} diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonSupervisionRecordController.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonSupervisionRecordController.java new file mode 100644 index 0000000..1905fb1 --- /dev/null +++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonSupervisionRecordController.java @@ -0,0 +1,161 @@ +package com.ruoyi.personnel.controller; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.common.core.domain.Result; +import com.ruoyi.personnel.dto.PersonSupervisionRecordDto; +import com.ruoyi.personnel.pojo.PersonSupervisionControlSheet; +import com.ruoyi.personnel.pojo.PersonSupervisionProcessingSheet; +import com.ruoyi.personnel.pojo.PersonSupervisionRecord; +import com.ruoyi.personnel.service.PersonSupervisionControlSheetService; +import com.ruoyi.personnel.service.PersonSupervisionProcessingSheetService; +import com.ruoyi.personnel.service.PersonSupervisionRecordService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import java.time.LocalDate; +import java.util.List; + +/** + * <p> + * 鐩戠潱璁板綍 鍓嶇鎺у埗鍣� + * </p> + * + * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃 + * @since 2024-10-10 04:16:49 + */ +@Api(tags = "浜哄憳 - 鐩戠潱璁板綍") +@RestController +@RequestMapping("/personSupervisionRecord") +public class PersonSupervisionRecordController { + + @Autowired + private PersonSupervisionRecordService personSupervisionRecordService; + + @Autowired + private PersonSupervisionControlSheetService personSupervisionControlSheetService; + + @Autowired + private PersonSupervisionProcessingSheetService personSupervisionProcessingSheetService; + + @ApiOperation(value = "鏂板/鏇存柊 鐩戠潱璁板綍") + @PostMapping("addOrUpdatePersonSupervisionRecord") + public Result<?> addOrUpdatePersonSupervisionRecord(@RequestBody PersonSupervisionRecord personSupervisionRecord) { + personSupervisionRecordService.saveOrUpdate(personSupervisionRecord); + return Result.success(); + } + + @ApiOperation(value = "鎵归噺鍒犻櫎 鐩戠潱璁板綍") + @ApiImplicitParam(name = "ids", dataType = "array", allowMultiple = true, paramType = "query") + @DeleteMapping("deletePersonSupervisionRecord") + public Result<?> deletePersonSupervisionRecord(@RequestParam("ids") List<Integer> ids) { + personSupervisionRecordService.deletePersonSupervisionRecord(ids); + return Result.success(); + } + + @ApiOperation(value = "鏌ヨ 鐩戠潱璁板綍") + @GetMapping("personSupervisionRecordPage") + public Result<IPage<PersonSupervisionRecordDto>> personSupervisionRecordPage(Page page, + Integer userId, + Integer departLimsId, + String userName) { + return Result.success(personSupervisionRecordService.personSupervisionRecordPage(page, userId, userName, departLimsId)); + } + + + @ApiOperation(value = "鎺у埗鍗曞拰澶勭悊鍗� 鏄惁鍙互鎻愪氦") + @GetMapping("isSubmit") + public Result isSubmit() { + return Result.success(); + } + + + + @ApiOperation(value = "鏌ヨ 鐩戠潱璁板綍 - 鎺у埗鍗�") + @GetMapping("personSupervisionControlSheetPage") + public Result<?> personSupervisionControlSheetPage(Integer id) { + PersonSupervisionControlSheet byId = personSupervisionControlSheetService.getOne(Wrappers.<PersonSupervisionControlSheet>lambdaQuery() + .eq(PersonSupervisionControlSheet::getSupervisionRecordId, id)); + if (ObjectUtils.isEmpty(byId)) { + return Result.fail(202); + } else { + return Result.success(byId); + } + } + + @ApiOperation(value = "鏌ヨ 鐩戠潱璁板綍 - 澶勭悊鍗�") + @GetMapping("personSupervisionProcessingPage") + public Result<?> personSupervisionProcessingPage(Integer id) { + PersonSupervisionProcessingSheet byId = personSupervisionProcessingSheetService.getOne(Wrappers.<PersonSupervisionProcessingSheet>lambdaQuery() + .eq(PersonSupervisionProcessingSheet::getSupervisionRecordId, id)); + if (ObjectUtils.isEmpty(byId)) { + return Result.fail(202); + } else { + return Result.success(byId); + } + } + + @ApiOperation(value = "鏂板/鏇存柊 鐩戠潱璁板綍 - 鎺у埗鍗�") + @PostMapping("addOrUpdatePersonSupervisionControl") + public Result<?> addOrUpdatePersonSupervisionControl(@RequestBody PersonSupervisionControlSheet personSupervisionControlSheet) { + PersonSupervisionControlSheet supervisionControlSheet = personSupervisionControlSheetService.getOne(Wrappers.<PersonSupervisionControlSheet>lambdaQuery() + .eq(PersonSupervisionControlSheet::getSupervisionRecordId, personSupervisionControlSheet.getSupervisionRecordId())); + personSupervisionControlSheet.setCreateTime(LocalDate.now()); + if (ObjectUtils.isEmpty(supervisionControlSheet)) { + personSupervisionControlSheetService.save(personSupervisionControlSheet); + } else { + personSupervisionControlSheetService.updateById(personSupervisionControlSheet); + } + return Result.success(); + } + + @ApiOperation(value = "鏂板/鏇存柊 鐩戠潱璁板綍 - 澶勭悊鍗�") + @PostMapping("addOrUpdatePersonnelServiceProcessing") + public Result<?> addOrUpdatePersonnelServiceProcessing(@RequestBody PersonSupervisionProcessingSheet personSupervisionProcessingSheet) { + PersonSupervisionProcessingSheet processingSheetServiceOne = personSupervisionProcessingSheetService.getOne(Wrappers.<PersonSupervisionProcessingSheet>lambdaQuery() + .eq(PersonSupervisionProcessingSheet::getSupervisionRecordId, personSupervisionProcessingSheet.getSupervisionRecordId())); + if (ObjectUtils.isEmpty(processingSheetServiceOne)) { + personSupervisionProcessingSheetService.save(personSupervisionProcessingSheet); + } else { + personSupervisionProcessingSheetService.updateById(personSupervisionProcessingSheet); + } + return Result.success(); + } + + /** + * 瀵煎嚭浜哄憳鐩戠潱璁板綍 + * @return + */ + @ApiOperation(value = "瀵煎嚭浜哄憳鐩戠潱璁板綍") + @GetMapping("/exportPersonSupervisionRecord") + public void exportPersonSupervisionRecord(Integer id, HttpServletResponse response){ + personSupervisionRecordService.exportPersonSupervisionRecord(id, response); + } + + + /** + * 瀵煎嚭浜哄憳鐩戠潱璁板綍绾犳鎺у埗鍗� + * @return + */ + @ApiOperation(value = "瀵煎嚭浜哄憳鐩戠潱璁板綍绾犳鎺у埗鍗�") + @GetMapping("/exportSupervisionControlSheet") + public void exportSupervisionControlSheet(Integer supervisionRecordId, HttpServletResponse response){ + personSupervisionControlSheetService.exportSupervisionControlSheet(supervisionRecordId, response); + } + + /** + * 瀵煎嚭浜哄憳鐩戠潱璁板綍绾犳澶勭悊鍗� + * @return + */ + @ApiOperation(value = "瀵煎嚭浜哄憳鐩戠潱璁板綍绾犳澶勭悊鍗�") + @GetMapping("/exportSupervisionProcessingSheet") + public void exportSupervisionProcessingSheet(Integer supervisionRecordId, HttpServletResponse response){ + personSupervisionProcessingSheetService.exportSupervisionProcessingSheet(supervisionRecordId, response); + } +} diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonTrackRecordController.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonTrackRecordController.java new file mode 100644 index 0000000..2e0bcfe --- /dev/null +++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonTrackRecordController.java @@ -0,0 +1,88 @@ +package com.ruoyi.personnel.controller; + +import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.common.core.domain.Result; +import com.ruoyi.common.core.domain.entity.User; +import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.personnel.pojo.PersonTrackRecord; +import com.ruoyi.personnel.service.PersonTrackRecordService; +import com.ruoyi.system.mapper.UserMapper; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +/** + * <p> + * 宸ヤ綔灞ュ巻 鍓嶇鎺у埗鍣� + * </p> + * + * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃 + * @since 2024-09-02 03:13:03 + */ +@Api(tags = "浜哄憳 - 宸ヤ綔灞ュ巻") +@RestController +@AllArgsConstructor +@RequestMapping("/personTrackRecord") +public class PersonTrackRecordController { + + @Autowired + private PersonTrackRecordService personTrackRecordService; + + + private UserMapper userMapper; + + @ApiOperation(value = "鏂板宸ヤ綔灞ュ巻") + @PostMapping("personTrackRecordSave") + public Result<?> personTrackRecordSave(@RequestBody PersonTrackRecord personTrackRecord) { + Integer userId = SecurityUtils.getUserId().intValue(); + User user = userMapper.selectById(userId); + personTrackRecord.setCreateUser(user.getName()); + personTrackRecordService.save(personTrackRecord); + return Result.success(); + } + + @ApiOperation(value = "鍒犻櫎宸ヤ綔灞ュ巻") + @DeleteMapping("personTrackRecordDelete") + public Result<?> personTrackRecordDelete(@RequestParam("id") Integer id) { + personTrackRecordService.removeById(id); + return Result.success(); + } + + @ApiOperation(value = "宸ヤ綔灞ュ巻鏇存柊") + @PostMapping("personTrackRecordUpdate") + public Result<?> personTrackRecordUpdate(@RequestBody PersonTrackRecord personTrackRecord) { + personTrackRecordService.updateById(personTrackRecord); + return Result.success(); + } + + @ApiOperation(value = "鏌ヨ宸ヤ綔灞ュ巻") + @GetMapping("personTrackRecordSelect") + public Result<IPage<PersonTrackRecord>> personTrackRecordSelect(Page page, String userId, String departmentId) { + IPage<PersonTrackRecord> iPage = personTrackRecordService.personTrackRecordSelect(page, userId, departmentId); + return Result.success(iPage); + } + + @ApiOperation(value = "宸ヤ綔灞ュ巻瀵煎嚭") + @GetMapping("personTrackRecordExport") + public void personTrackRecordExport(HttpServletResponse response, String userId, String departmentId) throws Exception { + List<PersonTrackRecord> data = personTrackRecordService.personTrackRecordExport(userId, departmentId); + response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); + response.setHeader("requestType", "excel"); + response.setHeader("Access-Control-Expose-Headers", "requestType"); + // 璁剧疆鍗曞厓鏍兼牱寮� + // 淇濆瓨鍒扮涓�涓猻heet涓� + EasyExcel.write(response.getOutputStream()) + .head(PersonTrackRecord.class) + .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()) // 鑷�傚簲鍒楀 + .sheet() + .doWrite(data); + } +} diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonTrainingController.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonTrainingController.java new file mode 100644 index 0000000..f485096 --- /dev/null +++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonTrainingController.java @@ -0,0 +1,272 @@ +package com.ruoyi.personnel.controller; + +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.common.core.domain.Result; +import com.ruoyi.common.numgen.NumberGenerator; +import com.ruoyi.personnel.dto.*; +import com.ruoyi.personnel.pojo.PersonTraining; +import com.ruoyi.personnel.pojo.PersonTrainingDetailed; +import com.ruoyi.personnel.pojo.PersonTrainingRecord; +import com.ruoyi.personnel.service.PersonTrainingDetailedService; +import com.ruoyi.personnel.service.PersonTrainingRecordService; +import com.ruoyi.personnel.service.PersonTrainingService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import java.text.SimpleDateFormat; +import java.time.LocalDateTime; +import java.util.Date; +import java.util.List; +import java.util.Locale; +import java.util.Objects; + +/** + * <p> + * 鍩硅璁″垝 鍓嶇鎺у埗鍣� + * </p> + * + * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃 + * @since 2024-10-11 01:11:49 + */ +@Api(tags = "浜哄憳 - 鍩硅璁″垝") +@RestController +@RequestMapping("/personTraining") +public class PersonTrainingController { + + @Autowired + private PersonTrainingService personTrainingService; + + @Autowired + private PersonTrainingDetailedService personTrainingDetailedService; + + @Autowired + private PersonTrainingRecordService personTrainingRecordService; + + @Resource + private NumberGenerator<PersonTrainingDetailed> numberGenerator; + + @ApiOperation(value = "鍩硅璁″垝 瀵煎叆") + @PostMapping("personTrainingImport") + public Result<?> personTrainingImport(@RequestPart("file") MultipartFile file) { + personTrainingService.personTrainingImport(file); + return Result.success(); + } + + @ApiOperation(value = "鍩硅璁″垝 鍒犻櫎") + @DeleteMapping("personTrainingDelete") + public Result<?> personTrainingDelete(@RequestParam("id") Integer id) { + personTrainingService.personTrainingDelete(id); + return Result.success(); + } + @ApiOperation(value = "鍩硅璁″垝 鏌ヨ") + @GetMapping("personTrainingSelect") + public Result<IPage<PersonTrainingDto>> personTrainingSelect(Page page, String compilerName, Integer departmentId) { + IPage<PersonTrainingDto> iPage = personTrainingService.personTrainingSelect(page, compilerName, departmentId); + return Result.success(iPage); + } + + @ApiOperation(value = "鍩硅璁″垝 骞村害璁″垝鏄庣粏琛� 鍒犻櫎") + @DeleteMapping("/deleteDetail") + public Result<?> deleteDetail( Integer id) { + personTrainingService.deleteDetail(id); + return Result.success(); + } + + @ApiOperation(value = "骞村害鍩硅璁″垝 瀹℃牳") + @PostMapping("reviewAnnualPersonnelTraining") + public Result<?> reviewAnnualPersonnelTraining(@RequestBody PersonTrainingUpdateDto personTrainingUpdateDto) { + personTrainingService.reviewAnnualPersonnelTraining(personTrainingUpdateDto); + return Result.success(); + } + + @ApiOperation(value = "鍩硅璁″垝 鎵瑰噯") + @PostMapping("approveAnnualPersonnelTraining") + public Result<?> approveAnnualPersonnelTraining(@RequestBody PersonTrainingUpdateDto personTrainingUpdateDto) { + personTrainingService.approveAnnualPersonnelTraining(personTrainingUpdateDto); + return Result.success(); + } + + @ApiOperation(value = "骞村害璁″垝鏄庣粏琛� 鏂板/缂栬緫") + @PostMapping("addOrUpdatePersonTrainingDetailed") + public Result<?> addOrUpdatePersonTrainingDetailed(@RequestBody PersonTrainingDetailed personTrainingDetailed) { + if (ObjectUtils.isEmpty(personTrainingDetailed.getId())) { + personTrainingDetailed.setState(3); + String year = new SimpleDateFormat("yy", Locale.CHINESE).format(new Date()); + String month = new SimpleDateFormat("MM", Locale.CHINESE).format(new Date()); + String processNumber = numberGenerator.generateNumberWithPrefix(4, "KC" + month + "-" + year + month, PersonTrainingDetailed::getCourseCode); + personTrainingDetailed.setCourseCode(processNumber); + } + // 濡傛灉鏄柊澧� 骞村害璁″垝琛ㄩ渶瑕侀噸鏂板鏍搞�佹壒鍑� + if(Objects.isNull(personTrainingDetailed.getId())) { + PersonTraining byId = personTrainingService.getById(personTrainingDetailed.getPlanId()); + personTrainingService.update(new LambdaUpdateWrapper<PersonTraining>() + .set(PersonTraining::getReviewerId,null) + .set(PersonTraining::getAuditDate,null) + .set(PersonTraining::getReviewerStatus,null) + .set(PersonTraining::getApproverId,null) + .set(PersonTraining::getApprovalStatus,null) + .set(PersonTraining::getApprovalDate,null) + .eq(PersonTraining::getId,byId.getId())); + } + // 濡傛灉鏃堕棿宸茬粡鍒颁簡锛岄偅涔堢姸鎬佸氨瑕佹敼涓哄凡缁撴潫 + LocalDateTime now = LocalDateTime.now(); + String trainingDateTwo = personTrainingDetailed.getTrainingDateTwo(); // 鏃ユ湡 + String endTime = personTrainingDetailed.getEndTime(); // 缁撴潫鏃堕棿 + LocalDateTime parse = LocalDateTime.parse(trainingDateTwo + "T" + endTime); + if(now.isAfter(parse)) { + personTrainingDetailed.setState(4); + } + personTrainingDetailedService.saveOrUpdate(personTrainingDetailed); + return Result.success(); + } + + @ApiOperation(value = "骞村害璁″垝鏄庣粏琛� 鎵归噺鍒犻櫎") + @DeleteMapping("deleteAnnualPlanDetailTable") + public Result<?> deleteAnnualPlanDetailTable(@RequestParam("ids") String ids) { + personTrainingDetailedService.deleteAnnualPlanDetailTable(ids); + return Result.success(); + } + + @ApiOperation(value = "骞村害璁″垝鏄庣粏琛� 鏌ヨ") + @GetMapping("queryTheAnnualPlanDetailsTable") + public Result<IPage<PersonTrainingDetailedDto>> queryTheAnnualPlanDetailsTable(Page page, + String trainingLecturerName, String courseCode, + String trainingDate, String id, Integer userId, + Integer departId, + Integer state) { + Integer planId = 0; + if(id.equals("null") || StringUtils.isEmpty(id)) { + planId = null; + } else { + planId = Integer.parseInt(id); + } + IPage<PersonTrainingDetailedDto> iPage = personTrainingDetailedService.queryTheAnnualPlanDetailsTable(page, + trainingLecturerName, courseCode, trainingDate, planId, userId,departId,state); + return Result.success(iPage); + } + + @ApiOperation(value = "骞村害璁″垝鏄庣粏琛�-缁撴灉鏄庣粏-鏂囦欢涓婁紶") + @PostMapping("/fileUpload") + public Result<?> fileUpload(@RequestParam MultipartFile file,@RequestParam Integer id) { + return Result.success(personTrainingDetailedService.fileUpload(file,id)); + } + + @ApiOperation(value = "鏌ョ湅鎵�鏈夐儴闂�") + @GetMapping("/selectDepartLims") + public Result<?> selectDepartLims() { + return Result.success(personTrainingDetailedService.selectDepartLims()); + } + + + @ApiOperation(value = "鍩硅涓庤�冩牳璁板綍 鏌ヨ") + @GetMapping("trainingAndAssessmentRecordsPage") + public Result<List<PersonTrainingRecordDto>> trainingAndAssessmentRecordsPage(Integer trainingDetailedId, + String userName) { + List<PersonTrainingRecordDto> list = personTrainingRecordService.trainingAndAssessmentRecordsPage(trainingDetailedId, userName); + return Result.success(list); + } + + @ApiOperation(value = "鍩硅涓庤�冩牳璁板綍 鏂板浜哄憳") + @PostMapping("newPersonnelAddedToTrainingRecords") + public Result<?> newPersonnelAddedToTrainingRecords(@RequestBody List<PersonTrainingRecord> personTrainingRecord) { + personTrainingRecordService.saveBatch(personTrainingRecord); + return Result.success(); + } + + @ApiOperation(value = "鍩硅涓庤�冩牳璁板綍 璁ら") + @PostMapping("claimOfTrainingAndAssessmentRecords") + public Result<?> claimOfTrainingAndAssessmentRecords(@RequestParam("claimAndClaim") Boolean claimAndClaim, + @RequestParam("courseId") Integer courseId) { + personTrainingRecordService.claimOfTrainingAndAssessmentRecords(claimAndClaim, courseId); + return Result.success(); + } + + @ApiOperation(value = "鍩硅涓庤�冩牳璁板綍 鎻愪氦/鎾ら攢") + @PostMapping("trainingAndAssessmentRecordsAdded") + public Result<?> trainingAndAssessmentRecordsAdded(@RequestBody PersonTrainingRecordSubmitDto personTrainingRecordSubmitDto) { + personTrainingDetailedService.update(Wrappers.<PersonTrainingDetailed>lambdaUpdate() + .eq(PersonTrainingDetailed::getId, personTrainingRecordSubmitDto.getTrainingDetailedId()) + .set(PersonTrainingDetailed::getAssessmentMethod, personTrainingRecordSubmitDto.getAssessmentMethod()) + .set(PersonTrainingDetailed::getComprehensiveAssessment, personTrainingRecordSubmitDto.getComprehensiveAssessment()) + .set(PersonTrainingDetailed::getAssessmentUserId, personTrainingRecordSubmitDto.getAssessmentUserId()) + .set(PersonTrainingDetailed::getAssessmentDate, personTrainingRecordSubmitDto.getAssessmentDate()) + .set(PersonTrainingDetailed::getState, personTrainingRecordSubmitDto.getState()) + .set(PersonTrainingDetailed::getTrainingAbstract,personTrainingRecordSubmitDto.getTrainingAbstract())); + return Result.success(); + } + + @ApiOperation(value = "鍩硅涓庤�冩牳璁板綍 鍒犻櫎") + @DeleteMapping("deleteTrainingAndAssessmentRecords") + public Result<?> deleteTrainingAndAssessmentRecords(@RequestParam("ids") String ids) { + personTrainingRecordService.deleteTrainingAndAssessmentRecords(ids); + return Result.success(); + } + + @PostMapping("outOfFocusPreservation") + public Result<?> outOfFocusPreservation(@RequestBody PersonTrainingRecord personTrainingRecord) { + personTrainingRecordService.outOfFocusPreservation(personTrainingRecord); + return Result.success(); + } + + /** + * 瀵煎嚭浜哄憳鍩硅璁″垝 + * @return + */ + @ApiOperation(value = "瀵煎嚭浜哄憳鍩硅璁″垝") + @GetMapping("/exportPersonTraining") + public void exportPersonTraining(Integer id, HttpServletResponse response){ + personTrainingService.exportPersonTraining(id, response); + } + + /** + * 瀵煎嚭浜哄憳鍩硅涓庤�冩牳璁板綍 + * @return + */ + @ApiOperation(value = "瀵煎嚭浜哄憳鍩硅涓庤�冩牳璁板綍") + @GetMapping("/exportPersonTrainingRecord") + public void exportPersonTrainingRecord(Integer id, HttpServletResponse response){ + personTrainingService.exportPersonTrainingRecord(id, response); + } + + + /** + * 骞村害璁″垝鏄庣粏琛� 闄勪欢鏌ヨ + */ + @GetMapping("/getFileData") + @ApiOperation(value = "闄勪欢鏌ヨ") + public Result<?> getFileData(Integer detailedId) { + return Result.success(personTrainingDetailedService.getFileData(detailedId)); + } + + /** + * 骞村害璁″垝鏄庣粏琛� 闄勪欢鍒犻櫎 + */ + @DeleteMapping("/deleteFile") + @ApiOperation(value = "闄勪欢鍒犻櫎") + public Result<?> deleteFile(Integer id) { + personTrainingDetailedService.deleteFile(id); + return Result.success(); + } + + /** + * 闄勪欢涓嬭浇 + */ + @ApiOperation(value = "闄勪欢涓嬭浇") + @GetMapping("/fileDownLoad") + public Result<?> fileDownLoad(Integer id,HttpServletResponse response) { + personTrainingDetailedService.fileDownLoad(id,response); + return Result.success(); + } + + +} diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonTrainingRecordController.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonTrainingRecordController.java new file mode 100644 index 0000000..f5aa1fa --- /dev/null +++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonTrainingRecordController.java @@ -0,0 +1,60 @@ +package com.ruoyi.personnel.controller; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.common.core.domain.Result; +import com.ruoyi.personnel.dto.PersonTrainingRecordListDto; +import com.ruoyi.personnel.dto.TrainingRecordPersonDetailedDto; +import com.ruoyi.personnel.service.PersonTrainingRecordService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.http.HttpServletResponse; + +/** + * <p> + * 鍩硅璁″垝 鍓嶇鎺у埗鍣� + * </p> + * + * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃 + * @since 2024-10-11 01:11:49 + */ +@Api(tags = "浜哄憳 - 鍩硅璁板綍") +@RestController +@RequestMapping("/personTrainingRecord") +public class PersonTrainingRecordController { + + @Autowired + private PersonTrainingRecordService personTrainingRecordService; + + @ApiOperation(value = "鏌ヨ浜哄憳 鍩硅璁板綍") + @GetMapping("trainingSelectTrainingRecord") + public Result<IPage<PersonTrainingRecordListDto>> trainingSelectTrainingRecord(Page page, String userName, Integer userId, Integer departmentId) { + IPage<PersonTrainingRecordListDto> iPage = personTrainingRecordService.personnelTrainingPersonnel(page, userName, userId, departmentId); + return Result.success(iPage); + } + + @ApiOperation(value = "鏌ヨ浜哄憳鏄庣粏 鍩硅璁板綍") + @GetMapping("queryPersonnelDetails") + public Result<IPage<TrainingRecordPersonDetailedDto>> queryPersonnelDetails(Page page, Integer userId, Integer trainingDate) { +// IPage<TrainingRecordPersonDetailedDto> iPage = personTrainingRecordService.queryPersonnelDetails(page, userId); + IPage<TrainingRecordPersonDetailedDto> iPage = personTrainingRecordService.queryPersonnelDetailsOfUserIdAndYear(page, userId, trainingDate); // 鏂板鏍规嵁骞翠唤鏌ヨ + return Result.success(iPage); + } + + /** + * 瀵煎嚭浜哄憳鍩硅璁板綍 + * @return + */ + @ApiOperation(value = "瀵煎嚭浜哄憳鍩硅璁板綍") + @GetMapping("/exportTrainingRecord") + public void exportTrainingRecord(Integer userId, Integer trainingDate, HttpServletResponse response){ +// personTrainingRecordService.exportTrainingRecord(userId, response); + personTrainingRecordService.exportTrainingRecordAddTrainingDate(userId, trainingDate, response);// 鏂板鏍规嵁骞翠唤鏌ヨ + + } +} diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/SuperVisePlanController.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/SuperVisePlanController.java new file mode 100644 index 0000000..1c63015 --- /dev/null +++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/SuperVisePlanController.java @@ -0,0 +1,136 @@ +package com.ruoyi.personnel.controller; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.common.core.domain.Result; +import com.ruoyi.personnel.dto.PersonSupervisePlanDetailsDto; +import com.ruoyi.personnel.dto.PersonSupervisePlanDto; +import com.ruoyi.personnel.pojo.PersonSupervisePlan; +import com.ruoyi.personnel.pojo.PersonSupervisePlanDetails; +import com.ruoyi.personnel.service.PersonSupervisePlanDetailsService; +import com.ruoyi.personnel.service.PersonSupervisePlanService; +import com.ruoyi.system.mapper.UserMapper; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.time.LocalDateTime; +import java.util.Map; + +/** + * <p> + * 鐩戠璁″垝 鍓嶇鎺у埗鍣� + * </p> + * + * @author tangbowen + * @since 2024-09-29 11:13:25 + */ +@Api(tags = "浜哄憳 - 鐩戠潱璁″垝") +@AllArgsConstructor +@RestController +@RequestMapping("/superVisePlan") +public class SuperVisePlanController { + + private PersonSupervisePlanDetailsService personSupervisePlanDetailsService; + + private PersonSupervisePlanService personSupervisePlanService; + + private UserMapper userMapper; + + @ApiOperation(value = "鏌ヨ 骞村害璁″垝") + @GetMapping("/yearPlanList") + public Result<IPage<PersonSupervisePlanDto>> yearPlanList(Integer size, Integer current, @RequestParam(value = "organizationPerson",required = false) String organizationPerson, Integer departId) { + if(departId.equals(1)) { + departId = null; + } + return Result.success(personSupervisePlanService.yearPlanDtoIPage(new Page<>(current, size), organizationPerson,departId)); + } + + @ApiOperation(value = "鎵瑰噯 骞村害璁″垝") + @PostMapping("/yearPlanDetailApproval") + public Result yearPlanDetailApproval(@RequestBody Map<String,Object> map ) { + Integer id = (Integer)map.get("id"); + Integer approvalStatus =(Integer) map.get("approvalStatus"); + PersonSupervisePlan byId = personSupervisePlanService.getById(id); + // 閫氫俊鐨勪负璁稿啗 鐢靛姏鐨勬槸鍒樺缓寰� + Integer approvalId = null; + Integer departId = byId.getDepartId(); + if(departId.equals(18)) { + approvalId = 11; + } else if (departId.equals(19)) { + approvalId = 35; + } + personSupervisePlanService.update(Wrappers.<PersonSupervisePlan>lambdaUpdate() + .eq(PersonSupervisePlan::getId, id) + .set(PersonSupervisePlan::getApprovalStatus, approvalStatus) + .set(PersonSupervisePlan::getApprovalId,approvalId) + .set(PersonSupervisePlan::getApprovalDate, LocalDateTime.now())); + return Result.success("鏇存柊鎴愬姛"); + } + + @ApiOperation(value = "鍒犻櫎 骞村害璁″垝") + @DeleteMapping("/yearPlanDel") + public Result yearPlanDel(String id) { + personSupervisePlanService.removeById(id); + // 瀵瑰簲鐨勫勾搴﹁鍒掕鎯呬篃闇�鍒犻櫎 + personSupervisePlanDetailsService.remove(Wrappers.<PersonSupervisePlanDetails>lambdaQuery() + .eq(PersonSupervisePlanDetails::getPlanId, id)); + return Result.success(); + } + + @ApiOperation(value = "鏌ヨ 骞村害璁″垝璇︽儏") + @GetMapping("/yearPlanDetailList") + public Result<IPage<PersonSupervisePlanDetailsDto>> yearPlanDetailList(Page page, + Integer planId, + @RequestParam(value = "date",required = false) String date, + @RequestParam(value = "project",required = false) String project) { + return Result.success(personSupervisePlanDetailsService.yearPlanDetailPage(page, date,project, planId)); + } + + /** + * 鍙兘鏄痚xcel 涔熷彲鑳芥槸word + * @param file + * @param suffix 鏂囦欢鍚庣紑 + * @return + */ + @ApiOperation(value = "瀵煎叆 骞村害璁″垝") + @PostMapping("/yearPlanDetailImport") + public Result yearPlanDetailImport(@RequestParam("file") MultipartFile file,@RequestParam("suffix")String suffix) { + personSupervisePlanService.yearPlanDetailImport(file,suffix); + return Result.success(); + } + + @ApiOperation(value = "鍒犻櫎 骞村害璁″垝璇︽儏") + @DeleteMapping("/yearPlanDetailDel") + public Result yearPlanDetailDel(String id) { + return Result.success(personSupervisePlanDetailsService.removeById(id)); + } + + @ApiOperation(value = "鏂板 骞村害璁″垝璇︽儏") + @PostMapping("/yearPlanDetailAdd") + public Result yearPlanDetailAdd(@RequestBody PersonSupervisePlanDetails personSupervisePlanDetails) { + personSupervisePlanDetailsService.save(personSupervisePlanDetails); + return Result.success(); + } + + @ApiOperation(value = "缂栬緫 骞村害璁″垝璇︽儏") + @PostMapping("/yearPlanDetailEdit") + public Result yearPlanDetailEdit(@RequestBody PersonSupervisePlanDetails personSupervisePlanDetails) { + personSupervisePlanDetailsService.updateById(personSupervisePlanDetails); + return Result.success("淇濆瓨鎴愬姛"); + } + + /** + * 瀵煎嚭浜哄憳鐩戠潱璁″垝 + * @return + */ + @ApiOperation(value = "瀵煎嚭浜哄憳鐩戠潱璁″垝") + @GetMapping("/exportSuperVisePlan") + public void exportSuperVisePlan(Integer id, HttpServletResponse response){ + personSupervisePlanService.exportSuperVisePlan(id, response); + } +} diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonSupervisePlanServiceImpl.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonSupervisePlanServiceImpl.java index 21f2260..b81a69f 100644 --- a/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonSupervisePlanServiceImpl.java +++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonSupervisePlanServiceImpl.java @@ -44,6 +44,8 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; import org.apache.poi.xwpf.usermodel.XWPFDocument; + +import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.InputStream; @@ -68,13 +70,15 @@ @Service @Slf4j @Transactional(rollbackFor = Exception.class) -@AllArgsConstructor public class PersonSupervisePlanServiceImpl extends ServiceImpl<PersonSupervisePlanMapper, PersonSupervisePlan> implements PersonSupervisePlanService { + @Resource private PersonSupervisePlanDetailsService personSupervisePlanDetailsService; + @Resource private PersonSupervisePlanDetailsMapper personSupervisePlanDetailsMapper; + @Resource private PersonSupervisionRecordMapper personSupervisionRecordMapper; @Value("${file.path}") diff --git a/cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessComplainServiceImpl.java b/cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessComplainServiceImpl.java index 384e6dc..e7f435c 100644 --- a/cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessComplainServiceImpl.java +++ b/cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessComplainServiceImpl.java @@ -35,6 +35,7 @@ @Resource private ProcessComplainMapper processComplainMapper; // todo :妫�楠屾牱鍝佸拰鎶ュ憡妯″潡鎼縼涔嬪悗鏀惧紑 + // @Resource // private InsReportMapper insReportMapper; // diff --git a/cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessMethodVerifyServiceImpl.java b/cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessMethodVerifyServiceImpl.java index 82b850c..d604cd5 100644 --- a/cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessMethodVerifyServiceImpl.java +++ b/cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessMethodVerifyServiceImpl.java @@ -289,7 +289,6 @@ // 灏嗗唴閮ㄥ瓧娈佃浆鎹㈡垚灞曠ず鍒皐ord涓殑瀵硅薄 ProcessMethodVerifyExportWordDto exportWordTemplate = getExportWordTemplate(processMethodVerify); - // TODO:瀵煎嚭鏍囧噯鏂规硶鏇存柊楠岃瘉鑾峰彇浜哄憳绛惧悕鍒楄〃鏈缃� // 鑾峰彇浜哄憳id瀛楃涓� 濡傦細1,2,3,4,5 String confirmUser = processMethodVerify.getConfirmUser(); // 瀵逛汉鍛榠d瀛楃涓茶繘琛屽垎鍓叉垚鏁扮粍 diff --git a/performance-server/src/main/java/com/ruoyi/performance/controller/PerformanceShiftController.java b/performance-server/src/main/java/com/ruoyi/performance/controller/PerformanceShiftController.java index ecdabdb..01ba300 100644 --- a/performance-server/src/main/java/com/ruoyi/performance/controller/PerformanceShiftController.java +++ b/performance-server/src/main/java/com/ruoyi/performance/controller/PerformanceShiftController.java @@ -115,7 +115,7 @@ @GetMapping("temporaryInterface") public void temporaryInterface() { System.out.println("寮�濮嬬粰姣忎釜浜鸿繘琛屾帓鐝�,榛樿鏃╃彮======start"); - // TODO 缁欐瘡涓汉閮借繘琛屾帓鐝�(榛樿鏃╃彮) + // 缁欐瘡涓汉閮借繘琛屾帓鐝�(榛樿鏃╃彮) PerformanceShiftAddDto performanceShiftAddDto = new PerformanceShiftAddDto(); //鐝--鏃�(鏌ヨ瀛楀吀) List<SysDictData> shiftType = dictTypeService.selectDictDataByName("鐝绫诲瀷"); diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/UserController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/UserController.java index e93f447..53ee93f 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/UserController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/UserController.java @@ -33,7 +33,7 @@ private HeaderToken headerToken; /** - * todo: type : 1: 鑾峰彇妫�娴嬩汉鍛樹俊鎭� + *type : 1: 鑾峰彇妫�娴嬩汉鍛樹俊鎭� type : 2: 鑾峰彇褰撳墠閮ㄩ棬(瀹為獙瀹や汉鍛�) * @param user * @param type -- Gitblit v1.9.3