zss
2025-03-07 12291480d592402398c3ba76e8de6006da5c2612
搬迁人员
已修改7个文件
已重命名2个文件
已添加133个文件
8709 ■■■■■ 文件已修改
cnas-personnel/pom.xml 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonBasicInfoDetailsDto.java 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonBasicInfoDto.java 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonCommunicationAbilityDto.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonJobResponsibilitiesDto.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonPersonnelCapacityDto.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonPersonnelCapacityExportDto.java 101 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonPostAuthorizationRecordDto.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonRewardPunishmentRecordDto.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonSupervisePlanDetailsDto.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonSupervisePlanDto.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonSupervisionControlSheetExportDto.java 74 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonSupervisionProcessingSheetDto.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonSupervisionRecordDto.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonTrainingDetailedDto.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonTrainingDto.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonTrainingRecordDto.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonTrainingRecordListDto.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonTrainingRecordSubmitDto.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonTrainingUpdateDto.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/dto/TrainingRecordExportDto.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/dto/TrainingRecordPersonDetailedDto.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/enumeration/AttachmentType.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/excel/PersonRewardPunishmentRecordExcel.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/excel/PersonSupervisePlanDetailsListener.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/excel/PersonSupervisePlanDetailsUpload.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/excel/PersonTrainingDetailedListener.java 81 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/excel/PersonTrainingDetailedUpload.java 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/AnnexMapper.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonBasicInfoMapper.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonCommunicationAbilityMapper.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonJobResponsibilitiesMapper.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonPersonnelCapacityMapper.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonPostAuthorizationRecordMapper.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonRewardPunishmentRecordMapper.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonSupervisePlanDetailsMapper.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonSupervisePlanMapper.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonSupervisionControlSheetMapper.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonSupervisionProcessingSheetMapper.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonSupervisionRecordMapper.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonTrackRecordMapper.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonTrainingDetailedMapper.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonTrainingFileMapper.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonTrainingMapper.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonTrainingRecordMapper.java 67 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/Annex.java 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonBasicInfo.java 271 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonCommunicationAbility.java 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonJobResponsibilities.java 78 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonPersonnelCapacity.java 122 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonPostAuthorizationRecord.java 74 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonRewardPunishmentRecord.java 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonSupervisePlan.java 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonSupervisePlanDetails.java 73 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonSupervisionControlSheet.java 113 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonSupervisionProcessingSheet.java 99 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonSupervisionRecord.java 107 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonTrackRecord.java 83 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonTraining.java 83 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonTrainingDetailed.java 124 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonTrainingFile.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonTrainingRecord.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/schedule/PersonSchedule.java 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/service/AnnexService.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/service/FileGeneralService.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonBasicInfoService.java 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonCommunicationAbilityService.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonJobResponsibilitiesService.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonPersonnelCapacityService.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonPostAuthorizationRecordService.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonRewardPunishmentRecordService.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonSupervisePlanDetailsService.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonSupervisePlanService.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonSupervisionControlSheetService.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonSupervisionProcessingSheetService.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonSupervisionRecordService.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonTrackRecordService.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonTrainingDetailedService.java 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonTrainingFileService.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonTrainingRecordService.java 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonTrainingService.java 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/AnnexServiceImpl.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/FileGeneralServiceImpl.java 162 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonBasicInfoServiceImpl.java 1081 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonCommunicationAbilityServiceImpl.java 113 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonJobResponsibilitiesServiceImpl.java 114 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonPersonnelCapacityServiceImpl.java 121 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonPostAuthorizationRecordServiceImpl.java 136 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonRewardPunishmentRecordServiceImpl.java 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonSupervisePlanDetailsServiceImpl.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonSupervisePlanServiceImpl.java 327 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonSupervisionControlSheetServiceImpl.java 155 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonSupervisionProcessingSheetServiceImpl.java 119 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonSupervisionRecordServiceImpl.java 125 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonTrackRecordServiceImpl.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonTrainingDetailedServiceImpl.java 363 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonTrainingFileServiceImpl.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonTrainingRecordServiceImpl.java 338 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonTrainingServiceImpl.java 376 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/resources/mapper/PersonBasicInfoMapper.xml 101 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/resources/mapper/PersonCommunicationAbilityMapper.xml 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/resources/mapper/PersonJobResponsibilitiesMapper.xml 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/resources/mapper/PersonPersonnelCapacityMapper.xml 168 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/resources/mapper/PersonPostAuthorizationRecordMapper.xml 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/resources/mapper/PersonRewardPunishmentRecordMapper.xml 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/resources/mapper/PersonSupervisePlanDetailsMapper.xml 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/resources/mapper/PersonSupervisePlanMapper.xml 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/resources/mapper/PersonSupervisionControlSheetMapper.xml 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/resources/mapper/PersonSupervisionProcessingSheetMapper.xml 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/resources/mapper/PersonSupervisionRecordMapper.xml 78 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/resources/mapper/PersonTrackRecordMapper.xml 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/resources/mapper/PersonTrainingDetailedMapper.xml 98 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/resources/mapper/PersonTrainingMapper.xml 72 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/resources/mapper/PersonTrainingRecordMapper.xml 135 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/resources/static/communication-deal.docx 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/resources/static/credentials-deal.docx 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/resources/static/explain-deal.docx 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/resources/static/person-deal.docx 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/resources/static/person-training-record.docx 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/resources/static/person-training.docx 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/resources/static/personnel-capacity.docx 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/resources/static/super-vise-plan.docx 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/resources/static/supervision-control-sheet.docx 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/resources/static/supervision-processing-sheet.docx 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/resources/static/supervision-record.docx 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/resources/static/training-record.docx 补丁 | 查看 | 原始文档 | blame | 历史
performance-server/src/main/java/com/ruoyi/performance/pojo/AuxiliaryWorkingHoursDay.java 93 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
performance-server/src/main/java/com/ruoyi/performance/service/impl/AuxiliaryOutputWorkingHoursServiceImpl.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/UserController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/DepartmentLims.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/User.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/core/dto/DepartmentDto.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/core/dto/UserPageDto.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/utils/DateImageUtil.java 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-framework/src/main/java/com/ruoyi/framework/util/HeaderToken.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-framework/src/main/java/com/ruoyi/framework/util/TestApi.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/pom.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/domain/AuthApi.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/mapper/DepartmentLimsMapper.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/DepartmentLimsService.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/DepartmentLimsServiceImpl.java 86 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/resources/mapper/system/DepartmentLimsMapper.xml 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/pom.xml
@@ -40,6 +40,17 @@
            <groupId>com.ruoyi</groupId>
            <artifactId>inspect-server</artifactId>
        </dependency>
        <dependency>
            <groupId>com.ruoyi</groupId>
            <artifactId>cnas-process</artifactId>
        </dependency>
        <dependency>
            <groupId>com.belerweb</groupId>
            <artifactId>pinyin4j</artifactId>
            <version>2.5.1</version>
        </dependency>
    </dependencies>
</project>
cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonBasicInfoDetailsDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,66 @@
package com.ruoyi.personnel.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.time.LocalDateTime;
/**
 * Author: yuan
 * Date: 2024-12-13 æ˜ŸæœŸäº” 13:52:52
 * Description:
 */
@Data
public class PersonBasicInfoDetailsDto {
    @ApiModelProperty("用户id")
    private Integer userId;
    @ApiModelProperty("用户姓名")
    private String name;
    @ApiModelProperty("入职时间")
    private String entryTimeStr;
    @ApiModelProperty("实际实习结束")
    private String endPracticalPracticeStr;
    @ApiModelProperty("籍贯")
    private String nativePlace;
    @ApiModelProperty("身份证号")
    private String identityCard;
    @ApiModelProperty("身份证地址")
    private String idAddress;
    @ApiModelProperty("用户手机号")
    private String phone;
    @ApiModelProperty("毕业院校")
    private String graduatedInstitutions1;
    @ApiModelProperty("专业")
    private String major1;
    @ApiModelProperty("毕业时间1")
    private LocalDateTime graduationTime1;
    @ApiModelProperty("最高学历")
    private String officialAcademicRedentials;
    @ApiModelProperty("最高学位")
    private String highestDegree;
    @ApiModelProperty("职称")
    private String professionalTitle;
    // èŒä¸šèƒ½åŠ›
    @ApiModelProperty("紧急联系人")
    private String emergencyContact;
    @ApiModelProperty("紧急联系人电话")
    private String emergencyContactPhone;
}
cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonBasicInfoDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,47 @@
package com.ruoyi.personnel.dto;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.ruoyi.personnel.pojo.PersonBasicInfo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
@ExcelIgnoreUnannotated
public class PersonBasicInfoDto extends PersonBasicInfo {
    @ApiModelProperty(value = "账号")
    @ExcelProperty("员工编号")
    private String account;
    @ApiModelProperty(value = "姓名")
    @ExcelProperty("姓名")
    private String name;
    @ApiModelProperty(value = "姓名(英文)")
    private String nameEn;
    @ApiModelProperty(value = "年龄")
    private Integer age;
    @ApiModelProperty(value = "电话号码")
    @ExcelProperty("手机号")
    private String phone;
    @ApiModelProperty(value = "邮箱")
    private String email;
    @ApiModelProperty(value = "部门")
    private String department;
    @ApiModelProperty(value = "lims组织架构")
    private String departLimsId;
    @ApiModelProperty(value = "签名照片地址")
    private String signatureUrl;
    @ApiModelProperty(value = "自身照片地址")
    private String pictureUrl;
}
cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonCommunicationAbilityDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,14 @@
package com.ruoyi.personnel.dto;
import com.ruoyi.personnel.pojo.PersonCommunicationAbility;
import lombok.Data;
@Data
public class PersonCommunicationAbilityDto extends PersonCommunicationAbility {
    private String userName;
    private String account;
    private String createUserName;
}
cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonJobResponsibilitiesDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,16 @@
package com.ruoyi.personnel.dto;
import com.ruoyi.personnel.pojo.PersonJobResponsibilities;
import lombok.Data;
@Data
public class PersonJobResponsibilitiesDto extends PersonJobResponsibilities {
    private String incumbentName;
    private String supervisorName;
    private String departLimsName;
    private String account;
}
cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonPersonnelCapacityDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,30 @@
package com.ruoyi.personnel.dto;
import com.ruoyi.personnel.pojo.PersonPersonnelCapacity;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
public class PersonPersonnelCapacityDto extends PersonPersonnelCapacity {
    @ApiModelProperty("提交人姓名")
    private String submitOperatingPersonnelName;
    @ApiModelProperty("操作人姓名")
    private String confirmOperatingPersonnelName;
    @ApiModelProperty("人员姓名")
    private String userName;
    @ApiModelProperty("岗位名称")
    private String postName;
    @ApiModelProperty("岗位职责")
    private String responsibilities;
    @ApiModelProperty("工作经历")
    private String placeWork;
    @ApiModelProperty("专业")
    private String major;
}
cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonPersonnelCapacityExportDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,101 @@
package com.ruoyi.personnel.dto;
import com.ruoyi.personnel.pojo.PersonPersonnelCapacity;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
 * @Author zhuo
 * @Date 2024/11/28
 */
@Data
public class PersonPersonnelCapacityExportDto extends PersonPersonnelCapacity {
    @ApiModelProperty("岗位名称")
    private String postName;
    @ApiModelProperty("人员姓名")
    private String userName;
    @ApiModelProperty("学历")
    private String officialAcademicRedentials;
    @ApiModelProperty("专业")
    private String major;
    @ApiModelProperty("职称")
    private String professionalTitle;
    @ApiModelProperty("工作经历")
    private String placeWork;
    @ApiModelProperty("学历 ç¬¦åˆä¸Žå¦(1:符合)")
    private String academicConformNot1 = "□";
    @ApiModelProperty("学历 ç¬¦åˆä¸Žå¦(2:不符合)")
    private String academicConformNot2 = "□";
    @ApiModelProperty("学历 ç¬¦åˆä¸Žå¦(3:不适用)")
    private String academicConformNot3 = "□";
    @ApiModelProperty("相关年限  ç¬¦åˆä¸Žå¦(1:符合)")
    private String relatedYearsConformNot1 = "□";
    @ApiModelProperty("相关年限  ç¬¦åˆä¸Žå¦(2:不符合)")
    private String relatedYearsConformNot2 = "□";
    @ApiModelProperty("相关年限  ç¬¦åˆä¸Žå¦(3:不适用)")
    private String relatedYearsConformNot3 = "□";
    @ApiModelProperty("相关培训 ç¬¦åˆä¸Žå¦(1:符合)")
    private String relatedTrainingConformNot1 = "□";
    @ApiModelProperty("相关培训 ç¬¦åˆä¸Žå¦(2:不符合)")
    private String relatedTrainingConformNot2 = "□";
    @ApiModelProperty("相关培训 ç¬¦åˆä¸Žå¦(3:不适用)")
    private String relatedTrainingConformNot3 = "□";
    @ApiModelProperty("相关经验 ç¬¦åˆä¸Žå¦(1:符合)")
    private String relevantExperienceConformNot1 = "□";
    @ApiModelProperty("相关经验 ç¬¦åˆä¸Žå¦(2:不符合)")
    private String relevantExperienceConformNot2 = "□";
    @ApiModelProperty("相关经验 ç¬¦åˆä¸Žå¦(3:不适用)")
    private String relevantExperienceConformNot3 = "□";
    @ApiModelProperty("上岗证 ç¬¦åˆä¸Žå¦(1:符合)")
    private String workLicenseConformNot1 = "□";
    @ApiModelProperty("上岗证 ç¬¦åˆä¸Žå¦(2:不符合)")
    private String workLicenseConformNot2 = "□";
    @ApiModelProperty("上岗证 ç¬¦åˆä¸Žå¦(3:不适用)")
    private String workLicenseConformNot3 = "□";
    @ApiModelProperty("岗位职责1(熟悉本岗位的产品检测样品制备和相关产品基础知识)")
    private String jobResponsibilities1 = "□";
    @ApiModelProperty("岗位职责2(熟悉本岗位样品检测流程)")
    private String jobResponsibilities2 = "□";
    @ApiModelProperty("岗位职责3(正确熟练操作本岗位仪表设备)")
    private String jobResponsibilities3 = "□";
    @ApiModelProperty("岗位职责4(熟悉本岗位相关检测标准)")
    private String jobResponsibilities4 = "□";
    @ApiModelProperty("岗位职责5(熟悉本岗位产品性能及结果判断、分析)")
    private String jobResponsibilities5 = "□";
    @ApiModelProperty("岗位职责6(完成相应的厂验、认证)")
    private String jobResponsibilities6 = "□";
    @ApiModelProperty("岗位职责7(编写相关检测手顺)")
    private String jobResponsibilities7 = "□";
    @ApiModelProperty("岗位职责8(了解仪器设备基本结构与简单维护保养)")
    private String jobResponsibilities8 = "□";
    @ApiModelProperty("岗位职责9(具备技能培训的能力)")
    private String jobResponsibilities9 = "□";
    @ApiModelProperty("岗位职责10(具备检测仪器改造能力)")
    private String jobResponsibilities10 = "□";
    @ApiModelProperty("岗位职责 ç¬¦åˆä¸Žå¦(1:符合)")
    private String jobResponsibilitiesConformNot1 = "□";
    @ApiModelProperty("岗位职责 ç¬¦åˆä¸Žå¦(2:不符合)")
    private String jobResponsibilitiesConformNot2 = "□";
    @ApiModelProperty("岗位职责 ç¬¦åˆä¸Žå¦(3:不适用)")
    private String jobResponsibilitiesConformNot3 = "□";
    @ApiModelProperty("综合评价1(可胜任该岗位)")
    private String comprehensiveAssessment1 = "□";
    @ApiModelProperty("综合评价2(可边培训边上岗)")
    private String comprehensiveAssessment2 = "□";
    @ApiModelProperty("综合评价3(不胜任该岗位)")
    private String comprehensiveAssessment3 = "□";
}
cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonPostAuthorizationRecordDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,14 @@
package com.ruoyi.personnel.dto;
import com.ruoyi.personnel.pojo.PersonPostAuthorizationRecord;
import lombok.Data;
@Data
public class PersonPostAuthorizationRecordDto extends PersonPostAuthorizationRecord {
    private String userName;
    private String account;
    private String createUserName;
}
cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonRewardPunishmentRecordDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,14 @@
package com.ruoyi.personnel.dto;
import com.ruoyi.personnel.pojo.PersonRewardPunishmentRecord;
import lombok.Data;
@Data
public class PersonRewardPunishmentRecordDto extends PersonRewardPunishmentRecord {
    private String userName;
    private String account;
    private String createUserName;
}
cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonSupervisePlanDetailsDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,14 @@
package com.ruoyi.personnel.dto;
import com.ruoyi.personnel.pojo.PersonSupervisePlanDetails;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
public class PersonSupervisePlanDetailsDto extends PersonSupervisePlanDetails {
    @ApiModelProperty(value = "创建人")
    private String createBy;
}
cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonSupervisePlanDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,21 @@
package com.ruoyi.personnel.dto;
import com.ruoyi.personnel.pojo.PersonSupervisePlan;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
public class PersonSupervisePlanDto extends PersonSupervisePlan {
    @ApiModelProperty(value = "审核人")
    private String approvalName;
    @ApiModelProperty(value = "编制人")
    private String organizationPersonName;
    @ApiModelProperty(value = "编制人")
    private String createName;
    @ApiModelProperty("当前登录人")
    private Integer currentId;
}
cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonSupervisionControlSheetExportDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,74 @@
package com.ruoyi.personnel.dto;
import com.ruoyi.personnel.pojo.PersonSupervisionControlSheet;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
 * @Author zhuo
 * @Date 2024/11/26
 */
@Data
public class PersonSupervisionControlSheetExportDto extends PersonSupervisionControlSheet {
    @ApiModelProperty("1发生部门")
    private String occurrenceDepartmentString;
    @ApiModelProperty("1部门负责人")
    private String departmentHead;
    @ApiModelProperty("1发现部门")
    private String discovererDepartment;
    @ApiModelProperty("1发现部门-日期")
    private String discovererDateString;
    @ApiModelProperty("2被监督人")
    private String supervisedPerson;
    @ApiModelProperty("3责任部门")
    private String responsibleDepartment;
    @ApiModelProperty("3责任部门 æ—¥æœŸ")
    private String responsibleDepartmentDateString;
    @ApiModelProperty("4纠正措施 æ—¥æœŸ")
    private String correctiveMeasureDateString;
    @ApiModelProperty("5质量负责人日期")
    private String qualitySupervisorDateString;
    @ApiModelProperty("4纠正措施处理单跟踪(是)")
    private String correctiveMeasureFollowTracksYes = "□";
    @ApiModelProperty("4纠正措施处理单跟踪(否)")
    private String correctiveMeasureFollowTracksNo = "□";
    @ApiModelProperty("5是否通知客户(是)")
    private String whetherInformCustomerYes = "□";
    @ApiModelProperty("5是否通知客户(否)")
    private String whetherInformCustomerNo = "□";
    @ApiModelProperty("5是否恢复工作(1:是;2:否)")
    private String whetherResumeWorkYes = "□";
    @ApiModelProperty("5是否恢复工作(1:是;2:否)")
    private String whetherResumeWorkNo = "□";
    @ApiModelProperty("1不符合工作发现途径0(管理评审)")
    private String discoveryApproach0 = "□";
    @ApiModelProperty("1不符合工作发现途径1(内部审核)")
    private String discoveryApproach1 = "□";
    @ApiModelProperty("1不符合工作发现途径2(检测过程控制)")
    private String discoveryApproach2 = "□";
    @ApiModelProperty("1不符合工作发现途径3(内部质量控制)")
    private String discoveryApproach3 = "□";
    @ApiModelProperty("1不符合工作发现途径4(内部监督)")
    private String discoveryApproach4 = "□";
    @ApiModelProperty("1不符合工作发现途径5(外部评审/检查)")
    private String discoveryApproach5 = "□";
    @ApiModelProperty("1不符合工作发现途径6(顾客投诉/意见反馈)")
    private String discoveryApproach6 = "□";
    @ApiModelProperty("1不符合工作发现途径7(其他)")
    private String discoveryApproach7 = "□";
}
cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonSupervisionProcessingSheetDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,40 @@
package com.ruoyi.personnel.dto;
import com.ruoyi.personnel.pojo.PersonSupervisionProcessingSheet;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
 * @Author zhuo
 * @Date 2024/11/26
 */
@Data
public class PersonSupervisionProcessingSheetDto extends PersonSupervisionProcessingSheet {
    @ApiModelProperty("1 æå‡ºéƒ¨é—¨")
    private String proposingDepartment;
    @ApiModelProperty("1 æå‡ºéƒ¨é—¨ æ—¥æœŸ")
    private String proposingDepartmentDateString;
    @ApiModelProperty("2 åŽŸå› åˆ†æž éƒ¨é—¨")
    private String causeAnalysis;
    @ApiModelProperty("2 åŽŸå› åˆ†æž éƒ¨é—¨")
    private String causeAnalysisDepartment;
    @ApiModelProperty("2 åŽŸå› åˆ†æž æ—¥æœŸ")
    private String causeAnalysisDateString;
    @ApiModelProperty("3 çº æ­£æŽªæ–½")
    private String correctiveAction;
    @ApiModelProperty("3 çº æ­£æŽªæ–½ æ—¥æœŸ")
    private String correctiveActionDateString;
    @ApiModelProperty("4 éªŒè¯éƒ¨é—¨")
    private String verificationDepartment;
    @ApiModelProperty("4 éªŒè¯éƒ¨é—¨ æ—¥æœŸ")
    private String verificationDepartmentDateString;
}
cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonSupervisionRecordDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,33 @@
package com.ruoyi.personnel.dto;
import com.ruoyi.personnel.pojo.PersonSupervisionRecord;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
public class PersonSupervisionRecordDto extends PersonSupervisionRecord {
    @ApiModelProperty("检测人员姓名")
    private String testerName;
    @ApiModelProperty("监督员姓名")
    private String supervisorName;
    @ApiModelProperty("人员list å§“名id")
    private String personnelName;
    @ApiModelProperty("技术负责人姓名")
    private String technicalDirectorName;
    @ApiModelProperty("控制单状态")
    private String currentStateControl;
    @ApiModelProperty("处理单状态")
    private String currentStateProcessing;
    @ApiModelProperty("检测日期")
    private String detectionDateString;
    @ApiModelProperty("是否需要纠正措施 1需要 ")
    private String correctiveMeasure;
}
cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonTrainingDetailedDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,35 @@
package com.ruoyi.personnel.dto;
import com.baomidou.mybatisplus.annotation.TableField;
import com.ruoyi.personnel.pojo.PersonTrainingDetailed;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
public class PersonTrainingDetailedDto extends PersonTrainingDetailed {
    @ApiModelProperty("举办部门名称")
    private String holdingDepartmentName;
    @ApiModelProperty("培训讲师名称")
    private String trainingLecturerName;
    @ApiModelProperty("当前登录人是否认领")
    private Boolean whetherClaim;
    @ApiModelProperty("培训日期")
    private String trainingDateString;
    @ApiModelProperty("报名人数")
    private Integer enrollment;
    // å¯¼å‡ºä½¿ç”¨
    @TableField(select = false, exist = false)
    @ApiModelProperty("序号(导出使用)")
    private Integer index;
    private Integer departId;
    private Integer isDisabled;
}
cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonTrainingDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,26 @@
package com.ruoyi.personnel.dto;
import com.ruoyi.personnel.pojo.PersonTraining;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
@ApiModel(value = "PersonTrainingDto对象", description = "培训计划")
public class PersonTrainingDto extends PersonTraining {
    @ApiModelProperty("编制人姓名")
    private String compilerName;
    @ApiModelProperty("审核人姓名")
    private String reviewerName;
    @ApiModelProperty("批准人姓名")
    private String approverName;
    @ApiModelProperty("创建人姓名")
    private String createUserName;
    @ApiModelProperty("当前登录人id")
    private Integer currentId;
}
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;
}
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;
}
cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonTrainingRecordSubmitDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,34 @@
package com.ruoyi.personnel.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.time.LocalDate;
@Data
public class PersonTrainingRecordSubmitDto{
    @ApiModelProperty("年度计划明细ID")
    private Integer trainingDetailedId;
    @ApiModelProperty("考核方式")
    private String assessmentMethod;
    @ApiModelProperty("本次培训综合评价")
    private String comprehensiveAssessment;
    @ApiModelProperty("评价人")
    private Integer assessmentUserId;
    @ApiModelProperty("评价时间")
    private LocalDate assessmentDate;
    private String state;
    @ApiModelProperty("课时")
    private Integer classHour;
    private String trainingAbstract;
}
cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonTrainingUpdateDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,17 @@
package com.ruoyi.personnel.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
public class PersonTrainingUpdateDto {
    @ApiModelProperty("主键id")
    private Integer id;
    @ApiModelProperty("审核/批准 å¤‡æ³¨")
    private String remarks;
    @ApiModelProperty("审核/批准 çŠ¶æ€")
    private Integer status;
}
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;
}
cnas-personnel/src/main/java/com/ruoyi/personnel/dto/TrainingRecordPersonDetailedDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,28 @@
package com.ruoyi.personnel.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
@Data
public class TrainingRecordPersonDetailedDto {
    @ApiModelProperty("培训日期")
    private String trainingDateString;
    @ApiModelProperty("培训日期")
    private Date trainingDate;
    @ApiModelProperty("培训内容")
    private String trainingContent;
    @ApiModelProperty("课时")
    private Integer classHour;
    @ApiModelProperty("考核结果")
    private String examinationResults;
    @ApiModelProperty("备注")
    private String remarks;
}
cnas-personnel/src/main/java/com/ruoyi/personnel/enumeration/AttachmentType.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,46 @@
package com.ruoyi.personnel.enumeration;
public enum AttachmentType {
    // è®¾å¤‡æ ¡å‡†è¡¨å
    SBJZ(1,"device_metric_record"),
     // åŸ¹è®­è®¡åˆ’ æ˜Žç»†è¡¨
    PXJH(2,"cnas_person_training_detailed"),
    // å…¥èŒæŽˆæƒè®°å½•
    RZSQ(3,"cnas_person_post_authorization_record"),
    ;
    private Integer type;
    private String value;
     AttachmentType(Integer type, String value) {
        this.type = type;
        this.value = value;
    }
    public Integer getType() {
        return type;
    }
    public void setType(Integer type) {
        this.type = type;
    }
    public String getValue() {
        return value;
    }
    public void setValue(String value) {
        this.value = value;
    }
    public static String getTypeValue(Integer type) {
        AttachmentType.values();
        for(AttachmentType attachmentType : AttachmentType.values()) {
            if(attachmentType.getType().equals(type)) return attachmentType.getValue();
        }
        return "";
    }
}
cnas-personnel/src/main/java/com/ruoyi/personnel/excel/PersonRewardPunishmentRecordExcel.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,34 @@
package com.ruoyi.personnel.excel;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;
@Data
public class PersonRewardPunishmentRecordExcel {
    @ExcelProperty("员工编号")
    private String account;
    @ExcelProperty("姓名")
    private String userName;
    @ExcelProperty("奖惩级别")
    private String rewardPunishLevel;
    @ExcelProperty("奖惩名称")
    private String rewardPunishName;
    @ExcelProperty("奖惩时间")
    private String rewardPunishTime;
    @ExcelProperty("奖惩单位")
    private String rewardPunishWorkUnit;
    @ExcelProperty("奖惩内容")
    private String rewardPunishContent;
    @ExcelProperty("创建时间")
    private String createTime;
    @ExcelProperty("创建人")
    private String createUserName;
}
cnas-personnel/src/main/java/com/ruoyi/personnel/excel/PersonSupervisePlanDetailsListener.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,42 @@
package com.ruoyi.personnel.excel;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.ruoyi.personnel.service.PersonSupervisePlanDetailsService;
import lombok.Data;
import java.util.ArrayList;
import java.util.List;
@Data
public class PersonSupervisePlanDetailsListener extends AnalysisEventListener<PersonSupervisePlanDetailsUpload> {
    private Integer planId;
    private static final int BATCH_COUNT = 1000;
    List<PersonSupervisePlanDetailsUpload> list = new ArrayList<>();
    private PersonSupervisePlanDetailsService personSupervisePlanDetailsService;
    public PersonSupervisePlanDetailsListener(PersonSupervisePlanDetailsService personSupervisePlanDetailsService) {
        this.personSupervisePlanDetailsService = personSupervisePlanDetailsService;
    }
    @Override
    public void invoke(PersonSupervisePlanDetailsUpload data, AnalysisContext context) {
        list.add(data);
        if (list.size() >= BATCH_COUNT) {
            save();
            list.clear();
        }
    }
    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
        save();
    }
    private void save() {
        personSupervisePlanDetailsService.importExcel(list, this.planId);
    }
}
cnas-personnel/src/main/java/com/ruoyi/personnel/excel/PersonSupervisePlanDetailsUpload.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,28 @@
package com.ruoyi.personnel.excel;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;
import java.time.LocalDateTime;
@Data
public class PersonSupervisePlanDetailsUpload {
    @ExcelProperty("监督日期")
    private LocalDateTime superviseDate;
    @ExcelProperty("监督目的")
    private String superviseDes;
    @ExcelProperty("被监督人员")
    private String supervisePerson;
    @ExcelProperty("备注")
    private String remarks;
    @ExcelProperty("监督项目")
    private String superviseProject;
    @ExcelProperty("监督原因")
    private String superviseReason;
}
cnas-personnel/src/main/java/com/ruoyi/personnel/excel/PersonTrainingDetailedListener.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,81 @@
package com.ruoyi.personnel.excel;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.ruoyi.personnel.service.PersonTrainingDetailedService;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
@Data
@Slf4j
public class PersonTrainingDetailedListener extends AnalysisEventListener<PersonTrainingDetailedUpload> {
    private Integer planId;
    private static Boolean FLAG = true;
    private static final int BATCH_COUNT = 1000;
    List<PersonTrainingDetailedUpload> list = new ArrayList<>();
    private PersonTrainingDetailedService personTrainingDetailedService;
    public PersonTrainingDetailedListener(PersonTrainingDetailedService personTrainingDetailedService,Integer planId) {
        this.personTrainingDetailedService = personTrainingDetailedService;
        this.planId = planId;
    }
    @Override
    public void invoke(PersonTrainingDetailedUpload data, AnalysisContext context) {
        log.info("解析到一条数据{}", JSON.toJSONString(data));
        int count = 0;
        int count1 = 0;
        // å¦‚果数据全为空 é‚£ä¹ˆå°±ä¸åœ¨ç»§ç»­æ·»åŠ 
        Field[] fields = data.getClass().getDeclaredFields();
        for (Field field : fields) {
            count1++;
            field.setAccessible(true);
            try {
                Object o = field.get(data); // èŽ·å–å­—æ®µå€¼
                if(Objects.isNull(o) || StringUtils.isEmpty(o.toString())) {
                    count++;
                }
            } catch (IllegalAccessException e) {
                throw new RuntimeException(e);
            }
        }
        if(count == count1) {
            FLAG = false;
        }
        if(FLAG) {
            list.add(data);
        }
        if (list.size() >= BATCH_COUNT) {
            save();
            list.clear();
        }
    }
    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
        log.info("所有数据解析完成{}",list.size());
        save();
        // æ‰€æœ‰æ•°æ®è§£æžå®Œæˆ å°†FLAG更新为true
        if(!FLAG) {
            FLAG = true;
        }
    }
    private void save() {
        personTrainingDetailedService.importExcel(list, this.planId);
    }
}
cnas-personnel/src/main/java/com/ruoyi/personnel/excel/PersonTrainingDetailedUpload.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,44 @@
package com.ruoyi.personnel.excel;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;
@Data
public class PersonTrainingDetailedUpload {
//    @ExcelProperty("培训目标")
    @ExcelProperty(index = 1)
    private String trainingObjectives;
//    @ExcelProperty("培训内容")
    @ExcelProperty(index = 2)
    private String trainingContent;
//    @ExcelProperty("培训方式")
    @ExcelProperty(index = 3)
    private String trainingMode;
//    @ExcelProperty("参加对象")
    @ExcelProperty(index = 4)
    private String participants;
//    @ExcelProperty("举办部门")
    @ExcelProperty(index = 5)
    private String holdingDepartment;
//    @ExcelProperty("培训讲师")
    @ExcelProperty(index = 6)
    private String trainingLecturerName;
//    @ExcelProperty("培训时间")
    @ExcelProperty(index = 7)
    private String trainingDate;
//    @ExcelProperty("课时")
    @ExcelProperty(index = 8)
    private String classHour;
//    @ExcelProperty("备注")
    @ExcelProperty(index = 9)
    private String remarks;
}
cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/AnnexMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,9 @@
package com.ruoyi.personnel.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.personnel.pojo.Annex;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface AnnexMapper extends BaseMapper<Annex> {
}
cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonBasicInfoMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,37 @@
package com.ruoyi.personnel.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.core.dto.DepartmentDto;
import com.ruoyi.personnel.dto.PersonBasicInfoDto;
import com.ruoyi.personnel.pojo.PersonBasicInfo;
import java.util.List;
import java.util.Map;
/**
 * <p>
 *  Mapper æŽ¥å£
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2024-08-30 09:19:57
 */
public interface PersonBasicInfoMapper extends BaseMapper<PersonBasicInfo> {
    List<DepartmentDto> selectLimsUser();
    PersonBasicInfoDto getCNASPersonnelInfo(Integer userId);
    IPage<Map<String, Object>> basicInformationOfPersonnelSelectPage(Page page, Integer departmentId);
    /**
     * äººå‘˜åŸºæœ¬ä¿¡æ¯åˆ†é¡µæŸ¥è¯¢
     * @param page
     * @param name
     * @param departmentId
     * @return
     */
    IPage<Map<String, Object>> selectPersonBasecInfoAndUser(Page page, String name, Integer departmentId);
}
cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonCommunicationAbilityMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,21 @@
package com.ruoyi.personnel.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.personnel.dto.PersonCommunicationAbilityDto;
import com.ruoyi.personnel.pojo.PersonCommunicationAbility;
import org.apache.ibatis.annotations.Param;
/**
 * <p>
 * æ²Ÿé€šèƒ½åŠ› Mapper æŽ¥å£
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2024-10-09 12:00:57
 */
public interface PersonCommunicationAbilityMapper extends BaseMapper<PersonCommunicationAbility> {
    IPage<PersonCommunicationAbilityDto> personPersonCommunicationAbilityPage(Page page, @Param("departLimsId") Integer departLimsId, @Param("userId") Integer userId, @Param("userName") String userName);
}
cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonJobResponsibilitiesMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
package com.ruoyi.personnel.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.personnel.dto.PersonJobResponsibilitiesDto;
import com.ruoyi.personnel.pojo.PersonJobResponsibilities;
/**
 * <p>
 * å²—位职责 Mapper æŽ¥å£
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2024-10-09 02:07:49
 */
public interface PersonJobResponsibilitiesMapper extends BaseMapper<PersonJobResponsibilities> {
    IPage<PersonJobResponsibilitiesDto> personJobResponsibilitiesSelect(Page page, String userId, String departmentId, String userName);
}
cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonPersonnelCapacityMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,29 @@
package com.ruoyi.personnel.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.personnel.dto.PersonPersonnelCapacityDto;
import com.ruoyi.personnel.dto.PersonPersonnelCapacityExportDto;
import com.ruoyi.personnel.pojo.PersonPersonnelCapacity;
import org.apache.ibatis.annotations.Param;
/**
 * <p>
 * äººå‘˜èƒ½åŠ› Mapper æŽ¥å£
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2024-10-10 11:26:18
 */
public interface PersonPersonnelCapacityMapper extends BaseMapper<PersonPersonnelCapacity> {
    IPage<PersonPersonnelCapacityDto> personPersonnelCapacityPage(Page page, Integer departLimsId, Integer userId, String userName);
    /**
     * æŸ¥è¯¢äººå‘˜èƒ½åŠ›æŽ¥å£
     * @param id
     * @return
     */
    PersonPersonnelCapacityExportDto selectExportPersonnelCapacity(@Param("id") Integer id);
}
cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonPostAuthorizationRecordMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
package com.ruoyi.personnel.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.personnel.dto.PersonPostAuthorizationRecordDto;
import com.ruoyi.personnel.pojo.PersonPostAuthorizationRecord;
/**
 * <p>
 * ä»»èŒæŽˆæƒè®°å½• Mapper æŽ¥å£
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2024-10-09 10:48:17
 */
public interface PersonPostAuthorizationRecordMapper extends BaseMapper<PersonPostAuthorizationRecord> {
    IPage<PersonPostAuthorizationRecordDto> personPostAuthorizationRecordPage(Page page, Integer departLimsId, Integer userId, String userName);
}
cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonRewardPunishmentRecordMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,26 @@
package com.ruoyi.personnel.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.personnel.dto.PersonRewardPunishmentRecordDto;
import com.ruoyi.personnel.excel.PersonRewardPunishmentRecordExcel;
import com.ruoyi.personnel.pojo.PersonRewardPunishmentRecord;
import java.util.Date;
import java.util.List;
/**
 * <p>
 * å¥–惩记录 Mapper æŽ¥å£
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2024-10-08 11:25:02
 */
public interface PersonRewardPunishmentRecordMapper extends BaseMapper<PersonRewardPunishmentRecord> {
    IPage<PersonRewardPunishmentRecordDto> rewardPunishmentPage(Page page, Integer userId, String userName, Date startTime, Date endTime, Integer departmentId);
    List<PersonRewardPunishmentRecordExcel> rewardPunishmentExport(Integer userId, Integer departmentId, String userName, Date startTime, Date endTime);
}
cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonSupervisePlanDetailsMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,21 @@
package com.ruoyi.personnel.mapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.framework.mybatis_config.MyBaseMapper;
import com.ruoyi.personnel.dto.PersonSupervisePlanDetailsDto;
import com.ruoyi.personnel.pojo.PersonSupervisePlanDetails;
/**
 * <p>
 * ç›‘督计划 - å­ Mapper æŽ¥å£
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2024-10-09 04:17:02
 */
public interface PersonSupervisePlanDetailsMapper extends MyBaseMapper<PersonSupervisePlanDetails> {
    IPage<PersonSupervisePlanDetailsDto> pageByDate(Page page, String date, String project, Integer planId);
}
cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonSupervisePlanMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,21 @@
package com.ruoyi.personnel.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.personnel.dto.PersonSupervisePlanDto;
import com.ruoyi.personnel.pojo.PersonSupervisePlan;
/**
 * <p>
 * ç›‘督计划 - çˆ¶ Mapper æŽ¥å£
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2024-10-09 04:14:45
 */
public interface PersonSupervisePlanMapper extends BaseMapper<PersonSupervisePlan> {
    IPage<PersonSupervisePlanDto> pageByPerson(Page page, String organizationPerson,Integer departId);
}
cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonSupervisionControlSheetMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,25 @@
package com.ruoyi.personnel.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.personnel.dto.PersonSupervisionControlSheetExportDto;
import com.ruoyi.personnel.pojo.PersonSupervisionControlSheet;
import org.apache.ibatis.annotations.Param;
/**
 * <p>
 * ç›‘督记录 - æŽ§åˆ¶å• Mapper æŽ¥å£
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2024-10-10 05:18:57
 */
public interface PersonSupervisionControlSheetMapper extends BaseMapper<PersonSupervisionControlSheet> {
    /**
     * æŸ¥è¯¢ç›‘督记录控制单
     * @param supervisionRecordId
     */
    PersonSupervisionControlSheetExportDto selectSupervisionControl(@Param("supervisionRecordId") Integer supervisionRecordId);
}
cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonSupervisionProcessingSheetMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,24 @@
package com.ruoyi.personnel.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.personnel.dto.PersonSupervisionProcessingSheetDto;
import com.ruoyi.personnel.pojo.PersonSupervisionProcessingSheet;
import org.apache.ibatis.annotations.Param;
/**
 * <p>
 * ç›‘督记录 - å¤„理单 Mapper æŽ¥å£
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2024-10-10 05:35:58
 */
public interface PersonSupervisionProcessingSheetMapper extends BaseMapper<PersonSupervisionProcessingSheet> {
    /**
     * æŸ¥è¯¢äººå‘˜ç›‘督记录处理单
     * @param supervisionRecordId
     * @return
     */
    PersonSupervisionProcessingSheetDto selectProcessingSheet(@Param("supervisionRecordId") Integer supervisionRecordId);
}
cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonSupervisionRecordMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,27 @@
package com.ruoyi.personnel.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.personnel.dto.PersonSupervisionRecordDto;
import com.ruoyi.personnel.pojo.PersonSupervisionRecord;
/**
 * <p>
 * ç›‘督记录 Mapper æŽ¥å£
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2024-10-10 04:16:49
 */
public interface PersonSupervisionRecordMapper extends BaseMapper<PersonSupervisionRecord> {
    IPage<PersonSupervisionRecordDto> personSupervisionRecordPage(Page page, Integer userId, Integer departLimsId, String userName);
    /**
     * æŸ¥è¯¢ç›‘督记录详情
     * @param id
     * @return
     */
    PersonSupervisionRecordDto selectPersonSupervisionRecord(Integer id);
}
cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonTrackRecordMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,24 @@
package com.ruoyi.personnel.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.personnel.pojo.PersonTrackRecord;
import java.util.List;
/**
 * <p>
 * å·¥ä½œå±¥åކ Mapper æŽ¥å£
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2024-09-02 03:13:03
 */
public interface PersonTrackRecordMapper extends BaseMapper<PersonTrackRecord> {
    IPage<PersonTrackRecord> personTrackRecordSelect(Page page, String userId, String departLimsId);
    List<PersonTrackRecord> personTrackRecordExport(String userId, String departLimsId);
}
cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonTrainingDetailedMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,43 @@
package com.ruoyi.personnel.mapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.framework.mybatis_config.MyBaseMapper;
import com.ruoyi.personnel.dto.PersonTrainingDetailedDto;
import com.ruoyi.personnel.pojo.PersonTrainingDetailed;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
 * <p>
 * åŸ¹è®­è®¡åˆ’详情 Mapper æŽ¥å£
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2024-10-11 01:46:27
 */
public interface PersonTrainingDetailedMapper extends MyBaseMapper<PersonTrainingDetailed> {
    IPage<PersonTrainingDetailedDto> queryTheAnnualPlanDetailsTable(Page page,
                                                                    String trainingLecturerName,
                                                                    String courseCode, String trainingDate,
                                                                    Integer id,
                                                                    Integer userId,
                                                                    Integer loginUserId,
                                                                    Integer state);
    /**
     * æ ¹æ®ä¸»è¡¨id查询详情
     * @param trainingId
     * @return
     */
    List<PersonTrainingDetailedDto> selectTrainingList(@Param("trainingId") Integer trainingId);
    /**
     * æŸ¥è¯¢è¯¦ç»†
     * @param id
     * @return
     */
    PersonTrainingDetailedDto selectTrainingDetail(@Param("id") Integer id);
}
cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonTrainingFileMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,9 @@
package com.ruoyi.personnel.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.personnel.pojo.PersonTrainingFile;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface PersonTrainingFileMapper extends BaseMapper<PersonTrainingFile> {
}
cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonTrainingMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
package com.ruoyi.personnel.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.personnel.dto.PersonTrainingDto;
import com.ruoyi.personnel.pojo.PersonTraining;
/**
 * <p>
 * åŸ¹è®­è®¡åˆ’ Mapper æŽ¥å£
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2024-10-11 01:11:49
 */
public interface PersonTrainingMapper extends BaseMapper<PersonTraining> {
    IPage<PersonTrainingDto> personTrainingSelect(Page page, String compilerName, Integer departLimsId);
}
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);
}
cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/Annex.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,48 @@
package com.ruoyi.personnel.pojo;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
@Data
@TableName("cnas_annex")
@ApiModel("人员基本信息附件表")
public class Annex implements Serializable {
    @TableId(type = IdType.AUTO)
    private Integer id;
    @ApiModelProperty(value = "user表id")
    private Integer userId;
    @ApiModelProperty(value = "证件号")
    private String idNumber;
    @ApiModelProperty(value = "发证单位")
    private String issueUnit;
    @ApiModelProperty(value = "文件名称")
    private String fileName;
    @ApiModelProperty(value = "级别")
    private String level;
    @ApiModelProperty(value = "有效期")
    private String periodValidity;
    @ApiModelProperty(value = "添加时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    @ApiModelProperty(value = "复印件")
    private String copy;
    @ApiModelProperty(value = "原件")
    private String original;
}
cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonBasicInfo.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,271 @@
package com.ruoyi.personnel.pojo;
import com.alibaba.excel.annotation.ExcelProperty;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
import java.time.LocalDate;
/**
 * <p>
 *
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2024-08-30 09:19:57
 */
@Getter
@Setter
@TableName("cnas_person_basic_info")
@ApiModel(value = "PersonBasicInfo对象", description = "")
public class PersonBasicInfo implements Serializable {
    private static final long serialVersionUID = 1L;
    @ApiModelProperty("主键id")
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    @ApiModelProperty("当前状态")
    private String currentState;
    @ApiModelProperty("入职时间")
    @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8")
    @TableField(updateStrategy = FieldStrategy.IGNORED) // ä¸ºç©ºå¯ä»¥æ›´æ–°
    private LocalDate entryTime;
    @ApiModelProperty("当前职务")
    private String currentPosition;
    @ApiModelProperty("岗位")
    private String post;
    @ApiModelProperty("部门编号")
    private String departmentCode;
    @ApiModelProperty("职称")
    @ExcelProperty("职称")
    private String professionalTitle;
    @ApiModelProperty("性别")
    private String sex;
    @ApiModelProperty("人员分类")
    private String personnelClassification;
    @ApiModelProperty("出生日期")
    @TableField(updateStrategy = FieldStrategy.IGNORED) // ä¸ºç©ºå¯ä»¥æ›´æ–°
    @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8")
    private LocalDate dateBirth;
    @ApiModelProperty("身份证号")
    @ExcelProperty("证件号码")
    private String identityCard;
    @ApiModelProperty("民族")
    private String nation;
    @ApiModelProperty("政治面貌")
    private String politicalStatus;
    @ApiModelProperty("最高学历")
    @ExcelProperty("最高学历")
    private String officialAcademicRedentials;
    @ApiModelProperty("毕业时间1")
    @ExcelProperty("毕业时间")
    @TableField(updateStrategy = FieldStrategy.IGNORED) // ä¸ºç©ºå¯ä»¥æ›´æ–°
    @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8")
    private LocalDate graduationTime1;
    @ApiModelProperty("毕业院校1")
    @ExcelProperty("毕业院校")
    private String graduatedInstitutions1;
    @ApiModelProperty("专业1")
    @ExcelProperty("所学专业")
    private String major1;
    @ApiModelProperty("毕业时间2")
    @TableField(updateStrategy = FieldStrategy.IGNORED) // ä¸ºç©ºå¯ä»¥æ›´æ–°
    @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8")
    private LocalDate graduationTime2;
    @ApiModelProperty("毕业院校2")
    private String graduatedInstitutions2;
    @ApiModelProperty("专业2")
    private String major2;
    @ApiModelProperty("手机号")
    private String telephone;
    @ApiModelProperty("计划实习结束")
    @TableField(updateStrategy = FieldStrategy.IGNORED) // ä¸ºç©ºå¯ä»¥æ›´æ–°
    @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8")
    private LocalDate endPlannedInternship;
    @ApiModelProperty("实际实习结束")
    @TableField(updateStrategy = FieldStrategy.IGNORED) // ä¸ºç©ºå¯ä»¥æ›´æ–°
    @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8")
    private LocalDate endPracticalPractice;
    @ApiModelProperty("离职日期")
    @TableField(updateStrategy = FieldStrategy.IGNORED) // ä¸ºç©ºå¯ä»¥æ›´æ–°
    @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8")
    private LocalDate dateDeparture;
    @ApiModelProperty("桌面图片")
    private String desktopPicture;
    @ApiModelProperty("附件资料")
    private String attachmentInformation;
    @ApiModelProperty("备注")
    private String remarks;
    @ApiModelProperty("用户表(user)id")
    private Integer userId;
//
    @ApiModelProperty("工号")
    private String jobNumber;
    @ApiModelProperty("员工子编号")
    private String subordinateNumber;
    @ApiModelProperty("公司名称")
    private String corporateName;
    @ApiModelProperty("岗位类别")
    private String postType;
    @ApiModelProperty("岗位编号")
    private String postCode;
    @ApiModelProperty("岗位名称")
    private String postName;
    @ApiModelProperty("入集团时间")
    @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8")
    @TableField(updateStrategy = FieldStrategy.IGNORED) // ä¸ºç©ºå¯ä»¥æ›´æ–°
    @ExcelProperty("入集团时间")
    private LocalDate groupTime;
    @ApiModelProperty("入单位时间")
    @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8")
    @TableField(updateStrategy = FieldStrategy.IGNORED) // ä¸ºç©ºå¯ä»¥æ›´æ–°
    @ExcelProperty("入单位时间")
    private LocalDate unitTime;
    @ApiModelProperty("年龄")
    private Integer personBasicInfoAge;
    @ApiModelProperty("直接上级")
    private String reportingTo;
    @ApiModelProperty("劳动关系")
    private String laborRelations;
    @ApiModelProperty("试用开始时间")
    @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8")
    @TableField(updateStrategy = FieldStrategy.IGNORED) // ä¸ºç©ºå¯ä»¥æ›´æ–°
    private LocalDate trialStartTime;
    @ApiModelProperty("试用结束时间")
    @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8")
    @TableField(updateStrategy = FieldStrategy.IGNORED) // ä¸ºç©ºå¯ä»¥æ›´æ–°
    private LocalDate trialEndTime;
    @ApiModelProperty("籍贯")
    @ExcelProperty("籍贯")
    private String nativePlace;
    @ApiModelProperty("证件类型")
    private String idType;
    @ApiModelProperty("证件有效期")
    @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8")
    @TableField(updateStrategy = FieldStrategy.IGNORED) // ä¸ºç©ºå¯ä»¥æ›´æ–°
    private LocalDate validityPeriod;
    @ApiModelProperty("婚姻状况")
    private String maritalStatus;
    @ApiModelProperty("证件地址")
    @ExcelProperty("证件地址")
    private String idAddress;
    @ApiModelProperty("证件详细地址")
    private String idDetailAddress;
    @ApiModelProperty("现居地址")
    private String currentAddress;
    @ApiModelProperty("现居详细地址")
    private String currentDetailAddress;
    @ApiModelProperty("送达地址")
    private String serviceAddress;
    @ApiModelProperty("送达详细地址")
    private String serviceDetailAddress;
    @ApiModelProperty("是否退伍军人")
    private String retiredSoldiers;
    @ApiModelProperty("入党/团时间")
    @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8")
    @TableField(updateStrategy = FieldStrategy.IGNORED) // ä¸ºç©ºå¯ä»¥æ›´æ–°
    private LocalDate dumplingTime;
    @ApiModelProperty("短号")
    private String cornet;
    @ApiModelProperty("办公电话")
    private String officePhone;
    @ApiModelProperty("计算机等级")
    private String ncre;
    @ApiModelProperty("最高学位")
    @ExcelProperty("最高学位")
    private String highestDegree;
    @ApiModelProperty("是否全日制")
    private Integer fullTime;
    @ApiModelProperty("是否属于中天")
    private Integer enroll;
    @ApiModelProperty("XX届大学生")
    private String collegeStudents;
    @ApiModelProperty("紧急联系人")
    @ExcelProperty("紧急联系人")
    private String emergencyContact;
    @ApiModelProperty("紧急联系人电话")
    @ExcelProperty("紧急联系人电话")
    private String emergencyContactPhone;
    @ApiModelProperty("公司邮箱")
    private String companyEmail;
    @ApiModelProperty("最后更新时间")
    @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDate lastUpdateTime;
    @ApiModelProperty("试验室")
    private String sonLaboratory;
}
cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonCommunicationAbility.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,61 @@
package com.ruoyi.personnel.pojo;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
 * <p>
 * æ²Ÿé€šè®°å½•
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2024-10-09 12:00:57
 */
@Getter
@Setter
@TableName("cnas_person_communication_ability")
@ApiModel(value = "PersonCommunicationAbility对象", description = "沟通记录")
public class PersonCommunicationAbility implements Serializable {
    private static final long serialVersionUID = 1L;
    @ApiModelProperty("主键id")
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    @ApiModelProperty("沟通人id")
    private String userId;
    @ApiModelProperty("沟通时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime communicationTime;
    @ApiModelProperty("沟通地点")
    private String communicationPlace;
    @ApiModelProperty("沟通内容")
    private String communicationContent;
    @ApiModelProperty("创建人id")
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    @ApiModelProperty(value = "更新人id", hidden = true)
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    @ApiModelProperty(value = "创建时间", hidden = true)
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    @ApiModelProperty(value = "更新时间", hidden = true)
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
}
cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonJobResponsibilities.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,78 @@
package com.ruoyi.personnel.pojo;
import com.baomidou.mybatisplus.annotation.*;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
 * <p>
 * å²—位职责
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2024-10-09 02:07:49
 */
@Getter
@Setter
@TableName("cnas_person_job_responsibilities")
@ApiModel(value = "PersonJobResponsibilities对象", description = "岗位职责")
public class PersonJobResponsibilities implements Serializable {
    private static final long serialVersionUID = 1L;
    @ApiModelProperty("主键id")
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    @ApiModelProperty("1岗位名称")
    private String postName;
    @ApiModelProperty("1工作目标")
    private String jobObjective;
    @ApiModelProperty("1岗位职责")
    private String jobResponsibilities;
    @ApiModelProperty("1任职人id")
    private String incumbentId;
    @ApiModelProperty("1 æäº¤æ“ä½œäºº")
    private String submittingOperator;
    @ApiModelProperty("1提交日期")
    private LocalDateTime submittingDate;
    @ApiModelProperty("2 ä»»èŒäºº ä¸»ç®¡id")
    private Integer supervisorId;
    @ApiModelProperty("2 ä»»èŒäºº æ“ä½œäºº")
    private String incumbentOperator;
    @ApiModelProperty("2 ä»»èŒäºº æ—¥æœŸ")
    private LocalDateTime incumbentDate;
    @ApiModelProperty("3 ä¸»ç®¡ æ“ä½œäºº")
    private String supervisorOperator;
    @ApiModelProperty("3 ä¸»ç®¡ æ—¥æœŸ")
    private LocalDateTime supervisorDate;
    @ApiModelProperty(value = "创建人id", hidden = true)
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    @ApiModelProperty("当前状态")
    private String currentState;
    @ApiModelProperty(value = "创建日期 / æäº¤æ—¥æœŸ", hidden = true)
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    @ApiModelProperty("当前负责人")
    private String currentResponsible;
}
cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonPersonnelCapacity.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,122 @@
package com.ruoyi.personnel.pojo;
import com.baomidou.mybatisplus.annotation.*;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
 * <p>
 * äººå‘˜èƒ½åŠ›
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2024-10-10 11:26:18
 */
@Getter
@Setter
@TableName("cnas_person_personnel_capacity")
@ApiModel(value = "PersonPersonnelCapacity对象", description = "人员能力")
public class PersonPersonnelCapacity implements Serializable {
    private static final long serialVersionUID = 1L;
    @ApiModelProperty("主键id")
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    @ApiModelProperty("学历")
    private String academicDegree;
    @ApiModelProperty("学历 ç¬¦åˆä¸Žå¦(1:符合;2:不符合;3:不适用)")
    private Integer academicConformNot;
    @ApiModelProperty("学历 å¤‡æ³¨")
    private String academicRemarks;
    @ApiModelProperty("相关年限")
    private String relatedYears;
    @ApiModelProperty("相关年限  ç¬¦åˆä¸Žå¦(1:符合;2:不符合;3:不适用)")
    private Integer relatedYearsConformNot;
    @ApiModelProperty("相关年限 å¤‡æ³¨")
    private String relatedYearsRemarks;
    @ApiModelProperty("相关培训")
    private String relatedTraining;
    @ApiModelProperty("相关培训 ç¬¦åˆä¸Žå¦(1:符合;2:不符合;3:不适用)")
    private Integer relatedTrainingConformNot;
    @ApiModelProperty("相关培训 å¤‡æ³¨")
    private String relatedTrainingRemarks;
    @ApiModelProperty("相关经验")
    private String relevantExperience;
    @ApiModelProperty("相关经验 ç¬¦åˆä¸Žå¦(1:符合;2:不符合;3:不适用)")
    private Integer relevantExperienceConformNot;
    @ApiModelProperty("相关经验 å¤‡æ³¨")
    private String relevantExperienceRemarks;
    @ApiModelProperty("上岗证")
    private String workLicense;
    @ApiModelProperty("上岗证 ç¬¦åˆä¸Žå¦(1:符合;2:不符合;3:不适用)")
    private Integer workLicenseConformNot;
    @ApiModelProperty("上岗证 å¤‡æ³¨")
    private String workLicenseRemarks;
    @ApiModelProperty("岗位职责")
    private String jobResponsibilities;
    @ApiModelProperty("岗位职责 ç¬¦åˆä¸Žå¦(1:符合;2:不符合;3:不适用)")
    private Integer jobResponsibilitiesConformNot;
    @ApiModelProperty("岗位职责 å¤‡æ³¨")
    private String jobResponsibilitiesRemarks;
    @ApiModelProperty("综合评价")
    private String comprehensiveAssessment;
    @ApiModelProperty("1 æäº¤id æ“ä½œäºº")
    private Integer submitOperatingPersonnelId;
    @ApiModelProperty("1 æäº¤ æ—¥æœŸ")
    private LocalDateTime submitDate;
    @ApiModelProperty("2 ç¡®è®¤äºº userId主键")
    private Integer confirmOperatingPersonnelId;
    @ApiModelProperty("2 ç¡®è®¤äºº æ—¥æœŸ")
    private LocalDateTime confirmDate;
    @ApiModelProperty(value = "创建日期", hidden = true)
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    @ApiModelProperty(value = "更新日期", hidden = true)
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
    @ApiModelProperty(value = "创建人", hidden = true)
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    @ApiModelProperty(value = "更新人", hidden = true)
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    @ApiModelProperty(value = "人员姓名 id")
    private Integer userId;
    @ApiModelProperty(value = "职称")
    private String technicalPost;
}
cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonPostAuthorizationRecord.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,74 @@
package com.ruoyi.personnel.pojo;
import com.baomidou.mybatisplus.annotation.*;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
 * <p>
 * ä»»èŒæŽˆæƒè®°å½•
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2024-10-09 10:48:17
 */
@Getter
@Setter
@TableName("cnas_person_post_authorization_record")
@ApiModel(value = "PersonPostAuthorizationRecord对象", description = "任职授权记录")
public class PersonPostAuthorizationRecord implements Serializable {
    private static final long serialVersionUID = 1L;
    @ApiModelProperty("主键id")
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    @ApiModelProperty("证书编号")
    private String certificateNumber;
    @ApiModelProperty("被任职人员id")
    private String userId;
    @ApiModelProperty("任职岗位")
    private String post;
    @ApiModelProperty("操作类型")
    private String operationType;
    @ApiModelProperty("原文件名称")
    private String fileName;
    @ApiModelProperty("系统生成文件名称")
    private String systemFileName;
    @ApiModelProperty("备注")
    private String remarks;
    @ApiModelProperty(value = "创建时间", hidden = true)
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    @ApiModelProperty(value = "更新时间", hidden = true)
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
    @ApiModelProperty(value = "更新人id",hidden = true)
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    @ApiModelProperty(value = "创建人id", hidden = true)
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    @ApiModelProperty("理论知识考试成绩")
    private String num1;
    @ApiModelProperty("操作技能考试成绩")
    private String num2;
}
cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonRewardPunishmentRecord.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,61 @@
package com.ruoyi.personnel.pojo;
import com.baomidou.mybatisplus.annotation.*;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
 * <p>
 * å¥–惩记录
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2024-10-08 11:25:02
 */
@Getter
@Setter
@TableName("cnas_person_reward_punishment_record")
@ApiModel(value = "PersonRewardPunishmentRecord对象", description = "奖惩记录")
public class PersonRewardPunishmentRecord implements Serializable {
    private static final long serialVersionUID = 1L;
    @ApiModelProperty("主键id")
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    @ApiModelProperty("奖惩级别")
    private String rewardPunishLevel;
    @ApiModelProperty("奖惩名称")
    private String rewardPunishName;
    @ApiModelProperty("奖惩时间")
    private LocalDateTime rewardPunishTime;
    @ApiModelProperty("奖惩单位")
    private String rewardPunishWorkUnit;
    @ApiModelProperty("奖惩内容")
    private String rewardPunishContent;
    @ApiModelProperty("用户id")
    private Integer userId;
    @ApiModelProperty(value = "创建时间", hidden = true)
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    @ApiModelProperty(value = "更新时间", hidden = true)
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime updateTime;
    @ApiModelProperty(value = "创建人", hidden = true)
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
}
cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonSupervisePlan.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,66 @@
package com.ruoyi.personnel.pojo;
import com.baomidou.mybatisplus.annotation.*;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
 * <p>
 * ç›‘督计划 - çˆ¶
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2024-10-09 04:14:45
 */
@Data
@TableName("cnas_person_supervise_plan")
@ApiModel(value = "PersonSupervisePlan对象", description = "监督计划 - çˆ¶")
public class PersonSupervisePlan implements Serializable {
    private static final long serialVersionUID = 1L;
    @ApiModelProperty("主键id")
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    @ApiModelProperty("文件名称")
    private String fileName;
    @ApiModelProperty("编制人id")
    private Integer organizationPersonId;
    @ApiModelProperty("编制日期")
    private LocalDateTime organizationDate;
    @ApiModelProperty("批准人id")
    private Integer approvalId;
    @ApiModelProperty("批准人日期")
    private LocalDateTime approvalDate;
    @ApiModelProperty("批准状态(1通过/0不通过)")
    private Integer approvalStatus;
    @ApiModelProperty(value = "创建时间", hidden = true)
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    @ApiModelProperty(value = "创建人id", hidden = true)
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    @ApiModelProperty(value = "更新时间", hidden = true)
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
    @ApiModelProperty(value = "更新人id",hidden = true)
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    @ApiModelProperty("部门id")
    private Integer departId;
}
cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonSupervisePlanDetails.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,73 @@
package com.ruoyi.personnel.pojo;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
import java.time.LocalDate;
import java.time.LocalDateTime;
/**
 * <p>
 * ç›‘督计划 - å­
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2024-10-09 04:17:02
 */
@Getter
@Setter
@TableName("cnas_person_supervise_plan_details")
@ApiModel(value = "PersonSupervisePlanDetails对象", description = "监督计划 - å­")
public class PersonSupervisePlanDetails implements Serializable {
    private static final long serialVersionUID = 1L;
    @ApiModelProperty("主键id")
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8")
    @ApiModelProperty("监督日期")
    private LocalDate superviseDate;
    @ApiModelProperty("监督目的")
    private String superviseDes;
    @ApiModelProperty("被监督人员")
    private String supervisePerson;
    @ApiModelProperty("备注")
    private String remarks;
    @ApiModelProperty("监督项目")
    private String superviseProject;
    @ApiModelProperty("监督原因")
    private String superviseReason;
    @ApiModelProperty(value = "创建时间", hidden = true)
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    @ApiModelProperty(value = "创建人", hidden = true)
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    @ApiModelProperty("监督计划 - çˆ¶ id")
    private Integer planId;
    //序号, å¯¼å‡ºä½¿ç”¨
    @TableField(select = false, exist = false)
    private Integer index;
    // å¯¼å‡ºä½¿ç”¨
    @TableField(select = false, exist = false)
    @ApiModelProperty("监督日期")
    private String superviseDateString;
}
cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonSupervisionControlSheet.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,113 @@
package com.ruoyi.personnel.pojo;
import com.baomidou.mybatisplus.annotation.*;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
import java.time.LocalDate;
import java.time.LocalDateTime;
/**
 * <p>
 * ç›‘督记录 - æŽ§åˆ¶å•
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2024-10-10 05:18:57
 */
@Getter
@Setter
@TableName("cnas_person_supervision_control_sheet")
@ApiModel(value = "PersonSupervisionControlSheet对象", description = "监督记录 - æŽ§åˆ¶å•")
public class PersonSupervisionControlSheet implements Serializable {
    private static final long serialVersionUID = 1L;
    @ApiModelProperty("主键id")
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    @ApiModelProperty("1发生部门id")
    private Integer occurrenceDepartment;
    @ApiModelProperty("1部门负责人id")
    private Integer departmentHeadId;
    @ApiModelProperty("1不符合工作发现途径字典id")
    private String discoveryApproach;
    @ApiModelProperty("1不符合工作的详细记录")
    private String notConformDetails;
    @ApiModelProperty("1不符合的依据及条款号")
    private String nonConformityClause;
    @ApiModelProperty("1发现部门 è´Ÿè´£äººid")
    private Integer discovererId;
    @ApiModelProperty("1发现部门 - æ—¥æœŸ")
    private LocalDateTime discovererDate;
    @ApiModelProperty("2被监督人id")
    private Integer supervisedPersonId;
    @ApiModelProperty("2被监督人 - æ—¥æœŸ")
    private String supervisedPersonDate;
    @ApiModelProperty("3消除不符合工作所采取的措施")
    private String treatmentMeasures;
    @ApiModelProperty("3责任部门")
    private Integer responsibleDepartmentId;
    @ApiModelProperty("3责任部门 è´Ÿè´£äººid")
    private Integer responsibleDepartmentPersonId;
    @ApiModelProperty("3责任部门 æ—¥æœŸ")
    private LocalDateTime responsibleDepartmentDate;
    @ApiModelProperty("4是否需要采取纠正措施")
    private Integer correctiveMeasure;
    @ApiModelProperty("4纠正措施处理单跟踪")
    private Integer correctiveMeasureFollowTracks;
    @ApiModelProperty("4纠正措施 æŠ€æœ¯è´Ÿè´£äººid")
    private Integer correctiveMeasurePersonId;
    @ApiModelProperty("4纠正措施 æ—¥æœŸ")
    private LocalDateTime correctiveMeasureDate;
    @ApiModelProperty("5是否通知客户(1:是;2:否)")
    private Integer whetherInformCustomer;
    @ApiModelProperty("5是否恢复工作(1:是;2:否)")
    private Integer whetherResumeWork;
    @ApiModelProperty("5质量负责人id")
    private Integer qualitySupervisorId;
    @ApiModelProperty("5质量负责人日期")
    private LocalDateTime qualitySupervisorDate;
    @ApiModelProperty(value = "提交人id", hidden = true)
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    @ApiModelProperty("当前状态")
    private String currentState;
    @ApiModelProperty(value = "创建日期 / æäº¤æ—¥æœŸ", hidden = true)
    @TableField(fill = FieldFill.INSERT)
    private LocalDate createTime;
    @ApiModelProperty("当前负责人")
    private String currentResponsible;
    @ApiModelProperty("监督记录id")
    private Integer supervisionRecordId;
}
cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonSupervisionProcessingSheet.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,99 @@
package com.ruoyi.personnel.pojo;
import com.baomidou.mybatisplus.annotation.*;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
 * <p>
 * ç›‘督记录 - å¤„理单
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2024-10-10 05:35:58
 */
@Getter
@Setter
@TableName("cnas_person_supervision_processing_sheet")
@ApiModel(value = "PersonSupervisionProcessingSheet对象", description = "监督记录 - å¤„理单")
public class PersonSupervisionProcessingSheet implements Serializable {
    private static final long serialVersionUID = 1L;
    @ApiModelProperty("主键id")
    @TableId(value = "processing_id", type = IdType.AUTO)
    private Integer processingId;
    @ApiModelProperty("1 ä¸ç¬¦åˆæˆ–偏离事实的描述")
    private String descriptionNonconformity;
    @ApiModelProperty("1 æå‡ºéƒ¨é—¨")
    private String proposingDepartment;
    @ApiModelProperty("1 æå‡ºéƒ¨é—¨ äººå‘˜ id")
    private Integer proposingDepartmentPersonId;
    @ApiModelProperty("1 æå‡ºéƒ¨é—¨ æ—¥æœŸ")
    private LocalDateTime proposingDepartmentDate;
    @ApiModelProperty("2 åŽŸå› åˆ†æž")
    private String causeAnalysis;
    @ApiModelProperty("2 åŽŸå› åˆ†æž éƒ¨é—¨")
    private Integer causeAnalysisId;
    @ApiModelProperty("2 åŽŸå› åˆ†æž éƒ¨é—¨ äººå‘˜ id")
    private Integer causeAnalysisPersonId;
    @ApiModelProperty("2 åŽŸå› åˆ†æž æ—¥æœŸ")
    private LocalDateTime causeAnalysisDate;
    @ApiModelProperty("3 çº æ­£æŽªæ–½")
    private String correctiveMeasure;
    @ApiModelProperty("3 çº æ­£æŽªæ–½ æå‡ºè¦æ±‚部门确认")
    private String requestDepartmentConfirmation;
    @ApiModelProperty("3 çº æ­£æŽªæ–½ éƒ¨é—¨")
    private Integer correctiveDepartId;
    @ApiModelProperty("3 çº æ­£æŽªæ–½ äººå‘˜id")
    private Integer correctiveActionId;
    @ApiModelProperty("3 çº æ­£æŽªæ–½ æ—¥æœŸ")
    private LocalDateTime correctiveActionDate;
    @ApiModelProperty("4 å®žæ–½éªŒè¯ç»“æžœ")
    private String implementationVerificationResults;
    @ApiModelProperty("4 éªŒè¯éƒ¨é—¨")
    private String verificationDepartment;
    @ApiModelProperty("4 éªŒè¯éƒ¨é—¨ äººå‘˜id")
    private Integer verificationDepartmentPersonId;
    @ApiModelProperty("4 éªŒè¯éƒ¨é—¨ æ—¥æœŸ")
    private LocalDateTime verificationDepartmentDate;
    @ApiModelProperty(value = "提交人id", hidden = true)
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    @ApiModelProperty("当前状态")
    private String currentState;
    @ApiModelProperty(value = "创建日期 / æäº¤æ—¥æœŸ", hidden = true)
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    @ApiModelProperty("当前负责人")
    private String currentResponsible;
    @ApiModelProperty("监督记录id")
    private Integer supervisionRecordId;
}
cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonSupervisionRecord.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,107 @@
package com.ruoyi.personnel.pojo;
import com.baomidou.mybatisplus.annotation.*;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
import java.time.LocalDate;
import java.time.LocalDateTime;
/**
 * <p>
 * ç›‘督记录
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2024-10-10 04:16:49
 */
@Getter
@Setter
@TableName("cnas_person_supervision_record")
@ApiModel(value = "PersonSupervisionRecord对象", description = "监督记录")
public class PersonSupervisionRecord implements Serializable {
    private static final long serialVersionUID = 1L;
    @ApiModelProperty("主键id")
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    @ApiModelProperty("检测人员id")
    private Integer testerId;
    @ApiModelProperty("监督员id")
    private Integer supervisorId;
    @ApiModelProperty("检测项目")
    private String testItem;
    @ApiModelProperty("样品编号")
    private String sampleNumber;
    @ApiModelProperty("检测方法")
    private String testMethod;
    @ApiModelProperty("检测记录")
    private String testingRecords;
    @ApiModelProperty("检测日期")
    private LocalDate detectionDate;
    @ApiModelProperty("人员id")
    private String personnel;
    @ApiModelProperty("仪器设备")
    private String instrumentEquipment;
    @ApiModelProperty("工作环境")
    private String workingEnvironment;
    @ApiModelProperty("样品采集")
    private String sampleCollection;
    @ApiModelProperty("样品的准备")
    private String samplePreparation;
    @ApiModelProperty("检测报告")
    private String testReport;
    @ApiModelProperty("监督情况评价")
    private String evaluationSupervisionSituation;
    @ApiModelProperty("不符合处理意见")
    private String doNotMeetTheHandlingOpinions;
    @ApiModelProperty("技术负责人id")
    private Integer technicalDirector;
    @ApiModelProperty("技术负责人审批日期")
    private LocalDateTime technicalDirectorDate;
    @ApiModelProperty(value = "创建日期", hidden = true)
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    @ApiModelProperty(value = "更新日期", hidden = true)
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
    @ApiModelProperty(value = "创建人id", hidden = true)
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    @ApiModelProperty(value = "更新人id", hidden = true)
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    @ApiModelProperty("当前负责人")
    private String currentResponsible;
    @ApiModelProperty("当前状态")
    private String currentState;
    private Integer departLimsId;
}
cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonTrackRecord.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,83 @@
package com.ruoyi.personnel.pojo;
import com.alibaba.excel.annotation.ExcelIgnore;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.write.style.ColumnWidth;
import com.baomidou.mybatisplus.annotation.*;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
 * <p>
 * å·¥ä½œå±¥åކ
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2024-09-02 03:13:03
 */
@Getter
@Setter
@TableName("cnas_person_track_record")
@ApiModel(value = "PersonTrackRecord对象", description = "工作履历")
@ExcelIgnoreUnannotated
public class PersonTrackRecord implements Serializable {
    private static final long serialVersionUID = 1L;
    @ExcelIgnore
    @ApiModelProperty("主键id")
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    @ColumnWidth(value = 18)
    @ExcelProperty(value = "起始时间")
    @ApiModelProperty("起始时间")
    private LocalDateTime startTime;
    @ExcelProperty(value = "结束时间")
    @ColumnWidth(value = 18)
    @ApiModelProperty("结束时间")
    private LocalDateTime endTime;
    @ExcelProperty(value = "工作单位")
    @ApiModelProperty("工作单位")
    private String placeWork;
    @ExcelProperty(value = "部门")
    @ApiModelProperty("部门")
    private String department;
    @ExcelProperty(value = "职务")
    @ApiModelProperty("职务")
    private String post;
    @ExcelProperty(value = "备注")
    @ApiModelProperty("备注")
    private String remarks;
    @ColumnWidth(value = 18)
    @ExcelProperty(value = "创建时间")
    @ApiModelProperty("创建时间")
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    @ApiModelProperty("创建人")
    @TableField(fill = FieldFill.INSERT)
    private String createUser;
    @ApiModelProperty("用户表(user)id")
    private Integer userId;
    private String fileName;
    @TableField(exist = false,select = false)
    @ExcelProperty(value = "用户名称")
    @ApiModelProperty("用户名称")
    private String name;
}
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("编制人id")
    private Integer compilerId;
    @ApiModelProperty("编制日期")
    private LocalDateTime compilationDate;
    @ApiModelProperty("审核人id")
    private Integer reviewerId;
    @ApiModelProperty("审核日期")
    private LocalDateTime auditDate;
    @ApiModelProperty("审核状态")
    private Integer reviewerStatus;
    @ApiModelProperty("审核备注")
    private String auditRemarks;
    @ApiModelProperty("批准人id")
    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("创建人id")
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    @ApiModelProperty("更新时间")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
    @ApiModelProperty("更新人id")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    @ApiModelProperty("部门id")
    private Integer departId;
}
cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonTrainingDetailed.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,124 @@
package com.ruoyi.personnel.pojo;
import com.baomidou.mybatisplus.annotation.*;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
import java.time.LocalDate;
import java.time.LocalDateTime;
/**
 * <p>
 * åŸ¹è®­è®¡åˆ’详情
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2024-10-11 01:46:27
 */
@Getter
@Setter
@TableName("cnas_person_training_detailed")
@ApiModel(value = "PersonTrainingDetailed对象", description = "培训计划详情")
public class PersonTrainingDetailed implements Serializable {
    private static final long serialVersionUID = 1L;
    @ApiModelProperty("培训计划")
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    @ApiModelProperty("课程编号")
    private String courseCode;
    @ApiModelProperty("培训目标")
    private String trainingObjectives;
    @ApiModelProperty("培训内容")
    private String trainingContent;
    @ApiModelProperty("培训方式")
    private String trainingMode;
    // æœªå¼€å§‹ ==> è¿›è¡Œä¸­ ==> å·²ç»“束 ==> å·²å®Œæˆ
    @ApiModelProperty("状态(1:已完成;2:进行中;3: æœªå¼€å§‹ï¼›4:已结束)")
    private Integer state;
    @ApiModelProperty("参加对象")
    private String participants;
    @ApiModelProperty("举办部门")
    private Integer holdingDepartment;
    @ApiModelProperty("培训地点")
    private String placeTraining;
    @ApiModelProperty("培训讲师_id")
    private String trainingLecturerId;
    @ApiModelProperty("培训日期")
    private String trainingDate;
    @ApiModelProperty("具体日期")
    private String trainingDateTwo;
    @ApiModelProperty("开始时间")
    private String openingTime;
    @ApiModelProperty("结束时间")
    private String endTime;
    @ApiModelProperty("课题学分")
    private String projectCredits;
    @ApiModelProperty("课时")
    private Double classHour;
    @ApiModelProperty("备注")
    private String remarks;
    @ApiModelProperty("培训计划id")
    private Integer planId;
    @ApiModelProperty(value = "创建时间", hidden = true)
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    @ApiModelProperty(value = "创建人id", hidden = true)
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    @ApiModelProperty(value = "更新人id", hidden = true)
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    @ApiModelProperty(value = "更新时间", hidden = true)
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
    @ApiModelProperty("考核方式")
    private String assessmentMethod;
    @ApiModelProperty("本次培训综合评价")
    private String comprehensiveAssessment;
    @ApiModelProperty("评价人")
    private Integer assessmentUserId;
    @ApiModelProperty("评价时间")
    private LocalDate assessmentDate;
    @ApiModelProperty("路径")
    private String url;
    @ApiModelProperty("文件名称")
    private String imgName;
    @ApiModelProperty("培训摘要")
    private String trainingAbstract;
    @TableField(exist = false)
    private String organizingDepartment;
}
cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonTrainingFile.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,41 @@
package com.ruoyi.personnel.pojo;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.time.LocalDateTime;
@Data
@TableName("cnas_person_training_file")
public class PersonTrainingFile {
    @TableId(type = IdType.AUTO)
    private Integer id;
    @ApiModelProperty("年度计划明细表id")
    private Integer detailId;
    @ApiModelProperty("文件路径")
    private String fileUrl;
    @ApiModelProperty("文件名称")
    private String fileName;
    @ApiModelProperty("创建人")
    private Integer createUser;
    @ApiModelProperty("创建时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
    private LocalDateTime createTime;
    @ApiModelProperty("枚举表名")
    private String enumAttachmentType;
    @TableField(exist = false)
    private String mime;
}
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("用户表格(user)主键")
    private Integer userId;
    @ApiModelProperty("培训计划详情 - å­ id")
    private Integer courseId;
    @ApiModelProperty("考核结果")
    private String examinationResults;
}
cnas-personnel/src/main/java/com/ruoyi/personnel/schedule/PersonSchedule.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,54 @@
package com.ruoyi.personnel.schedule;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.ruoyi.personnel.pojo.PersonTrainingDetailed;
import com.ruoyi.personnel.service.PersonTrainingDetailedService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.ZoneId;
import java.util.Date;
import java.util.List;
@Component
public class PersonSchedule {
    @Resource
    private PersonTrainingDetailedService personTrainingDetailedService;
    /**
     * å½“前课程小于当前时间,并且状态为2:进行中;3: æœªå¼€å§‹æ›´æ–°çŠ¶æ€ä¸º4:已结束
     */
     @Scheduled(cron = "0 0/15 * * * ?") //15分钟执行一次
    //@Scheduled(cron = "0/10 * * * * ?") //每10秒执行一次
    public void testScheduleTask() {
        // èŽ·å–å½“å¤©çš„æ‰€æœ‰åŸ¹è®­è¯¾ç¨‹
        Date date = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        SimpleDateFormat sdfWithTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String newDate = sdf.format(date);
        List<PersonTrainingDetailed> list = personTrainingDetailedService.list(Wrappers.<PersonTrainingDetailed>lambdaQuery()
                .eq(PersonTrainingDetailed::getState, 2)
                .or().eq(PersonTrainingDetailed::getState, 3)
                .le(PersonTrainingDetailed::getTrainingDateTwo, newDate));
        list.forEach(i -> {
            LocalDate parse = LocalDate.parse(i.getTrainingDateTwo());
            Date date1 = Date.from(parse.atStartOfDay(ZoneId.systemDefault()).toInstant());
            String trainingDate = sdf.format(date1);
            String endTime = trainingDate + " " + i.getEndTime();
            try {
                Date endNewTime = sdfWithTime.parse(endTime);
                // æ—¥æœŸè¶…出
                if (endNewTime.before(date)) {
                    i.setState(4);
                    personTrainingDetailedService.updateById(i);
                }
            } catch (ParseException e) {}
        });
    }
}
cnas-personnel/src/main/java/com/ruoyi/personnel/service/AnnexService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,7 @@
package com.ruoyi.personnel.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.personnel.pojo.Annex;
public interface AnnexService extends IService<Annex> {
}
cnas-personnel/src/main/java/com/ruoyi/personnel/service/FileGeneralService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,19 @@
package com.ruoyi.personnel.service;
import com.ruoyi.personnel.pojo.PersonTrainingFile;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
public interface FileGeneralService {
    void fileUpload(MultipartFile file, String suffix, Integer id,Integer type);
    List<PersonTrainingFile> selectFile(Integer id,Integer type);
    void delFile(Integer id);
    void fileDownLoad(Integer id, HttpServletResponse response);
}
cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonBasicInfoService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,50 @@
package com.ruoyi.personnel.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.common.core.dto.DepartmentDto;
import com.ruoyi.common.core.dto.UserPageDto;
import com.ruoyi.personnel.dto.PersonBasicInfoDto;
import com.ruoyi.personnel.pojo.PersonBasicInfo;
import com.ruoyi.personnel.pojo.PersonTrainingFile;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
import java.util.Map;
/**
 * <p>
 *  æœåŠ¡ç±»
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2024-08-30 09:19:57
 */
public interface PersonBasicInfoService extends IService<PersonBasicInfo> {
    List<DepartmentDto> selectCNSAPersonTree();
    Map<String,Object> getCNASPersonnelInfo(Integer userId);
    void saveCNASPersonnelInfo(PersonBasicInfoDto personBasicInfoDto);
    IPage<Map<String, Object>> basicInformationOfPersonnelSelectPage(Page page, String name, Integer departmentId);
    void exportPersonBasicInfo(UserPageDto userPageDto, HttpServletResponse response) throws Exception;
    String exportPersonBasicInfoById(Integer id, HttpServletResponse response);
    void saveDeviceCalibrationFile(MultipartFile file, String suffix, Integer id);
    List<PersonTrainingFile> getDeviceCalibrationFile(Integer id);
    void delDeviceCalibrationFile(Integer id);
    void downLoadDeviceCalibrationFile(Integer id ,HttpServletResponse response);
    void getEmployees(Integer departId);
    void getEmployee(Integer userId);
}
cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonCommunicationAbilityService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,25 @@
package com.ruoyi.personnel.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.personnel.dto.PersonCommunicationAbilityDto;
import com.ruoyi.personnel.pojo.PersonCommunicationAbility;
import javax.servlet.http.HttpServletResponse;
/**
 * <p>
 * æ²Ÿé€šèƒ½åŠ› æœåŠ¡ç±»
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2024-10-09 12:00:57
 */
public interface PersonCommunicationAbilityService extends IService<PersonCommunicationAbility> {
    IPage<PersonCommunicationAbilityDto> personPersonCommunicationAbilityPage(Page page,
                                                                              Integer departLimsId, Integer userId, String userName);
    void exportPersonCommunicationAbility(Integer id, HttpServletResponse response)throws Exception;
}
cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonJobResponsibilitiesService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,27 @@
package com.ruoyi.personnel.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.personnel.dto.PersonJobResponsibilitiesDto;
import com.ruoyi.personnel.pojo.PersonJobResponsibilities;
import javax.servlet.http.HttpServletResponse;
/**
 * <p>
 * å²—位职责 æœåŠ¡ç±»
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2024-10-09 02:07:49
 */
public interface PersonJobResponsibilitiesService extends IService<PersonJobResponsibilities> {
    IPage<PersonJobResponsibilitiesDto> personJobResponsibilitiesSelect(Page page,
                                                                        String userId,
                                                                        String departmentId,
                                                                        String userName);
    void exportPersonJobResponsibilities(Integer id, HttpServletResponse response);
}
cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonPersonnelCapacityService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,37 @@
package com.ruoyi.personnel.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.personnel.dto.PersonPersonnelCapacityDto;
import com.ruoyi.personnel.pojo.PersonPersonnelCapacity;
import javax.servlet.http.HttpServletResponse;
/**
 * <p>
 * äººå‘˜èƒ½åŠ› æœåŠ¡ç±»
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2024-10-10 11:26:18
 */
public interface PersonPersonnelCapacityService extends IService<PersonPersonnelCapacity> {
    IPage<PersonPersonnelCapacityDto> personPersonnelCapacityPage(Page page, Integer departLimsId, Integer userId, String userName);
    /**
     * å¯¼å‡ºäººå‘˜èƒ½åŠ›
     * @param id
     * @param response
     */
    void exportPersonnelCapacity(Integer id, HttpServletResponse response);
    /**
     * äººå‘˜èƒ½åŠ›ç¡®è®¤
     * @param id
     * @return
     */
    boolean confirmPersonnelCapacity(Integer id);
}
cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonPostAuthorizationRecordService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,27 @@
package com.ruoyi.personnel.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.personnel.dto.PersonPostAuthorizationRecordDto;
import com.ruoyi.personnel.pojo.PersonPostAuthorizationRecord;
import javax.servlet.http.HttpServletResponse;
/**
 * <p>
 * ä»»èŒæŽˆæƒè®°å½• æœåŠ¡ç±»
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2024-10-09 10:48:17
 */
public interface PersonPostAuthorizationRecordService extends IService<PersonPostAuthorizationRecord> {
    IPage<PersonPostAuthorizationRecordDto> personPostAuthorizationRecordPage(Page page,
                                                                              Integer departLimsId,
                                                                              Integer userId,
                                                                              String userName);
    void exportPersonPostAuthorizationRecord(Integer id, HttpServletResponse response);
}
cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonRewardPunishmentRecordService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,31 @@
package com.ruoyi.personnel.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.personnel.dto.PersonRewardPunishmentRecordDto;
import com.ruoyi.personnel.excel.PersonRewardPunishmentRecordExcel;
import com.ruoyi.personnel.pojo.PersonRewardPunishmentRecord;
import java.util.Date;
import java.util.List;
/**
 * <p>
 * å¥–惩记录 æœåŠ¡ç±»
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2024-10-08 11:25:02
 */
public interface PersonRewardPunishmentRecordService extends IService<PersonRewardPunishmentRecord> {
    IPage<PersonRewardPunishmentRecordDto> rewardPunishmentPage(Page page,
                                                                Integer userId,
                                                                String userName,
                                                                Date startTime,
                                                                Date endTime,
                                                                Integer departmentId);
    List<PersonRewardPunishmentRecordExcel> rewardPunishmentExport(Integer userId, Integer departmentId, String userName, Date startTime, Date endTime);
}
cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonSupervisePlanDetailsService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,26 @@
package com.ruoyi.personnel.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.personnel.dto.PersonSupervisePlanDetailsDto;
import com.ruoyi.personnel.excel.PersonSupervisePlanDetailsUpload;
import com.ruoyi.personnel.pojo.PersonSupervisePlanDetails;
import java.util.List;
/**
 * <p>
 * ç›‘督计划 - å­ æœåŠ¡ç±»
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2024-10-09 04:17:02
 */
public interface PersonSupervisePlanDetailsService extends IService<PersonSupervisePlanDetails> {
    IPage<PersonSupervisePlanDetailsDto> yearPlanDetailPage(Page page,
                                                            String date, String project, Integer planId);
    void importExcel(List<PersonSupervisePlanDetailsUpload> list, Integer planId);
}
cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonSupervisePlanService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,32 @@
package com.ruoyi.personnel.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.personnel.dto.PersonSupervisePlanDto;
import com.ruoyi.personnel.pojo.PersonSupervisePlan;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
/**
 * <p>
 * ç›‘督计划 - çˆ¶ æœåŠ¡ç±»
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2024-10-09 04:14:45
 */
public interface PersonSupervisePlanService extends IService<PersonSupervisePlan> {
    IPage<PersonSupervisePlanDto> yearPlanDtoIPage(Page page, String organizationPerson,Integer departId);
    void yearPlanDetailImport(MultipartFile file,String suffix);
    /**
     * å¯¼å‡ºäººå‘˜ç›‘督计划
     * @param id
     * @param response
     */
    void exportSuperVisePlan(Integer id, HttpServletResponse response);
}
cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonSupervisionControlSheetService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,24 @@
package com.ruoyi.personnel.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.personnel.pojo.PersonSupervisionControlSheet;
import javax.servlet.http.HttpServletResponse;
/**
 * <p>
 * ç›‘督记录 - æŽ§åˆ¶å• æœåŠ¡ç±»
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2024-10-10 05:18:57
 */
public interface PersonSupervisionControlSheetService extends IService<PersonSupervisionControlSheet> {
    /**
     * å¯¼å‡ºäººå‘˜ç›‘督记录纠正控制单
     * @param supervisionRecordId
     * @param response
     */
    void exportSupervisionControlSheet(Integer supervisionRecordId, HttpServletResponse response);
}
cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonSupervisionProcessingSheetService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,24 @@
package com.ruoyi.personnel.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.personnel.pojo.PersonSupervisionProcessingSheet;
import javax.servlet.http.HttpServletResponse;
/**
 * <p>
 * ç›‘督记录 - å¤„理单 æœåŠ¡ç±»
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2024-10-10 05:35:58
 */
public interface PersonSupervisionProcessingSheetService extends IService<PersonSupervisionProcessingSheet> {
    /**
     * å¯¼å‡ºäººå‘˜ç›‘督记录纠正处理单
     * @param supervisionRecordId
     * @param response
     */
    void exportSupervisionProcessingSheet(Integer supervisionRecordId, HttpServletResponse response);
}
cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonSupervisionRecordService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,33 @@
package com.ruoyi.personnel.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.personnel.dto.PersonSupervisionRecordDto;
import com.ruoyi.personnel.pojo.PersonSupervisionRecord;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
/**
 * <p>
 * ç›‘督记录 æœåŠ¡ç±»
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2024-10-10 04:16:49
 */
public interface PersonSupervisionRecordService extends IService<PersonSupervisionRecord> {
    void deletePersonSupervisionRecord(List<Integer> ids);
    IPage<PersonSupervisionRecordDto> personSupervisionRecordPage(Page page,
                                                                  Integer userId, String userName, Integer departLimsId);
    /**
     * å¯¼å‡ºäººå‘˜ç›‘督记录
     * @param id
     * @param response
     */
    void exportPersonSupervisionRecord(Integer id, HttpServletResponse response);
}
cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonTrackRecordService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
package com.ruoyi.personnel.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.personnel.pojo.PersonTrackRecord;
import java.util.List;
/**
 * <p>
 * å·¥ä½œå±¥åކ æœåŠ¡ç±»
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2024-09-02 03:13:03
 */
public interface PersonTrackRecordService extends IService<PersonTrackRecord> {
    IPage<PersonTrackRecord> personTrackRecordSelect(Page page, String userId, String departmentId);
    List<PersonTrackRecord> personTrackRecordExport(String userId, String departmentId);
}
cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonTrainingDetailedService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,47 @@
package com.ruoyi.personnel.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.common.core.domain.entity.DepartmentLims;
import com.ruoyi.personnel.dto.PersonTrainingDetailedDto;
import com.ruoyi.personnel.excel.PersonTrainingDetailedUpload;
import com.ruoyi.personnel.pojo.PersonTrainingDetailed;
import com.ruoyi.personnel.pojo.PersonTrainingFile;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
import java.util.Map;
/**
 * <p>
 * åŸ¹è®­è®¡åˆ’详情 æœåŠ¡ç±»
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2024-10-11 01:46:27
 */
public interface PersonTrainingDetailedService extends IService<PersonTrainingDetailed> {
    Map<String,Object> fileUpload(MultipartFile file , Integer id);
    List<DepartmentLims> selectDepartLims();
    void importExcel(List<PersonTrainingDetailedUpload> list, Integer planId);
    void deleteAnnualPlanDetailTable(String ids);
    IPage<PersonTrainingDetailedDto> queryTheAnnualPlanDetailsTable(Page page,
                                                                    String trainingLecturerName,
                                                                    String courseCode, String trainingDate, Integer id, Integer userId,Integer departId,
                                                                    Integer state);
    List<PersonTrainingFile> getFileData(Integer detailedId);
    void deleteFile(Integer id);
    void fileDownLoad(Integer id, HttpServletResponse response);
}
cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonTrainingFileService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,7 @@
package com.ruoyi.personnel.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.personnel.pojo.PersonTrainingFile;
public interface PersonTrainingFileService extends IService<PersonTrainingFile> {
}
cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonTrainingRecordService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,60 @@
package com.ruoyi.personnel.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.personnel.dto.PersonTrainingRecordDto;
import com.ruoyi.personnel.dto.PersonTrainingRecordListDto;
import com.ruoyi.personnel.dto.TrainingRecordPersonDetailedDto;
import com.ruoyi.personnel.pojo.PersonTrainingRecord;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
/**
 * <p>
 * åŸ¹è®­è®°å½• æœåŠ¡ç±»
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2024-10-12 04:50:48
 */
public interface PersonTrainingRecordService extends IService<PersonTrainingRecord> {
    List<PersonTrainingRecordDto> trainingAndAssessmentRecordsPage(Integer trainingDetailedId, String userName);
    void deleteTrainingAndAssessmentRecords(String ids);
    IPage<PersonTrainingRecordListDto> personnelTrainingPersonnel(Page page,
                                                                  String userName, Integer userId, Integer departLimsId);
    IPage<TrainingRecordPersonDetailedDto> queryPersonnelDetails(Page page, Integer userId);
    void claimOfTrainingAndAssessmentRecords(Boolean claimAndClaim, Integer courseId);
    /**
     * å¯¼å‡ºäººå‘˜åŸ¹è®­è®°å½•
     * @param userId
     * @param response
     */
    void exportTrainingRecord(Integer userId, HttpServletResponse response);
    /**
     * æ ¹æ®ç”¨æˆ·id和年份查询人员明细 åŸ¹è®­è®°å½•
     * @param page
     * @param userId
     * @param year
     * @return
     */
    IPage<TrainingRecordPersonDetailedDto> queryPersonnelDetailsOfUserIdAndYear(Page page, Integer userId, Integer year);
    /**
     * å¯¼å‡ºäººå‘˜åŸ¹è®­è®°å½•
     * @param userId
     * @param trainingDate
     * @param response
     */
    void exportTrainingRecordAddTrainingDate(Integer userId, Integer trainingDate, HttpServletResponse response);
    void outOfFocusPreservation(PersonTrainingRecord personTrainingRecord);
}
cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonTrainingService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,48 @@
package com.ruoyi.personnel.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.personnel.dto.PersonTrainingDto;
import com.ruoyi.personnel.dto.PersonTrainingUpdateDto;
import com.ruoyi.personnel.pojo.PersonTraining;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
/**
 * <p>
 * åŸ¹è®­è®¡åˆ’ æœåŠ¡ç±»
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2024-10-11 01:11:49
 */
public interface PersonTrainingService extends IService<PersonTraining> {
    IPage<PersonTrainingDto> personTrainingSelect(Page page,
                                                  String compilerName, Integer departmentId);
    void deleteDetail(Integer id);
    void personTrainingImport(MultipartFile file);
    void personTrainingDelete(Integer id);
    void reviewAnnualPersonnelTraining(PersonTrainingUpdateDto personTrainingUpdateDto);
    void approveAnnualPersonnelTraining(PersonTrainingUpdateDto personTrainingUpdateDto);
    /**
     * å¯¼å‡ºäººå‘˜åŸ¹è®­è®¡åˆ’
     * @param id
     * @param response
     */
    void exportPersonTraining(Integer id, HttpServletResponse response);
    /**
     * å¯¼å‡ºäººå‘˜åŸ¹è®­ä¸Žè€ƒæ ¸è®°å½•
     * @param id
     * @param response
     */
    void exportPersonTrainingRecord(Integer id, HttpServletResponse response);
}
cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/AnnexServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,13 @@
package com.ruoyi.personnel.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.personnel.mapper.AnnexMapper;
import com.ruoyi.personnel.pojo.Annex;
import com.ruoyi.personnel.service.AnnexService;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;
@Service
@AllArgsConstructor
public class AnnexServiceImpl extends ServiceImpl<AnnexMapper, Annex> implements AnnexService {
}
cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/FileGeneralServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,162 @@
package com.ruoyi.personnel.service.impl;
import cn.hutool.core.lang.UUID;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.personnel.enumeration.AttachmentType;
import com.ruoyi.personnel.mapper.PersonTrainingFileMapper;
import com.ruoyi.personnel.pojo.PersonTrainingFile;
import com.ruoyi.personnel.service.FileGeneralService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.time.LocalDateTime;
import java.util.List;
@Service
public class FileGeneralServiceImpl implements FileGeneralService {
    @Autowired
    private PersonTrainingFileMapper fileMapper;
    @Value("${wordUrl}")
    private String wordUrl;
    @Value("${file.path}")
    private String imgUrl;
    @Value("${excelUrl}")
    private String excelUrl;
    @Override
    public void fileUpload(MultipartFile file, String suffix, Integer id,Integer type) {
        String name = file.getOriginalFilename();
        UUID uuid = UUID.randomUUID();
        String fileName = uuid + name;
        String path = "";
        // æ ¹æ®åŽç¼€åˆ¤æ–­å±žäºŽä»€ä¹ˆç±»åž‹
        if(suffix.toLowerCase().contains("xls")) {
            path = excelUrl;
        } else if (suffix.toLowerCase().contains("doc") || suffix.toLowerCase().contains("pdf")) {
            path = wordUrl;
        } else {
            path = imgUrl;
        }
        File file1 = new File(path);
        if(!file1.exists()) {
            file1.mkdir();
        }
        try {
            File file2 = new File(file1, fileName);
            file.transferTo(file2);
            // ä¿å­˜æ•°æ®åº“
            PersonTrainingFile personTrainingFile = new PersonTrainingFile();
            personTrainingFile.setDetailId(id);
            personTrainingFile.setFileUrl("/" + fileName);
            personTrainingFile.setFileName(file.getOriginalFilename());
            personTrainingFile.setCreateUser(SecurityUtils.getUserId().intValue());
            personTrainingFile.setCreateTime(LocalDateTime.now());
            personTrainingFile.setEnumAttachmentType(AttachmentType.getTypeValue(type));
            fileMapper.insert(personTrainingFile);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
    @Override
    public List<PersonTrainingFile> selectFile(Integer id, Integer type) {
        List<PersonTrainingFile> personTrainingFileList = fileMapper.selectList(new LambdaQueryWrapper<PersonTrainingFile>()
                .eq(PersonTrainingFile::getDetailId, id)
                .eq(PersonTrainingFile::getEnumAttachmentType, AttachmentType.getTypeValue(type)));
        if(CollectionUtils.isNotEmpty(personTrainingFileList)) {
            for(PersonTrainingFile a : personTrainingFileList) {
                // è®¾ç½®mime
                int i = a.getFileUrl().lastIndexOf(".");
                String contentType = getContentType(a.getFileUrl().substring(i + 1));
                a.setMime(contentType);
            }
        }
        return personTrainingFileList;
    }
    @Override
    public void delFile(Integer id) {
        fileMapper.deleteById(id);
    }
    @Override
    public void fileDownLoad(Integer id, HttpServletResponse response) {
        PersonTrainingFile personTrainingFile = fileMapper.selectById(id);
        // èŽ·å–æ–‡ä»¶åŽç¼€
        String suffix = personTrainingFile.getFileName().substring(personTrainingFile.getFileName().lastIndexOf(".") + 1);
        String path = "";
        if(suffix.toLowerCase().contains("xls")) {
            path = excelUrl;
        } else if (suffix.toLowerCase().contains("doc") || suffix.toLowerCase().contains("pdf")) {
            path = wordUrl;
        } else {
            path = imgUrl;
        }
        File file = new File(path + File.separator + personTrainingFile.getFileUrl());
        if(!file.exists()) {
            throw new RuntimeException("文件不存在");
        }
        try(FileInputStream fileInputStream = new FileInputStream(file);
            ServletOutputStream stream = response.getOutputStream()) {
            String contentType = getContentType(suffix);
            response.setContentType(contentType);
            response.setHeader("Content-disposition", "attachment;filename=" + personTrainingFile.getFileName());
            byte[] bytes = new byte[1024];
            int i;
            while((i = fileInputStream.read(bytes)) != -1) {
                stream.write(bytes, 0, i);
                stream.flush();
            }
        }catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
    // æ ¹æ®æ–‡ä»¶æ‰©å±•名获取 MIME ç±»åž‹
    private String getContentType(String fileExtension) {
        switch (fileExtension) {
            case "jpg":
            case "jpeg":
                return "image/jpeg";
            case "png":
                return "image/png";
            case "gif":
                return "image/gif";
            case "pdf":
                return "application/pdf";
            case "doc":
                return "application/msword";
            case "docx":
                return "application/vnd.openxmlformats-officedocument.wordprocessingml.document";
            case "xls":
                return "application/vnd.ms-excel";
            case "xlsx":
                return "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
            case "ppt":
            case "pptx":
                return "application/vnd.ms-powerpoint";
            default:
                return "application/octet-stream"; // é»˜è®¤äºŒè¿›åˆ¶æµ
        }
    }
}
cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonBasicInfoServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,1081 @@
package com.ruoyi.personnel.service.impl;
import cn.hutool.core.lang.UUID;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.config.Configure;
import com.deepoove.poi.config.ConfigureBuilder;
import com.deepoove.poi.data.*;
import com.deepoove.poi.data.style.*;
import com.ruoyi.common.core.domain.entity.DepartmentLims;
import com.ruoyi.common.core.domain.entity.User;
import com.ruoyi.common.core.dto.DepartmentDto;
import com.ruoyi.common.core.dto.UserPageDto;
import com.ruoyi.common.utils.QueryWrappers;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.framework.exception.ErrorException;
import com.ruoyi.framework.util.HeaderToken;
import com.ruoyi.personnel.dto.PersonBasicInfoDto;
import com.ruoyi.personnel.mapper.*;
import com.ruoyi.personnel.pojo.*;
import com.ruoyi.personnel.service.PersonBasicInfoService;
import com.ruoyi.system.mapper.DepartmentLimsMapper;
import com.ruoyi.system.mapper.UserMapper;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.openxml4j.util.ZipSecureFile;
import org.apache.poi.xwpf.usermodel.*;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STMerge;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.Period;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.stream.Collectors;
/**
 * <p>
 *  æœåŠ¡å®žçŽ°ç±»
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2024-08-30 09:19:57
 */
@Service
@Slf4j
@Transactional(rollbackFor = Exception.class)
public class PersonBasicInfoServiceImpl extends ServiceImpl<PersonBasicInfoMapper, PersonBasicInfo> implements PersonBasicInfoService {
    @Resource
    private DepartmentLimsMapper departmentMapper;
    @Resource
    private PersonTrainingFileMapper fileMapper;
    @Resource
    private HeaderToken headerToken;
    @Value("${wordUrl}")
    private String wordUrl;
    @Value("${file.path}")
    private String imgUrl;
    @Value("${excelUrl}")
    private String excelUrl;
    @Resource
    private UserMapper userMapper;
    @Resource
    private AnnexMapper annexMapper;
    @Resource
    private PersonTrackRecordMapper personTrackRecordMapper;
    @Override
    public List<DepartmentDto> selectCNSAPersonTree() {
        List<DepartmentDto> departments = departmentMapper.selectDepartment();
        List<DepartmentDto> limsUser = baseMapper.selectLimsUser();
        departments.addAll(limsUser);
        //获取父节点
        return departments.stream().filter(m -> m.getFatherId() == null).peek(
                (m) -> m.setChildren(getChildren(m, departments))
        ).collect(Collectors.toList());
    }
    @Override
    public Map<String,Object> getCNASPersonnelInfo(Integer userId) {
        Map<String, Object> map = new HashMap<>();
        Map<Integer,List<DepartmentLims>>  childrenMap = new HashMap<>();
        List<DepartmentLims> deptS = departmentMapper.selectList(null);
        for (DepartmentLims dept : deptS) {
            if(!Objects.isNull(dept.getFatherId())) {
                if(!childrenMap.containsKey(dept.getFatherId())) {
                        childrenMap.put(dept.getFatherId(),new ArrayList<>());
                }
                childrenMap.get(dept.getFatherId()).add(dept);
            }
        }
        // çˆ¶èŠ‚ç‚¹
        List<DepartmentLims> deptF = new ArrayList<>();
        for (DepartmentLims dept : deptS) {
            if(Objects.isNull(dept.getFatherId())) {
                deptF.add(buildTree(dept,childrenMap));
            }
        }
        map.put("department",deptF);
        map.put("PersonBasicInfoDto",baseMapper.getCNASPersonnelInfo(userId));
        map.put("annexList",annexMapper.selectList(new LambdaQueryWrapper<Annex>().eq(Annex::getUserId,userId)));
        return map;
    }
    private DepartmentLims buildTree(DepartmentLims departmentLims, Map<Integer,List<DepartmentLims>> childrenMap) {
        if(childrenMap.containsKey(departmentLims.getId())) {
            departmentLims.setChildren(childrenMap.get(departmentLims.getId()));
            for (DepartmentLims departmentLims1 : departmentLims.getChildren()) {
                buildTree(departmentLims1,childrenMap);
            }
        }
        return departmentLims;
    }
    @Override
    public void saveCNASPersonnelInfo(PersonBasicInfoDto personBasicInfoDto) {
        User user = new User();
        user.setId(personBasicInfoDto.getUserId());
        user.setAccount(personBasicInfoDto.getAccount());
        user.setName(personBasicInfoDto.getName());
        user.setNameEn(personBasicInfoDto.getNameEn());
        user.setAge(personBasicInfoDto.getAge());
        user.setPhone(personBasicInfoDto.getPhone());
        user.setEmail(personBasicInfoDto.getEmail());
//        user.setDepartment(personBasicInfoDto.getDepartment());
        user.setSignatureUrl(personBasicInfoDto.getSignatureUrl());
        user.setPictureUrl(personBasicInfoDto.getPictureUrl());
        user.setDepartLimsId(personBasicInfoDto.getDepartLimsId());
        userMapper.updateById(user);
        PersonBasicInfo personBasicInfo = JSONObject.parseObject(JSON.toJSONString(personBasicInfoDto), PersonBasicInfo.class);
        PersonBasicInfo one = baseMapper.selectOne(new LambdaQueryWrapper<PersonBasicInfo>()
                .eq(PersonBasicInfo::getUserId, personBasicInfoDto.getUserId()));
        if(Objects.isNull(one)) {
            baseMapper.insert(personBasicInfo);
        }else {
            personBasicInfo.setId(one.getId());
            baseMapper.updateById(personBasicInfo);
        }
    }
    @Override
    public IPage<Map<String, Object>> basicInformationOfPersonnelSelectPage(Page page, String name, Integer departmentId) {
        return baseMapper.selectPersonBasecInfoAndUser(page, name, departmentId);
    }
    @Override
    public void exportPersonBasicInfo(UserPageDto userPageDto, HttpServletResponse response) throws Exception {
        ArrayList<PersonBasicInfoDto> data = new ArrayList<>();
        List<User> list = userMapper.selectList(null);
        for (User user : list) {
            PersonBasicInfoDto personBasicInfoDto = new PersonBasicInfoDto();
            PersonBasicInfo personBasicInfo = baseMapper.selectOne(Wrappers.<PersonBasicInfo>lambdaQuery().eq(PersonBasicInfo::getUserId, user.getId()));
            if (ObjectUtils.isNotEmpty(personBasicInfo)) {
                BeanUtils.copyProperties(personBasicInfo, personBasicInfoDto);
            }
            personBasicInfoDto.setName(user.getName());
            personBasicInfoDto.setAccount(user.getAccount());
            personBasicInfoDto.setPhone(ObjectUtils.isNotEmpty(user.getPhone()) ? user.getPhone() : " ");
            data.add(personBasicInfoDto);
        }
        response.setContentType("application/vnd.ms-excel");
        response.setCharacterEncoding("UTF-8");
        String fileName = URLEncoder.encode("人员基本信息列表导出", "UTF-8");
        response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
        try {
            // æ–°å»ºExcelWriter
            ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()).build();
            WriteSheet mainSheet = EasyExcel.writerSheet(0, "人员基本信息导出").head(PersonBasicInfoDto.class).build();
            excelWriter.write(data, mainSheet);
            // å…³é—­æµ
            excelWriter.finish();
        } catch (IOException e) {
            throw new RuntimeException("导出失败");
        }
    }
    @Override
    public String exportPersonBasicInfoById(Integer id, HttpServletResponse response) {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyå¹´MM月dd日");
        User user = userMapper.selectById(id);
        PersonBasicInfo personBasicInfo = baseMapper.selectOne(Wrappers.<PersonBasicInfo>lambdaQuery().eq(PersonBasicInfo::getUserId, user.getId()));
        if (ObjectUtils.isEmpty(personBasicInfo)){
            throw new ErrorException("该用户的基本信息没有录入,暂无法导出");
        }
        //证件
        List<Annex> annexList = annexMapper.selectList(Wrappers.<Annex>lambdaQuery().eq(Annex::getUserId, user.getId()));
        //工作经历
        List<PersonTrackRecord> personTrackRecordList = personTrackRecordMapper.selectList(Wrappers.<PersonTrackRecord>lambdaQuery().eq(PersonTrackRecord::getUserId, user.getId()));
        List<RowRenderData> rows = new ArrayList<>();
        //表格行数
        int hang = 10 + (Math.max(annexList.size() - 1, 0)) + (Math.max(personTrackRecordList.size()-1 , 0));
        for (int i = 0; i < hang; i++) {
            RowRenderData rowRenderData = new RowRenderData();
            RowStyle rowStyle = new RowStyle();
            rowStyle.setHeight(40);
            rowRenderData.setRowStyle(rowStyle);
            List<CellRenderData> cells = new ArrayList<>();
            //表格列数
            for (int j = 0; j < 6; j++) {
                CellRenderData cellRenderData = new CellRenderData();
                CellStyle cellStyle = new CellStyle();
                cellStyle.setVertAlign(XWPFTableCell.XWPFVertAlign.CENTER);
                cellRenderData.setCellStyle(cellStyle);
                List<ParagraphRenderData> paragraphRenderDataList = new ArrayList<>();
                ParagraphRenderData paragraphRenderData = new ParagraphRenderData();
                ParagraphStyle paragraphStyle = new ParagraphStyle();
                paragraphStyle.setAlign(ParagraphAlignment.CENTER);
                paragraphRenderData.setParagraphStyle(paragraphStyle);
                List<RenderData> renderData = new ArrayList<>();
                TextRenderData textRenderData = new TextRenderData();
                Style style = new Style();
                style.setFontFamily("宋体");
                style.setColor("000000");
                textRenderData.setStyle(style);
                if (i==0) {
                    //第一行
                    if (j==0) {
                        //第一列
                        textRenderData.setText("姓名@Name");
                        renderData.add(textRenderData);
                        paragraphRenderData.setContents(renderData);
                        paragraphRenderDataList.add(paragraphRenderData);
                        cellRenderData.setParagraphs(paragraphRenderDataList);
                        cells.add(cellRenderData);
                    }
                    else if (j==1) {
                        //第二列
                        textRenderData.setText(user.getName());
                        renderData.add(textRenderData);
                        paragraphRenderData.setContents(renderData);
                        paragraphRenderDataList.add(paragraphRenderData);
                        cellRenderData.setParagraphs(paragraphRenderDataList);
                        cells.add(cellRenderData);
                    }
                    else if (j==2 || j==3) {
                        textRenderData.setText("性别@Gender âˆ‘1");
                        renderData.add(textRenderData);
                        paragraphRenderData.setContents(renderData);
                        paragraphRenderDataList.add(paragraphRenderData);
                        cellRenderData.setParagraphs(paragraphRenderDataList);
                        cells.add(cellRenderData);
                    }
                    else {
                        textRenderData.setText((ObjectUtils.isNotEmpty(personBasicInfo.getSex())?personBasicInfo.getSex():" ")+"∑2");
                        renderData.add(textRenderData);
                        paragraphRenderData.setContents(renderData);
                        paragraphRenderDataList.add(paragraphRenderData);
                        cellRenderData.setParagraphs(paragraphRenderDataList);
                        cells.add(cellRenderData);
                    }
                }
                else if (i==1) {
                    //第二行
                    if (j==0) {
                        //第一列
                        textRenderData.setText("年龄@Age");
                        renderData.add(textRenderData);
                        paragraphRenderData.setContents(renderData);
                        paragraphRenderDataList.add(paragraphRenderData);
                        cellRenderData.setParagraphs(paragraphRenderDataList);
                        cells.add(cellRenderData);
                    }
                    else if (j==1) {
                        //第二列
                        textRenderData.setText(ObjectUtils.isNotEmpty(user.getAge())?user.getAge()+"":" ");
                        renderData.add(textRenderData);
                        paragraphRenderData.setContents(renderData);
                        paragraphRenderDataList.add(paragraphRenderData);
                        cellRenderData.setParagraphs(paragraphRenderDataList);
                        cells.add(cellRenderData);
                    }
                    else if (j==2 || j==3) {
                        textRenderData.setText("工作时间@Working time âˆ‘3");
                        renderData.add(textRenderData);
                        paragraphRenderData.setContents(renderData);
                        paragraphRenderDataList.add(paragraphRenderData);
                        cellRenderData.setParagraphs(paragraphRenderDataList);
                        cells.add(cellRenderData);
                    }
                    else {
                        textRenderData.setText((ObjectUtils.isNotEmpty(personBasicInfo.getEntryTime())?personBasicInfo.getEntryTime():" ")+"∑4");
                        renderData.add(textRenderData);
                        paragraphRenderData.setContents(renderData);
                        paragraphRenderDataList.add(paragraphRenderData);
                        cellRenderData.setParagraphs(paragraphRenderDataList);
                        cells.add(cellRenderData);
                    }
                }
                else if (i==2) {
                    //第三行
                    if (j==0) {
                        //第一列
                        textRenderData.setText("所学专业@Majors studied");
                        renderData.add(textRenderData);
                        paragraphRenderData.setContents(renderData);
                        paragraphRenderDataList.add(paragraphRenderData);
                        cellRenderData.setParagraphs(paragraphRenderDataList);
                        cells.add(cellRenderData);
                    }
                    else if (j==1) {
                        //第二列
                        textRenderData.setText(ObjectUtils.isNotEmpty(personBasicInfo.getMajor1())?personBasicInfo.getMajor1():" ");
                        renderData.add(textRenderData);
                        paragraphRenderData.setContents(renderData);
                        paragraphRenderDataList.add(paragraphRenderData);
                        cellRenderData.setParagraphs(paragraphRenderDataList);
                        cells.add(cellRenderData);
                    }
                    else if (j==2 || j==3) {
                        textRenderData.setText("文化程度@Education âˆ‘5");
                        renderData.add(textRenderData);
                        paragraphRenderData.setContents(renderData);
                        paragraphRenderDataList.add(paragraphRenderData);
                        cellRenderData.setParagraphs(paragraphRenderDataList);
                        cells.add(cellRenderData);
                    }
                    else {
                        textRenderData.setText((ObjectUtils.isNotEmpty(personBasicInfo.getOfficialAcademicRedentials())?personBasicInfo.getOfficialAcademicRedentials():" ")+"∑6");
                        renderData.add(textRenderData);
                        paragraphRenderData.setContents(renderData);
                        paragraphRenderDataList.add(paragraphRenderData);
                        cellRenderData.setParagraphs(paragraphRenderDataList);
                        cells.add(cellRenderData);
                    }
                }
                else if (i==3) {
                    //第四行
                    if (j==0) {
                        //第一列
                        textRenderData.setText("毕业时间@Graducation time");
                        renderData.add(textRenderData);
                        paragraphRenderData.setContents(renderData);
                        paragraphRenderDataList.add(paragraphRenderData);
                        cellRenderData.setParagraphs(paragraphRenderDataList);
                        cells.add(cellRenderData);
                    }
                    else if (j==1) {
                        //第二列
                        textRenderData.setText(ObjectUtils.isNotEmpty(personBasicInfo.getGraduationTime1())?personBasicInfo.getGraduationTime1()+"":" ");
                        renderData.add(textRenderData);
                        paragraphRenderData.setContents(renderData);
                        paragraphRenderDataList.add(paragraphRenderData);
                        cellRenderData.setParagraphs(paragraphRenderDataList);
                        cells.add(cellRenderData);
                    }
                    else if (j==2 || j==3) {
                        textRenderData.setText("毕业学校@Graduation school âˆ‘7");
                        renderData.add(textRenderData);
                        paragraphRenderData.setContents(renderData);
                        paragraphRenderDataList.add(paragraphRenderData);
                        cellRenderData.setParagraphs(paragraphRenderDataList);
                        cells.add(cellRenderData);
                    }
                    else {
                        textRenderData.setText((ObjectUtils.isNotEmpty(personBasicInfo.getGraduatedInstitutions1())?personBasicInfo.getGraduatedInstitutions1():" ")+"∑8");
                        renderData.add(textRenderData);
                        paragraphRenderData.setContents(renderData);
                        paragraphRenderDataList.add(paragraphRenderData);
                        cellRenderData.setParagraphs(paragraphRenderDataList);
                        cells.add(cellRenderData);
                    }
                }
                else if (i==4){
                    //第五行
                    if (j==0){
                        //第一列
                        textRenderData.setText("岗位@Position");
                        renderData.add(textRenderData);
                        paragraphRenderData.setContents(renderData);
                        paragraphRenderDataList.add(paragraphRenderData);
                        cellRenderData.setParagraphs(paragraphRenderDataList);
                        cells.add(cellRenderData);
                    }
                    else {
                        textRenderData.setText((ObjectUtils.isNotEmpty(personBasicInfo.getPost())?personBasicInfo.getPost()+"":" " )+"∑9");
                        renderData.add(textRenderData);
                        paragraphRenderData.setContents(renderData);
                        paragraphRenderDataList.add(paragraphRenderData);
                        cellRenderData.setParagraphs(paragraphRenderDataList);
                        cells.add(cellRenderData);
                    }
                }
                else if (i==5){
                    //第六行
                    textRenderData.setText("学历、检测专业资格、职称证书登记表@Education, testing professional qualifications, professional title certificate registration form âˆ‘10");
                    renderData.add(textRenderData);
                    paragraphRenderData.setContents(renderData);
                    paragraphRenderDataList.add(paragraphRenderData);
                    cellRenderData.setParagraphs(paragraphRenderDataList);
                    cells.add(cellRenderData);
                }
                else if (i==6){
                    if (j==0){
                        textRenderData.setText("证件号@ID number");
                        renderData.add(textRenderData);
                        paragraphRenderData.setContents(renderData);
                        paragraphRenderDataList.add(paragraphRenderData);
                        cellRenderData.setParagraphs(paragraphRenderDataList);
                        cells.add(cellRenderData);
                    }
                    else if (j==1){
                        textRenderData.setText("发证单位@Issuing unit");
                        renderData.add(textRenderData);
                        paragraphRenderData.setContents(renderData);
                        paragraphRenderDataList.add(paragraphRenderData);
                        cellRenderData.setParagraphs(paragraphRenderDataList);
                        cells.add(cellRenderData);
                    }
                    else if (j==2){
                        textRenderData.setText("级别@Level");
                        renderData.add(textRenderData);
                        paragraphRenderData.setContents(renderData);
                        paragraphRenderDataList.add(paragraphRenderData);
                        cellRenderData.setParagraphs(paragraphRenderDataList);
                        cells.add(cellRenderData);
                    }
                    else if (j==3){
                        textRenderData.setText("有效期@Expiration date");
                        renderData.add(textRenderData);
                        paragraphRenderData.setContents(renderData);
                        paragraphRenderDataList.add(paragraphRenderData);
                        cellRenderData.setParagraphs(paragraphRenderDataList);
                        cells.add(cellRenderData);
                    }
                    else if (j==4){
                        textRenderData.setText("复印件@Copy");
                        renderData.add(textRenderData);
                        paragraphRenderData.setContents(renderData);
                        paragraphRenderDataList.add(paragraphRenderData);
                        cellRenderData.setParagraphs(paragraphRenderDataList);
                        cells.add(cellRenderData);
                    }
                    else {
                        textRenderData.setText("原件@Original");
                        renderData.add(textRenderData);
                        paragraphRenderData.setContents(renderData);
                        paragraphRenderDataList.add(paragraphRenderData);
                        cellRenderData.setParagraphs(paragraphRenderDataList);
                        cells.add(cellRenderData);
                    }
                }
                else if (i==hang-1){
                    //最后一行
                    if (j==0){
                            textRenderData.setText("备注@Remark");
                            renderData.add(textRenderData);
                            paragraphRenderData.setContents(renderData);
                            paragraphRenderDataList.add(paragraphRenderData);
                            cellRenderData.setParagraphs(paragraphRenderDataList);
                            cells.add(cellRenderData);
                    }
                    else {
                        textRenderData.setText((ObjectUtils.isNotEmpty(personBasicInfo.getRemarks())?personBasicInfo.getRemarks()+"":" " )+"∑11");
                        renderData.add(textRenderData);
                        paragraphRenderData.setContents(renderData);
                        paragraphRenderDataList.add(paragraphRenderData);
                        cellRenderData.setParagraphs(paragraphRenderDataList);
                        cells.add(cellRenderData);
                    }
                }
                else {
                    if (annexList.size() == 0) {
                        if (i == 7) {
                            textRenderData.setText(" ");
                            renderData.add(textRenderData);
                            paragraphRenderData.setContents(renderData);
                            paragraphRenderDataList.add(paragraphRenderData);
                            cellRenderData.setParagraphs(paragraphRenderDataList);
                            cells.add(cellRenderData);
                        }
                    } else {
                        if (i >= 7 && i < 8 + (Math.max(annexList.size() - 1, 0))) {
                            if (j == 0) {
                                textRenderData.setText(ObjectUtils.isNotEmpty(annexList.get(i - 7).getIdNumber()) ? annexList.get(i - 7).getIdNumber() : " ");
                                renderData.add(textRenderData);
                                paragraphRenderData.setContents(renderData);
                                paragraphRenderDataList.add(paragraphRenderData);
                                cellRenderData.setParagraphs(paragraphRenderDataList);
                                cells.add(cellRenderData);
                            } else if (j == 1) {
                                textRenderData.setText(ObjectUtils.isNotEmpty(annexList.get(i - 7).getIssueUnit()) ? annexList.get(i - 7).getIssueUnit() : " ");
                                renderData.add(textRenderData);
                                paragraphRenderData.setContents(renderData);
                                paragraphRenderDataList.add(paragraphRenderData);
                                cellRenderData.setParagraphs(paragraphRenderDataList);
                                cells.add(cellRenderData);
                            } else if (j == 2) {
                                textRenderData.setText(ObjectUtils.isNotEmpty(annexList.get(i - 7).getLevel()) ? annexList.get(i - 7).getLevel() : " ");
                                renderData.add(textRenderData);
                                paragraphRenderData.setContents(renderData);
                                paragraphRenderDataList.add(paragraphRenderData);
                                cellRenderData.setParagraphs(paragraphRenderDataList);
                                cells.add(cellRenderData);
                            } else if (j == 3) {
                                textRenderData.setText(ObjectUtils.isNotEmpty(annexList.get(i - 7).getPeriodValidity()) ? annexList.get(i - 7).getPeriodValidity() : " ");
                                renderData.add(textRenderData);
                                paragraphRenderData.setContents(renderData);
                                paragraphRenderDataList.add(paragraphRenderData);
                                cellRenderData.setParagraphs(paragraphRenderDataList);
                                cells.add(cellRenderData);
                            } else if (j == 4) {
                                textRenderData.setText(ObjectUtils.isNotEmpty(annexList.get(i - 7).getCopy()) ? annexList.get(i - 7).getCopy() : " ");
                                renderData.add(textRenderData);
                                paragraphRenderData.setContents(renderData);
                                paragraphRenderDataList.add(paragraphRenderData);
                                cellRenderData.setParagraphs(paragraphRenderDataList);
                                cells.add(cellRenderData);
                            } else {
                                textRenderData.setText(ObjectUtils.isNotEmpty(annexList.get(i - 7).getOriginal()) ? annexList.get(i - 7).getOriginal() : " ");
                                renderData.add(textRenderData);
                                paragraphRenderData.setContents(renderData);
                                paragraphRenderDataList.add(paragraphRenderData);
                                cellRenderData.setParagraphs(paragraphRenderDataList);
                                cells.add(cellRenderData);
                            }
                        }
                    }
                    if (personTrackRecordList.size() == 0) {
                        if (i == 8 + (Math.max(annexList.size() - 1, 0))) {
                            if (j == 0) {
                                textRenderData.setText("主要工作经历@Main work experience");
                                renderData.add(textRenderData);
                                paragraphRenderData.setContents(renderData);
                                paragraphRenderDataList.add(paragraphRenderData);
                                cellRenderData.setParagraphs(paragraphRenderDataList);
                                cells.add(cellRenderData);
                            } else {
                                textRenderData.setText(" âˆ‘" + i + "5");
                                renderData.add(textRenderData);
                                paragraphRenderData.setContents(renderData);
                                paragraphRenderDataList.add(paragraphRenderData);
                                cellRenderData.setParagraphs(paragraphRenderDataList);
                                cells.add(cellRenderData);
                            }
                        }
                    } else {
                        if (i >= 8 + (Math.max(annexList.size() - 1, 0)) && i < hang - 1) {
                            if (j == 0) {
                                textRenderData.setText("主要工作经历@Main work experience âˆ‘2"+j);
                                renderData.add(textRenderData);
                                paragraphRenderData.setContents(renderData);
                                paragraphRenderDataList.add(paragraphRenderData);
                                cellRenderData.setParagraphs(paragraphRenderDataList);
                                cells.add(cellRenderData);
                            } else {
                                String startTime = personTrackRecordList.get(i - (8 + (Math.max(annexList.size() - 1, 0)))).getStartTime().format(formatter);
                                String endTime="/";
                                try{
                                     endTime = personTrackRecordList.get(i - (8 + (Math.max(annexList.size() - 1, 0)))).getEndTime().format(formatter);
                                }catch (Exception e){
                                }
                                String placeWork = personTrackRecordList.get(i - (8 + (Math.max(annexList.size() - 1, 0)))).getPlaceWork();
                                String department = personTrackRecordList.get(i - (8 + (Math.max(annexList.size() - 1, 0)))).getDepartment();
                                String post = personTrackRecordList.get(i - (8 + (Math.max(annexList.size() - 1, 0)))).getPost();
                                textRenderData.setText(startTime+","+endTime+","+placeWork+","+department+","+post+"∑" + i + "5");
                                renderData.add(textRenderData);
                                paragraphRenderData.setContents(renderData);
                                paragraphRenderDataList.add(paragraphRenderData);
                                cellRenderData.setParagraphs(paragraphRenderDataList);
                                cells.add(cellRenderData);
                            }
                        }
                    }
                }
            }
            rowRenderData.setCells(cells);
            if (rowRenderData.getCells().size() != 0) {
                rows.add(rowRenderData);
            }
        }
        TableRenderData tableRenderData = new TableRenderData();
        tableRenderData.setRows(rows);
        int countSize = tableRenderData.getRows().get(0).getCells().size();
        for (RowRenderData row : tableRenderData.getRows()) {
            if (row.getCells().size() != countSize) {
                throw new ErrorException("每行单元格不相等");
            }
        }
        TableStyle tableStyle = new TableStyle();
        tableStyle.setWidth(XWPFTable.DEFAULT_PERCENTAGE_WIDTH);
        tableStyle.setAlign(TableRowAlign.CENTER);
        BorderStyle borderStyle = new BorderStyle();
        borderStyle.setColor("000000");
        borderStyle.setType(XWPFTable.XWPFBorderType.THICK);
        borderStyle.setSize(14);
        tableStyle.setLeftBorder(borderStyle);
        tableStyle.setTopBorder(borderStyle);
        tableStyle.setRightBorder(borderStyle);
        tableStyle.setBottomBorder(borderStyle);
        tableRenderData.setTableStyle(tableStyle);
        InputStream inputStream = this.getClass().getResourceAsStream("/static/person-deal.docx");
        ConfigureBuilder builder = Configure.builder();
        builder.useSpringEL(true);
        XWPFTemplate template = XWPFTemplate.compile(inputStream, builder.build()).render(
                new HashMap<String, Object>() {{
                    put("createTime", user.getCreateTime().format(formatter));
                    put("person", tableRenderData);
                }});
        String name = UUID.randomUUID()+ user.getName()+ "_人员档案卡" + ".docx";
        try {
            template.writeAndClose(Files.newOutputStream(Paths.get(wordUrl + "/" + name)));
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        String path = wordUrl + "/" + name;
        // å¤„理合并单元格的问题
        try {
            ZipSecureFile.setMinInflateRatio(0.0001);
            FileInputStream stream = new FileInputStream(path);
            XWPFDocument document = new XWPFDocument(stream);
            List<XWPFTable> xwpfTables = document.getTables();
            for (int i = 0; i < xwpfTables.size(); i++) {
                Set<String> set1 = new HashSet<>();
                Map<String, Map<String, Integer>> maps = new HashMap<>();
                for (int j = 0; j < xwpfTables.get(i).getRows().size(); j++) {
                    for (int k = 0; k < xwpfTables.get(i).getRows().get(j).getTableCells().size(); k++) {
                        if (xwpfTables.get(i).getRows().get(j).getTableCells().get(k).getText().indexOf("∑") > -1) {
                            String[] split = xwpfTables.get(i).getRows().get(j).getTableCells().get(k).getText().split("∑");
                            if (set1.add(split[1])) {
                                Map<String, Integer> map = new HashMap<>();
                                map.put("sr", j);
                                map.put("sc", k);
                                map.put("er", j + 0);
                                map.put("ec", k + 0);
                                maps.put(split[1], map);
                            } else {
                                Map<String, Integer> map1 = maps.get(split[1]);
                                if (j == map1.get("sr")) {
                                    map1.put("ec", map1.get("ec") + 1);
                                } else if (k == map1.get("sc")) {
                                    map1.put("er", map1.get("er") + 1);
                                }
                            }
                            String str = xwpfTables.get(i).getRows().get(j).getTableCells().get(k).getText().split("∑")[0];
                            xwpfTables.get(i).getRows().get(j).getTableCells().get(k).removeParagraph(0);
                            xwpfTables.get(i).getRows().get(j).getTableCells().get(k).setText(str);
                            xwpfTables.get(i).getRows().get(j).getTableCells().get(k).setVerticalAlignment(XWPFTableCell.XWPFVertAlign.CENTER);
                            xwpfTables.get(i).getRows().get(j).getTableCells().get(k).getParagraphArray(0).setAlignment(ParagraphAlignment.CENTER);
                        }
                    }
                }
                // å•元格排序, é¿å…æ ¼å¼é”™ä¹±
                List<Map.Entry<String, Map<String, Integer>>> entries = new ArrayList<>(maps.entrySet());
                entries.sort((o1, o2) -> o1.getValue().get("sc") - o2.getValue().get("sc"));
                // æŒ‰ç…§é¡ºåºæ·»åŠ è¿›é›†åˆ
                List<String> list = new ArrayList<>();
                for (Map.Entry<String, Map<String, Integer>> entry : entries) {
                    list.add(entry.getKey());
                }
                for (int a = list.size() - 1; a >= 0; a--) {
                    Map<String, Integer> v = maps.get(list.get(a));
                    for (int j = 0; j < v.get("er") - v.get("sr") + 1; j++) {
                        if (v.get("ec") > v.get("sc")) {
                            try {
                                mergeCellsHorizontally(xwpfTables.get(i), v.get("sr") + j, v.get("sc"), v.get("ec"));
//                                TableTools.mergeCellsHorizonal(xwpfTables.get(i), v.get("sr") + j, v.get("sc"), v.get("ec"));
                            } catch (Exception e) {
                            }
                        }
                    }
                    if (v.get("er") > v.get("sr")) {
                        try {
                            mergeCellsVertically(xwpfTables.get(i), v.get("sc"), v.get("sr"), v.get("er"));
//                            TableTools.mergeCellsVertically(xwpfTables.get(i), v.get("sc"), v.get("sr"), v.get("er"));
                        } catch (Exception e) {
                        }
                    }
                }
            }
            FileOutputStream fileOutputStream = new FileOutputStream(path);
            document.write(fileOutputStream);
            fileOutputStream.close();
        } catch (FileNotFoundException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        //处理中英文换行的问题
        try {
            FileInputStream stream1 = new FileInputStream(path);
            XWPFDocument document1 = new XWPFDocument(stream1);
            List<XWPFTable> xwpfTables1 = document1.getTables();
            for (int i = 0; i < xwpfTables1.size(); i++) {
                for (int j = 0; j < xwpfTables1.get(i).getRows().size(); j++) {
                    for (int k = 0; k < xwpfTables1.get(i).getRows().get(j).getTableCells().size(); k++) {
                        if (xwpfTables1.get(i).getRows().get(j).getTableCells().get(k).getText().contains("@")) {
                            String text = xwpfTables1.get(i).getRows().get(j).getTableCells().get(k).getText();
                            String[] split = text.split("@");
                            xwpfTables1.get(i).getRows().get(j).getTableCells().get(k).removeParagraph(0);
                            XWPFParagraph xwpfParagraph = xwpfTables1.get(i).getRows().get(j).getTableCells().get(k).addParagraph();
                            XWPFRun run = xwpfParagraph.createRun();
                            run.setText(split[0]);
                            if (ObjectUtils.isNotNull(split[1])) {
                                run.addBreak();
                                run.setText(split[1]);
                            }
                            xwpfParagraph.setAlignment(ParagraphAlignment.CENTER);
                        }
                    }
                }
            }
            FileOutputStream fileOutputStream1 = new FileOutputStream(path);
            document1.write(fileOutputStream1);
            fileOutputStream1.close();
        } catch (FileNotFoundException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        return name;
    }
    /**
     * è®¾å¤‡æ ¡å‡†é™„件上传
     * @param file
     * @param suffix
     * @param id
     */
    @Override
    public void saveDeviceCalibrationFile(MultipartFile file, String suffix, Integer id) {
        String name = file.getOriginalFilename();
        UUID uuid = UUID.randomUUID();
        String fileName = uuid + name;
        String path = "";
        // æ ¹æ®åŽç¼€åˆ¤æ–­å±žäºŽä»€ä¹ˆç±»åž‹
        if(suffix.toLowerCase().contains("xls")) {
             path = excelUrl;
        } else if (suffix.toLowerCase().contains("doc") || suffix.toLowerCase().contains("pdf")) {
            path = wordUrl;
        } else {
            path = imgUrl;
        }
        File file1 = new File(path);
        if(!file1.exists()) {
            file1.mkdir();
        }
        try {
            File file2 = new File(file1, fileName);
            file.transferTo(file2);
            // ä¿å­˜æ•°æ®åº“
            PersonTrainingFile personTrainingFile = new PersonTrainingFile();
            personTrainingFile.setDetailId(id);
            personTrainingFile.setFileUrl("/" + fileName);
            personTrainingFile.setFileName(file.getOriginalFilename());
            personTrainingFile.setCreateUser(SecurityUtils.getUserId().intValue());
            personTrainingFile.setCreateTime(LocalDateTime.now());
            personTrainingFile.setEnumAttachmentType(com.ruoyi.personnel.enumeration.AttachmentType.getTypeValue(1));
            fileMapper.insert(personTrainingFile);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
    /**
     * æŸ¥çœ‹è®¾å¤‡æ ¡å‡†é™„ä»¶
     * @param id
     * @return
     */
    @Override
    public List<PersonTrainingFile> getDeviceCalibrationFile(Integer id) {
        List<PersonTrainingFile> personTrainingFiles = fileMapper.selectList(new LambdaQueryWrapper<PersonTrainingFile>()
                .eq(PersonTrainingFile::getDetailId, id)
                .eq(PersonTrainingFile::getEnumAttachmentType, com.ruoyi.personnel.enumeration.AttachmentType.getTypeValue(1)));
        if(CollectionUtils.isNotEmpty(personTrainingFiles)) {
            for(PersonTrainingFile a : personTrainingFiles) {
                // è®¾ç½®mime
                int i = a.getFileUrl().lastIndexOf(".");
                String contentType = getContentType(a.getFileUrl().substring(i + 1));
                a.setMime(contentType);
            }
        }
        return personTrainingFiles;
    }
    @Override
    public void delDeviceCalibrationFile(Integer id) {
        fileMapper.deleteById(id);
    }
    @Override
    public void downLoadDeviceCalibrationFile(Integer id, HttpServletResponse response) {
        PersonTrainingFile personTrainingFile = fileMapper.selectById(id);
        String fileName = personTrainingFile.getFileName();
        int i = fileName.lastIndexOf(".");
        String suffix = fileName.substring(i);
        String path = "";
        // æ ¹æ®åŽç¼€èŽ·å–ç›¸åº”çš„è·¯å¾„
        if(suffix.toLowerCase().contains("xls")) {
            path = excelUrl;
        } else if (suffix.toLowerCase().contains("doc") || suffix.toLowerCase().contains("pdf")) {
            path = wordUrl;
        } else {
            path = imgUrl;
        }
        path = path + personTrainingFile.getFileUrl();
        File file = new File(path);
        try(FileInputStream fileInputStream = new FileInputStream(file);
            ServletOutputStream outputStream = response.getOutputStream()) {
            String contentType = getContentType(suffix);
            // è®¾ç½®å“åº”头
            response.setContentType(contentType);
            response.setHeader("Content-disposition", "attachment;filename=" + fileName + suffix);
            byte[] bytes = new byte[1024];
            int len;
            while ((len = fileInputStream.read(bytes)) != -1) {
                outputStream.write(bytes,0,len);
                outputStream.flush();
            }
        }catch (Exception e) {
            throw new ErrorException("下载失败");
        }
    }
    @Override
    public void getEmployees(Integer departId) {
        List<Map> employees = headerToken.getEmployees();
        List<User> users = userMapper.selectList(new LambdaQueryWrapper<User>().eq(User::getStatus, 0)
                .like(User::getDepartLimsId,String.valueOf(departId)));
        if(CollectionUtils.isNotEmpty(users)) {
            for (User user : users) {
                if(CollectionUtils.isNotEmpty(employees)) {
                    for (Map map : employees) {
                        if(map.get("employeeID").toString().equals(user.getAccount())) {
                            employeeAddOrUpdate(map,user.getId());
                        }
                    }
                }
            }
        }
    }
    @Override
    public void getEmployee(Integer userId) {
        User user = userMapper.selectById(userId);
        Map employee = headerToken.getEmployee(user.getAccount());
        if(Objects.nonNull(user)) {
            employeeAddOrUpdate(employee,user.getId());
        }
    }
    public void  employeeAddOrUpdate(Map map,Integer userId) {
        PersonBasicInfo personBasicInfo = baseMapper.selectOne(new LambdaQueryWrapper<PersonBasicInfo>()
                .eq(PersonBasicInfo::getUserId, userId));
        if(Objects.isNull(personBasicInfo)) {
            personBasicInfo = new PersonBasicInfo();
        }
        // å°†ä¸ºnull的值改为""
        map = updateMap(map);
        // äººäº‹ç³»ç»ŸæœªåŒ…含字段
//        personBasicInfo.setEmergencyContactPhone(null); // ç´§æ€¥è”系人电话
//        personBasicInfo.setLastUpdateTime(null); // æœ€åŽæ›´æ–°æ—¶é—´
//        personBasicInfo.setCurrentState(""); // å½“前状态
//        personBasicInfo.setCurrentPosition(""); // å½“前职务
//        personBasicInfo.setProfessionalTitle(""); //职称
//        personBasicInfo.setPersonnelClassification(""); //人员分类
//        personBasicInfo.setOfficialAcademicRedentials(""); // æœ€é«˜å­¦åކ
//        personBasicInfo.setGraduationTime1(null); // æ¯•业时间
//        personBasicInfo.setGraduationTime2(null); // æ¯•业时间2
//        personBasicInfo.setGraduatedInstitutions2(""); // æ¯•业院校2
//        personBasicInfo.setMajor1(""); // ä¸“业1
//        personBasicInfo.setMajor2(""); // ä¸“业2
//        personBasicInfo.setEndPlannedInternship(null); // è®¡åˆ’实习结束
//        personBasicInfo.setDesktopPicture(""); // æ¡Œé¢å›¾ç‰‡
//        personBasicInfo.setAttachmentInformation(""); // é™„件资料
//        personBasicInfo.setRemarks(""); // å¤‡æ³¨
//        personBasicInfo.setPostType(""); // å²—位类别
//        personBasicInfo.setCurrentAddress(""); // çŽ°å±…ä½åœ°å€
//        personBasicInfo.setCurrentDetailAddress(""); // çŽ°å±…ä½è¯¦ç»†åœ°å€
//        personBasicInfo.setServiceAddress(""); // é€è¾¾åœ°å€
//        personBasicInfo.setServiceDetailAddress(""); // é€è¾¾è¯¦ç»†åœ°å€
//        personBasicInfo.setNcre(""); // è®¡ç®—机等级
//        personBasicInfo.setHighestDegree(""); // æœ€é«˜å­¦ä½
//        personBasicInfo.setFullTime(null); // æ˜¯å¦å±žäºŽå…¨æ—¥åˆ¶
//        personBasicInfo.setEnroll(null); // æ˜¯å¦å±žäºŽä¸­å¤©
        // è¿›è¡Œä¸€ä¸ªèµ‹å€¼
        personBasicInfo.setUserId(userId); // ç”¨æˆ·id
        if(StringUtils.isNotEmpty(map.get("dateOfJoiningTheCompany").toString())) {
            LocalDate parse = LocalDate.parse(map.get("dateOfJoiningTheCompany").toString());
            personBasicInfo.setEntryTime(parse); // å…¥èŒæ—¶é—´
        }
        if(StringUtils.isNotEmpty(map.get("dateOfBirth").toString())) {
            LocalDate parse1 = LocalDate.parse(map.get("dateOfBirth").toString());
            personBasicInfo.setDateBirth(parse1); //出生日期
        }
        if(StringUtils.isNotEmpty(map.get("dateOfConversionToFullTime").toString())) {
            personBasicInfo.setEndPracticalPractice(LocalDate.parse(map.get("dateOfConversionToFullTime").toString())); // å®žé™…实习结束  (转正日期)
        }
        if(StringUtils.isNotEmpty(map.get("dateOfResignation").toString())) {
            personBasicInfo.setDateDeparture(LocalDate.parse(map.get("dateOfResignation").toString())); // ç¦»èŒæ—¥æœŸ
        }
        if(StringUtils.isNotEmpty(map.get("dateOfJoiningTheGroup").toString())) {
            personBasicInfo.setGroupTime(LocalDate.parse(map.get("dateOfJoiningTheGroup").toString())); // å…¥é›†å›¢æ—¶é—´
        }
        if(StringUtils.isNotEmpty(map.get("dateOfJoiningTheCompany").toString())) {
            personBasicInfo.setTrialStartTime(LocalDate.parse(map.get("dateOfJoiningTheCompany").toString())); // è¯•用开始时间 å…¥èŒæ—¶é—´
        }
        if(StringUtils.isNotEmpty(map.get("dateOfConversionToFullTime").toString())) {
            personBasicInfo.setTrialEndTime(LocalDate.parse(map.get("dateOfConversionToFullTime").toString())); //   è¯•用结束时间 è½¬æ­£æ—¶é—´
        }
        if(StringUtils.isNotEmpty(map.get("idValidityPeriod").toString())) {
            personBasicInfo.setValidityPeriod(LocalDate.parse(map.get("idValidityPeriod").toString())); // è¯ä»¶æœ‰æ•ˆæœŸ
        }
        if(StringUtils.isNotEmpty(map.get("dateOfJoiningTheCommunistPartyOrCommunistYouthLeague").toString())) {
            personBasicInfo.setDumplingTime(LocalDate.parse(map.get("dateOfJoiningTheCommunistPartyOrCommunistYouthLeague").toString())); // å…¥å…š/团时间
        }
        if(StringUtils.isNotEmpty(map.get("dateOfJoiningTheCompany").toString())) {
            personBasicInfo.setUnitTime(LocalDate.parse(map.get("dateOfJoiningTheCompany").toString())); // å…¥å•位时间
        }
        personBasicInfo.setDepartmentCode(map.get("departmentCode").toString()); // éƒ¨é—¨ç¼–号
        personBasicInfo.setPost(map.get("position").toString()); // å²—位
        personBasicInfo.setSex(map.get("gender").toString()); //性别
        personBasicInfo.setIdentityCard(map.get("idNumber").toString()); // èº«ä»½è¯å·ç 
        personBasicInfo.setNation(map.get("nation").toString()); // æ°‘族
        personBasicInfo.setPoliticalStatus(map.get("politicalAffiliation").toString()); // æ”¿æ²»é¢è²Œ
        personBasicInfo.setGraduatedInstitutions1(""); // æ¯•业院校1
        personBasicInfo.setTelephone(map.get("phoneNumber").toString()); // æ‰‹æœºå·ç 
        personBasicInfo.setJobNumber(map.get("employeeID").toString()); // å·¥å· äººå‘˜ç¼–号
        personBasicInfo.setSubordinateNumber(map.get("employeeSubID").toString()); // å‘˜å·¥å­ç¼–号
        personBasicInfo.setCorporateName(map.get("companyId").toString()); // å…¬å¸åç§° æ‰€å±žç»„织编码
        personBasicInfo.setPostCode(map.get("positionCode").toString()); // å²—位编号
        personBasicInfo.setPostName(map.get("position").toString()); // å²—位名称
        personBasicInfo.setReportingTo(map.get("directSupervisorID").toString()); // ç›´æŽ¥ä¸Šçº§
        personBasicInfo.setLaborRelations(map.get("employmentStatus").toString()); // åŠ³åŠ¨å…³ç³»
        personBasicInfo.setNativePlace(map.get("hometown").toString()); // ç±è´¯
        personBasicInfo.setIdType(map.get("idType").toString()); // è¯ä»¶ç±»åž‹
        personBasicInfo.setMaritalStatus(map.get("maritalStatus").toString()); // å©šå§»çж况
        personBasicInfo.setIdAddress(map.get("idAddress").toString()); // è¯ä»¶åœ°å€
        personBasicInfo.setIdDetailAddress(map.get("detailedResidentialAddress").toString()); // èº«ä»½è¯è¯¦ç»†åœ°å€
        personBasicInfo.setRetiredSoldiers(map.get("militaryServiceStatus").toString()); // æ˜¯å¦æ˜¯é€€ä¼å†›äºº
        personBasicInfo.setCornet(map.get("shortPhoneNumber").toString()); // çŸ­å·
        personBasicInfo.setOfficePhone(map.get("officePhone").toString()); // åŠžå…¬ç”µè¯
        personBasicInfo.setCollegeStudents(map.get("yearOfGraduation").toString()); // xxx届大学生
        personBasicInfo.setEmergencyContact(map.get("emergencyContactName").toString()); // ç´§æ€¥è”系人
        personBasicInfo.setCompanyEmail(map.get("companyEmail").toString()); // å…¬å¸é‚®ç®±
        if(Objects.nonNull(personBasicInfo.getDateBirth())) {
            Period period = Period.between(personBasicInfo.getDateBirth(), LocalDate.now());
            int years = period.getYears();
            personBasicInfo.setPersonBasicInfoAge(years);
        }
        if(Objects.isNull(personBasicInfo.getId()) ) {
            log.info("新增");
            baseMapper.insert(personBasicInfo);
        }else {
            log.info("更新");
            baseMapper.updateById(personBasicInfo);
        }
    }
    public Map updateMap(Map<String,Object> map) {
        Iterator<Map.Entry<String, Object>> iterator = map.entrySet().iterator();
        while (iterator.hasNext()){
            Map.Entry<String, Object> entry = iterator.next();
            if(Objects.isNull(entry.getValue()) || entry.getValue().equals("null")) {
                entry.setValue("");
            }
        }
        return map;
    }
    /**
     * é€’归查询子节点
     * @param root  æ ¹èŠ‚ç‚¹
     * @param all   æ‰€æœ‰èŠ‚ç‚¹
     * @return æ ¹èŠ‚ç‚¹ä¿¡æ¯
     */
    private List<DepartmentDto> getChildren(DepartmentDto root, List<DepartmentDto> all) {
        if (ObjectUtils.isNotEmpty(root.getId())) {
            return all.stream().filter(m -> Objects.equals(m.getFatherId(), root.getId())).peek(
                    (m) -> m.setChildren(getChildren(m, all))
            ).collect(Collectors.toList());
        } else {
            return Collections.emptyList();
        }
    }
    // æ°´å¹³åˆå¹¶å•元格
    private static void mergeCellsHorizontally(XWPFTable table, int row, int fromCol, int toCol) {
        for (int i = fromCol; i <= toCol; i++) {
            if (i == fromCol) {
                table.getRow(row).getCell(i).getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.RESTART);
            } else {
                table.getRow(row).getCell(i).getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.CONTINUE);
            }
        }
    }
    // åž‚直合并单元格
    private static void mergeCellsVertically(XWPFTable table, int col, int fromRow, int toRow) {
        for (int i = fromRow; i <= toRow; i++) {
            if (i == fromRow) {
                table.getRow(i).getCell(col).getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.RESTART);
            } else {
                table.getRow(i).getCell(col).getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.CONTINUE);
            }
        }
    }
    // æ ¹æ®æ–‡ä»¶æ‰©å±•名获取 MIME ç±»åž‹
    private String getContentType(String fileExtension) {
        switch (fileExtension) {
            case "jpg":
            case "jpeg":
                return "image/jpeg";
            case "png":
                return "image/png";
            case "gif":
                return "image/gif";
            case "pdf":
                return "application/pdf";
            case "doc":
                return "application/msword";
            case "docx":
                return "application/vnd.openxmlformats-officedocument.wordprocessingml.document";
            case "xls":
                return "application/vnd.ms-excel";
            case "xlsx":
                return "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
            case "ppt":
            case "pptx":
                return "application/vnd.ms-powerpoint";
            default:
                return "application/octet-stream"; // é»˜è®¤äºŒè¿›åˆ¶æµ
        }
    }
}
cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonCommunicationAbilityServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,113 @@
package com.ruoyi.personnel.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.config.Configure;
import com.deepoove.poi.config.ConfigureBuilder;
import com.ruoyi.common.core.domain.entity.User;
import com.ruoyi.personnel.dto.PersonCommunicationAbilityDto;
import com.ruoyi.personnel.mapper.PersonCommunicationAbilityMapper;
import com.ruoyi.personnel.pojo.PersonCommunicationAbility;
import com.ruoyi.personnel.service.PersonCommunicationAbilityService;
import com.ruoyi.system.mapper.UserMapper;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.stream.Collectors;
/**
 * <p>
 * æ²Ÿé€šèƒ½åŠ› æœåŠ¡å®žçŽ°ç±»
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2024-10-09 12:00:57
 */
@Service
public class PersonCommunicationAbilityServiceImpl extends ServiceImpl<PersonCommunicationAbilityMapper, PersonCommunicationAbility> implements PersonCommunicationAbilityService {
    @Resource
    UserMapper userMapper;
    @Override
    public IPage<PersonCommunicationAbilityDto> personPersonCommunicationAbilityPage(Page page, Integer departLimsId, Integer userId, String userName) {
        IPage<PersonCommunicationAbilityDto> personCommunicationAbilityDtoIPage = baseMapper.personPersonCommunicationAbilityPage(page, departLimsId, userId, userName);
        List<PersonCommunicationAbilityDto> collect = personCommunicationAbilityDtoIPage.getRecords().stream().map(personCommunicationAbilityDto -> {
            if (ObjectUtils.isNotEmpty(personCommunicationAbilityDto.getUserId())) {
                List<String> account = new ArrayList<>();
                List<String> name = new ArrayList<>();
                for (String s : personCommunicationAbilityDto.getUserId().split(",")) {
                    User user = userMapper.selectById(Integer.parseInt(s));
                    account.add(user.getAccount());
                    name.add(user.getName());
                }
                personCommunicationAbilityDto.setAccount(account.stream().collect(Collectors.joining(",")));
                personCommunicationAbilityDto.setUserName(name.stream().collect(Collectors.joining(",")));
            }
            return personCommunicationAbilityDto;  // è¿™é‡Œå¯ä»¥å¯¹è¿”回的数据进行处理,如添加一些新的属性或转换等。
        }).collect(Collectors.toList());
        personCommunicationAbilityDtoIPage.setRecords(collect);
        return personCommunicationAbilityDtoIPage;
    }
    @Override
    public void exportPersonCommunicationAbility(Integer id, HttpServletResponse response) throws Exception {
        PersonCommunicationAbility personCommunicationAbility = baseMapper.selectById(id);
        //沟通人
        String collect = " ";
        if (ObjectUtils.isNotEmpty(personCommunicationAbility.getUserId())) {
            List<String> name = new ArrayList<>();
            for (String s : personCommunicationAbility.getUserId().split(",")) {
                User user = userMapper.selectById(Integer.parseInt(s));
                name.add(user.getName());
            }
            collect = name.stream().collect(Collectors.joining(","));
        }
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyå¹´MM月dd日");
        //时间
        String communicationTime = "";
        if (ObjectUtils.isNotEmpty(personCommunicationAbility.getCommunicationTime())) {
            communicationTime = personCommunicationAbility.getCommunicationTime().format(formatter);
        }
        InputStream inputStream = this.getClass().getResourceAsStream("/static/communication-deal.docx");
        ConfigureBuilder builder = Configure.builder();
        builder.useSpringEL(true);
        String finalCollect = collect;
        String finalCommunicationTime = communicationTime;
        XWPFTemplate template = XWPFTemplate.compile(inputStream, builder.build()).render(
                new HashMap<String, Object>() {{
                    put("userName", finalCollect);
                    put("communicationTime", finalCommunicationTime);
                    put("communicationPlace", personCommunicationAbility.getCommunicationPlace());
                    put("communicationContent", personCommunicationAbility.getCommunicationContent());
                }});
        try {
            response.setContentType("application/msword");
            String fileName = URLEncoder.encode(
                    "沟通记录", "UTF-8");
            response.setHeader("Content-disposition",
                    "attachment;filename=" + fileName + ".docx");
            OutputStream os = response.getOutputStream();
            template.write(os);
            os.flush();
            os.close();
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException("导出失败");
        }
    }
}
cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonJobResponsibilitiesServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,114 @@
package com.ruoyi.personnel.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.config.Configure;
import com.deepoove.poi.config.ConfigureBuilder;
import com.ruoyi.common.core.domain.entity.User;
import com.ruoyi.personnel.dto.PersonJobResponsibilitiesDto;
import com.ruoyi.personnel.mapper.PersonJobResponsibilitiesMapper;
import com.ruoyi.personnel.pojo.PersonJobResponsibilities;
import com.ruoyi.personnel.service.PersonJobResponsibilitiesService;
import com.ruoyi.system.mapper.UserMapper;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.time.format.DateTimeFormatter;
import java.util.HashMap;
/**
 * <p>
 * å²—位职责 æœåŠ¡å®žçŽ°ç±»
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2024-10-09 02:07:49
 */
@Service
@AllArgsConstructor
public class PersonJobResponsibilitiesServiceImpl extends ServiceImpl<PersonJobResponsibilitiesMapper, PersonJobResponsibilities> implements PersonJobResponsibilitiesService {
    @Resource
    UserMapper userMapper;
    @Override
    public IPage<PersonJobResponsibilitiesDto> personJobResponsibilitiesSelect(Page page, String userId, String departmentId, String userName) {
        return baseMapper.personJobResponsibilitiesSelect(page, userId, departmentId, userName);
    }
    @Override
    public void exportPersonJobResponsibilities(Integer id, HttpServletResponse response) {
        PersonJobResponsibilities personJobResponsibilities = baseMapper.selectById(id);
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyå¹´MM月dd日");
        //岗位名称
        String name = personJobResponsibilities.getPostName();
        //所属部门
        String departLims = userMapper.selectUserDepartmentLimsName(Integer.parseInt(personJobResponsibilities.getIncumbentId()));
        //工作目标
        String objective = personJobResponsibilities.getJobObjective();
        //岗位职责
        String responsibilities = personJobResponsibilities.getJobResponsibilities();
        //任职人
        User user = userMapper.selectById(Integer.parseInt(personJobResponsibilities.getIncumbentId()));
        String incumbent = user.getName();
        //任职时间
        String incumbentDate = "";
        if (ObjectUtils.isNotEmpty(personJobResponsibilities.getIncumbentDate())) {
            incumbentDate = personJobResponsibilities.getIncumbentDate().format(formatter);
        }
        //主管
        String supervisor = "";
        if (ObjectUtils.isNotEmpty(personJobResponsibilities.getSupervisorId())) {
            supervisor = userMapper.selectById(personJobResponsibilities.getSupervisorId()).getName();
        }
        //主管时间
        String supervisorDate = "";
        if (ObjectUtils.isNotEmpty(personJobResponsibilities.getSupervisorDate())) {
            supervisorDate = personJobResponsibilities.getSupervisorDate().format(formatter);
        }
        InputStream inputStream = this.getClass().getResourceAsStream("/static/explain-deal.docx");
        ConfigureBuilder builder = Configure.builder();
        builder.useSpringEL(true);
        String finalIncumbentDate = incumbentDate;
        String finalSupervisor = supervisor;
        String finalSupervisorDate = supervisorDate;
        XWPFTemplate template = XWPFTemplate.compile(inputStream, builder.build()).render(
                new HashMap<String, Object>() {{
                    put("name", name);
                    put("account", user.getAccount());
                    put("departLims", departLims);
                    put("objective", objective);
                    put("responsibilities", responsibilities);
                    put("incumbent", incumbent);
                    put("incumbentDate", finalIncumbentDate);
                    put("supervisor", finalSupervisor);
                    put("supervisorDate", finalSupervisorDate);
                }});
        try {
            response.setContentType("application/msword");
            String fileName = URLEncoder.encode(
                    name + "的任职岗位说明书", "UTF-8");
            response.setHeader("Content-disposition",
                    "attachment;filename=" + fileName + ".docx");
            OutputStream os = response.getOutputStream();
            template.write(os);
            os.flush();
            os.close();
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException("导出失败");
        }
    }
}
cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonPersonnelCapacityServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,121 @@
package com.ruoyi.personnel.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.config.Configure;
import com.deepoove.poi.config.ConfigureBuilder;
import com.deepoove.poi.data.Pictures;
import com.ruoyi.common.utils.DateImageUtil;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.framework.exception.ErrorException;
import com.ruoyi.personnel.dto.PersonPersonnelCapacityDto;
import com.ruoyi.personnel.dto.PersonPersonnelCapacityExportDto;
import com.ruoyi.personnel.mapper.PersonPersonnelCapacityMapper;
import com.ruoyi.personnel.pojo.PersonPersonnelCapacity;
import com.ruoyi.personnel.service.PersonPersonnelCapacityService;
import com.ruoyi.system.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.time.LocalDateTime;
import java.util.HashMap;
/**
 * <p>
 * äººå‘˜èƒ½åŠ› æœåŠ¡å®žçŽ°ç±»
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2024-10-10 11:26:18
 */
@Service
public class PersonPersonnelCapacityServiceImpl extends ServiceImpl<PersonPersonnelCapacityMapper, PersonPersonnelCapacity> implements PersonPersonnelCapacityService {
    @Resource
    private UserMapper userMapper;
    @Value("${file.path}")
    private String imgUrl;
    @Override
    public IPage<PersonPersonnelCapacityDto> personPersonnelCapacityPage(Page page, Integer departLimsId, Integer userId, String userName) {
        return baseMapper.personPersonnelCapacityPage(page, departLimsId, userId, userName);
    }
    /**
     * å¯¼å‡ºäººå‘˜èƒ½åŠ›
     * @param id
     * @param response
     */
    @Override
    public void exportPersonnelCapacity(Integer id, HttpServletResponse response) {
        PersonPersonnelCapacityExportDto capacityExportDto = baseMapper.selectExportPersonnelCapacity(id);
        // ç¡®è®¤äºº
        String confirmUrl = null;
        if (capacityExportDto.getConfirmOperatingPersonnelId() != null) {
            confirmUrl = userMapper.selectById(capacityExportDto.getConfirmOperatingPersonnelId()).getSignatureUrl();
            if (StringUtils.isBlank(confirmUrl)) {
                throw new ErrorException("确认人");
            }
        }
        // èŽ·å–è·¯å¾„
        InputStream inputStream = this.getClass().getResourceAsStream("/static/personnel-capacity.docx");
        ConfigureBuilder builder = Configure.builder();
        builder.useSpringEL(true);
        String finalConfirmUrl = confirmUrl;
        XWPFTemplate template = XWPFTemplate.compile(inputStream, builder.build()).render(
                new HashMap<String, Object>() {{
                    put("capacity", capacityExportDto);
                    put("confirmUrl", StringUtils.isNotBlank(finalConfirmUrl) ? Pictures.ofLocal(imgUrl + "/" + finalConfirmUrl).create() : null);
                    put("confirmDateUrl", capacityExportDto.getConfirmDate() != null ?
                            Pictures.ofStream(DateImageUtil.createDateImage(capacityExportDto.getConfirmDate())).create() : null);
                }});
        try {
            response.setContentType("application/msword");
            String fileName = URLEncoder.encode(
                    "人员能力", "UTF-8");
            response.setHeader("Content-disposition",
                    "attachment;filename=" + fileName + ".docx");
            OutputStream os = response.getOutputStream();
            template.write(os);
            os.flush();
            os.close();
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException("导出失败");
        }
    }
    /**
     * äººå‘˜èƒ½åŠ›ç¡®è®¤
     * @param id
     * @return
     */
    @Override
    public boolean confirmPersonnelCapacity(Integer id) {
        // æŸ¥è¯¢äººå‘˜èƒ½åŠ›
        PersonPersonnelCapacity personPersonnelCapacity = baseMapper.selectById(id);
        if (personPersonnelCapacity.getConfirmOperatingPersonnelId() != null) {
            throw new ErrorException("该人员能力已确认过, æ— éœ€é‡å¤ç¡®è®¤");
        }
        Integer userId = SecurityUtils.getUserId().intValue();
        baseMapper.update(null, Wrappers.<PersonPersonnelCapacity>lambdaUpdate()
                .eq(PersonPersonnelCapacity::getId, id)
                .set(PersonPersonnelCapacity::getConfirmOperatingPersonnelId, userId)
                .set(PersonPersonnelCapacity::getConfirmDate, LocalDateTime.now()));
        return true;
    }
}
cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonPostAuthorizationRecordServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,136 @@
package com.ruoyi.personnel.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.config.Configure;
import com.deepoove.poi.config.ConfigureBuilder;
import com.deepoove.poi.data.FilePictureRenderData;
import com.ruoyi.common.core.domain.entity.User;
import com.ruoyi.framework.exception.ErrorException;
import com.ruoyi.personnel.dto.PersonPostAuthorizationRecordDto;
import com.ruoyi.personnel.mapper.PersonPostAuthorizationRecordMapper;
import com.ruoyi.personnel.pojo.PersonPostAuthorizationRecord;
import com.ruoyi.personnel.service.PersonPostAuthorizationRecordService;
import com.ruoyi.system.mapper.UserMapper;
import net.sourceforge.pinyin4j.PinyinHelper;
import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType;
import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;
import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.time.LocalDateTime;
import java.util.HashMap;
/**
 * <p>
 * ä»»èŒæŽˆæƒè®°å½• æœåŠ¡å®žçŽ°ç±»
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2024-10-09 10:48:17
 */
@Service
public class PersonPostAuthorizationRecordServiceImpl extends ServiceImpl<PersonPostAuthorizationRecordMapper, PersonPostAuthorizationRecord> implements PersonPostAuthorizationRecordService {
    @Resource
    UserMapper userMapper;
    @Value("${file.path}")
    private String imgUrl;
    @Override
    public IPage<PersonPostAuthorizationRecordDto> personPostAuthorizationRecordPage(Page page, Integer departLimsId, Integer userId, String userName) {
        return baseMapper.personPostAuthorizationRecordPage(page, departLimsId, userId, userName);
    }
    @Override
    public void exportPersonPostAuthorizationRecord(Integer id, HttpServletResponse response) {
        PersonPostAuthorizationRecord personPostAuthorizationRecord = baseMapper.selectById(id);
        //姓名
        User user = userMapper.selectById(personPostAuthorizationRecord.getUserId());
        String name = user.getName();
        //姓名英文
        HanyuPinyinOutputFormat format = new HanyuPinyinOutputFormat();
        format.setCaseType(HanyuPinyinCaseType.LOWERCASE);
        format.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
        StringBuilder pinyinBuilder = new StringBuilder();
        for (int i = 0; i < name.length(); i++) {
            char c = name.charAt(i);
            // åˆ¤æ–­æ˜¯å¦æ˜¯æ±‰å­—
            if (Character.toString(c).matches("[\\u4E00-\\u9FFF]")) {
                // èŽ·å–æ±‰å­—çš„æ‹¼éŸ³æ•°ç»„
                String[] pinyinArray = new String[0];
                try {
                    pinyinArray = PinyinHelper.toHanyuPinyinStringArray(c, format);
                } catch (BadHanyuPinyinOutputFormatCombination badHanyuPinyinOutputFormatCombination) {
                }
                if (pinyinArray!= null && pinyinArray.length > 0) {
                    pinyinBuilder.append(pinyinArray[0]);
                }
            } else {
                pinyinBuilder.append(c);
            }
        }
        String nameEn = pinyinBuilder.toString();
        //理论知识考试成绩
        String num1=personPostAuthorizationRecord.getNum1();
        //操作技能考试成绩
        String num2=personPostAuthorizationRecord.getNum2();
        //证书编号
        String code = personPostAuthorizationRecord.getCertificateNumber();
        //发证时间
        LocalDateTime createTime = personPostAuthorizationRecord.getCreateTime();
        String year = createTime.getYear() + "";
        String mon = createTime.getMonth().getValue() + "";
        String day = createTime.getDayOfMonth() + "";
        //个人照片
        if (ObjectUtils.isEmpty(user.getPictureUrl())) {
            throw new ErrorException(name+"的个人照片没有上传");
        }
        String pictureUrl = user.getPictureUrl();
        InputStream inputStream = this.getClass().getResourceAsStream("/static/credentials-deal.docx");
        ConfigureBuilder builder = Configure.builder();
        builder.useSpringEL(true);
        XWPFTemplate template = XWPFTemplate.compile(inputStream, builder.build()).render(
                new HashMap<String, Object>() {{
                    put("name", name);
                    put("nameEn", nameEn);
                    put("num1", num1);
                    put("num2", num2);
                    put("code", code);
                    put("year", year);
                    put("mon", mon);
                    put("day", day);
                    put("writeUrl", new FilePictureRenderData(100,50,imgUrl + "/" + pictureUrl));
                }});
        try {
            response.setContentType("application/msword");
            String fileName = URLEncoder.encode(
                    name+"的岗位职业资格正式", "UTF-8");
            response.setHeader("Content-disposition",
                    "attachment;filename=" + fileName + ".docx");
            OutputStream os = response.getOutputStream();
            template.write(os);
            os.flush();
            os.close();
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException("导出失败");
        }
    }
}
cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonRewardPunishmentRecordServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,36 @@
package com.ruoyi.personnel.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.personnel.dto.PersonRewardPunishmentRecordDto;
import com.ruoyi.personnel.excel.PersonRewardPunishmentRecordExcel;
import com.ruoyi.personnel.mapper.PersonRewardPunishmentRecordMapper;
import com.ruoyi.personnel.pojo.PersonRewardPunishmentRecord;
import com.ruoyi.personnel.service.PersonRewardPunishmentRecordService;
import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.List;
/**
 * <p>
 * å¥–惩记录 æœåŠ¡å®žçŽ°ç±»
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2024-10-08 11:25:02
 */
@Service
public class PersonRewardPunishmentRecordServiceImpl extends ServiceImpl<PersonRewardPunishmentRecordMapper, PersonRewardPunishmentRecord> implements PersonRewardPunishmentRecordService {
    @Override
    public IPage<PersonRewardPunishmentRecordDto> rewardPunishmentPage(Page page, Integer userId, String userName, Date startTime, Date endTime, Integer departmentId) {
        return baseMapper.rewardPunishmentPage(page, userId, userName, startTime, endTime, departmentId);
    }
    @Override
    public List<PersonRewardPunishmentRecordExcel> rewardPunishmentExport(Integer userId, Integer departmentId, String userName, Date startTime, Date endTime) {
        return baseMapper.rewardPunishmentExport(userId, departmentId, userName, startTime, endTime);
    }
}
cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonSupervisePlanDetailsServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,43 @@
package com.ruoyi.personnel.service.impl;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.personnel.dto.PersonSupervisePlanDetailsDto;
import com.ruoyi.personnel.excel.PersonSupervisePlanDetailsUpload;
import com.ruoyi.personnel.mapper.PersonSupervisePlanDetailsMapper;
import com.ruoyi.personnel.pojo.PersonSupervisePlanDetails;
import com.ruoyi.personnel.service.PersonSupervisePlanDetailsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
 * <p>
 * ç›‘督计划 - å­ æœåŠ¡å®žçŽ°ç±»
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2024-10-09 04:17:02
 */
@Service
public class PersonSupervisePlanDetailsServiceImpl extends ServiceImpl<PersonSupervisePlanDetailsMapper, PersonSupervisePlanDetails> implements PersonSupervisePlanDetailsService {
    public IPage<PersonSupervisePlanDetailsDto> yearPlanDetailPage(Page page, String date, String project, Integer planId) {
        IPage<PersonSupervisePlanDetailsDto> personSupervisePlanDetailsDtoIPage = baseMapper.pageByDate(page, date, project, planId);
        return personSupervisePlanDetailsDtoIPage;
    }
    @Override
    public void importExcel(List<PersonSupervisePlanDetailsUpload> list, Integer planId) {
        List<PersonSupervisePlanDetails> personSupervisePlanDetailsList = JSON.parseArray(JSON.toJSONString(list), PersonSupervisePlanDetails.class);
        personSupervisePlanDetailsList.forEach(i -> i.setPlanId(planId));
        if (CollectionUtils.isNotEmpty(personSupervisePlanDetailsList)) {
            baseMapper.insertBatchSomeColumn(personSupervisePlanDetailsList);
        }
    }
}
cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonSupervisePlanServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,327 @@
package com.ruoyi.personnel.service.impl;
import cn.hutool.core.util.NumberUtil;
import com.alibaba.excel.EasyExcel;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.config.Configure;
import com.deepoove.poi.data.Pictures;
import com.ruoyi.common.core.domain.entity.User;
import com.ruoyi.common.utils.DateImageUtil;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.framework.exception.ErrorException;
import com.ruoyi.inspect.util.HackLoopTableRenderPolicy;
import com.ruoyi.personnel.dto.PersonSupervisePlanDto;
import com.ruoyi.personnel.excel.PersonSupervisePlanDetailsListener;
import com.ruoyi.personnel.excel.PersonSupervisePlanDetailsUpload;
import com.ruoyi.personnel.mapper.PersonSupervisePlanDetailsMapper;
import com.ruoyi.personnel.mapper.PersonSupervisePlanMapper;
import com.ruoyi.personnel.mapper.PersonSupervisionRecordMapper;
import com.ruoyi.personnel.pojo.PersonSupervisePlan;
import com.ruoyi.personnel.pojo.PersonSupervisePlanDetails;
import com.ruoyi.personnel.pojo.PersonSupervisionRecord;
import com.ruoyi.personnel.service.PersonSupervisePlanDetailsService;
import com.ruoyi.personnel.service.PersonSupervisePlanService;
import com.ruoyi.system.mapper.UserMapper;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.hwpf.HWPFDocument;
import org.apache.poi.hwpf.usermodel.*;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFTable;
import org.apache.poi.xwpf.usermodel.XWPFTableCell;
import org.apache.poi.xwpf.usermodel.XWPFTableRow;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
 * <p>
 * ç›‘督计划 - çˆ¶ æœåŠ¡å®žçŽ°ç±»
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2024-10-09 04:14:45
 */
@Service
@Slf4j
@Transactional(rollbackFor = Exception.class)
@AllArgsConstructor
public class PersonSupervisePlanServiceImpl extends ServiceImpl<PersonSupervisePlanMapper, PersonSupervisePlan> implements PersonSupervisePlanService {
    private PersonSupervisePlanDetailsService personSupervisePlanDetailsService;
    private PersonSupervisePlanDetailsMapper personSupervisePlanDetailsMapper;
    private PersonSupervisionRecordMapper personSupervisionRecordMapper;
    @Value("${file.path}")
    private String imgUrl;
    @Autowired
    private UserMapper userMapper;
    public IPage<PersonSupervisePlanDto> yearPlanDtoIPage(Page page, String organizationPerson, Integer departId) {
        IPage<PersonSupervisePlanDto> personSupervisePlanDtoIPage = baseMapper.pageByPerson(page, organizationPerson, departId);
        List<PersonSupervisePlanDto> records = personSupervisePlanDtoIPage.getRecords();
        for(PersonSupervisePlanDto a : records) {
            a.setCurrentId(SecurityUtils.getUserId().intValue());
        }
        return personSupervisePlanDtoIPage;
    }
    @Override
    public void yearPlanDetailImport(MultipartFile file ,String suffix) {
        // å¹´åº¦è®¡åˆ’父级新增数据
        PersonSupervisePlan personSupervisePlan = new PersonSupervisePlan();
        String fileName = file.getOriginalFilename().substring(0, file.getOriginalFilename().lastIndexOf("."));
        personSupervisePlan.setFileName(fileName);
        personSupervisePlan.setOrganizationPersonId(SecurityUtils.getUserId().intValue());
        personSupervisePlan.setOrganizationDate(LocalDateTime.now());
        baseMapper.insert(personSupervisePlan);
        List<List<String>> tableData = new ArrayList<>();
        String name = "";
        // å¹´åº¦è®¡åˆ’详情 æ–°å¢ž
        try {
            if(suffix.toLowerCase().contains("xls")) {
                PersonSupervisePlanDetailsListener personSupervisePlanDetailsListener = new PersonSupervisePlanDetailsListener(personSupervisePlanDetailsService);
                personSupervisePlanDetailsListener.setPlanId(personSupervisePlan.getId());
                EasyExcel.read(file.getInputStream(), PersonSupervisePlanDetailsUpload.class, personSupervisePlanDetailsListener).sheet().doRead();
            }else if(suffix.toLowerCase().equals("doc"))  {
                try(InputStream inputStream = file.getInputStream();
                    HWPFDocument doc = new HWPFDocument(inputStream)) {
                    // èŽ·å–æ–‡æ¡£çš„ Range
                    Range range = doc.getRange();
                    // éåŽ†æ‰€æœ‰è¡¨æ ¼
                    TableIterator tableIterator = new TableIterator(range);
                    while (tableIterator.hasNext()) {
                        Table table = tableIterator.next();
                        // éåŽ†è¡¨æ ¼çš„æ¯ä¸€è¡Œ
                        for (int rowIdx = 0; rowIdx < table.numRows(); rowIdx++) {
                            TableRow row = table.getRow(rowIdx);
                            List<String> rowData = new ArrayList<>();
                            // éåŽ†è¡Œä¸­çš„æ¯ä¸ªå•å…ƒæ ¼
                            for (int cellIdx = 0; cellIdx < row.numCells(); cellIdx++) {
                                TableCell cell = row.getCell(cellIdx);
                                String text = cell.text().trim();
                                rowData.add(text);
                            }
                            tableData.add(rowData);
                        }
                    }
                    for (List<String> list : tableData) {
                        // è¿›è¡Œæ·»åŠ 
                        addPersonSupervisePlanDetails(list,personSupervisePlan.getId());
                        if(StringUtils.isEmpty(name) && NumberUtil.isInteger(list.get(0))) {
                            String supervisePerson = list.get(4); // è¢«ç›‘督人员
                            name = supervisePerson;
                        }
                    }
                    // æ ¹æ®æ·»åŠ æ•°æ®è¢«ç›‘ç£äºº æ¥åˆ¤æ–­è¯¥æ–‡ä»¶æ˜¯å“ªä¸ªéƒ¨é—¨çš„
                    String departLimsId = userMapper.selectList(new LambdaQueryWrapper<User>().eq(User::getName, name)).get(0).getDepartLimsId();
                    if(StringUtils.isNotEmpty(departLimsId) && departLimsId.contains("18")) {
                        baseMapper.update(null,new LambdaUpdateWrapper<PersonSupervisePlan>()
                                .set(PersonSupervisePlan::getDepartId,18)
                                .set(PersonSupervisePlan::getOrganizationPersonId,12) // é€šä¿¡çš„æ˜¯åˆ˜æ™¨ ï¼ˆç¼–制人)
                                .eq(PersonSupervisePlan::getId,personSupervisePlan.getId()));
                    } else if (StringUtils.isNotEmpty(departLimsId) && departLimsId.contains("19")) {
                        baseMapper.update(null,new LambdaUpdateWrapper<PersonSupervisePlan>()
                                .set(PersonSupervisePlan::getDepartId,19)
                                .set(PersonSupervisePlan::getOrganizationPersonId,41) // ç”µåŠ›çš„æ˜¯å´æ˜ŽåŽ ï¼ˆç¼–制人)
                                .eq(PersonSupervisePlan::getId,personSupervisePlan.getId()));
                    }
                log.info("读取文件: {}",tableData);
                }catch (Exception e) {
                    throw new ErrorException("导入失败"+ e);
                }
            }else if(suffix.toLowerCase().equals("docx")) {
                try(InputStream fileInputStream = file.getInputStream();XWPFDocument xwpfDocument = new XWPFDocument(fileInputStream)) {
                    // éåŽ†æ‰€æœ‰è¡¨æ ¼
                    for(XWPFTable table : xwpfDocument.getTables()) {
                        // éåŽ†æ¯ä¸€è¡Œ
                        for(XWPFTableRow row : table.getRows()) {
                            List<String> list = new ArrayList<>();
                            // éåŽ†æ¯ä¸€ä¸ªå•å…ƒæ ¼
                            for(XWPFTableCell cell : row.getTableCells()) {
                                String text = cell.getText();
                                list.add(text);
                            }
                            log.info("读取每一行的内容: {}",list);
                            // è¿›è¡Œæ·»åŠ 
                            addPersonSupervisePlanDetails(list,personSupervisePlan.getId());
                           if(StringUtils.isEmpty(name) && NumberUtil.isInteger(list.get(0))) {
                               String supervisePerson = list.get(4); // è¢«ç›‘督人员
                               name = supervisePerson;
                           }
                        }
                    }
                    // æ ¹æ®æ·»åŠ æ•°æ®è¢«ç›‘ç£äºº æ¥åˆ¤æ–­è¯¥æ–‡ä»¶æ˜¯å“ªä¸ªéƒ¨é—¨çš„
                    String departLimsId = userMapper.selectList(new LambdaQueryWrapper<User>().eq(User::getName, name)).get(0).getDepartLimsId();
                    if(StringUtils.isNotEmpty(departLimsId) && departLimsId.contains("18")) {
                        baseMapper.update(null,new LambdaUpdateWrapper<PersonSupervisePlan>()
                                .set(PersonSupervisePlan::getDepartId,18)
                                .eq(PersonSupervisePlan::getId,personSupervisePlan.getId()));
                    } else if (StringUtils.isNotEmpty(departLimsId) && departLimsId.contains("19")) {
                        baseMapper.update(null,new LambdaUpdateWrapper<PersonSupervisePlan>()
                                .set(PersonSupervisePlan::getDepartId,18)
                                .eq(PersonSupervisePlan::getId,personSupervisePlan.getId()));
                    }
                }catch (Exception e){
                    throw new ErrorException("导入失败"+e);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public void  addPersonSupervisePlanDetails(List<String> list,Integer planId) {
        if(NumberUtil.isInteger(list.get(0)) ) {
            String superviseDate = list.get(1); // ç›‘督日期
            String superviseDes = list.get(2); // ç›‘督目的
            String superviseProject = list.get(3); // ç›‘督项目
            String supervisePerson = list.get(4); // è¢«ç›‘督人员
            String superviseReason = list.get(5); // ç›‘督原因
            String remarks = list.get(6); // å¤‡æ³¨
            PersonSupervisePlanDetails personSupervisePlanDetails = new PersonSupervisePlanDetails();
            LocalDate localDate = null;
            String[] parts = superviseDate.split("\\.");
            if (parts.length == 2) {
                try {
                    // èŽ·å–å¹´ä»½
                    int year = Integer.parseInt(parts[0]);
                    // èŽ·å–æœˆä»½
                    int month = Integer.parseInt(parts[1]);
                    // åˆ›å»º LocalDate å¯¹è±¡ï¼Œæ—¥æœŸè®¾ä¸ºè¯¥æœˆç¬¬ä¸€å¤©
                    localDate = LocalDate.of(year, month, 1);
                } catch (NumberFormatException e) {
                   throw  new ErrorException("输入的字符串无法转换为有效的年份或月份: " + e.getMessage());
                }
            }
            personSupervisePlanDetails.setSuperviseDate(localDate);
            personSupervisePlanDetails.setSuperviseDes(superviseDes);
            personSupervisePlanDetails.setSuperviseProject(superviseProject);
            personSupervisePlanDetails.setSupervisePerson(supervisePerson);
            personSupervisePlanDetails.setSuperviseReason(superviseReason);
            personSupervisePlanDetails.setRemarks(remarks);
            personSupervisePlanDetails.setPlanId(planId); // çˆ¶id
            personSupervisePlanDetailsMapper.insert(personSupervisePlanDetails);
        }
    }
    /**
     * å¯¼å‡ºäººå‘˜ç›‘督计划
     * @param id
     * @param response
     */
    @Override
    public void exportSuperVisePlan(Integer id, HttpServletResponse response) {
        Map<String, Object> data = new HashMap<>();
        data.put("year","");
        data.put("supervisor","");
        // æŸ¥è¯¢è¯¦æƒ…
        PersonSupervisePlan personSupervisePlan = baseMapper.selectById(id);
        //获取提交人的签名地址
        String organizationUrl = userMapper.selectById(personSupervisePlan.getOrganizationPersonId()).getSignatureUrl();
        if (StringUtils.isBlank(organizationUrl)) {
            throw new ErrorException("找不到检验人的签名");
        }
        //获取批准人的签名地址
        String approvalUrl = null;
        if (personSupervisePlan.getApprovalId() != null) {
            approvalUrl = userMapper.selectById(personSupervisePlan.getApprovalId()).getSignatureUrl();
            if (StringUtils.isBlank(approvalUrl)) {
                throw new ErrorException("找不到批准人的签名");
            }
        }
        // æŸ¥è¯¢è¯¦æƒ…
        List<PersonSupervisePlanDetails> detailedDtos = personSupervisePlanDetailsService.list(Wrappers.<PersonSupervisePlanDetails>lambdaQuery()
                .eq(PersonSupervisePlanDetails::getPlanId, id));
        // æŸ¥è¯¢ç›‘督记录
        List<PersonSupervisionRecord> personSupervisionRecords = personSupervisionRecordMapper.selectList(new LambdaQueryWrapper<PersonSupervisionRecord>()
                .orderByAsc(PersonSupervisionRecord::getId));
        if(CollectionUtils.isNotEmpty(personSupervisionRecords)) {
            Integer supervisorId = personSupervisionRecords.get(0).getSupervisorId();
            String name = userMapper.selectById(supervisorId).getName();
            data.put("supervisor",name);
        }
        int index = 1;
        for (PersonSupervisePlanDetails detailedDto : detailedDtos) {
            detailedDto.setIndex(index);
            index++;
            DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
            String format = detailedDto.getSuperviseDate().format(dateTimeFormatter);
            detailedDto.setSuperviseDateString(format);
            int year = detailedDto.getSuperviseDate().getYear();
            data.put("year",year);
        }
        System.out.println("data: " + data);
        // èŽ·å–è·¯å¾„
        InputStream inputStream = this.getClass().getResourceAsStream("/static/super-vise-plan.docx");
        Configure configure = Configure.builder()
                .bind("supervisePlanDetailsList", new HackLoopTableRenderPolicy())
                .build();
        String finalApprovalUrl = approvalUrl;
        XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
                new HashMap<String, Object>() {{
                    put("data",data);
                    put("supervisePlanDetailsList", detailedDtos);
                    put("organizationUrl", StringUtils.isNotBlank(organizationUrl) ? Pictures.ofLocal(imgUrl + "/" + organizationUrl).create() : null);
                    put("approvalUrl", StringUtils.isNotBlank(finalApprovalUrl) ? Pictures.ofLocal(imgUrl + "/" + finalApprovalUrl).create() : null);
                    put("writeDateUrl", personSupervisePlan.getOrganizationDate() != null ?
                            Pictures.ofStream(DateImageUtil.createDateImage(personSupervisePlan.getOrganizationDate())).create() : null);
                    put("ratifyDateUrl", personSupervisePlan.getApprovalDate() != null ?
                            Pictures.ofStream(DateImageUtil.createDateImage(personSupervisePlan.getApprovalDate())).create() : null);
                }});
        try {
            response.setContentType("application/msword");
            String fileName = URLEncoder.encode(
                    "人员监督计划导出", "UTF-8");
            response.setHeader("Content-disposition",
                    "attachment;filename=" + fileName + ".docx");
            OutputStream os = response.getOutputStream();
            template.write(os);
            os.flush();
            os.close();
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException("导出失败");
        }
    }
}
cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonSupervisionControlSheetServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,155 @@
package com.ruoyi.personnel.service.impl;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.config.Configure;
import com.deepoove.poi.config.ConfigureBuilder;
import com.deepoove.poi.data.Pictures;
import com.ruoyi.framework.exception.ErrorException;
import com.ruoyi.personnel.dto.PersonSupervisionControlSheetExportDto;
import com.ruoyi.personnel.mapper.PersonSupervisionControlSheetMapper;
import com.ruoyi.personnel.pojo.PersonSupervisionControlSheet;
import com.ruoyi.personnel.service.PersonSupervisionControlSheetService;
import com.ruoyi.system.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.List;
/**
 * <p>
 * ç›‘督记录 - æŽ§åˆ¶å• æœåŠ¡å®žçŽ°ç±»
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2024-10-10 05:18:57
 */
@Service
public class PersonSupervisionControlSheetServiceImpl extends ServiceImpl<PersonSupervisionControlSheetMapper, PersonSupervisionControlSheet> implements PersonSupervisionControlSheetService {
    @Resource
    private UserMapper userMapper;
    @Value("${file.path}")
    private String imgUrl;
    /**
     * å¯¼å‡ºäººå‘˜ç›‘督记录纠正控制单
     * @param supervisionRecordId
     * @param response
     */
    @Override
    public void exportSupervisionControlSheet(Integer supervisionRecordId, HttpServletResponse response) {
        PersonSupervisionControlSheetExportDto controlSheetExportDto = baseMapper.selectSupervisionControl(supervisionRecordId);
        // åˆ¤æ–­ä¸ç¬¦åˆå·¥ä½œå‘现途径是否为空
        if (StringUtils.isNotBlank(controlSheetExportDto.getDiscoveryApproach())) {
            List<String> splitList = StrUtil.split(controlSheetExportDto.getDiscoveryApproach(), ',');
            for (String s : splitList) {
                switch (s) {
                    case "0":
                        controlSheetExportDto.setDiscoveryApproach0("☑");
                        break;
                    case "1":
                        controlSheetExportDto.setDiscoveryApproach1("☑");
                        break;
                    case "2":
                        controlSheetExportDto.setDiscoveryApproach2("☑");
                        break;
                    case "3":
                        controlSheetExportDto.setDiscoveryApproach3("☑");
                        break;
                    case "4":
                        controlSheetExportDto.setDiscoveryApproach4("☑");
                        break;
                    case "5":
                        controlSheetExportDto.setDiscoveryApproach5("☑");
                        break;
                    case "6":
                        controlSheetExportDto.setDiscoveryApproach6("☑");
                        break;
                    case "7":
                        controlSheetExportDto.setDiscoveryApproach7("☑");
                        break;
                }
            }
        }
        // å‘现部门
        String discovererUrl = null;
        if (controlSheetExportDto.getDepartmentHeadId() != null) {
            discovererUrl = userMapper.selectById(controlSheetExportDto.getDepartmentHeadId()).getSignatureUrl();
            if (StringUtils.isBlank(discovererUrl)) {
                throw new ErrorException("找不到发现部门人的签名");
            }
        }
        // å¤„理措施负责人
        String responsibleUrl = null;
        if (controlSheetExportDto.getResponsibleDepartmentPersonId() != null) {
            responsibleUrl = userMapper.selectById(controlSheetExportDto.getResponsibleDepartmentPersonId()).getSignatureUrl();
            if (StringUtils.isBlank(responsibleUrl)) {
                throw new ErrorException("找不到处理措施负责人的签名");
            }
        }
        // æŠ€æœ¯è´Ÿè´£äºº
        String correctiveUrl = null;
        if (controlSheetExportDto.getResponsibleDepartmentPersonId() != null) {
            correctiveUrl = userMapper.selectById(controlSheetExportDto.getResponsibleDepartmentPersonId()).getSignatureUrl();
            if (StringUtils.isBlank(correctiveUrl)) {
                throw new ErrorException("找不到技术负责人的签名");
            }
        }
        // è´¨é‡è´Ÿè´£äºº
        String qualityUrl = null;
        if (controlSheetExportDto.getQualitySupervisorId() != null) {
            qualityUrl = userMapper.selectById(controlSheetExportDto.getQualitySupervisorId()).getSignatureUrl();
            if (StringUtils.isBlank(qualityUrl)) {
                throw new ErrorException("找不到质量负责人的签名");
            }
        }
        // èŽ·å–è·¯å¾„
        InputStream inputStream = this.getClass().getResourceAsStream("/static/supervision-control-sheet.docx");
        ConfigureBuilder builder = Configure.builder();
        builder.useSpringEL(true);
        String finalDiscovererUrl = discovererUrl;
        String finalResponsibleUrl = responsibleUrl;
        String finalCorrectiveUrl = correctiveUrl;
        String finalQualityUrl = qualityUrl;
        XWPFTemplate template = XWPFTemplate.compile(inputStream, builder.build()).render(
                new HashMap<String, Object>() {{
                    put("control", controlSheetExportDto);
                    put("discovererUrl", StringUtils.isNotBlank(finalDiscovererUrl) ? Pictures.ofLocal(imgUrl + "/" + finalDiscovererUrl).create() : null);
                    put("responsibleUrl", StringUtils.isNotBlank(finalResponsibleUrl) ? Pictures.ofLocal(imgUrl + "/" + finalResponsibleUrl).create() : null);
                    put("correctiveUrl", StringUtils.isNotBlank(finalCorrectiveUrl) ? Pictures.ofLocal(imgUrl + "/" + finalCorrectiveUrl).create() : null);
                    put("qualityUrl", StringUtils.isNotBlank(finalQualityUrl) ? Pictures.ofLocal(imgUrl + "/" + finalQualityUrl).create() : null);
                }});
        try {
            response.setContentType("application/msword");
            String fileName = URLEncoder.encode(
                    "人员监督记录控制单", "UTF-8");
            response.setHeader("Content-disposition",
                    "attachment;filename=" + fileName + ".docx");
            OutputStream os = response.getOutputStream();
            template.write(os);
            os.flush();
            os.close();
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException("导出失败");
        }
    }
}
cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonSupervisionProcessingSheetServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,119 @@
package com.ruoyi.personnel.service.impl;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.config.Configure;
import com.deepoove.poi.config.ConfigureBuilder;
import com.deepoove.poi.data.Pictures;
import com.ruoyi.framework.exception.ErrorException;
import com.ruoyi.personnel.dto.PersonSupervisionProcessingSheetDto;
import com.ruoyi.personnel.mapper.PersonSupervisionProcessingSheetMapper;
import com.ruoyi.personnel.pojo.PersonSupervisionProcessingSheet;
import com.ruoyi.personnel.service.PersonSupervisionProcessingSheetService;
import com.ruoyi.system.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.util.HashMap;
/**
 * <p>
 * ç›‘督记录 - å¤„理单 æœåŠ¡å®žçŽ°ç±»
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2024-10-10 05:35:58
 */
@Service
public class PersonSupervisionProcessingSheetServiceImpl extends ServiceImpl<PersonSupervisionProcessingSheetMapper, PersonSupervisionProcessingSheet> implements PersonSupervisionProcessingSheetService {
    @Resource
    private UserMapper userMapper;
    @Value("${file.path}")
    private String imgUrl;
    /**
     * å¯¼å‡ºäººå‘˜ç›‘督记录纠正处理单
     * @param supervisionRecordId
     * @param response
     */
    @Override
    public void exportSupervisionProcessingSheet(Integer supervisionRecordId, HttpServletResponse response) {
        PersonSupervisionProcessingSheetDto processingSheetDto = baseMapper.selectProcessingSheet(supervisionRecordId);
        // æå‡ºäººç­¾å
        String raiseUrl = null;
        if (processingSheetDto.getProposingDepartmentPersonId() != null) {
            raiseUrl = userMapper.selectById(processingSheetDto.getProposingDepartmentPersonId()).getSignatureUrl();
            if (StringUtils.isBlank(raiseUrl)) {
                throw new ErrorException("找不到提出人的签名");
            }
        }
        // åŽŸå› åˆ†æžäºº
        String causeUrl = null;
        if (processingSheetDto.getCauseAnalysisPersonId() != null) {
            causeUrl = userMapper.selectById(processingSheetDto.getCauseAnalysisPersonId()).getSignatureUrl();
            if (StringUtils.isBlank(causeUrl)) {
                throw new ErrorException("找不到原因分析人的签名");
            }
        }
        // çº æ­£äºº
        String correctUrl = null;
        if (processingSheetDto.getCorrectiveActionId() != null) {
            correctUrl = userMapper.selectById(processingSheetDto.getCorrectiveActionId()).getSignatureUrl();
            if (StringUtils.isBlank(correctUrl)) {
                throw new ErrorException("找不到纠正人的签名");
            }
        }
        // éªŒè¯äºº
        String validationUrl = null;
        if (processingSheetDto.getVerificationDepartmentPersonId() != null) {
            validationUrl = userMapper.selectById(processingSheetDto.getVerificationDepartmentPersonId()).getSignatureUrl();
            if (StringUtils.isBlank(validationUrl)) {
                throw new ErrorException("找不到验证人的签名");
            }
        }
        // èŽ·å–è·¯å¾„
        InputStream inputStream = this.getClass().getResourceAsStream("/static/supervision-processing-sheet.docx");
        ConfigureBuilder builder = Configure.builder();
        builder.useSpringEL(true);
        String finalRaiseUrl = raiseUrl;
        String finalCauseUrl = causeUrl;
        String finalCorrectUrl = correctUrl;
        String finalValidationUrl = validationUrl;
        XWPFTemplate template = XWPFTemplate.compile(inputStream, builder.build()).render(
                new HashMap<String, Object>() {{
                    put("processing", processingSheetDto);
                    put("raiseUrl", StringUtils.isNotBlank(finalRaiseUrl) ? Pictures.ofLocal(imgUrl + "/" + finalRaiseUrl).create() : null);
                    put("causeUrl", StringUtils.isNotBlank(finalCauseUrl) ? Pictures.ofLocal(imgUrl + "/" + finalCauseUrl).create() : null);
                    put("correctUrl", StringUtils.isNotBlank(finalCorrectUrl) ? Pictures.ofLocal(imgUrl + "/" + finalCorrectUrl).create() : null);
                    put("validationUrl", StringUtils.isNotBlank(finalValidationUrl) ? Pictures.ofLocal(imgUrl + "/" + finalValidationUrl).create() : null);
                }});
        try {
            response.setContentType("application/msword");
            String fileName = URLEncoder.encode(
                    "人员监督记录纠正处理单", "UTF-8");
            response.setHeader("Content-disposition",
                    "attachment;filename=" + fileName + ".docx");
            OutputStream os = response.getOutputStream();
            template.write(os);
            os.flush();
            os.close();
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException("导出失败");
        }
    }
}
cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonSupervisionRecordServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,125 @@
package com.ruoyi.personnel.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.config.Configure;
import com.deepoove.poi.config.ConfigureBuilder;
import com.deepoove.poi.data.Pictures;
import com.ruoyi.common.utils.DateImageUtil;
import com.ruoyi.framework.exception.ErrorException;
import com.ruoyi.personnel.dto.PersonSupervisionRecordDto;
import com.ruoyi.personnel.mapper.PersonSupervisionRecordMapper;
import com.ruoyi.personnel.pojo.PersonSupervisionControlSheet;
import com.ruoyi.personnel.pojo.PersonSupervisionProcessingSheet;
import com.ruoyi.personnel.pojo.PersonSupervisionRecord;
import com.ruoyi.personnel.service.PersonSupervisionControlSheetService;
import com.ruoyi.personnel.service.PersonSupervisionProcessingSheetService;
import com.ruoyi.personnel.service.PersonSupervisionRecordService;
import com.ruoyi.system.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.servlet.http.HttpServletResponse;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.List;
/**
 * <p>
 * ç›‘督记录 æœåŠ¡å®žçŽ°ç±»
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2024-10-10 04:16:49
 */
@Service
@Transactional(rollbackFor = Exception.class)
public class PersonSupervisionRecordServiceImpl extends ServiceImpl<PersonSupervisionRecordMapper, PersonSupervisionRecord> implements PersonSupervisionRecordService {
    @Autowired
    private PersonSupervisionControlSheetService personSupervisionControlSheetService;
    @Autowired
    private PersonSupervisionProcessingSheetService personSupervisionProcessingSheetService;
    @Autowired
    private UserMapper userMapper;
    @Value("${file.path}")
    private String imgUrl;
    @Override
    public void deletePersonSupervisionRecord(List<Integer> ids) {
        if (CollectionUtils.isNotEmpty(ids)) {
            ids.forEach(id -> {
                personSupervisionControlSheetService.remove(Wrappers.<PersonSupervisionControlSheet>lambdaQuery()
                        .eq(PersonSupervisionControlSheet::getSupervisionRecordId, id));
                personSupervisionProcessingSheetService.remove(Wrappers.<PersonSupervisionProcessingSheet>lambdaQuery()
                        .eq(PersonSupervisionProcessingSheet::getSupervisionRecordId, id));
                baseMapper.deleteById(id);
            });
        }
    }
    @Override
    public IPage<PersonSupervisionRecordDto> personSupervisionRecordPage(Page page, Integer userId, String userName, Integer departLimsId) {
        return baseMapper.personSupervisionRecordPage(page, userId, departLimsId, userName);
    }
    /**
     * å¯¼å‡ºäººå‘˜ç›‘督记录
     *
     * @param id
     * @param response
     */
    @Override
    public void exportPersonSupervisionRecord(Integer id, HttpServletResponse response) {
        PersonSupervisionRecordDto recordDto = baseMapper.selectPersonSupervisionRecord(id);
        recordDto.setPersonnelName(recordDto.getPersonnel());
        //获取技术负责人的签名地址
        String ratifyUrl = null;
        if (recordDto.getTechnicalDirector() != null) {
            ratifyUrl = userMapper.selectById(recordDto.getTechnicalDirector()).getSignatureUrl();
            if (StringUtils.isBlank(ratifyUrl)) {
                throw new ErrorException("找不到技术负责人的签名");
            }
        }
        // èŽ·å–è·¯å¾„
        InputStream inputStream = this.getClass().getResourceAsStream("/static/supervision-record.docx");
        ConfigureBuilder builder = Configure.builder();
        builder.useSpringEL(true);
        String finalRatifyUrl = ratifyUrl;
        XWPFTemplate template = XWPFTemplate.compile(inputStream, builder.build()).render(
                new HashMap<String, Object>() {{
                    put("supervision", recordDto);
                    put("technicalDirectorUrl", StringUtils.isNotBlank(finalRatifyUrl) ? Pictures.ofLocal(imgUrl + "/" + finalRatifyUrl).create() : null);
                    put("technicalDirectorDateUrl", recordDto.getTechnicalDirectorDate() != null ?
                            Pictures.ofStream(DateImageUtil.createDateImage(recordDto.getTechnicalDirectorDate())).create() : null);
                    put("testDateUrl", recordDto.getDetectionDate() != null ?
                            Pictures.ofStream(DateImageUtil.createDateImage(recordDto.getDetectionDate())).create() : null);
                }});
        try {
            response.setContentType("application/msword");
            String fileName = URLEncoder.encode(
                    "人员监督记录", "UTF-8");
            response.setHeader("Content-disposition",
                    "attachment;filename=" + fileName + ".docx");
            OutputStream os = response.getOutputStream();
            template.write(os);
            os.flush();
            os.close();
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException("导出失败");
        }
    }
}
cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonTrackRecordServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,33 @@
package com.ruoyi.personnel.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.personnel.mapper.PersonTrackRecordMapper;
import com.ruoyi.personnel.pojo.PersonTrackRecord;
import com.ruoyi.personnel.service.PersonTrackRecordService;
import org.springframework.stereotype.Service;
import java.util.List;
/**
 * <p>
 * å·¥ä½œå±¥åކ æœåŠ¡å®žçŽ°ç±»
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2024-09-02 03:13:03
 */
@Service
public class PersonTrackRecordServiceImpl extends ServiceImpl<PersonTrackRecordMapper, PersonTrackRecord> implements PersonTrackRecordService {
    @Override
    public IPage<PersonTrackRecord> personTrackRecordSelect(Page page, String userId, String departmentId) {
        return baseMapper.personTrackRecordSelect(page, userId, departmentId);
    }
    @Override
    public List<PersonTrackRecord> personTrackRecordExport(String userId, String departmentId) {
        return baseMapper.personTrackRecordExport(userId, departmentId);
    }
}
cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonTrainingDetailedServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,363 @@
package com.ruoyi.personnel.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.core.domain.entity.DepartmentLims;
import com.ruoyi.common.core.domain.entity.User;
import com.ruoyi.common.numgen.NumberGenerator;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.framework.exception.ErrorException;
import com.ruoyi.personnel.dto.PersonTrainingDetailedDto;
import com.ruoyi.personnel.enumeration.AttachmentType;
import com.ruoyi.personnel.excel.PersonTrainingDetailedUpload;
import com.ruoyi.personnel.mapper.*;
import com.ruoyi.personnel.pojo.*;
import com.ruoyi.personnel.service.PersonTrainingDetailedService;
import com.ruoyi.system.mapper.DepartmentLimsMapper;
import com.ruoyi.system.mapper.UserMapper;
import com.ruoyi.system.service.DepartmentLimsService;
import lombok.AllArgsConstructor;
import org.apache.commons.math3.analysis.function.Power;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.util.*;
import java.util.stream.Collectors;
/**
 * <p>
 * åŸ¹è®­è®¡åˆ’详情 æœåŠ¡å®žçŽ°ç±»
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2024-10-11 01:46:27
 */
@Service
@Transactional(rollbackFor = Exception.class)
public class PersonTrainingDetailedServiceImpl extends ServiceImpl<PersonTrainingDetailedMapper, PersonTrainingDetailed> implements PersonTrainingDetailedService {
    @Resource
    private DepartmentLimsService departmentLimsService;
    @Resource
    private UserMapper userMapper;
    @Resource
    private PersonTrainingRecordMapper personTrainingRecordMapper;
    @Resource
    private PersonTrainingMapper personTrainingMapper;
//    private PowerMapper powerMapper;
    @Resource
    private PersonTrainingFileMapper personTrainingFileMapper;
    @Resource
    private NumberGenerator<PersonTrainingDetailed> numberGenerator;
    @Resource
    private DepartmentLimsMapper departmentLimsMapper;
    @Value("${file.path}")
    private String imgUrl;
    @Value("${excelUrl}")
    private String excelUrl;
    @Value("${wordUrl}")
    private String wordUrl;
    /**
     *
     * @param file
     * @param id å¹´åº¦è®¡åˆ’明细表id
     */
    @Override
    public Map<String,Object> fileUpload(MultipartFile file, Integer id) {
        HashMap<String, Object> map = new HashMap<>();
        String fileName = file.getOriginalFilename();
        try {
            UUID uuid = UUID.randomUUID();
            String uuidString = uuid.toString();
            int i = fileName.indexOf(".");
            String suffix = fileName.substring(i); //文件后缀
            String url = uuidString + suffix;
            String OriginalFileName = fileName.substring(0,i); // æ–‡ä»¶åŽŸåç§°
            // å­˜æ”¾è·¯å¾„
            String path = "";
            // æ ¹æ®ä¸åŒçš„后缀存放在不同的路径下
            if(suffix.toLowerCase().contains("xls")) {
                path = excelUrl;
            } else if (suffix.toLowerCase().contains("doc") || suffix.toLowerCase().contains("pdf")) {
                path = wordUrl;
            }else {
                path = imgUrl;
            }
            File uploadDir  = new File(path);
            if(!uploadDir.exists()){
                uploadDir.mkdir();
            }
            File destFile = new File(uploadDir , url);
            file.transferTo(destFile);
            // å°†æ–‡ä»¶è·¯å¾„存储到数据库
            PersonTrainingFile personTrainingFile = new PersonTrainingFile();
            personTrainingFile.setDetailId(id);
            personTrainingFile.setFileName(OriginalFileName + suffix);
            personTrainingFile.setFileUrl("/"+url);
            personTrainingFile.setCreateUser(SecurityUtils.getUserId().intValue());
            personTrainingFile.setCreateTime(LocalDateTime.now());
            personTrainingFileMapper.insert(personTrainingFile);
            map.put("fileName",OriginalFileName + suffix);
            map.put("url","/"+url);
        } catch (IOException e) {
            throw new ErrorException("上传失败");
        }
        return map;
    }
    @Override
    public List<DepartmentLims> selectDepartLims() {
        List<DepartmentLims> departmentLims = departmentLimsMapper.selectList(null);
        return departmentLims;
    }
    @Override
    public void importExcel(List<PersonTrainingDetailedUpload> list, Integer planId) {
        List<PersonTrainingDetailed> personTrainingDetailedList = new ArrayList<>();
        list.forEach(i -> {
            PersonTrainingDetailed personTrainingDetailed = new PersonTrainingDetailed();
            BeanUtils.copyProperties(i, personTrainingDetailed);
            personTrainingDetailed.setClassHour(Double.parseDouble( i.getClassHour()));
            // åŒ¹é…ä¸¾åŠžéƒ¨é—¨
            DepartmentLims departmentLims = departmentLimsService.getOne(Wrappers.<DepartmentLims>lambdaQuery()
                    .eq(DepartmentLims::getName, i.getHoldingDepartment()));
            if (ObjectUtils.isEmpty(departmentLims)) {
                throw new ErrorException("未匹配到举办部门:" + i.getHoldingDepartment());
            }
            personTrainingDetailed.setHoldingDepartment(departmentLims.getId());
//            // åŒ¹é…è®²å¸ˆ
//            String[] names = i.getTrainingLecturerName().split("、|,|,|\\s+");
//            ArrayList<Integer> ids = new ArrayList<>();
//            for(String name : names) {
//                if(StringUtils.isNotEmpty(name)) {
//                    User user = userMapper.selectOne(Wrappers.<User>lambdaQuery()
//                            .eq(User::getName, name));
//                    if(Objects.isNull(user)) {
//                        throw new ErrorException("未找到该讲师:" + name);
//                    }
//                    ids.add(user.getId());
//                }
//            }
//            String collect = ids.stream().map(item -> item.toString()).collect(Collectors.joining(","));
            personTrainingDetailed.setTrainingLecturerId(i.getTrainingLecturerName());
            personTrainingDetailed.setPlanId(planId);
            personTrainingDetailed.setState(3);
            String year = new SimpleDateFormat("yy", Locale.CHINESE).format(new Date());
            String month = new SimpleDateFormat("MM", Locale.CHINESE).format(new Date());
            String processNumber = numberGenerator.generateNumberWithPrefix(4, "KC" + month + "-" + year + month, PersonTrainingDetailed::getCourseCode);
            personTrainingDetailed.setCourseCode(processNumber);
            personTrainingDetailedList.add(personTrainingDetailed);
        });
        // æ‰¹é‡æ–°å¢ž
        if (CollectionUtils.isNotEmpty(personTrainingDetailedList)) {
            baseMapper.insertBatchSomeColumn(personTrainingDetailedList);
        }
    }
    @Override
    public void deleteAnnualPlanDetailTable(String ids) {
        String[] split = ids.split(",");
        if (split.length > 0) {
            for (String s : split) {
                baseMapper.deleteById(s);
            }
        }
    }
    @Override
    public IPage<PersonTrainingDetailedDto> queryTheAnnualPlanDetailsTable(Page page, String trainingLecturerName, String courseCode, String trainingDate,
                                                                           Integer id, Integer userId,Integer departId,Integer state) {
        // åˆ¤æ–­å½“前人是否有权限查看年度计划主表
        Integer userId1 = SecurityUtils.getUserId().intValue();
        User user = userMapper.selectById(userId1);
        String name1 =  user.getName();
        Integer currentUserId = user.getId();
        //todo æƒé™å¾…完成
//        List<Power> powers = powerMapper.selectList(new LambdaQueryWrapper<Power>()
//                .eq(Power::getRoleId, user.getRoleId())
//                .eq(Power::getMenuMethod,"personTrainingSelect"));
//        if(CollectionUtils.isEmpty(powers)) {
//            if(Objects.isNull(departId) || departId == 1) {
//                // æ²¡æœ‰æƒé™ å°±é»˜è®¤æŸ¥çœ‹è‡ªå·±éƒ¨é—¨æœ€æ–°çš„年度计划  18 é€šä¿¡äº§å“å®žéªŒå®¤  19 ç”µåŠ›äº§å“å®žéªŒå®¤
//                if(user.getDepartLimsId().contains("18")) {
//                    List<PersonTraining> personTrainings = personTrainingMapper.selectList(new LambdaQueryWrapper<PersonTraining>()
//                            .eq(PersonTraining::getDepartId, 18)
//                            .orderByDesc(PersonTraining::getId));
//                    if(CollectionUtils.isNotEmpty(personTrainings)) {
//                        id = personTrainings.get(0).getId();
//                    }
//                }else if(user.getDepartLimsId().contains("19")) {
//                    List<PersonTraining> personTrainings = personTrainingMapper.selectList(new LambdaQueryWrapper<PersonTraining>()
//                            .eq(PersonTraining::getDepartId, 19)
//                            .orderByDesc(PersonTraining::getId));
//                    if(CollectionUtils.isNotEmpty(personTrainings)) {
//                        id = personTrainings.get(0).getId();
//                    }
//                }
//            }else {
//                List<PersonTraining> personTrainings = personTrainingMapper.selectList(new LambdaQueryWrapper<PersonTraining>()
//                        .eq(PersonTraining::getDepartId, departId)
//                        .orderByDesc(PersonTraining::getId));
//                if(CollectionUtils.isNotEmpty(personTrainings)) {
//                    id = personTrainings.get(0).getId();
//                }
//            }
//        }
        if(Objects.nonNull(state)) {
            if(state == -1) {
                state = null;
            }
        }
        IPage<PersonTrainingDetailedDto> list = baseMapper.queryTheAnnualPlanDetailsTable(page, trainingLecturerName, courseCode, trainingDate, id, userId, userId1,state);
        // æŠ¥åäººæ•°
        List<PersonTrainingDetailedDto> records = list.getRecords();
        for(PersonTrainingDetailedDto a : records) {
            // æŠ¥åçš„人数
            List<PersonTrainingRecord> personTrainingRecords = personTrainingRecordMapper.selectList(new LambdaQueryWrapper<PersonTrainingRecord>()
                    .eq(PersonTrainingRecord::getCourseId, a.getId()));
            a.setEnrollment(CollectionUtils.isNotEmpty(personTrainingRecords) ? personTrainingRecords.size() : 0);
            List<Integer> collect = personTrainingRecords.stream().map(PersonTrainingRecord::getUserId).collect(Collectors.toList());
            if(collect.contains(SecurityUtils.getUserId().intValue())) {
                a.setWhetherClaim(true);
            }else {
                a.setWhetherClaim(false);
            }
            //前端权限需要 æ˜¯å¦å¯ä»¥æ“ä½œæŒ‰é’®
//            if(a.getTrainingLecturerId().contains(name1) || CollectionUtils.isNotEmpty(powers) ||
//                    (Objects.nonNull(a.getAssessmentUserId()) && a.getAssessmentUserId().equals(currentUserId)) || Arrays.asList(16,36,35).contains(currentUserId)) {
//                a.setIsDisabled(1); // 1不禁用
//            }else{
//                a.setIsDisabled(0);
//            }
        }
        return list;
    }
    @Override
    public List<PersonTrainingFile> getFileData(Integer detailedId) {
        List<PersonTrainingFile> personTrainingFiles = personTrainingFileMapper.selectList(new LambdaQueryWrapper<PersonTrainingFile>()
                .eq(PersonTrainingFile::getDetailId, detailedId)
                .eq(PersonTrainingFile::getEnumAttachmentType, AttachmentType.getTypeValue(2)));
        if(CollectionUtils.isNotEmpty(personTrainingFiles)) {
            for(PersonTrainingFile a : personTrainingFiles) {
                // è®¾ç½®mime
                int i = a.getFileUrl().indexOf(".");
                String contentType = getContentType(a.getFileUrl().substring(i + 1));
                a.setMime(contentType);
            }
        }
        return personTrainingFiles;
    }
    @Override
    public void deleteFile(Integer id) {
        personTrainingFileMapper.deleteById(id);
    }
    @Override
    public void fileDownLoad(Integer id, HttpServletResponse response) {
        // æ ¹æ®id查询下载的文件
        PersonTrainingFile personTrainingFile = personTrainingFileMapper.selectById(id);
        if(Objects.nonNull(personTrainingFile)) {
            // æ‹¿åˆ°æ–‡ä»¶è·¯å¾„
            String fileUrl = personTrainingFile.getFileUrl();
            int i = fileUrl.indexOf(".");
            String suffix = fileUrl.substring(i); // æ–‡ä»¶åŽç¼€
            String url = "";
            if(suffix.toLowerCase().contains("xls")) {
                 url = excelUrl + File.separator + fileUrl;
            } else if (suffix.toLowerCase().contains("doc") || suffix.toLowerCase().contains("pdf")) {
                url = wordUrl + File.separator + fileUrl;
            }else {
                url = imgUrl + File.separator + fileUrl;
            }
            File file = new File(url);
            if(!file.exists()) {
                throw new ErrorException("文件不存在或损坏");
            }
            // èŽ·å–æ–‡ä»¶è¾“å…¥æµ
            try(FileInputStream fileInputStream = new FileInputStream(file); ServletOutputStream outputStream = response.getOutputStream()) {
                String contentType = getContentType(fileUrl.substring(i + 1));
                // è®¾ç½®å“åº”头
                response.setContentType(contentType);
                int i1 = personTrainingFile.getFileName().indexOf(".");
                String fileName = URLEncoder.encode(personTrainingFile.getFileName().substring(0, i1), "UTF-8");
                response.setHeader("Content-disposition", "attachment;filename=" + fileName + suffix);
                byte[] bytes = new byte[1024];
                int bytesRead;
                while ((bytesRead = fileInputStream.read(bytes)) != -1 ){
                    outputStream.write(bytes,0,bytesRead);
                }
                outputStream.flush();
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }
    }
    // æ ¹æ®æ–‡ä»¶æ‰©å±•名获取 MIME ç±»åž‹
    private String getContentType(String fileExtension) {
        switch (fileExtension) {
            case "jpg":
            case "jpeg":
                return "image/jpeg";
            case "png":
                return "image/png";
            case "gif":
                return "image/gif";
            case "pdf":
                return "application/pdf";
            case "doc":
                return "application/msword";
            case "docx":
                return "application/vnd.openxmlformats-officedocument.wordprocessingml.document";
            case "xls":
                return "application/vnd.ms-excel";
            case "xlsx":
                return "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
            case "ppt":
            case "pptx":
                return "application/vnd.ms-powerpoint";
            default:
                return "application/octet-stream"; // é»˜è®¤äºŒè¿›åˆ¶æµ
        }
    }
}
cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonTrainingFileServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,14 @@
package com.ruoyi.personnel.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.personnel.mapper.PersonTrainingFileMapper;
import com.ruoyi.personnel.pojo.PersonTrainingFile;
import com.ruoyi.personnel.service.PersonTrainingFileService;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;
@Service
@AllArgsConstructor
public class PersonTrainingFileServiceImpl extends ServiceImpl<PersonTrainingFileMapper,PersonTrainingFile>
        implements PersonTrainingFileService {
}
cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonTrainingRecordServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,338 @@
package com.ruoyi.personnel.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.config.Configure;
import com.ruoyi.common.core.domain.entity.User;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.framework.exception.ErrorException;
import com.ruoyi.inspect.util.HackLoopTableRenderPolicy;
import com.ruoyi.performance.mapper.AuxiliaryWorkingHoursDayMapper;
import com.ruoyi.performance.mapper.PerformanceShiftMapper;
import com.ruoyi.performance.pojo.AuxiliaryWorkingHoursDay;
import com.ruoyi.performance.pojo.PerformanceShift;
import com.ruoyi.performance.service.AuxiliaryWorkingHoursDayService;
import com.ruoyi.personnel.dto.PersonTrainingRecordDto;
import com.ruoyi.personnel.dto.PersonTrainingRecordListDto;
import com.ruoyi.personnel.dto.TrainingRecordPersonDetailedDto;
import com.ruoyi.personnel.mapper.*;
import com.ruoyi.personnel.pojo.*;
import com.ruoyi.personnel.service.PersonTrainingDetailedService;
import com.ruoyi.personnel.service.PersonTrainingRecordService;
import com.ruoyi.system.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.io.InputStream;
import java.io.OutputStream;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.time.*;
import java.time.temporal.TemporalField;
import java.time.temporal.WeekFields;
import java.util.*;
/**
 * <p>
 * åŸ¹è®­è®°å½• æœåŠ¡å®žçŽ°ç±»
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2024-10-12 04:50:48
 */
@Transactional(rollbackFor = Exception.class)
@Service
public class PersonTrainingRecordServiceImpl extends ServiceImpl<PersonTrainingRecordMapper, PersonTrainingRecord> implements PersonTrainingRecordService {
    @Resource
    private UserMapper userMapper;
    @Resource
    private PersonTrainingDetailedService personTrainingDetailedService;
    @Resource
    private PersonTrainingDetailedMapper personTrainingDetailedMapper;
    @Resource
    private AuxiliaryWorkingHoursDayMapper auxiliaryWorkingHoursDayMapper;
    @Resource
    private PerformanceShiftMapper shiftMapper;
    @Autowired
    private AuxiliaryWorkingHoursDayService auxiliaryWorkingHoursDayService;
    @Override
    public List<PersonTrainingRecordDto> trainingAndAssessmentRecordsPage(Integer trainingDetailedId, String userName) {
        return baseMapper.trainingAndAssessmentRecordsPage(trainingDetailedId, userName);
    }
    @Override
    public void deleteTrainingAndAssessmentRecords(String ids) {
        String[] split = ids.split(",");
        if (split.length > 0) {
            for (String s : split) {
                baseMapper.deleteById(s);
            }
        }
    }
    @Override
    public IPage<PersonTrainingRecordListDto> personnelTrainingPersonnel(Page page, String userName, Integer userId, Integer departLimsId) {
        return baseMapper.personnelTrainingPersonnel(page, userName, userId, departLimsId);
    }
    @Override
    public IPage<TrainingRecordPersonDetailedDto> queryPersonnelDetails(Page page, Integer userId) {
        return baseMapper.queryPersonnelDetails(page, userId);
    }
    @Override
    public void claimOfTrainingAndAssessmentRecords(Boolean claimAndClaim, Integer courseId) {
        int userId = SecurityUtils.getUserId().intValue();
        // 1、查询培训课程,取培训日期与开始日期,与当前时间比较,判断是否超出,如果超出不允许认领
        Boolean doesItExceedState = doesItExceed(courseId);
        if (!doesItExceedState) {
            throw new ErrorException("当前课程状态无法认领!");
        }
        // 2、判断是否重复
        PersonTrainingRecord personTrainingRecord1 = baseMapper.selectOne(Wrappers.<PersonTrainingRecord>lambdaQuery()
                .eq(PersonTrainingRecord::getCourseId, courseId)
                .eq(PersonTrainingRecord::getUserId, userId));
        if (ObjectUtils.isNotEmpty(personTrainingRecord1)) {
            throw new ErrorException("请勿重复认领!");
        }
        // 3、如果未重复新增培训记录
        // true è®¤é¢†
        if (claimAndClaim) {
            PersonTrainingRecord personTrainingRecord = new PersonTrainingRecord();
            personTrainingRecord.setUserId(userId);
            personTrainingRecord.setCourseId(courseId);
            baseMapper.insert(personTrainingRecord);
        // å–消认领
        } else {
            baseMapper.delete(Wrappers.<PersonTrainingRecord>lambdaQuery()
                    .eq(PersonTrainingRecord::getUserId, userId)
                    .eq(PersonTrainingRecord::getCourseId, courseId));
        }
    }
    /**
     * å¯¼å‡ºäººå‘˜åŸ¹è®­è®°å½•
     * @param userId
     * @param response
     */
    @Override
    public void exportTrainingRecord(Integer userId, HttpServletResponse response) {
        // æŸ¥è¯¢äººå‘˜äººä¿¡æ¯
        PersonTrainingRecordListDto trainingRecordListDto = baseMapper.selectUserTraining(userId);
        // æŸ¥è¯¢åŸ¹è®­è®°å½•
        List<TrainingRecordPersonDetailedDto> personDetailedDtos = baseMapper.selectPersonDetailedDtos(userId);
        // èŽ·å–è·¯å¾„
        InputStream inputStream = this.getClass().getResourceAsStream("/static/training-record.docx");
        Configure configure = Configure.builder()
                .bind("personnelDetailsLisat", new HackLoopTableRenderPolicy())
                .build();
        XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
                new HashMap<String, Object>() {{
                    put("traning", trainingRecordListDto);
                    put("personnelDetailsLisat", personDetailedDtos);
                }});
        try {
            response.setContentType("application/msword");
            String fileName = URLEncoder.encode(
                    "人员培训记录导出", "UTF-8");
            response.setHeader("Content-disposition",
                    "attachment;filename=" + fileName + ".docx");
            OutputStream os = response.getOutputStream();
            template.write(os);
            os.flush();
            os.close();
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException("导出失败");
        }
    }
    @Override
    public IPage<TrainingRecordPersonDetailedDto> queryPersonnelDetailsOfUserIdAndYear(Page page, Integer userId, Integer year) {
        return baseMapper.queryPersonnelDetailsOfUserIdAndYear(page, userId, year);
    }
    @Override
    public void exportTrainingRecordAddTrainingDate(Integer userId, Integer trainingDate, HttpServletResponse response) {
        // æŸ¥è¯¢äººå‘˜äººä¿¡æ¯
        PersonTrainingRecordListDto trainingRecordListDto = baseMapper.selectUserTraining(userId);
        // æŸ¥è¯¢åŸ¹è®­è®°å½•
        List<TrainingRecordPersonDetailedDto> personDetailedDtos = baseMapper.selectPersonDetailedDtosByTrainingDate(userId, trainingDate);
        // èŽ·å–è·¯å¾„
        InputStream inputStream = this.getClass().getResourceAsStream("/static/training-record.docx");
        Configure configure = Configure.builder()
                .bind("personnelDetailsLisat", new HackLoopTableRenderPolicy())
                .build();
        XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
                new HashMap<String, Object>() {{
                    put("traning", trainingRecordListDto);
                    put("personnelDetailsLisat", personDetailedDtos);
                }});
        try {
            response.setContentType("application/msword");
            String fileName = URLEncoder.encode(
                    "人员培训记录导出", "UTF-8");
            response.setHeader("Content-disposition",
                    "attachment;filename=" + fileName + ".docx");
            OutputStream os = response.getOutputStream();
            template.write(os);
            os.flush();
            os.close();
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException("导出失败");
        }
    }
    @Override
    public void outOfFocusPreservation(PersonTrainingRecord personTrainingRecord) {
        int userId = SecurityUtils.getUserId().intValue();
        // åŸ¹è®­é€šè¿‡äº†ï¼ŒåŸ¹è®­è¯¾æ—¶è®¡å…¥åˆ°å½“天的辅助工时 (辅助工时 ä»¥åŠ æ ¸å‡†å·¥æ—¶éƒ½æ·»åŠ )
        baseMapper.updateById(personTrainingRecord);
        PersonTrainingDetailed personTrainingDetailed = personTrainingDetailedMapper.selectById(personTrainingRecord.getCourseId());
        if(Objects.nonNull(personTrainingDetailed)) {
            Double classHour = personTrainingDetailed.getClassHour(); // è¯¾æ—¶
            String trainingDateTwo = personTrainingDetailed.getTrainingDateTwo(); // åŸ¹è®­æ—¥æœŸ
            if(StringUtils.isEmpty(trainingDateTwo)) {
                throw new ErrorException("没有设置培训日期无法添加辅助工时");
            }
            // æ˜¯å¦ä»¥åŠæ·»åŠ è¿‡äº†
            List<AuxiliaryWorkingHoursDay> auxiliaryWorkingHoursDays = auxiliaryWorkingHoursDayMapper.selectList(new LambdaQueryWrapper<AuxiliaryWorkingHoursDay>()
                    .eq(AuxiliaryWorkingHoursDay::getNameUser, personTrainingRecord.getUserId())
                    .eq(AuxiliaryWorkingHoursDay::getAuxiliaryProject, personTrainingDetailed.getTrainingContent())
                    .eq(AuxiliaryWorkingHoursDay::getCreateUser, userId)
                    .eq(AuxiliaryWorkingHoursDay::getDateTime, trainingDateTwo + " 00:00:00"));
            // å¦‚果有数据 åˆæ ¼å°±ä¸åšå¤„理   ä¸åˆæ ¼å°±åˆ é™¤
            if(CollectionUtils.isNotEmpty(auxiliaryWorkingHoursDays)) {
                if(personTrainingRecord.getExaminationResults().equals("不合格")) {
                    auxiliaryWorkingHoursDayMapper.delete(new LambdaQueryWrapper<AuxiliaryWorkingHoursDay>()
                            .eq(AuxiliaryWorkingHoursDay::getNameUser, personTrainingRecord.getUserId())
                            .eq(AuxiliaryWorkingHoursDay::getAuxiliaryProject, personTrainingDetailed.getTrainingContent())
                            .eq(AuxiliaryWorkingHoursDay::getCreateUser, userId)
                            .eq(AuxiliaryWorkingHoursDay::getDateTime, trainingDateTwo + " 00:00:00"));
                }
            }
            // æ˜¯å¦é€šè¿‡
            if(personTrainingRecord.getExaminationResults().equals("合格") && CollectionUtils.isEmpty(auxiliaryWorkingHoursDays)) {
                // å¦‚果是检测办的人就不用加
                User user = userMapper.selectById(personTrainingRecord.getUserId());
                if(user.getDepartLimsId().contains("22")) {
                    return;
                }
                // ä¸€èŠ‚è¯¾45分钟 å·¥æ—¶60分钟
                BigDecimal minute = BigDecimal.valueOf(classHour).multiply(new BigDecimal("45")); // å…·ä½“分钟
                BigDecimal divide = minute.divide(new BigDecimal("60"),4, RoundingMode.HALF_UP); // å·¥æ—¶
                // æ·»åŠ æ•°æ®
                AuxiliaryWorkingHoursDay a = new AuxiliaryWorkingHoursDay();
                a.setNameUser(personTrainingRecord.getUserId()); // å§“名id
                // é¡¹ç›®åç§°
                a.setRemarks(personTrainingDetailed.getTrainingContent()); //  è¾…助说明
                a.setNumber("401"); // ç¼–号
                AuxiliaryWorkingHoursDay auxiliaryWorkingHoursDay = auxiliaryWorkingHoursDayService.selectAuxiliaryWorkingHoursByNumber("401");
                a.setAuxiliaryProject(auxiliaryWorkingHoursDay.getAuxiliaryProject()); // è¾…助项目名称
                a.setNonproductiveTime(Double.parseDouble(divide.toString())); // è¾…助工时
                a.setApprovedWorkingHour(auxiliaryWorkingHoursDay.getApprovedWorkingHour()); // æ ¸å‡†å·¥æ—¶
                a.setAmount(Double.parseDouble(divide.toString())); // æ•°é‡
                String year = trainingDateTwo.split("-")[0];
                a.setYear(year); // å¹´
                a.setCreateTime(LocalDateTime.now());
                a.setUpdateTime(LocalDateTime.now());
                a.setCreateUser(userId); // åˆ›å»ºäººid
                a.setUpdateUser(userId); // ä¿®æ”¹äººid
                a.setState("已提交"); // çŠ¶æ€
                a.setDateTime(trainingDateTwo + " 00:00:00"); // æ—¥æœŸ
                // èŽ·å–å½“å‰æ—¥æœŸ
                LocalDate today = LocalDate.now();
                // èŽ·å–å½“å‰æ—¥æœŸçš„å‘¨æ¬¡ï¼ˆä¸€å¹´ä¸­çš„ç¬¬å‡ å‘¨ï¼‰
                TemporalField weekOfYear = WeekFields.of(Locale.getDefault()).weekOfYear();
                int weekNumber = today.get(weekOfYear);
                // èŽ·å–å½“å‰æ—¥æœŸçš„æ˜ŸæœŸï¼ˆä¸€å‘¨ä¸­çš„ç¬¬å‡ å¤©ï¼‰
                DayOfWeek dayOfWeek = today.getDayOfWeek();
                int dayOfWeekNumber = dayOfWeek.getValue();
                LocalDate now = LocalDate.now();
                LocalTime parse = LocalTime.parse("00:00:00");
                LocalDateTime of = LocalDateTime.of(now, parse);
                PerformanceShift performanceShift = shiftMapper.selectOne(new LambdaQueryWrapper<PerformanceShift>().eq(PerformanceShift::getWorkTime, of)
                        .eq(PerformanceShift::getUserId, personTrainingRecord.getUserId()));
                if(Objects.nonNull(performanceShift)) {
                    a.setShift(performanceShift.getShift()); // ç­æ¬¡
                }
                a.setWeek(weekNumber+""); // å‘¨æ¬¡
                a.setWeekDay(dayOfWeekNumber == 7 ? 0+"" : dayOfWeekNumber+""); // æ˜ŸæœŸ
                auxiliaryWorkingHoursDayMapper.insert(a);
            }
        }
    }
    /**
     * æ£€éªŒè¯¥åŸ¹è®­è¯¾ç¨‹æ˜¯å¦å…è®¸è®¤é¢†
     * @param courseId è¯¥è¯¾ç¨‹çš„id
     * @return
     */
    public Boolean doesItExceed(Integer courseId) {
        PersonTrainingDetailed personTrainingDetailed = personTrainingDetailedService.getById(courseId);
        // åªæœ‰çŠ¶æ€ä¸º3可以认领
        if (!personTrainingDetailed.getState().equals(3)) {
            return false;
        }
        SimpleDateFormat sdfWithoutTime = new SimpleDateFormat("yyyy-MM-dd");
        if(Objects.isNull(personTrainingDetailed.getTrainingDateTwo()) || StringUtils.isEmpty(personTrainingDetailed.getTrainingDateTwo())) {
            throw  new ErrorException("未配置培训日期,无法报名");
        }
        LocalDate parse = LocalDate.parse(personTrainingDetailed.getTrainingDateTwo());
        Date from = Date.from(parse.atStartOfDay(ZoneId.systemDefault()).toInstant());
        String originalDateStr = sdfWithoutTime.format(from);
        SimpleDateFormat sdfWithTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        try {
            if(Objects.isNull(personTrainingDetailed.getOpeningTime()) || StringUtils.isEmpty(personTrainingDetailed.getOpeningTime())) {
                throw  new ErrorException("未配置具体时间,无法报名");
            }
            // æ·»åŠ æ—¶åˆ†ç§’åŽçš„æ—¥æœŸ
            Date addedDate = sdfWithTime.parse(originalDateStr + " " + personTrainingDetailed.getOpeningTime());
            // èŽ·å–å½“å‰æ—¶é—´
            Date currentDate = new Date();
            // æ—¥æœŸæœªè¶…出当前时间。
            if (addedDate.after(currentDate) || addedDate.equals(currentDate)) {
                return true;
            // æ—¥æœŸå·²è¶…出当前时间
            } else {
                // å¦‚果日期超出 æ›´æ–°è¯¾ç¨‹çŠ¶æ€ä¸ºå·²ç»“æŸ
                personTrainingDetailedService.update(Wrappers.<PersonTrainingDetailed>lambdaUpdate()
                        .eq(PersonTrainingDetailed::getId, courseId)
                        .set(PersonTrainingDetailed::getState, 2));
                return false;
            }
        } catch (Exception e) {
            throw new ErrorException("时间格式错误!");
        }
    }
}
cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonTrainingServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,376 @@
package com.ruoyi.personnel.service.impl;
import com.alibaba.excel.EasyExcel;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.config.Configure;
import com.deepoove.poi.data.Pictures;
import com.ruoyi.common.core.domain.entity.DepartmentLims;
import com.ruoyi.common.core.domain.entity.User;
import com.ruoyi.common.utils.DateImageUtil;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.framework.exception.ErrorException;
import com.ruoyi.inspect.util.HackLoopTableRenderPolicy;
import com.ruoyi.personnel.dto.*;
import com.ruoyi.personnel.excel.PersonTrainingDetailedListener;
import com.ruoyi.personnel.excel.PersonTrainingDetailedUpload;
import com.ruoyi.personnel.mapper.*;
import com.ruoyi.personnel.pojo.*;
import com.ruoyi.personnel.service.PersonTrainingDetailedService;
import com.ruoyi.personnel.service.PersonTrainingService;
import com.ruoyi.system.mapper.DepartmentLimsMapper;
import com.ruoyi.system.mapper.UserMapper;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.util.*;
/**
 * <p>
 * åŸ¹è®­è®¡åˆ’ æœåŠ¡å®žçŽ°ç±»
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2024-10-11 01:11:49
 */
@Service
@Transactional(rollbackFor = Exception.class)
public class PersonTrainingServiceImpl extends ServiceImpl<PersonTrainingMapper, PersonTraining> implements PersonTrainingService {
    @Autowired
    private PersonTrainingDetailedService personTrainingDetailedService;
    @Autowired
    private UserMapper userMapper;
    @Resource
    private PersonTrainingDetailedMapper personTrainingDetailedMapper;
    @Resource
    private PersonTrainingRecordMapper personTrainingRecordMapper;
    @Autowired
    private DepartmentLimsMapper departmentLimsMapper;
    @Value("${file.path}")
    private String imgUrl;
    @Override
    public IPage<PersonTrainingDto> personTrainingSelect(Page page, String compilerName, Integer departmentId) {
        // å½“前登录人
        Integer userId = SecurityUtils.getUserId().intValue();
//        User user = Optional.ofNullable(userMapper.selectById(userId)).orElse(new User());
//        if(3==user.getRoleId()){
//            departmentId=null;
//        }
        // å¦‚果传入了departId å°±ä»¥ä¼ å…¥çš„为准。 å¦‚果没有传入就以当前人所在部门为准
        if(Objects.isNull(departmentId)) {
            User user = userMapper.selectById(userId);
            String[] split = user.getDepartLimsId().split(",");
            for(String departId : split) {
                if(departId != "1" && StringUtils.isNotEmpty(departId)) {
                    departmentId = Integer.parseInt(departId);
                }
            }
            //todo å¾…修改 å¦‚果当前人是管理员就可查看全部
//            if(user.getRoleId() == 3) {
//                departmentId = null;
//            }
        }else {
            // å¦‚果传入的departId是1(中天科技) ä¸åšå¤„理
            if(departmentId == 1) {
                departmentId = null;
            }
        }
        IPage<PersonTrainingDto> personTrainingDtoIPage = baseMapper.personTrainingSelect(page, compilerName, departmentId);
        List<PersonTrainingDto> records = personTrainingDtoIPage.getRecords();
        for (PersonTrainingDto dto : records) {
            dto.setCurrentId(userId);
        }
        return personTrainingDtoIPage;
    }
    /**
     *
     * @param id æ˜Žç»†è¡¨id
     */
    @Override
    public void deleteDetail(Integer id) {
         personTrainingDetailedMapper.deleteById(id);
         personTrainingRecordMapper.delete(Wrappers.<PersonTrainingRecord>lambdaQuery().eq(PersonTrainingRecord::getCourseId,id));
    }
    @Override
    public void personTrainingImport(MultipartFile file) {
        int userId = SecurityUtils.getUserId().intValue();
        // å¹´åº¦è®¡åˆ’父级新增数据
        PersonTraining personSupervisePlan = new PersonTraining();
        String fileName = file.getOriginalFilename().substring(0, file.getOriginalFilename().lastIndexOf("."));
        personSupervisePlan.setFileName(fileName);
        personSupervisePlan.setCompilerId(userId); // ç¼–制人
        personSupervisePlan.setCompilationDate(LocalDateTime.now());
        try(Workbook workbook  = WorkbookFactory.create(file.getInputStream())) {
            // å¤šä¸ªsheet页 å¾—区分一下通信和电力
            for (int i = 0; i < workbook.getNumberOfSheets(); i++) {
                String sheetName = workbook.getSheetName(i);
                // æ ¹æ®sheet名称来分别给对应的实验室赋值
                DepartmentLims departmentLims = departmentLimsMapper.selectOne(Wrappers.<DepartmentLims>lambdaQuery().like(DepartmentLims::getName, sheetName));
                if(Objects.nonNull(departmentLims)) {
                    personSupervisePlan.setDepartId(departmentLims.getId());
                    // ç¼–制人电力的是胡雪霞  é€šä¿¡çš„æ˜¯è¢é›¨éœ²
                    if(departmentLims.getId().equals(18)) {
                        personSupervisePlan.setCompilerId(userMapper.selectList(new LambdaQueryWrapper<User>().eq(User::getName,"袁雨露")).get(0).getId());
                    } else if (departmentLims.getId().equals(19)) {
                        personSupervisePlan.setCompilerId(userMapper.selectList(new LambdaQueryWrapper<User>().eq(User::getName,"胡雪霞")).get(0).getId());
                    }
                    baseMapper.insert(personSupervisePlan);
                    // å¹´åº¦è®¡åˆ’详情 æ–°å¢ž
                    PersonTrainingDetailedListener personSupervisePlanDetailsListener = new PersonTrainingDetailedListener(personTrainingDetailedService,personSupervisePlan.getId());
                    personSupervisePlanDetailsListener.setPlanId(personSupervisePlan.getId());
                    //EasyExcel.read(file.getInputStream(), PersonTrainingDetailedUpload.class, personSupervisePlanDetailsListener).sheet().doRead();
                    EasyExcel.read(file.getInputStream(),PersonTrainingDetailedUpload.class,new PersonTrainingDetailedListener(personTrainingDetailedService,personSupervisePlan.getId()))
                            .headRowNumber(3).ignoreEmptyRow(false).sheet(sheetName).doRead();
                    // æ·»åŠ ä¸€æ¬¡åŽ æ¸…空id é˜²æ­¢å‡ºçŽ°é‡å¤key
                    personSupervisePlan.setId(null);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    @Override
    public void personTrainingDelete(Integer id) {
        personTrainingDetailedService.remove(new LambdaQueryWrapper<PersonTrainingDetailed>().eq(PersonTrainingDetailed::getPlanId,id));
        baseMapper.deleteById(id);
    }
    @Override
    public void reviewAnnualPersonnelTraining(PersonTrainingUpdateDto personTrainingUpdateDto) {
        PersonTraining personTraining = new PersonTraining();
        personTraining.setId(personTrainingUpdateDto.getId());
        // å¦‚果是通信 å®¡æ ¸äººå°±æ˜¯å­™ç£Š ç”µåŠ›çš„åˆ™æ˜¯åˆ˜å»ºå¾·
        PersonTraining personTraining1 = baseMapper.selectById(personTrainingUpdateDto.getId());
        if(personTraining1.getDepartId().equals(19)) {
            personTraining.setReviewerId(userMapper.selectList(new LambdaQueryWrapper<User>().eq(User::getName,"刘建德")).get(0).getId());
        }else {
            personTraining.setReviewerId(userMapper.selectList(new LambdaQueryWrapper<User>().eq(User::getName,"孙磊")).get(0).getId());
        }
        personTraining.setAuditDate(LocalDateTime.now());
        personTraining.setAuditRemarks(personTrainingUpdateDto.getRemarks());
        personTraining.setReviewerStatus(personTrainingUpdateDto.getStatus());
        baseMapper.updateById(personTraining);
    }
    @Override
    public void approveAnnualPersonnelTraining(PersonTrainingUpdateDto personTrainingUpdateDto) {
        Integer id = userMapper.selectList(new LambdaQueryWrapper<User>().eq(User::getName, "许军")).get(0).getId();
        LambdaUpdateWrapper<PersonTraining> wrapper = Wrappers.<PersonTraining>lambdaUpdate()
                .eq(PersonTraining::getId, personTrainingUpdateDto.getId())
                .set(PersonTraining::getApproverId, id) // åªèƒ½æ˜¯è®¸å†›
                .set(PersonTraining::getApprovalDate, LocalDateTime.now())
                .set(PersonTraining::getApprovalRemarks, personTrainingUpdateDto.getRemarks())
                .set(PersonTraining::getApprovalStatus, personTrainingUpdateDto.getStatus());
        if (personTrainingUpdateDto.getStatus().equals(2)) {
            wrapper.set(PersonTraining::getReviewerStatus, null);
        }
        baseMapper.update(new PersonTraining(), wrapper);
    }
    /**
     * å¯¼å‡ºäººå‘˜åŸ¹è®­è®¡åˆ’
     * @param id
     * @param response
     */
    @Override
    public void exportPersonTraining(Integer id, HttpServletResponse response) {
        // æŸ¥è¯¢è¯¦æƒ…
        PersonTraining personTraining = baseMapper.selectById(id);
        //获取提交人的签名地址
        String writeUrl = userMapper.selectById(personTraining.getCompilerId()).getSignatureUrl();
        if (ObjectUtils.isEmpty(writeUrl) || writeUrl.equals("")) {
            throw new ErrorException("找不到检验人的签名");
        }
        //获取复核人的签名地址
        String examineUrl = null;
        if (personTraining.getReviewerId() != null) {
            examineUrl = userMapper.selectById(personTraining.getReviewerId()).getSignatureUrl();
            if (StringUtils.isBlank(examineUrl)) {
                throw new ErrorException("找不到复核人的签名");
            }
        }
        //获取批准人的签名地址
        String ratifyUrl = null;
        if (personTraining.getApproverId() != null) {
            ratifyUrl = userMapper.selectById(personTraining.getApproverId()).getSignatureUrl();
            if (StringUtils.isBlank(ratifyUrl)) {
                throw new ErrorException("找不到复核人的签名");
            }
        }
        // æŸ¥è¯¢è¯¦æƒ…
        List<PersonTrainingDetailedDto> detailedDtos = personTrainingDetailedMapper.selectTrainingList(id);
        int index = 1;
        for (PersonTrainingDetailedDto detailedDto : detailedDtos) {
            detailedDto.setTrainingLecturerName(detailedDto.getTrainingLecturerId());
            if (detailedDto.getTrainingDate() != null) {
                SimpleDateFormat sdfWithoutTime = new SimpleDateFormat("yyyy-MM-dd");
//                detailedDto.setTrainingDateString(sdfWithoutTime.format(detailedDto.getTrainingDate()));
                detailedDto.setTrainingDateString(detailedDto.getTrainingDate());
            }
            DepartmentLims departmentLims = departmentLimsMapper.selectById(detailedDto.getHoldingDepartment());
            if(Objects.nonNull(departmentLims)) {
                detailedDto.setOrganizingDepartment(departmentLims.getName());
            }
            detailedDto.setIndex(index);
            index++;
        }
        // èŽ·å–è·¯å¾„
        InputStream inputStream = this.getClass().getResourceAsStream("/static/person-training.docx");
        String finalExamineUrl = examineUrl;
        String finalRatifyUrl = ratifyUrl;
        Configure configure = Configure.builder()
                .bind("trainingDetailedList", new HackLoopTableRenderPolicy())
                .build();
        XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
                new HashMap<String, Object>() {{
                    put("year", personTraining.getCreateTime().getYear());
                    put("trainingDetailedList", detailedDtos);
                    put("writeUrl", StringUtils.isNotBlank(writeUrl) ? Pictures.ofLocal(imgUrl + "/" + writeUrl).create() : null);
                    put("examineUrl", StringUtils.isNotBlank(finalExamineUrl) ? Pictures.ofLocal(imgUrl + "/" + finalExamineUrl).create() : null);
                    put("ratifyUrl", StringUtils.isNotBlank(finalRatifyUrl) ? Pictures.ofLocal(imgUrl + "/" + finalRatifyUrl).create() : null);
                    put("writeDateUrl", personTraining.getCompilationDate() != null ?
                            Pictures.ofStream(DateImageUtil.createDateImage(personTraining.getCompilationDate())).create() : null);
                    put("examineDateUrl", personTraining.getAuditDate() != null ?
                            Pictures.ofStream(DateImageUtil.createDateImage(personTraining.getAuditDate())).create() : null);
                    put("ratifyDateUrl", personTraining.getApprovalDate() != null ?
                            Pictures.ofStream(DateImageUtil.createDateImage(personTraining.getApprovalDate())).create() : null);
                }});
        try {
            response.setContentType("application/msword");
            String fileName = URLEncoder.encode(
                    "人员培训计划导出", "UTF-8");
            response.setHeader("Content-disposition",
                    "attachment;filename=" + fileName + ".docx");
            OutputStream os = response.getOutputStream();
            template.write(os);
            os.flush();
            os.close();
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException("导出失败");
        }
    }
    /**
     * å¯¼å‡ºäººå‘˜åŸ¹è®­ä¸Žè€ƒæ ¸è®°å½•
     * @param id
     * @param response
     */
    @Override
    public void exportPersonTrainingRecord(Integer id, HttpServletResponse response) {
        // æŸ¥è¯¢äººå‘˜åŸ¹è®­æ˜Žç»†
        PersonTrainingDetailedDto detailedDto = personTrainingDetailedMapper.selectTrainingDetail(id);
        detailedDto.setTrainingContent(detailedDto.getTrainingAbstract());
        detailedDto.setTrainingLecturerName(detailedDto.getTrainingLecturerId()); // åŸ¹è®­è®²å¸ˆ
        detailedDto.setTrainingDateString(detailedDto.getTrainingDateTwo()); // åŸ¹è®­æ—¥æœŸ
        // æŸ¥è¯¢åŸ¹è®­çš„人员
        List<PersonTrainingRecordDto> recordDtos = personTrainingRecordMapper.selectListByTrainingDetailedId(id);
        List<TrainingRecordExportDto> exportDtoList = new ArrayList<>();
        TrainingRecordExportDto exportDto = new TrainingRecordExportDto();
        int count = 0;
        for (PersonTrainingRecordDto recordDto : recordDtos) {
            switch (count) {
                case 0:
                    exportDto.setUserName1(recordDto.getUserName());
                    exportDto.setDepartment1(recordDto.getDepartment());
                    exportDto.setExaminationResults1(recordDto.getExaminationResults());
                    count ++;
                    break;
                case 1:
                    exportDto.setUserName2(recordDto.getUserName());
                    exportDto.setDepartment2(recordDto.getDepartment());
                    exportDto.setExaminationResults2(recordDto.getExaminationResults());
                    exportDtoList.add(exportDto);
                    exportDto = new TrainingRecordExportDto();
                    count = 0;
                    break;
            }
        }
        exportDtoList.add(exportDto);
        // è´¨é‡è´Ÿè´£äºº
        String assessmentUserUrl = null;
        if (detailedDto.getAssessmentUserId() != null) {
            assessmentUserUrl = userMapper.selectById(detailedDto.getAssessmentUserId()).getSignatureUrl();
            if (StringUtils.isBlank(assessmentUserUrl)) {
                throw new ErrorException("找不到评价人的签名");
            }
        }
        // èŽ·å–è·¯å¾„
        InputStream inputStream = this.getClass().getResourceAsStream("/static/person-training-record.docx");
        Configure configure = Configure.builder()
                .bind("trainingRecordsList", new HackLoopTableRenderPolicy())
                .build();
        String finalAssessmentUserUrl = assessmentUserUrl;
        XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
                new HashMap<String, Object>() {{
                    put("trainingDetail", detailedDto);
                    put("trainingRecordsList", exportDtoList);
                    put("assessmentUserUrl", StringUtils.isNotBlank(finalAssessmentUserUrl) ? Pictures.ofLocal(imgUrl + "/" + finalAssessmentUserUrl).create() : null);
                }});
        try {
            response.setContentType("application/msword");
            String fileName = URLEncoder.encode(
                    "培训与考核记录导出", "UTF-8");
            response.setHeader("Content-disposition",
                    "attachment;filename=" + fileName + ".docx");
            OutputStream os = response.getOutputStream();
            template.write(os);
            os.flush();
            os.close();
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException("导出失败");
        }
    }
}
cnas-personnel/src/main/resources/mapper/PersonBasicInfoMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,101 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.personnel.mapper.PersonBasicInfoMapper">
    <!-- é€šç”¨æŸ¥è¯¢æ˜ å°„结果 -->
    <resultMap id="BaseResultMap" type="com.ruoyi.personnel.pojo.PersonBasicInfo">
        <id column="id" property="id" />
        <result column="current_state" property="currentState" />
        <result column="entry_time" property="entryTime" />
        <result column="post" property="post" />
        <result column="professional_title" property="professionalTitle" />
        <result column="sex" property="sex" />
        <result column="personnel_classification" property="personnelClassification" />
        <result column="date_birth" property="dateBirth" />
        <result column="identity_card" property="identityCard" />
        <result column="nation" property="nation" />
        <result column="political_status" property="politicalStatus" />
        <result column="official_academic_redentials" property="officialAcademicRedentials" />
        <result column="graduation_time1" property="graduationTime1" />
        <result column="graduated_institutions1" property="graduatedInstitutions1" />
        <result column="major1" property="major1" />
        <result column="graduation_time2" property="graduationTime2" />
        <result column="graduated_institutions2" property="graduatedInstitutions2" />
        <result column="major2" property="major2" />
        <result column="telephone" property="telephone" />
        <result column="end_planned_internship" property="endPlannedInternship" />
        <result column="end_practical_practice" property="endPracticalPractice" />
        <result column="date_departure" property="dateDeparture" />
        <result column="desktop_picture" property="desktopPicture" />
        <result column="attachment_information" property="attachmentInformation" />
        <result column="remarks" property="remarks" />
        <result column="user_id" property="userId" />
        <result column="current_position" property="currentPosition" />
    </resultMap>
    <select id="selectLimsUser" resultType="com.ruoyi.common.core.dto.DepartmentDto">
        SELECT u.id userId, u.name, SUBSTRING_INDEX(SUBSTRING_INDEX(u.depart_lims_id, ',', -2), ',', 1) AS fatherId
        FROM user u
        where u.is_custom = 0
          and u.depart_lims_id is not null
          and u.depart_lims_id != ''
    </select>
    <select id="getCNASPersonnelInfo" resultType="com.ruoyi.personnel.dto.PersonBasicInfoDto">
        SELECT cpbi.*,u.*
        FROM user u
                 left join cnas_person_basic_info cpbi on cpbi.user_id = u.id
        where u.id = #{userId}
    </select>
    <select id="basicInformationOfPersonnelSelectPage" resultType="java.util.Map">
        select
            u.id,
            u.name,
            u.account,
            cpbi.sex,
            cpbi.date_birth,
            u.age,
            cpbi.entry_time,
            cpbi.personnel_classification,
            cpbi.official_academic_redentials,
            cpbi.current_position,
            u.phone,
            cpbi.date_departure,
            cpbi.current_state,
            u1.name createUser
        from user u
                 left join cnas_person_basic_info cpbi on cpbi.user_id = u.id
                 left join user u1 on u1.id = u.create_by
        where FIND_IN_SET(#{departmentId},u.depart_lims_id)
    </select>
    <select id="selectPersonBasecInfoAndUser" resultType="java.util.Map">
        select
            u.id  userId,
            u.`name`  name,
            u.account account,
            DATE_FORMAT(cpbi.entry_time, '%Y-%m-%d') groupTime,
            DATE_FORMAT(cpbi.end_practical_practice, '%Y-%m-%d')  endPracticalPracticeStr,
            cpbi.native_place nativePlace,
            cpbi.identity_card identityCard,
            cpbi.id_address idAddress,
            u.phone telephone,
            cpbi.graduated_institutions1 graduatedInstitutions1,
            cpbi.major1 major1,
            DATE_FORMAT(cpbi.graduation_time1, '%Y-%m-%d')  graduationTime1,
            cpbi.official_academic_redentials officialAcademicRedentials,
            cpbi.highest_degree highestDegree,
            cpbi.professional_title professionalTitle,
            cpbi.emergency_contact emergencyContact,
            cpbi.emergency_contact_phone emergencyContactPhone
        from user u
                 left join cnas_person_basic_info cpbi on cpbi.user_id = u.id
                 left join user u1 on u1.id = u.create_by
        <where>
            FIND_IN_SET(#{departmentId},u.depart_lims_id)
            <if test="name != null and name != ''">
                and u.name like concat('%',#{name},'%')
            </if>
        </where>
    </select>
</mapper>
cnas-personnel/src/main/resources/mapper/PersonCommunicationAbilityMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,31 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.personnel.mapper.PersonCommunicationAbilityMapper">
    <!-- é€šç”¨æŸ¥è¯¢æ˜ å°„结果 -->
    <resultMap id="BaseResultMap" type="com.ruoyi.personnel.pojo.PersonCommunicationAbility">
        <id column="id" property="id" />
        <result column="user_id" property="userId" />
        <result column="communication_time" property="communicationTime" />
        <result column="communication_place" property="communicationPlace" />
        <result column="communication_content" property="communicationContent" />
        <result column="create_user" property="createUser" />
        <result column="update_user" property="updateUser" />
        <result column="create_time" property="createTime" />
        <result column="update_time" property="updateTime" />
    </resultMap>
    <select id="personPersonCommunicationAbilityPage" resultType="com.ruoyi.personnel.dto.PersonCommunicationAbilityDto">
        select cpca.*, us.name create_user_name
        from cnas_person_communication_ability cpca
        left join user us on cpca.create_user = us.id
        <where>
            <if test="userId != null and userId != ''">
                and FIND_IN_SET(#{userId},cpca.user_id)
            </if>
            <if test="departLimsId != null and departLimsId != ''">
                and FIND_IN_SET(#{departLimsId},us.depart_lims_id)
            </if>
        </where>
    </select>
</mapper>
cnas-personnel/src/main/resources/mapper/PersonJobResponsibilitiesMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,39 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.personnel.mapper.PersonJobResponsibilitiesMapper">
    <!-- é€šç”¨æŸ¥è¯¢æ˜ å°„结果 -->
    <resultMap id="BaseResultMap" type="com.ruoyi.personnel.pojo.PersonJobResponsibilities">
        <id column="id" property="id" />
        <result column="post_name" property="postName" />
        <result column="job_objective" property="jobObjective" />
        <result column="job_responsibilities" property="jobResponsibilities" />
        <result column="incumbent_id" property="incumbentId" />
        <result column="submitting_operator" property="submittingOperator" />
        <result column="submitting_date" property="submittingDate" />
        <result column="supervisor_id" property="supervisorId" />
        <result column="incumbent_operator" property="incumbentOperator" />
        <result column="incumbent_date" property="incumbentDate" />
        <result column="supervisor_operator" property="supervisorOperator" />
        <result column="supervisor_date" property="supervisorDate" />
    </resultMap>
    <select id="personJobResponsibilitiesSelect" resultType="com.ruoyi.personnel.dto.PersonJobResponsibilitiesDto">
        select cpt.*, u.name incumbent_name, su.name supervisor_name, dl.name depart_lims_name, u.account
        from cnas_person_job_responsibilities cpt
        left join user u on cpt.incumbent_id = u.id
        left join user su on cpt.supervisor_id = su.id
        left join department_lims dl on dl.id = SUBSTRING_INDEX(SUBSTRING_INDEX(u.depart_lims_id, ',', -2), ',', 1)
        <where>
            <if test="userId != null and userId != ''">
                and cpt.incumbent_id = #{userId}
            </if>
            <if test="departmentId != null and departmentId != ''">
                and FIND_IN_SET(#{departmentId}, u.depart_lims_id)
            </if>
            <if test="userName != null and userName != ''">
                and u.name like concat('%', #{userName}, '%')
            </if>
        </where>
    </select>
</mapper>
cnas-personnel/src/main/resources/mapper/PersonPersonnelCapacityMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,168 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.personnel.mapper.PersonPersonnelCapacityMapper">
    <!-- é€šç”¨æŸ¥è¯¢æ˜ å°„结果 -->
    <resultMap id="BaseResultMap" type="com.ruoyi.personnel.pojo.PersonPersonnelCapacity">
        <id column="id" property="id" />
        <result column="academic_degree" property="academicDegree" />
        <result column="academic_conform_not" property="academicConformNot" />
        <result column="academic_remarks" property="academicRemarks" />
        <result column="related_years" property="relatedYears" />
        <result column="related_years_conform_not" property="relatedYearsConformNot" />
        <result column="related_years_remarks" property="relatedYearsRemarks" />
        <result column="related_training" property="relatedTraining" />
        <result column="related_training_conform_not" property="relatedTrainingConformNot" />
        <result column="related_training_remarks" property="relatedTrainingRemarks" />
        <result column="relevant_experience" property="relevantExperience" />
        <result column="relevant_experience_conform_not" property="relevantExperienceConformNot" />
        <result column="relevant_experience_remarks" property="relevantExperienceRemarks" />
        <result column="work_license" property="workLicense" />
        <result column="work_license_conform_not" property="workLicenseConformNot" />
        <result column="work_license_remarks" property="workLicenseRemarks" />
        <result column="job_responsibilities" property="jobResponsibilities" />
        <result column="job_responsibilities_conform_not" property="jobResponsibilitiesConformNot" />
        <result column="job_responsibilities_remarks" property="jobResponsibilitiesRemarks" />
        <result column="comprehensive_assessment" property="comprehensiveAssessment" />
        <result column="submit_operating_personnel_id" property="submitOperatingPersonnelId" />
        <result column="submit_date" property="submitDate" />
        <result column="confirm_operating_personnel_id" property="confirmOperatingPersonnelId" />
        <result column="confirm_date" property="confirmDate" />
        <result column="create_time" property="createTime" />
        <result column="update_time" property="updateTime" />
        <result column="create_user" property="createUser" />
        <result column="update_user" property="updateUser" />
        <result column="user_id" property="userId" />
    </resultMap>
    <resultMap id="BaseResultMapDto" type="com.ruoyi.personnel.dto.PersonPersonnelCapacityDto" extends="BaseResultMap">
        <result column="submit_operating_personnel_name" property="submitOperatingPersonnelName" />
        <result column="confirm_operating_personnel_name" property="confirmOperatingPersonnelName" />
        <result column="user_name" property="userName" />
        <result column="place_work" property="placeWork" />
        <result column="post_name" property="postName" />
        <result column="responsibilities" property="responsibilities" />
        <result column="major" property="major" />
    </resultMap>
    <select id="personPersonnelCapacityPage" resultMap="BaseResultMapDto">
        select cppc.*,
        u1.name submit_operating_personnel_name,
        u2.name confirm_operating_personnel_name,
        u3.name user_name,
        cpbi.post_name,
        p.place_work,
        ecp.responsibilities,
        TRIM(',' FROM CONCAT(cpbi.major1, ',', cpbi.major2)) AS major
        from cnas_person_personnel_capacity cppc
        left join user u1 on cppc.submit_operating_personnel_id = u1.id
        left join user u2 on cppc.confirm_operating_personnel_id = u2.id
        left join user u3 on cppc.user_id = u3.id
        -- å–岗位
        left join cnas_person_basic_info cpbi on cpbi.user_id = cppc.user_id
        -- å–人员能力的工作经历
        left join (select GROUP_CONCAT(cptr.place_work) place_work, cptr.user_id from cnas_person_track_record cptr
        where cptr.place_work like concat('%' ,'中天', '%')
        GROUP BY cptr.user_id) p on u3.id = p.user_id
        -- å–人员能力的岗位职责
        left join (SELECT GROUP_CONCAT(e.label) responsibilities, cppc.id
        from cnas_person_personnel_capacity cppc
        left join enums e on FIND_IN_SET(e.value, cppc.job_responsibilities)
        where e.category = '岗位职责'
        GROUP BY cppc.id) ecp on ecp.id = cppc.id
        <where>
            <if test="userId != null and userId != ''">
                and cppc.user_id = #{userId}
            </if>
            <if test="departLimsId != null and departLimsId != ''">
                and FIND_IN_SET(#{departLimsId}, u3.depart_lims_id)
            </if>
            <if test="userName != null and userName != ''">
                and u3.name like concat('%', #{userName}, '%')
            </if>
        </where>
    </select>
    <!-- æŸ¥è¯¢äººå‘˜èƒ½åŠ›æŽ¥å£ -->
    <select id="selectExportPersonnelCapacity"
            resultType="com.ruoyi.personnel.dto.PersonPersonnelCapacityExportDto">
        select cppc.*,
               cpbi.post postName,
               u1.name   userName,
               cpbi.official_academic_redentials,
               cpbi.major1,
               cpbi.professional_title,
               p.place_work,
               TRIM(',' FROM CONCAT(cpbi.major1, ',', cpbi.major2)) AS major,
               case when cppc.academic_conform_not = 1 then '☑'
                    else '□' end academicConformNot1,-- å­¦åކ
               case when cppc.academic_conform_not = 2 then '☑'
                    else '□' end academicConformNot2,
               case when cppc.academic_conform_not = 3 then '☑'
                    else '□' end academicConformNot3,
               case when cppc.related_years_conform_not = 1 then '☑'
                    else '□' end relatedYearsConformNot1,-- ç›¸å…³å¹´é™
               case when cppc.related_years_conform_not = 2 then '☑'
                    else '□' end relatedYearsConformNot2,
               case when cppc.related_years_conform_not = 3 then '☑'
                    else '□' end relatedYearsConformNot3,
               case when cppc.related_training_conform_not = 1 then '☑'
                    else '□' end relatedTrainingConformNot1,-- ç›¸å…³åŸ¹è®­
               case when cppc.related_training_conform_not = 2 then '☑'
                    else '□' end relatedTrainingConformNot2,
               case when cppc.related_training_conform_not = 3 then '☑'
                    else '□' end relatedTrainingConformNot3,
               case when cppc.relevant_experience_conform_not = 1 then '☑'
                    else '□' end relevantExperienceConformNot1,-- ç›¸å…³ç»éªŒ
               case when cppc.relevant_experience_conform_not = 2 then '☑'
                    else '□' end relevantExperienceConformNot2,
               case when cppc.relevant_experience_conform_not = 3 then '☑'
                    else '□' end relevantExperienceConformNot3,
               case when cppc.work_license_conform_not = 1 then '☑'
                    else '□' end workLicenseConformNot1,-- ä¸Šå²—证
               case when cppc.work_license_conform_not = 2 then '☑'
                    else '□' end workLicenseConformNot2,
               case when cppc.work_license_conform_not = 3 then '☑'
                    else '□' end workLicenseConformNot3,
               case when cppc.job_responsibilities_conform_not = 1 then '☑'
                    else '□' end jobResponsibilitiesConformNot1,-- å²—位职责
               case when cppc.job_responsibilities_conform_not = 2 then '☑'
                    else '□' end jobResponsibilitiesConformNot2,
               case when cppc.job_responsibilities_conform_not = 3 then '☑'
                    else '□' end jobResponsibilitiesConformNot3,
               case when cppc.comprehensive_assessment = 'Qualified this position' then '☑'
                    else '□' end comprehensiveAssessment1,-- ç»¼åˆè¯„ä»·
               case when cppc.comprehensive_assessment = 'You can work while training' then '☑'
                    else '□' end comprehensiveAssessment2,
               case when cppc.comprehensive_assessment = 'Iconpetent for the position' then '☑'
                    else '□' end comprehensiveAssessment3,
               case when find_in_set(1, cppc.job_responsibilities) then '☑'
                    else '□' end jobResponsibilities1,
               case when find_in_set(2, cppc.job_responsibilities) then '☑'
                    else '□' end jobResponsibilities2,
               case when find_in_set(3, cppc.job_responsibilities) then '☑'
                    else '□' end jobResponsibilities3,
               case when find_in_set(4, cppc.job_responsibilities) then '☑'
                    else '□' end jobResponsibilities4,
               case when find_in_set(5, cppc.job_responsibilities) then '☑'
                    else '□' end jobResponsibilities5,
               case when find_in_set(6, cppc.job_responsibilities) then '☑'
                    else '□' end jobResponsibilities6,
               case when find_in_set(7, cppc.job_responsibilities) then '☑'
                    else '□' end jobResponsibilities7,
               case when find_in_set(8, cppc.job_responsibilities) then '☑'
                    else '□' end jobResponsibilities8,
               case when find_in_set(9, cppc.job_responsibilities) then '☑'
                    else '□' end jobResponsibilities9,
               case when find_in_set(10, cppc.job_responsibilities) then '☑'
                    else '□' end jobResponsibilities10
        from cnas_person_personnel_capacity cppc
                 left join user u1 on cppc.user_id = u1.id
                 left join cnas_person_basic_info cpbi on cpbi.user_id = cppc.user_id
                 left join (select GROUP_CONCAT(cptr.place_work) place_work, cptr.user_id
                            from cnas_person_track_record cptr
                            where cptr.place_work like concat('%', '中天', '%')
                            GROUP BY cptr.user_id) p on u1.id = p.user_id
        where cppc.id = #{id}
    </select>
</mapper>
cnas-personnel/src/main/resources/mapper/PersonPostAuthorizationRecordMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,40 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.personnel.mapper.PersonPostAuthorizationRecordMapper">
    <!-- é€šç”¨æŸ¥è¯¢æ˜ å°„结果 -->
    <resultMap id="BaseResultMap" type="com.ruoyi.personnel.pojo.PersonPostAuthorizationRecord">
        <id column="id" property="id" />
        <result column="certificate_number" property="certificateNumber" />
        <result column="user_id" property="userId" />
        <result column="post" property="post" />
        <result column="operation_type" property="operationType" />
        <result column="file_name" property="fileName" />
        <result column="system_file_name" property="systemFileName" />
        <result column="remarks" property="remarks" />
        <result column="create_time" property="createTime" />
        <result column="update_time" property="updateTime" />
        <result column="update_user" property="updateUser" />
        <result column="create_user" property="createUser" />
        <result column="num1" property="num1" />
        <result column="num2" property="num2" />
    </resultMap>
    <select id="personPostAuthorizationRecordPage" resultType="com.ruoyi.personnel.dto.PersonPostAuthorizationRecordDto">
        select cppar.*, us.name create_user_name, u.account account, u.name user_name
        from cnas_person_post_authorization_record cppar
        left join user u on cppar.user_id = u.id
        left join user us on cppar.create_user = us.id
        <where>
            <if test="userId != null and userId != ''">
                and cppar.user_id = #{userId}
            </if>
            <if test="departLimsId != null and departLimsId != ''">
                and FIND_IN_SET(#{departLimsId},u.depart_lims_id)
            </if>
            <if test="userName != null and userName != ''">
                and u.name like concat('%', #{userName}, '%')
            </if>
        </where>
    </select>
</mapper>
cnas-personnel/src/main/resources/mapper/PersonRewardPunishmentRecordMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,58 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.personnel.mapper.PersonRewardPunishmentRecordMapper">
    <!-- é€šç”¨æŸ¥è¯¢æ˜ å°„结果 -->
    <resultMap id="BaseResultMap" type="com.ruoyi.personnel.pojo.PersonRewardPunishmentRecord">
        <id column="id" property="id" />
        <result column="reward_punish_level" property="rewardPunishLevel" />
        <result column="reward_punish_name" property="rewardPunishName" />
        <result column="reward_punish_time" property="rewardPunishTime" />
        <result column="reward_punish_work_unit" property="rewardPunishWorkUnit" />
        <result column="reward_punish_content" property="rewardPunishContent" />
        <result column="user_id" property="userId" />
        <result column="create_user" property="createUser" />
    </resultMap>
    <select id="rewardPunishmentPage" resultType="com.ruoyi.personnel.dto.PersonRewardPunishmentRecordDto">
        select cprpr.*, us.name create_user_name, u.account account, u.name user_name
        from cnas_person_reward_punishment_record cprpr
        left join user u on cprpr.user_id = u.id
        left join user us on cprpr.create_user = us.id
        <where>
            <if test="userId != null and userId != ''">
                and cprpr.user_id = #{userId}
            </if>
            <if test="userName != null and userName != ''">
                and u.name like concat('%', #{userName}, '%')
            </if>
            <if test="startTime != null and endTime != null">
                AND DATE(cprpr.reward_punish_time) BETWEEN #{startTime} AND #{endTime}
            </if>
            <if test="departmentId != null and departmentId != ''">
                and FIND_IN_SET(#{departmentId}, u.depart_lims_id)
            </if>
        </where>
    </select>
    <select id="rewardPunishmentExport" resultType="com.ruoyi.personnel.excel.PersonRewardPunishmentRecordExcel">
        select cprpr.*, us.name create_user_name, u.account account, u.name user_name
        from cnas_person_reward_punishment_record cprpr
        left join user u on cprpr.user_id = u.id
        left join user us on cprpr.create_user = us.id
        <where>
            <if test="userId != null and userId != ''">
                and cprpr.user_id = #{userId}
            </if>
            <if test="departmentId != null and departmentId != ''">
                and FIND_IN_SET(#{departmentId},u.depart_lims_id)
            </if>
            <if test="userName != null and userName != ''">
                and u.name like concat('%', #{userName}, '%')
            </if>
            <if test="startTime != null and endTime != null">
                AND DATE(cprpr.reward_punish_time) BETWEEN #{startTime} AND #{endTime}
            </if>
        </where>
    </select>
</mapper>
cnas-personnel/src/main/resources/mapper/PersonSupervisePlanDetailsMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,42 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.personnel.mapper.PersonSupervisePlanDetailsMapper">
    <!-- é€šç”¨æŸ¥è¯¢æ˜ å°„结果 -->
    <resultMap id="BaseResultMap" type="com.ruoyi.personnel.pojo.PersonSupervisePlanDetails">
        <id column="id" property="id" />
        <result column="supervise_date" property="superviseDate" />
        <result column="supervise_des" property="superviseDes" />
        <result column="supervise_person" property="supervisePerson" />
        <result column="remarks" property="remarks" />
        <result column="create_time" property="createTime" />
        <result column="create_user" property="createUser" />
        <result column="supervise_project" property="superviseProject" />
        <result column="supervise_reason" property="superviseReason" />
    </resultMap>
    <select id="pageByDate" resultType="com.ruoyi.personnel.dto.PersonSupervisePlanDetailsDto">
        SELECT
        cpspd.id,
        DATE_FORMAT( cpspd.supervise_date, '%Y-%m-%d' ) supervise_date,
        cpspd.supervise_des,
        cpspd.supervise_person,
        cpspd.remarks,
        cpspd.create_time,
        cpspd.create_user,
        cpspd.supervise_project,
        cpspd.supervise_reason,
        cpspd.plan_id,
        u.NAME create_by
        from cnas_person_supervise_plan_details cpspd
        left join user u on u.id = cpspd.create_user
        where cpspd.plan_id = #{planId}
        <if test="date != null and date != ''">
            and date_format(cpspd.supervise_date,'%Y-%m-%d') = #{date}
        </if>
        <if test="project != null and project != ''">
            and cpspd.supervise_project like concat('%', #{project}, '%')
        </if>
        order by cpspd.id ASC
    </select>
</mapper>
cnas-personnel/src/main/resources/mapper/PersonSupervisePlanMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,36 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.personnel.mapper.PersonSupervisePlanMapper">
    <!-- é€šç”¨æŸ¥è¯¢æ˜ å°„结果 -->
    <resultMap id="BaseResultMap" type="com.ruoyi.personnel.pojo.PersonSupervisePlan">
        <id column="id" property="id" />
        <result column="file_name" property="fileName" />
        <result column="organization_person_id" property="organizationPersonId" />
        <result column="organization_date" property="organizationDate" />
        <result column="approval_id" property="approvalId" />
        <result column="approval_date" property="approvalDate" />
        <result column="approval_status" property="approvalStatus" />
        <result column="create_time" property="createTime" />
        <result column="create_user" property="createUser" />
        <result column="update_time" property="updateTime" />
        <result column="update_user" property="updateUser" />
    </resultMap>
    <select id="pageByPerson" resultType="com.ruoyi.personnel.dto.PersonSupervisePlanDto">
        select cpsp.*, u1.name organization_person_name, u2.name approval_name, u3.name create_name
        from cnas_person_supervise_plan cpsp
        left join user u1 on cpsp.organization_person_id = u1.id
        left join user u2 on cpsp.approval_id = u2.id
        left join user u3 on cpsp.create_user = u3.id
        <where>
            <if test="organizationPerson != null and organizationPerson != ''">
                and u1.name =#{organizationPerson}
            </if>
        <if test="departId !='' and departId != null">
            and cpsp.depart_id = #{departId}
        </if>
        </where>
        order by create_time desc
    </select>
</mapper>
cnas-personnel/src/main/resources/mapper/PersonSupervisionControlSheetMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,41 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.personnel.mapper.PersonSupervisionControlSheetMapper">
    <!-- æŸ¥è¯¢ç›‘督记录控制单 -->
    <select id="selectSupervisionControl"
            resultType="com.ruoyi.personnel.dto.PersonSupervisionControlSheetExportDto">
        select scs.*,
               dl1.name                                     occurrenceDepartmentString,
               u1.name                                      departmentHead,
               dl2.name                                     discovererDepartment,
               DATE_FORMAT(scs.discoverer_date, '%Y-%m-%d') discovererDateString,
               u3.name                                      supervisedPerson,
               dl4.name                                      responsibleDepartment,
               DATE_FORMAT(scs.responsible_department_date, '%Y-%m-%d') responsibleDepartmentDateString,
               DATE_FORMAT(scs.corrective_measure_date, '%Y-%m-%d') correctiveMeasureDateString,
               DATE_FORMAT(scs.quality_supervisor_date, '%Y-%m-%d') qualitySupervisorDateString,
               case when scs.corrective_measure_follow_tracks = 1 then '☑'
                    else '□' end correctiveMeasureFollowTracksYes,
               case when scs.corrective_measure_follow_tracks = 2 then '☑'
                    else '□' end correctiveMeasureFollowTracksNo,
               case when scs.whether_inform_customer = 1 then '☑'
                    else '□' end whetherInformCustomerYes,
               case when scs.whether_inform_customer = 2 then '☑'
                    else '□' end whetherInformCustomerNo,
               case when scs.whether_resume_work = 1 then '☑'
                    else '□' end whetherResumeWorkYes,
               case when scs.whether_resume_work = 2 then '☑'
                    else '□' end whetherResumeWorkNo
        from cnas_person_supervision_control_sheet scs
                 left join user u1 on u1.id = scs.department_head_id -- éƒ¨é—¨è´Ÿè´£äºº
                 left join department_lims dl1 on find_in_set(dl1.id, u1.depart_lims_id) and dl1.id != 1
                 left join user u2 on u2.id = scs.discoverer_id -- å‘现部门
                 left join department_lims dl2 on find_in_set(dl2.id, u2.depart_lims_id) and dl2.id != 1
                 left join user u3 on u3.id = scs.supervised_person_id -- è¢«ç›‘督人
                 left join user u4 on u4.id = scs.responsible_department_person_id -- è´£ä»»éƒ¨é—¨
                 left join department_lims dl4 on find_in_set(dl4.id, u4.depart_lims_id) and dl4.id != 1
        where scs.supervision_record_id = #{supervisionRecordId}
    </select>
</mapper>
cnas-personnel/src/main/resources/mapper/PersonSupervisionProcessingSheetMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,28 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.personnel.mapper.PersonSupervisionProcessingSheetMapper">
    <!-- æŸ¥è¯¢äººå‘˜ç›‘督记录处理单 -->
    <select id="selectProcessingSheet" resultType="com.ruoyi.personnel.dto.PersonSupervisionProcessingSheetDto">
        select sps.*,
               dl1.name                                                     proposing_department,
               dl2.name                                                     cause_analysis_department,
               dl3.name                                                     corrective_action,
               dl4.name                                                     verification_department,
               DATE_FORMAT(sps.proposing_department_date, '%Y-%m-%d')    AS proposing_department_date_string,
               DATE_FORMAT(sps.cause_analysis_date, '%Y-%m-%d')          AS cause_analysis_date_string,
               DATE_FORMAT(sps.corrective_action_date, '%Y-%m-%d')       AS corrective_action_date_string,
               DATE_FORMAT(sps.verification_department_date, '%Y-%m-%d') AS verification_department_date_string
        from cnas_person_supervision_processing_sheet sps
                 left join user u1 on u1.id = sps.proposing_department_person_id
                 left join user u2 on u2.id = sps.cause_analysis_person_id
                 left join user u3 on u3.id = sps.corrective_action_id
                 left join user u4 on u4.id = sps.verification_department_person_id
                 left join department_lims dl1 on find_in_set(dl1.id, u1.depart_lims_id) and dl1.id != 1
                 left join department_lims dl2 on find_in_set(dl2.id, u2.depart_lims_id) and dl2.id != 1
                 left join department_lims dl3 on find_in_set(dl3.id, u3.depart_lims_id) and dl3.id != 1
                 left join department_lims dl4 on find_in_set(dl4.id, u4.depart_lims_id) and dl4.id != 1
        where sps.supervision_record_id = #{supervisionRecordId}
    </select>
</mapper>
cnas-personnel/src/main/resources/mapper/PersonSupervisionRecordMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,78 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.personnel.mapper.PersonSupervisionRecordMapper">
    <!-- é€šç”¨æŸ¥è¯¢æ˜ å°„结果 -->
    <resultMap id="BaseResultMap" type="com.ruoyi.personnel.pojo.PersonSupervisionRecord">
        <id column="id" property="id" />
        <result column="tester_id" property="testerId" />
        <result column="supervisor_id" property="supervisorId" />
        <result column="test_item" property="testItem" />
        <result column="sample_number" property="sampleNumber" />
        <result column="detection_date" property="detectionDate" />
        <result column="personnel" property="personnel" />
        <result column="instrument_equipment" property="instrumentEquipment" />
        <result column="working_environment" property="workingEnvironment" />
        <result column="sample_collection" property="sampleCollection" />
        <result column="sample_preparation" property="samplePreparation" />
        <result column="test_method" property="testMethod" />
        <result column="test_report" property="testReport" />
        <result column="evaluation_supervision_situation" property="evaluationSupervisionSituation" />
        <result column="do_not_meet_the_handling_opinions" property="doNotMeetTheHandlingOpinions" />
        <result column="technical_director" property="technicalDirector" />
        <result column="technical_director_date" property="technicalDirectorDate" />
        <result column="create_time" property="createTime" />
        <result column="update_time" property="updateTime" />
        <result column="create_user" property="createUser" />
        <result column="update_user" property="updateUser" />
    </resultMap>
    <select id="personSupervisionRecordPage" resultType="com.ruoyi.personnel.dto.PersonSupervisionRecordDto">
        select cpsr.*, u1.name tester_name, u2.name supervisor_name, u3.name technical_director_name,
        cp.personnel_name, cpscs.current_state current_state_control, cpscs.corrective_measure, cpsps.current_state current_state_processing,u2.depart_lims_id
        from cnas_person_supervision_record cpsr
        left join user u1 on cpsr.tester_id = u1.id
        left join user u2 on cpsr.supervisor_id = u2.id
        left join user u3 on cpsr.technical_director = u3.id
        left join (
        select GROUP_CONCAT(u.name) personnel_name, cp.id
        from cnas_person_supervision_record cp
        left join user u on FIND_IN_SET(u.id, cp.personnel)
        GROUP BY cp.id
        ) cp on cp.id = cpsr.id
        left join cnas_person_supervision_control_sheet cpscs on cpscs.supervision_record_id = cpsr.id
        left join cnas_person_supervision_processing_sheet cpsps on cpsps.supervision_record_id = cpsr.id
        <where>
            <if test="userId != null and userId != ''">
                and cpsr.supervisor_id = #{userId}
            </if>
            <if test="departLimsId != null and departLimsId != ''">
                <!--and FIND_IN_SET(#{departLimsId}, u2.depart_lims_id)-->
                and cpsr.depart_lims_id = #{departLimsId}
            </if>
            <if test="userName != null and userName != ''">
                and u2.name like concat('%', #{userName}, '%')
            </if>
        </where>
        order by cpsr.id desc
    </select>
    <!-- æŸ¥è¯¢ç›‘督记录详情 -->
    <select id="selectPersonSupervisionRecord" resultType="com.ruoyi.personnel.dto.PersonSupervisionRecordDto">
        select cpsr.*, u1.name tester_name, u2.name supervisor_name, u3.name technical_director_name,
               cp.personnel_name, cpscs.current_state current_state_control, cpsps.current_state current_state_processing
        from cnas_person_supervision_record cpsr
                 left join user u1 on cpsr.tester_id = u1.id
                 left join user u2 on cpsr.supervisor_id = u2.id
                 left join user u3 on cpsr.technical_director = u3.id
                 left join (
            select GROUP_CONCAT(u.name) personnel_name, cp.id
            from cnas_person_supervision_record cp
                     left join user u on FIND_IN_SET(u.id, cp.personnel)
            GROUP BY cp.id
        ) cp on cp.id = cpsr.id
                 left join cnas_person_supervision_control_sheet cpscs on cpscs.supervision_record_id = cpsr.id
                 left join cnas_person_supervision_processing_sheet cpsps on cpsps.supervision_record_id = cpsr.id
        where cpsr.id = #{id}
    </select>
</mapper>
cnas-personnel/src/main/resources/mapper/PersonTrackRecordMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,47 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.personnel.mapper.PersonTrackRecordMapper">
    <!-- é€šç”¨æŸ¥è¯¢æ˜ å°„结果 -->
    <resultMap id="BaseResultMap" type="com.ruoyi.personnel.pojo.PersonTrackRecord">
        <id column="id" property="id" />
        <result column="start_time" property="startTime" />
        <result column="end_time" property="endTime" />
        <result column="place_work" property="placeWork" />
        <result column="department" property="department" />
        <result column="post" property="post" />
        <result column="remarks" property="remarks" />
        <result column="create_time" property="createTime" />
        <result column="create_user" property="createUser" />
        <result column="user_id" property="userId" />
        <result column="file_name" property="fileName" />
    </resultMap>
    <select id="personTrackRecordSelect" resultType="com.ruoyi.personnel.pojo.PersonTrackRecord">
        select cpt.*
        from cnas_person_track_record cpt
        left join user u on cpt.user_id = u.id
        <where>
            <if test="userId != null and userId != '' and userId != 'null'">
                and cpt.user_id = #{userId}
            </if>
            <if test="departLimsId != null and departLimsId != '' and departLimsId != 'null'">
                and FIND_IN_SET(#{departLimsId},u.depart_lims_id)
            </if>
        </where>
    </select>
    <select id="personTrackRecordExport" resultMap="BaseResultMap">
        select *
        from cnas_person_track_record cpt
        left join user u on cpt.user_id = u.id
        <where>
            <if test="userId != null and userId != '' and userId != 'null'">
                and cpt.user_id = #{userId}
            </if>
            <if test="departLimsId != null and departLimsId != '' and departLimsId != 'null'">
                and FIND_IN_SET(#{departLimsId},u.depart_lims_id)
            </if>
        </where>
    </select>
</mapper>
cnas-personnel/src/main/resources/mapper/PersonTrainingDetailedMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,98 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.personnel.mapper.PersonTrainingDetailedMapper">
    <!-- é€šç”¨æŸ¥è¯¢æ˜ å°„结果 -->
    <resultMap id="BaseResultMap" type="com.ruoyi.personnel.pojo.PersonTrainingDetailed">
        <id column="id" property="id" />
        <result column="course_code" property="courseCode" />
        <result column="training_objectives" property="trainingObjectives" />
        <result column="training_content" property="trainingContent" />
        <result column="training_mode" property="trainingMode" />
        <result column="state" property="state" />
        <result column="participants" property="participants" />
        <result column="holding_department" property="holdingDepartment" />
        <result column="place_training" property="placeTraining" />
        <result column="training_lecturer_id" property="trainingLecturerId" />
        <result column="training_date" property="trainingDate" />
        <result column="opening_time" property="openingTime" />
        <result column="class_hour" property="classHour" />
        <result column="remarks" property="remarks" />
        <result column="create_time" property="createTime" />
        <result column="create_user" property="createUser" />
        <result column="update_user" property="updateUser" />
        <result column="update_time" property="updateTime" />
    </resultMap>
    <select id="queryTheAnnualPlanDetailsTable" resultType="com.ruoyi.personnel.dto.PersonTrainingDetailedDto">
        SELECT cptd.*,
        cpt.depart_id as departId,
       <!-- u1.name training_lecturer_name,-->
        dl.name holding_department_name, !isnull(cptr.training_record_id) whether_claim
        FROM cnas_person_training_detailed cptd
        <!-- left join user u1 on cptd.training_lecturer_id = u1.id-->
        left join department_lims dl on dl.id = cptd.holding_department
        left join cnas_person_training_record cptr on
            <!--cptr.user_id = #{loginUserId} and -->
            cptr.course_id = cptd.id
        left join cnas_person_training cpt on cpt.id = cptd.plan_id
        <where>
            <if test="id != null">
                and cptd.plan_id = #{id}
            </if>
            <if test="userId != null">
                and cptr.user_id = #{userId}
            </if>
            <if test="courseCode != null and courseCode != ''">
                and cptd.course_code like concat('%', #{courseCode}, '%')
            </if>
            <if test="trainingLecturerName != null and trainingLecturerName != ''">
                and cptd.training_lecturer_id like concat('%', #{trainingLecturerName}, '%')
            </if>
            <if test="trainingDate != null and trainingDate != ''">
                and cptd.training_date_two = #{trainingDate}
            </if>
            <if test="state != null and state != ''">
                and cptd.state = 3
            </if>
            <if test="state == null || state == ''">
                and cptd.state != 3
            </if>
        </where>
        GROUP BY
        cptd.id
        order by
        CASE
        WHEN cptd.training_date_two IS NULL THEN '9999-12-31'
        ELSE cptd.training_date_two
        END ASC,
        CASE
        WHEN cptd.opening_time IS NULL THEN '23:59:59'
        ELSE cptd.opening_time
        END ASC,
            cptd.id ASC
    </select>
    <!-- æ ¹æ®ä¸»è¡¨id查询详情 -->
    <select id="selectTrainingList" resultType="com.ruoyi.personnel.dto.PersonTrainingDetailedDto">
        <!--SELECT cptd.*,
               u1.name training_lecturer_name
        FROM cnas_person_training_detailed cptd
                 left join user u1 on cptd.training_lecturer_id = u1.id
        where cptd.plan_id = #{trainingId}-->
        SELECT cptd.*
        FROM cnas_person_training_detailed cptd
        where cptd.plan_id = #{trainingId}
    </select>
    <!-- æŸ¥è¯¢è¯¦ç»† -->
    <select id="selectTrainingDetail" resultType="com.ruoyi.personnel.dto.PersonTrainingDetailedDto">
        SELECT cptd.*,
               u1.name training_lecturer_name
        FROM cnas_person_training_detailed cptd
                 left join user u1 on cptd.training_lecturer_id = u1.id
        where cptd.id = #{id}
    </select>
</mapper>
cnas-personnel/src/main/resources/mapper/PersonTrainingMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,72 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.personnel.mapper.PersonTrainingMapper">
    <!-- é€šç”¨æŸ¥è¯¢æ˜ å°„结果 -->
    <resultMap id="BaseResultMap" type="com.ruoyi.personnel.pojo.PersonTraining">
        <id column="id" property="id" />
        <result column="file_name" property="fileName" />
        <result column="compiler_id" property="compilerId" />
        <result column="compilation_date" property="compilationDate" />
        <result column="reviewer_id" property="reviewerId" />
        <result column="audit_date" property="auditDate" />
        <result column="audit_remarks" property="auditRemarks" />
        <result column="approver_id" property="approverId" />
        <result column="approval_remarks" property="approvalRemarks" />
        <result column="approval_status" property="approvalStatus" />
        <result column="approval_date" property="approvalDate" />
        <result column="create_time" property="createTime" />
        <result column="create_user" property="createUser" />
        <result column="update_time" property="updateTime" />
        <result column="update_user" property="updateUser" />
    </resultMap>
    <!-- æ ¹æ®åˆ›å»ºäººçš„部门筛选数据,可是创建人可能未分配部门也需要查看 -->
    <select id="personTrainingSelect" resultType="com.ruoyi.personnel.dto.PersonTrainingDto">
        select * from(
        SELECT
        cpt.*,
        u1.name compiler_name,
        u2.name reviewer_name,
        u3.name approver_name,
        u4.name create_user_name
        FROM
        cnas_person_training cpt
        LEFT JOIN user u1 ON cpt.compiler_id = u1.id
        LEFT JOIN user u2 ON cpt.reviewer_id = u2.id
        LEFT JOIN user u3 ON cpt.approver_id = u3.id
        LEFT JOIN user u4 ON cpt.create_user = u4.id
        <where>
<!--            <if test="departLimsId != null and departLimsId != ''">-->
<!--                and FIND_IN_SET(#{departLimsId}, u4.depart_lims_id)-->
<!--            </if>-->
            <if test="departLimsId != null and departLimsId != ''">
                and cpt.depart_id = #{departLimsId}
            </if>
            <if test="compilerName != null and compilerName != ''">
                and u4.name like concat('%', #{compilerName}, '%')
            </if>
        </where>
        union
        SELECT
        cpt.*,
        u1.name compiler_name,
        u2.name reviewer_name,
        u3.name approver_name,
        u4.name create_user_name
        FROM
        cnas_person_training cpt
        LEFT JOIN user u1 ON cpt.compiler_id = u1.id
        LEFT JOIN user u2 ON cpt.reviewer_id = u2.id
        LEFT JOIN user u3 ON cpt.approver_id = u3.id
        LEFT JOIN user u4 ON cpt.create_user = u4.id
        WHERE
        u4.depart_lims_id is not null and length(u4.depart_lims_id) = 0
        <if test="compilerName != null and compilerName != ''">
            and u4.name like concat('%', #{compilerName}, '%')
        </if>
        )a  order by id desc
    </select>
</mapper>
cnas-personnel/src/main/resources/mapper/PersonTrainingRecordMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,135 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.personnel.mapper.PersonTrainingRecordMapper">
    <!-- é€šç”¨æŸ¥è¯¢æ˜ å°„结果 -->
    <resultMap id="BaseResultMap" type="com.ruoyi.personnel.pojo.PersonTrainingRecord">
        <id column="training_record_id" property="trainingRecordId" />
        <result column="user_id" property="userId" />
        <result column="course_id" property="courseId" />
        <result column="examination_results" property="examinationResults" />
    </resultMap>
    <select id="trainingAndAssessmentRecordsPage" resultType="com.ruoyi.personnel.dto.PersonTrainingRecordDto">
        select cptr.*, u.account, u.name user_name, u.phone, r.role_name role_name
        from cnas_person_training_record cptr
                 left join user u on u.id = cptr.user_id
                 left join sys_user_role ur on ur.user_id = u.id
        left join sys_role r on ur.role_id=r.role_id
        where cptr.course_id = #{trainingDetailedId}
        <if test="userName != null and userName != ''">
            and u.name like concat('%', #{userName}, '%')
        </if>
    </select>
    <select id="personnelTrainingPersonnel" resultType="com.ruoyi.personnel.dto.PersonTrainingRecordListDto">
        select u.name, u.account, dl.name depart_lims_name, cpbi.professional_title,
        cpbi.official_academic_redentials, cpbi.unit_time, u.id user_id
        from user u
        left join cnas_person_basic_info cpbi on cpbi.user_id = u.id
        left join department_lims dl on dl.id = SUBSTRING_INDEX(SUBSTRING_INDEX(u.depart_lims_id, ',', -2), ',', 1)
        where u.is_custom = 0
        <if test="userName != '' and userName != null and userName != 'null'">
            and u.name like concat('%', #{userName}, '%')
        </if>
        <if test="userId != null and userId != ''">
            and u.id = #{userId}
        </if>
        <if test="departLimsId != null and departLimsId != ''">
            and FIND_IN_SET(#{departLimsId}, u.depart_lims_id)
        </if>
    </select>
    <select id="queryPersonnelDetails" resultType="com.ruoyi.personnel.dto.TrainingRecordPersonDetailedDto">
        select cptd.training_date, cptd.training_content, cptd.class_hour, cptr.examination_results, cptd.remarks
        from cnas_person_training_record cptr
                 inner join cnas_person_training_detailed cptd on cptd.id = cptr.course_id
        <where>
            <if test="userId != null and userId != ''">
                and cptr.user_id = #{userId}
            </if>
        </where>
    </select>
    <!-- æ ¹æ®è¯¦æƒ…id查询培训信息 -->
    <select id="selectListByTrainingDetailedId" resultType="com.ruoyi.personnel.dto.PersonTrainingRecordDto">
        select cptr.*,
               u.name  userName,
               dl.name department
        from cnas_person_training_record cptr
                 left join user u on u.id = cptr.user_id
                 left join department_lims dl on find_in_set(dl.id, u.depart_lims_id) and dl.id != 1
        where cptr.course_id = #{trainingDetailedId}
    </select>
    <!-- æ ¹æ®id查询人员信息 -->
    <select id="selectUserTraining" resultType="com.ruoyi.personnel.dto.PersonTrainingRecordListDto">
        select u.name,
               u.account,
               dl.name                                    depart_lims_name,
               cpbi.professional_title,
               cpbi.official_academic_redentials,
               cpbi.unit_time,
               cpbi.major1,
               u.id                                       user_id,
               DATE_FORMAT(cpbi.unit_time, '%Y-%m-%d') AS unitTimeSting
        from user u
                 left join cnas_person_basic_info cpbi on cpbi.user_id = u.id
                 left join department_lims dl on dl.id = SUBSTRING_INDEX(SUBSTRING_INDEX(u.depart_lims_id, ',', -2), ',', 1)
        where u.is_custom = 0
        and u.id = #{userId}
    </select>
    <!-- æ ¹æ®ç”¨æˆ·id查询人员记录 -->
    <select id="selectPersonDetailedDtos" resultType="com.ruoyi.personnel.dto.TrainingRecordPersonDetailedDto">
        select cptd.training_date,
               cptd.training_content,
               cptd.class_hour,
               cptr.examination_results,
               cptd.remarks,
               DATE_FORMAT(cptd.training_date, '%Y-%m-%d') AS trainingDateString
        from cnas_person_training_record cptr
                 inner join cnas_person_training_detailed cptd on cptd.id = cptr.course_id
            and cptr.user_id = #{userId}
        <where>
            <if test="year!= null and year!= ''">
                and YEAR(cptd.training_date) = ${year}
            </if>
        </where>
    </select>
    <!--根据用户id和年份查询人员明细 åŸ¹è®­è®°å½•-->
    <select id="queryPersonnelDetailsOfUserIdAndYear"
            resultType="com.ruoyi.personnel.dto.TrainingRecordPersonDetailedDto">
        select cptd.training_date, cptd.training_content, cptd.class_hour, cptr.examination_results, cptd.remarks
        from cnas_person_training_record cptr
        inner join cnas_person_training_detailed cptd on cptd.id = cptr.course_id
        <where>
            <if test="userId != null and userId != ''">
                and cptr.user_id = #{userId}
            </if>
            <if test="year!= null and year!= ''">
                and YEAR(cptd.training_date) = ${year}
            </if>
        </where>
    </select>
    <!-- æ ¹æ®ç”¨æˆ·id和年份查询人员明细 åŸ¹è®­è®°å½•导出 -->
    <select id="selectPersonDetailedDtosByTrainingDate"
            resultType="com.ruoyi.personnel.dto.TrainingRecordPersonDetailedDto">
        select cptd.training_date,
        cptd.training_content,
        cptd.class_hour,
        cptr.examination_results,
        cptd.remarks,
        DATE_FORMAT(cptd.training_date, '%Y-%m-%d') AS trainingDateString
        from cnas_person_training_record cptr
        inner join cnas_person_training_detailed cptd on cptd.id = cptr.course_id
        and cptr.user_id = #{userId}
        <where>
            <if test="year!= null and year!= ''">
                and YEAR(cptd.training_date) = ${year}
            </if>
        </where>
    </select>
</mapper>
cnas-personnel/src/main/resources/static/communication-deal.docx
Binary files differ
cnas-personnel/src/main/resources/static/credentials-deal.docx
Binary files differ
cnas-personnel/src/main/resources/static/explain-deal.docx
Binary files differ
cnas-personnel/src/main/resources/static/person-deal.docx
Binary files differ
cnas-personnel/src/main/resources/static/person-training-record.docx
Binary files differ
cnas-personnel/src/main/resources/static/person-training.docx
Binary files differ
cnas-personnel/src/main/resources/static/personnel-capacity.docx
Binary files differ
cnas-personnel/src/main/resources/static/super-vise-plan.docx
Binary files differ
cnas-personnel/src/main/resources/static/supervision-control-sheet.docx
Binary files differ
cnas-personnel/src/main/resources/static/supervision-processing-sheet.docx
Binary files differ
cnas-personnel/src/main/resources/static/supervision-record.docx
Binary files differ
cnas-personnel/src/main/resources/static/training-record.docx
Binary files differ
performance-server/src/main/java/com/ruoyi/performance/pojo/AuxiliaryWorkingHoursDay.java
@@ -1,15 +1,20 @@
package com.ruoyi.performance.pojo;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelIgnore;
import com.alibaba.excel.annotation.ExcelProperty;
import com.baomidou.mybatisplus.annotation.*;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.time.LocalDateTime;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import lombok.Getter;
import lombok.Setter;
/**
 * <p>
@@ -22,92 +27,98 @@
@Data
@TableName("auxiliary_working_hours_day")
@ApiModel(value = "AuxiliaryWorkingHoursDay对象", description = "日工时管理的辅助工时")
@ExcelIgnoreUnannotated
public class AuxiliaryWorkingHoursDay  implements Serializable {
    @TableId(value = "id", type = IdType.AUTO)
    @ExcelIgnore
    private Integer id;
    @ApiModelProperty("姓名id")
    @ExcelIgnore
    private Integer nameUser;
    @ApiModelProperty("编号")
    @ExcelProperty(index = 2, value = "编号")
    @ExcelProperty(value = "编号")
    private String number;
    @ApiModelProperty("辅助项目名称")
    @ExcelProperty(index = 3, value = "辅助项目名称")
    @ExcelProperty(value = "辅助项目名称")
    private String auxiliaryProject;
    @ApiModelProperty("核准工时")
    @ExcelProperty(index = 5, value = "核准工时")
    private BigDecimal approvedWorkingHour;
    @ExcelProperty(value = "核准工时")
    private Double approvedWorkingHour;
    @ApiModelProperty("数量")
    @ExcelProperty(index = 6, value = "数量")
    private Integer amount;
    @ExcelProperty(value = "数量")
    private Double amount;
    @ApiModelProperty("辅助工时")
    @ExcelProperty(index = 7, value = "辅助工时")
    private BigDecimal nonproductiveTime;
    @ExcelProperty(value = "辅助工时")
    private Double nonproductiveTime;
    @ApiModelProperty("辅助说明")
    @ExcelProperty(index = 8, value = "辅助说明")
    @ExcelProperty(value = "辅助说明")
    private String remarks;
    @ApiModelProperty("复核人")
    @ExcelProperty(index = 9, value = "复核人")
    private String reviewer;
    @ApiModelProperty("复核数量")
    @ExcelProperty(index = 10, value = "复核数量")
    private Integer reviewerNumber;
    @ApiModelProperty("复核工时")
    @ExcelProperty(index = 11, value = "复核工时")
    private BigDecimal reviewerNonproductiveTime;
    @ApiModelProperty("复核说明")
    @ExcelProperty(index = 12, value = "复核说明")
    private String reviewerRemark;
    @ApiModelProperty("å¹´")
    @ExcelProperty(index = 13, value = "å¹´")
    private String year;
    @ApiModelProperty("班次")
    @ExcelProperty(index = 14, value = "班次")
    @ExcelProperty(value = "班次")
    private String shift;
    @ApiModelProperty("周次")
    @ExcelProperty(index = 15, value = "周次")
    @ExcelProperty(value = "周次")
    private String week;
    @ApiModelProperty("星期")
    @ExcelProperty(index = 16, value = "星期")
    @ExcelProperty(value = "星期")
    private String weekDay;
    @ApiModelProperty("复核人")
    @ExcelProperty(value = "复核人")
    private String reviewer;
    @ApiModelProperty("复核数量")
    @ExcelProperty(value = "复核数量")
    private Double reviewerNumber;
    @ApiModelProperty("复核工时")
    @ExcelProperty(value = "复核工时")
    private Double reviewerNonproductiveTime;
    @ApiModelProperty("复核说明")
    @ExcelProperty(value = "复核说明")
    private String reviewerRemark;
    @ApiModelProperty("å¹´")
    @ExcelProperty(value = "å¹´")
    private String year;
    @ApiModelProperty("创建时间")
    @TableField(fill = FieldFill.INSERT)
    @ExcelIgnore
    private LocalDateTime createTime;
    @ApiModelProperty("修改时间")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    @ExcelIgnore
    private LocalDateTime updateTime;
    @ApiModelProperty("创建人id")
    @TableField(fill = FieldFill.INSERT)
    @ExcelIgnore
    private Integer createUser;
    @ApiModelProperty("修改人id")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    @ExcelIgnore
    private Integer updateUser;
    @ApiModelProperty("状态")
    @ExcelProperty(index = 4, value = "状态")
    @ExcelProperty(value = "状态")
    @ExcelIgnore
    private String state;
    @ApiModelProperty("日期")
    @ExcelProperty(index = 17, value = "日期")
    @ExcelProperty(value = "日期")
    private String dateTime;
}
performance-server/src/main/java/com/ruoyi/performance/service/impl/AuxiliaryOutputWorkingHoursServiceImpl.java
@@ -160,7 +160,7 @@
        map.put("产量工时汇总", sumOutputWorkTime);
        if (ObjectUtils.isNotEmpty(auxiliaryWorkingHoursDays)) {
            for (AuxiliaryWorkingHoursDay auxiliaryWorkingHoursDay : auxiliaryWorkingHoursDays) {
                sumApprovedWorkingHour = sumApprovedWorkingHour.add(auxiliaryWorkingHoursDay.getReviewerNonproductiveTime());//复核工时
//                sumApprovedWorkingHour = sumApprovedWorkingHour.add(auxiliaryWorkingHoursDay.getReviewerNonproductiveTime());//复核工时
            }
        }
        map.put("辅助工时汇总", sumApprovedWorkingHour);
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/UserController.java
@@ -5,9 +5,9 @@
import com.ruoyi.common.core.domain.entity.Company;
import com.ruoyi.common.core.domain.entity.User;
import com.ruoyi.common.core.dto.PersonDto;
import com.ruoyi.framework.util.HeaderToken;
import com.ruoyi.system.service.UserService;
import com.ruoyi.web.controller.dto.UpdateUserDto;
import com.ruoyi.web.controller.system.api.HeaderToken;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/DepartmentLims.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,42 @@
package com.ruoyi.common.core.domain.entity;
import com.baomidou.mybatisplus.annotation.*;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.List;
/**
 * éƒ¨é—¨æ˜Žç»†
 * @TableName department_lims
 */
@TableName(value ="department_lims")
@Data
public class DepartmentLims implements Serializable {
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    @ApiModelProperty("名称")
    private String name;
    @ApiModelProperty("父级id")
    private Integer fatherId;
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
    @TableField(exist = false)
    private List<DepartmentLims> children;
}
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/User.java
@@ -4,6 +4,7 @@
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.time.LocalDateTime;
import java.util.Date;
/**
@@ -83,7 +84,7 @@
    @TableField(fill = FieldFill.INSERT)
    @ApiModelProperty(value = "创建时间")
    private Date createTime;
    private LocalDateTime createTime;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    @ApiModelProperty(value = "更新者")
ruoyi-common/src/main/java/com/ruoyi/common/core/dto/DepartmentDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
package com.ruoyi.common.core.dto;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class DepartmentDto {
    private Integer id;
    private String name;
    private Integer userId;
    private Integer fatherId;
    private List<DepartmentDto> children;
}
ruoyi-common/src/main/java/com/ruoyi/common/core/dto/UserPageDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,24 @@
package com.ruoyi.common.core.dto;
import com.ruoyi.common.core.domain.entity.User;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class UserPageDto extends User {
    @ApiModelProperty(value = "创建用户")
    private String createUserName;
    @ApiModelProperty(value = "更新用户")
    private String updateUserName;
    @ApiModelProperty(value = "角色")
    private String roleName;
}
ruoyi-common/src/main/java/com/ruoyi/common/utils/DateImageUtil.java
@@ -9,6 +9,7 @@
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
@@ -58,4 +59,41 @@
        }
        return new ByteArrayInputStream(os.toByteArray());
    }
    public static InputStream createDateImage(LocalDate date) {
        int width = 80;
        int height = 20;
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy.MM.dd");
        if (date == null) {
            date = LocalDate.now();
        }
        String s = date.format(formatter);
        java.awt.Font font = new java.awt.Font("Serif", java.awt.Font.BOLD, 10);
        // åˆ›å»ºä¸€ä¸ªç”»å¸ƒï¼ˆèƒŒæ™¯é€æ˜Žï¼‰
        BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
        // èŽ·å–ç”»å¸ƒçš„ç”»ç¬”
        Graphics2D g2 = (Graphics2D) bi.getGraphics();
        // å¼€å§‹ç»˜å›¾
        g2.setComposite(java.awt.AlphaComposite.Src); // ç¡®ä¿ç»˜å›¾æ—¶æ˜¯é€æ˜ŽèƒŒæ™¯
        g2.setBackground(new Color(0, 0, 0, 0)); // èƒŒæ™¯è‰²ä¸ºé€æ˜Ž
        g2.clearRect(0, 0, width, height);
        g2.setPaint(new Color(0, 0, 0)); // è®¾ç½®ç»˜åˆ¶é¢œè‰²
        FontRenderContext context = g2.getFontRenderContext();
        Rectangle2D bounds = font.getStringBounds(s, context);
        double x = (width - bounds.getWidth()) / 2;
        double y = (height - bounds.getHeight()) / 2;
        double ascent = -bounds.getY();
        double baseY = y + ascent;
        g2.drawString(s, (int) x, (int) baseY);
        g2.dispose(); // é‡Šæ”¾ç”»ç¬”资源
        ByteArrayOutputStream os = new ByteArrayOutputStream();
        try {
            ImageIO.write(bi, "png", os);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        return new ByteArrayInputStream(os.toByteArray());
    }
}
ruoyi-framework/src/main/java/com/ruoyi/framework/util/HeaderToken.java
ÎļþÃû´Ó ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/api/HeaderToken.java ÐÞ¸Ä
@@ -1,4 +1,4 @@
package com.ruoyi.web.controller.system.api;
package com.ruoyi.framework.util;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.http.HttpRequest;
@@ -15,6 +15,7 @@
import com.ruoyi.common.core.domain.entity.Person;
import com.ruoyi.common.core.domain.entity.User;
import com.ruoyi.framework.exception.ErrorException;
import com.ruoyi.system.domain.AuthApi;
import com.ruoyi.system.mapper.UserMapper;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
@@ -188,4 +189,4 @@
        }
        return map;
    }
}
}
ruoyi-framework/src/main/java/com/ruoyi/framework/util/TestApi.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,25 @@
package com.ruoyi.framework.util;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import com.ruoyi.system.domain.AuthApi;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class TestApi {
    @Autowired
    private HeaderToken headerToken;
    public void testApi() {
        String accessToken =headerToken.getAccessToken();
        String apiUrl = AuthApi.companies;
        // æ›¿æ¢ä¸ºå®žé™…çš„API端点URL
        HttpRequest request = HttpRequest.get(apiUrl)
                .header("Authorization", "Bearer " + accessToken);
        HttpResponse response = request.execute();
        System.out.println("Response Code: " + response.getStatus());
        System.out.println("Response Body: " + response.body());
    }
}
ruoyi-system/pom.xml
@@ -25,4 +25,4 @@
    </dependencies>
</project>
</project>
ruoyi-system/src/main/java/com/ruoyi/system/domain/AuthApi.java
ÎļþÃû´Ó ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/api/AuthApi.java ÐÞ¸Ä
@@ -1,4 +1,4 @@
package com.ruoyi.web.controller.system.api;
package com.ruoyi.system.domain;
public class AuthApi {
@@ -54,4 +54,4 @@
    public static String person = "https://ztt-connector.ztt.cn/api/org/v1/employees/simple/";
}
}
ruoyi-system/src/main/java/com/ruoyi/system/mapper/DepartmentLimsMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,27 @@
package com.ruoyi.system.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.common.core.domain.entity.DepartmentLims;
import com.ruoyi.common.core.dto.DepartmentDto;
import java.util.List;
/**
* @author z1292
* @description é’ˆå¯¹è¡¨ã€department_lims(部门明细)】的数据库操作Mapper
* @createDate 2024-05-22 14:08:17
* @Entity com.yuanchu.mom.pojo.DepartmentLims
*/
public interface DepartmentLimsMapper extends BaseMapper<DepartmentLims> {
    //获取部门树
    List<DepartmentDto> selectDepartment();
    //根据部门id,查询他的所有子类id
    List<Integer> selectSonById(Integer id);
}
ruoyi-system/src/main/java/com/ruoyi/system/service/DepartmentLimsService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,25 @@
package com.ruoyi.system.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.common.core.domain.entity.DepartmentLims;
import com.ruoyi.common.core.dto.DepartmentDto;
import java.util.List;
/**
* @author z1292
* @description é’ˆå¯¹è¡¨ã€department_lims(部门明细)】的数据库操作Service
* @createDate 2024-05-22 14:08:17
*/
public interface DepartmentLimsService extends IService<DepartmentLims> {
    //添加部门
    int addDepartment(DepartmentLims departmentLims);
    //获取部门树
    List<DepartmentDto> selectDepartment();
    //删除部门
    boolean delDepartment(Integer id);
}
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/DepartmentLimsServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,86 @@
package com.ruoyi.system.service.impl;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.core.domain.entity.DepartmentLims;
import com.ruoyi.common.core.dto.DepartmentDto;
import com.ruoyi.system.mapper.DepartmentLimsMapper;
import com.ruoyi.system.service.DepartmentLimsService;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
/**
* @author z1292
* @description é’ˆå¯¹è¡¨ã€department_lims(部门明细)】的数据库操作Service实现
* @createDate 2024-05-22 14:08:17
*/
@Service
@AllArgsConstructor
public class DepartmentLimsServiceImpl extends ServiceImpl<DepartmentLimsMapper, DepartmentLims>
    implements DepartmentLimsService {
    DepartmentLimsMapper departmentMapper;
    @Override
    public int addDepartment(DepartmentLims department) {
        departmentMapper.insert(department);
        return department.getId();
    }
    //获取部门树
    @Override
    public List<DepartmentDto> selectDepartment() {
        List<DepartmentDto> departments = departmentMapper.selectDepartment();
        //获取父节点
        List<DepartmentDto> collect = departments.stream().filter(m -> m.getFatherId() == null).peek(
                (m) -> m.setChildren(getChildren(m, departments))
        ).collect(Collectors.toList());
        return collect;
    }
    /**
     * é€’归查询子节点
     * @param root  æ ¹èŠ‚ç‚¹
     * @param all   æ‰€æœ‰èŠ‚ç‚¹
     * @return æ ¹èŠ‚ç‚¹ä¿¡æ¯
     */
    private List<DepartmentDto> getChildren(DepartmentDto root, List<DepartmentDto> all) {
        return all.stream().filter(m -> Objects.equals(m.getFatherId(), root.getId())).peek(
                (m) -> m.setChildren(getChildren(m, all))
        ).collect(Collectors.toList());
    }
    //删除部门
    @Override
    public boolean delDepartment(Integer id) {
        //判断是否有子类,直到没有为止
        List<DepartmentLims> department = getDepartment(id);
        return removeBatchByIds(department);
    }
    //判断是否有子类,直到没有为止
    public List<DepartmentLims> getDepartment(Integer id) {
        List<DepartmentLims> list = new ArrayList<>();
        DepartmentLims depart = baseMapper.selectById(id);
        list.add(depart);
        List<DepartmentLims> departments = baseMapper.selectList(Wrappers.<DepartmentLims>lambdaQuery().eq(DepartmentLims::getFatherId, id));
        if (ObjectUtils.isNotEmpty(departments)) {
            list.addAll(departments);
            for (DepartmentLims department : departments) {
                list.addAll(getDepartment(department.getId()));
            }
        }
        return list;
    }
}
ruoyi-system/src/main/resources/mapper/system/DepartmentLimsMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,34 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.system.mapper.DepartmentLimsMapper">
    <resultMap id="BaseResultMap" type="com.ruoyi.common.core.domain.entity.DepartmentLims">
            <id property="id" column="id" jdbcType="INTEGER"/>
            <result property="name" column="name" jdbcType="VARCHAR"/>
            <result property="fatherId" column="father_id" jdbcType="INTEGER"/>
            <result property="createUser" column="create_user" jdbcType="INTEGER"/>
            <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
            <result property="updateUser" column="update_user" jdbcType="INTEGER"/>
            <result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/>
    </resultMap>
    <select id="selectDepartment" resultType="com.ruoyi.common.core.dto.DepartmentDto">
        SELECT id, name, father_id
        FROM department_lims
    </select>
    <select id="selectSonById" resultType="java.lang.Integer">
        SELECT au.id
        FROM (SELECT * FROM department_lims WHERE father_id IS NOT NULL) au,
             (SELECT @father_id := #{id}) pd
        WHERE FIND_IN_SET(father_id, @father_id) > 0
                  AND @father_id := concat(@father_id, ',', id)
        UNION
        SELECT id
        FROM department_lims
        WHERE id = #{id}
        ORDER BY id
    </select>
</mapper>