zhuo
2025-02-24 e8e73529983bf656d8aa6627215045f56cc27103
Merge branch 'dev' into dev_ly

# Conflicts:
# ruoyi-admin/pom.xml
已修改7个文件
已添加214个文件
10978 ■■■■■ 文件已修改
cnas-device/pom.xml 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/controller/DeviceAcceptanceController.java 133 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/controller/DeviceAccidentReportController.java 84 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/controller/DeviceBorrowController.java 73 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/controller/DeviceBreakdownMaintenanceController.java 85 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/controller/DeviceInspectionRecordController.java 99 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/controller/DeviceInstructionController.java 103 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/controller/DeviceMaintenanceController.java 98 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/controller/DeviceMaintenancePlanController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/controller/DeviceMetricRecordController.java 89 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/controller/DeviceScrappedController.java 82 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/controller/DeviceStateController.java 87 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/controller/DeviceTraceabilityManagementController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/dto/DeviceAccidentReportDto.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/dto/DeviceBreakdownMaintenance.java 90 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/dto/DeviceInspectionRecordDto.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/dto/DeviceInstructionDto.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/dto/DeviceMetricRecordDto.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/dto/DeviceOperationInstructionDto.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/dto/DeviceScrappedDto.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/dto/DeviceStateDto.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/excel/DeviceStateExport.java 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceAcceptanceFileMapper.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceAcceptanceMapper.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceAccidentReportMapper.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceBorrowMapper.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceBreakdownMaintenanceMapper.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceInspectionRecordDetailsMapper.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceInspectionRecordMapper.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceLogMapper.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceMetricsCopyMapper.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceScrappedMapper.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceStateMapper.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/mapper/InstructionMapper.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/mapper/OperationInstructionMapper.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/mqtt/MQBean.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/mqtt/MQCallback.java 93 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/mqtt/MQClient.java 97 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/mqtt/MQConfig.java 64 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/mqtt/MQPublic.java 69 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/mqtt/MQSubscribe.java 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceAcceptance.java 77 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceAcceptanceFile.java 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceAccidentReport.java 120 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceBorrow.java 133 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceInspectionRecord.java 93 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceInspectionRecordDetails.java 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceInstruction.java 64 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceLog.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceMetricsCopy.java 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceScrapped.java 105 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceState.java 107 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/pojo/OperationInstruction.java 88 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/service/CollectBridgeService.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/service/DeviceAcceptanceFileService.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/service/DeviceAcceptanceService.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/service/DeviceAccidentReportService.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/service/DeviceBorrowService.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/service/DeviceBreakdownMaintenanceService.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/service/DeviceInspectionRecordDetailsService.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/service/DeviceInspectionRecordService.java 69 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/service/DeviceInstructionService.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/service/DeviceMaintenanceService.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/service/DeviceMetricRecordService.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/service/DeviceMetricsCopyService.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/service/DeviceOperationInstructionService.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/service/DeviceScrappedService.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/service/DeviceStateService.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/service/impl/CollectBridgeServiceImpl.java 107 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceAcceptanceFileServiceImpl.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceAcceptanceServiceImpl.java 159 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceAccidentReportServiceImpl.java 189 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceBorrowServiceImpl.java 116 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceBreakdownMaintenanceServiceImpl.java 152 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceInspectionRecordDetailsServiceImpl.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceInspectionRecordServiceImpl.java 221 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceInstructionServiceImpl.java 67 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceMaintenanceImpl.java 86 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceMetricRecordServiceImpl.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceMetricsCopyServiceImpl.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceOperationInstructionServiceImpl.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceScrappedServiceImpl.java 179 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceStateServiceImpl.java 159 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/java/com/ruoyi/device/task/DeviceRecordSchedule.java 65 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/resources/mapper/DeviceAcceptanceMapper.xml 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/resources/mapper/DeviceAccidentReportMapper.xml 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/resources/mapper/DeviceBorrowMapper.xml 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/resources/mapper/DeviceBreakdownMaintenanceMapper.xml 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/resources/mapper/DeviceInspectionRecordMapper.xml 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/resources/mapper/DeviceScrappedMapper.xml 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/resources/mapper/DeviceStateMapper.xml 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/resources/mapper/InstructionMapper.xml 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/resources/mapper/OperationInstructionMapper.xml 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/resources/static/word/acceptance-certificate.docx 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/resources/static/word/device-accident-report.docx 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/resources/static/word/device-breakdown-maintenance.docx 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/resources/static/word/device-calibration-plan.docx 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/resources/static/word/device-document.docx 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/resources/static/word/device-external-apply.docx 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/resources/static/word/device-inspection-record.docx 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/resources/static/word/device-scrapped.docx 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/resources/static/word/device-status.docx 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/resources/static/word/examine-plan-detail.docx 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/resources/static/word/examine-record.docx 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/resources/static/word/incident-report.docx 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/resources/static/word/maintenance-plan.docx 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/resources/static/word/maintenance-records.docx 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/resources/static/word/quipment-details.docx 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/resources/static/word/review-examine-record-contrast.docx 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/resources/static/word/traceability-management-details.docx 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/src/main/resources/static/word/use-record.docx 补丁 | 查看 | 原始文档 | blame | 历史
cnas-manage/src/main/java/com/ruoyi/manage/controller/ClientSatisfactionController.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/pom.xml 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonBasicInfoController.java 229 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonCommunicationAbilityController.java 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonJobResponsibilitiesController.java 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonPersonnelCapacityController.java 92 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonPostAuthorizationRecordController.java 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonRewardPunishmentRecordController.java 100 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonTrainingController.java 246 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonTrainingRecordController.java 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonBasicInfoDetailsDto.java 65 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonBasicInfoDto.java 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonBasicInfoWorkDto.java 16 ●●●●● 补丁 | 查看 | 原始文档 | 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/PersonTrainingDetailedDto.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonTrainingDto.java 23 ●●●●● 补丁 | 查看 | 原始文档 | 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 35 ●●●●● 补丁 | 查看 | 原始文档 | 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 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/dto/UserPageDto.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/excel/PersonRewardPunishmentRecordExcel.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/excel/PersonTrainingDetailedListener.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/excel/PersonTrainingDetailedUpload.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/AnnexMapper.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonBasicInfoFileMapper.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonBasicInfoMapper.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonBasicInfoWorkMapper.java 16 ●●●●● 补丁 | 查看 | 原始文档 | 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/PersonTrainingDetailedFileMapper.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonTrainingDetailedMapper.java 48 ●●●●● 补丁 | 查看 | 原始文档 | 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 156 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonBasicInfoFile.java 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonBasicInfoWork.java 53 ●●●●● 补丁 | 查看 | 原始文档 | 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 114 ●●●●● 补丁 | 查看 | 原始文档 | 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/PersonTraining.java 83 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonTrainingDetailed.java 99 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonTrainingDetailedFile.java 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonTrainingRecord.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/service/AnnexService.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonBasicInfoFileService.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonBasicInfoService.java 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonBasicInfoWorkService.java 16 ●●●●● 补丁 | 查看 | 原始文档 | 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 35 ●●●●● 补丁 | 查看 | 原始文档 | 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/PersonTrainingDetailedService.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonTrainingRecordService.java 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonTrainingService.java 63 ●●●●● 补丁 | 查看 | 原始文档 | 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/PersonBasicInfoFileServiceImpl.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonBasicInfoServiceImpl.java 340 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonBasicInfoWorkServiceImpl.java 20 ●●●●● 补丁 | 查看 | 原始文档 | 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 113 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonPersonnelCapacityServiceImpl.java 158 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonPostAuthorizationRecordServiceImpl.java 132 ●●●●● 补丁 | 查看 | 原始文档 | 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/PersonTrainingDetailedServiceImpl.java 85 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonTrainingRecordServiceImpl.java 177 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonTrainingServiceImpl.java 429 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/resources/mapper/PersonBasicInfoMapper.xml 65 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/resources/mapper/PersonCommunicationAbilityMapper.xml 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/resources/mapper/PersonJobResponsibilitiesMapper.xml 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/resources/mapper/PersonPersonnelCapacityMapper.xml 118 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/resources/mapper/PersonPostAuthorizationRecordMapper.xml 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/resources/mapper/PersonRewardPunishmentRecordMapper.xml 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/resources/mapper/PersonTrainingMapper.xml 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-personnel/src/main/resources/mapper/PersonTrainingRecordMapper.xml 126 ●●●●● 补丁 | 查看 | 原始文档 | 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-basic-info.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 | 历史
pom.xml 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/pom.xml 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/MqttApplicationRunner.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/resources/application-druid.yml 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/DepartmentDto.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/DepartmentLims.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/utils/FileSaveUtil.java 179 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/utils/MyUtil.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/mapper/DepartmentLimsMapper.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/resources/mapper/system/DepartmentLimsMapper.xml 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-device/pom.xml
@@ -18,6 +18,23 @@
            <groupId>com.ruoyi</groupId>
            <artifactId>inspect-server</artifactId>
        </dependency>
        <!--mqtt jar包-->
        <!-- https://mvnrepository.com/artifact/org.springframework.integration/spring-integration-mqtt -->
        <dependency>
            <groupId>org.springframework.integration</groupId>
            <artifactId>spring-integration-mqtt</artifactId>
        </dependency>
        <!--mqtt需要的jar包-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-integration</artifactId>
        </dependency>
        <!--mqtt需要的jar包-->
        <dependency>
            <groupId>org.springframework.integration</groupId>
            <artifactId>spring-integration-stream</artifactId>
        </dependency>
    </dependencies>
    <properties>
cnas-device/src/main/java/com/ruoyi/device/controller/DeviceAcceptanceController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,133 @@
package com.ruoyi.device.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.core.domain.Result;
import com.ruoyi.device.pojo.DeviceAcceptance;
import com.ruoyi.device.pojo.DeviceAcceptanceFile;
import com.ruoyi.device.service.DeviceAcceptanceFileService;
import com.ruoyi.device.service.DeviceAcceptanceService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
import java.util.Map;
/**
 * <p>
 * è®¾å¤‡éªŒæ”¶(装备) å‰ç«¯æŽ§åˆ¶å™¨
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2024-12-20 01:45:14
 */
@Api(tags = "设备验收(装备)")
@AllArgsConstructor
@RestController
@RequestMapping("/deviceAcceptance")
public class DeviceAcceptanceController {
    private DeviceAcceptanceService deviceAcceptanceService;
    private DeviceAcceptanceFileService deviceAcceptanceFileService;
    /**
     * è®¾å¤‡éªŒæ”¶åˆ—表
     * @return
     */
    @ApiOperation(value = "设备验收列表")
    @GetMapping("/pageDeviceAcceptance")
    public Result<IPage<DeviceAcceptance>> pageDeviceAcceptance(Page page, DeviceAcceptance deviceAcceptance) {
        return Result.success(deviceAcceptanceService.pageDeviceAcceptance(page, deviceAcceptance));
    }
    /**
     * æŸ¥è¯¢è®¾å¤‡éªŒæ”¶
     * @return
     */
    @ApiOperation(value = "查询设备验收")
    @GetMapping("/getDeviceAcceptance")
    public Result getDeviceAcceptance(Integer acceptanceId){
        return Result.success(deviceAcceptanceService.getById(acceptanceId));
    }
    /**
     * åˆ é™¤è®¾å¤‡éªŒæ”¶
     * @return
     */
    @ApiOperation(value = "删除设备验收")
    @DeleteMapping("/delDeviceAcceptance")
    public Result delDeviceAcceptance(Integer acceptanceId){
        return Result.success(deviceAcceptanceService.removeById(acceptanceId));
    }
    /**
     * æ–°å¢žè®¾å¤‡éªŒæ”¶
     * @return
     */
    @ApiOperation(value = "新增设备验收")
    @PostMapping("/addDeviceAcceptance")
    public Result addDeviceAcceptance(@RequestBody DeviceAcceptance deviceAcceptance){
        return Result.success(deviceAcceptanceService.save(deviceAcceptance));
    }
    /**
     * æ–°å¢žè®¾å¤‡éªŒæ”¶
     * @return
     */
    @ApiOperation(value = "编辑设备验收")
    @PostMapping("/updateDeviceAcceptance")
    public Result updateDeviceAcceptance(@RequestBody DeviceAcceptance deviceAcceptance){
        return Result.success(deviceAcceptanceService.updateById(deviceAcceptance));
    }
    /**
     * è®¾å¤‡éªŒæ”¶å¯¼å‡º
     * @param acceptanceId  è®¾å¤‡éªŒæ”¶id
     * @param response   å“åº”体
     * @return
     */
    @ApiOperation(value = "设备验收导出")
    @GetMapping("/exportDeviceAcceptance")
    public void exportDeviceAcceptance(Integer acceptanceId, HttpServletResponse response){
        deviceAcceptanceService.exportDeviceAcceptance(acceptanceId, response);
    }
    /**
     * è®¾å¤‡éªŒæ”¶é™„件新增
     * @param acceptanceId
     * @param file
     * @return
     */
    @ApiOperation(value = "设备验收附件新增")
    @PostMapping("/uploadDeviceAcceptanceFile")
    public Result<?> uploadDeviceAcceptanceFile(Integer acceptanceId, MultipartFile file) {
        return Result.success(deviceAcceptanceService.uploadDeviceAcceptanceFile(acceptanceId, file));
    }
    /**
     * è®¾å¤‡éªŒæ”¶é™„件列表
     * @return
     */
    @ApiOperation(value = "设备验收附件列表")
    @GetMapping("/getDeviceAcceptanceFileList")
    public Result<List<DeviceAcceptanceFile>> getVerifyMethodFileList(Integer acceptanceId){
        return Result.success(deviceAcceptanceFileService.list(Wrappers.<DeviceAcceptanceFile>lambdaQuery()
                .eq(DeviceAcceptanceFile::getAcceptanceId, acceptanceId)));
    }
    /**
     * è®¾å¤‡éªŒæ”¶é™„件删除
     * @return
     */
    @ApiOperation(value = "设备验收附件删除")
    @GetMapping("/delDeviceAcceptanceFileList")
    public Result delDeviceAcceptanceFileList(Integer acceptanceFileId){
        return Result.success(deviceAcceptanceFileService.removeById(acceptanceFileId));
    }
}
cnas-device/src/main/java/com/ruoyi/device/controller/DeviceAccidentReportController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,84 @@
package com.ruoyi.device.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.core.domain.Result;
import com.ruoyi.device.pojo.DeviceAccidentReport;
import com.ruoyi.device.service.DeviceAccidentReportService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.util.Map;
/**
 * <p>
 * è®¾å¤‡äº‹æ•…报告单 å‰ç«¯æŽ§åˆ¶å™¨
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2024-12-17 06:31:12
 */
@Api(tags = "设备事故报告单")
@AllArgsConstructor
@RestController
@RequestMapping("/deviceAccidentReport")
public class DeviceAccidentReportController {
    private DeviceAccidentReportService deviceAccidentReportService;
    /**
     * è®¾å¤‡äº‹æ•…报告列表
     * @return
     */
    @ApiOperation(value = "设备事故报告列表")
    @GetMapping("/pageDeviceAccidentReport")
    public Result<IPage<DeviceAccidentReport>> pageDeviceAccidentReport(Page page, DeviceAccidentReport deviceAccidentReport){
        return Result.success(deviceAccidentReportService.pageDeviceAccidentReport(page, deviceAccidentReport));
    }
    /**
     * æŸ¥è¯¢è®¾å¤‡äº‹æ•…报告
     * @return
     */
    @ApiOperation(value = "查询设备事故报告")
    @GetMapping("/getDeviceAccidentReport")
    public Result getDeviceAccidentReport(Integer accidentReportId){
        return Result.success(deviceAccidentReportService.getById(accidentReportId));
    }
    /**
     * åˆ é™¤è®¾å¤‡äº‹æ•…报告
     * @return
     */
    @ApiOperation(value = "删除设备事故报告")
    @DeleteMapping("/delDeviceAccidentReport")
    public Result delDeviceAccidentReport(Integer accidentReportId){
        return Result.success(deviceAccidentReportService.removeById(accidentReportId));
    }
    /**
     * æ–°å¢žè®¾å¤‡äº‹æ•…报告
     * @return
     */
    @ApiOperation(value = "新增设备事故报告")
    @PostMapping("/addDeviceAccidentReport")
    public Result addDeviceAccidentReport(@RequestBody DeviceAccidentReport deviceAccidentReport){
        return Result.success(deviceAccidentReportService.addDeviceAccidentReport(deviceAccidentReport));
    }
    /**
     * å¯¼å‡ºè®¾å¤‡äº‹æ•…报告
     * @param accidentReportId è®¾å¤‡äº‹æ•…报告id
     * @param response å“åº”
     */
    @ApiOperation(value = "导出设备事故报告")
    @GetMapping("/exportDeviceAccidentReport")
    public Result exportDeviceAccidentReport(Integer accidentReportId, HttpServletResponse response) {
        deviceAccidentReportService.exportDeviceAccidentReport(accidentReportId, response);
        return Result.success();
    }
}
cnas-device/src/main/java/com/ruoyi/device/controller/DeviceBorrowController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,73 @@
package com.ruoyi.device.controller;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.core.domain.Result;
import com.ruoyi.device.pojo.DeviceBorrow;
import com.ruoyi.device.service.DeviceBorrowService;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
import java.util.Map;
/**
 * <p>
 *  å‰ç«¯æŽ§åˆ¶å™¨
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2024-09-21 10:53:51
 */
@RestController
@RequestMapping("/deviceBorrow")
public class DeviceBorrowController {
    @Resource
    private DeviceBorrowService deviceBorrowService;
    //分页
    @GetMapping("/deviceBorrowPage")
    public Result deviceBorrowPage(Page page, DeviceBorrow deviceBorrow) throws Exception {
        return Result.success(deviceBorrowService.deviceBorrowPage(page, deviceBorrow));
    }
    //查询
    @GetMapping("/getDeviceBorrow")
    public Result getDeviceBorrow(Integer id) {
        return Result.success(deviceBorrowService.getDeviceBorrow(id));
    }
    //新增
    @PostMapping("/saveDeviceBorrow")
    public Result saveDeviceBorrow(@RequestBody DeviceBorrow deviceBorrow) {
        return Result.success(deviceBorrowService.saveDeviceBorrow(deviceBorrow));
    }
    //删除
    @DeleteMapping("/deleteDeviceBorrow")
    public Result deleteDeviceBorrow(Integer id) {
        return Result.success(deviceBorrowService.removeById(id));
    }
    //导出
    @GetMapping("/deviceBorrowExport")
    public Result deviceBorrowExport(@RequestParam("deviceId") Integer deviceId, HttpServletResponse response) throws Exception {
        List<DeviceBorrow> deviceBorrows = deviceBorrowService.getDeviceBorrowBydeviceId(deviceId);
        response.setHeader("requestType", "excel");
        response.setHeader("Access-Control-Expose-Headers", "requestType");
        // è®¾ç½®å•元格样式
        // ä¿å­˜åˆ°ç¬¬ä¸€ä¸ªsheet中
        EasyExcel.write(response.getOutputStream())
                .head(DeviceBorrow.class)
                .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()) // è‡ªé€‚应列宽
                .sheet()
                .doWrite(deviceBorrows);
        return Result.success();
    }
}
cnas-device/src/main/java/com/ruoyi/device/controller/DeviceBreakdownMaintenanceController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,85 @@
package com.ruoyi.device.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.core.domain.Result;
import com.ruoyi.device.dto.DeviceBreakdownMaintenance;
import com.ruoyi.device.service.DeviceBreakdownMaintenanceService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.util.Map;
/**
 * <p>
 * è®¾å¤‡æ•…障维修表 å‰ç«¯æŽ§åˆ¶å™¨
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2024-12-17 04:50:57
 */
@Api(tags = "设备故障维修表")
@AllArgsConstructor
@RestController
@RequestMapping("/deviceBreakdownMaintenance")
public class DeviceBreakdownMaintenanceController {
    private DeviceBreakdownMaintenanceService deviceBreakdownMaintenanceService;
    /**
     * è®¾å¤‡æ•…障维修列表
     * @return
     */
    @ApiOperation(value = "设备故障维修列表")
    @GetMapping("/pageDeviceBreakdownMaintenance")
    public Result<IPage<DeviceBreakdownMaintenance>> pageDeviceBreakdownMaintenance(Page page, DeviceBreakdownMaintenance deviceBreakdownMaintenance) {
        return Result.success(deviceBreakdownMaintenanceService.pageDeviceBreakdownMaintenance(page, deviceBreakdownMaintenance));
    }
    /**
     * æŸ¥è¯¢è®¾å¤‡æ•…障维修
     * @return
     */
    @ApiOperation(value = "查询设备故障维修")
    @GetMapping("/getDeviceBreakdownMaintenance")
    public Result getDeviceBreakdownMaintenance(Integer maintenanceId){
        return Result.success(deviceBreakdownMaintenanceService.getById(maintenanceId));
    }
    /**
     * åˆ é™¤è®¾å¤‡æ•…障维修
     * @return
     */
    @ApiOperation(value = "删除设备故障维修")
    @DeleteMapping("/delDeviceBreakdownMaintenance")
    public Result delDeviceBreakdownMaintenance(Integer maintenanceId){
        return Result.success(deviceBreakdownMaintenanceService.removeById(maintenanceId));
    }
    /**
     * æ–°å¢žè®¾å¤‡æ•…障维修
     * @return
     */
    @ApiOperation(value = "新增设备故障维修")
    @PostMapping("/addDeviceBreakdownMaintenance")
    public Result addDeviceBreakdownMaintenance(@RequestBody DeviceBreakdownMaintenance deviceBreakdownMaintenance){
        return Result.success(deviceBreakdownMaintenanceService.addDeviceBreakdownMaintenance(deviceBreakdownMaintenance));
    }
    /**
     * å¯¼å‡ºè®¾å¤‡æ•…障维修
     * @param maintenanceId è®¾å¤‡æ•…障维修id
     * @param response å“åº”
     * @return
     */
    @ApiOperation(value = "导出设备故障维修")
    @GetMapping("/exportDeviceBreakdownMaintenance")
    public Result exportDeviceBreakdownMaintenance(Integer maintenanceId, HttpServletResponse response){
        deviceBreakdownMaintenanceService.exportDeviceBreakdownMaintenance(maintenanceId, response);
        return Result.success();
    }
}
cnas-device/src/main/java/com/ruoyi/device/controller/DeviceInspectionRecordController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,99 @@
package com.ruoyi.device.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.core.domain.Result;
import com.ruoyi.device.dto.DeviceInspectionRecordDto;
import com.ruoyi.device.pojo.DeviceInspectionRecord;
import com.ruoyi.device.service.DeviceInspectionRecordService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.SneakyThrows;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.util.Map;
/**
 * <p>
 *  è®¾å¤‡ç‚¹æ£€è®°å½•表
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2024-12-16 04:25:14
 */
@Api(tags = "设备点检记录")
@RestController
@RequestMapping("/deviceInspectionRecord")
public class DeviceInspectionRecordController {
    @Resource
    private DeviceInspectionRecordService deviceInspectionRecordService;
    /**
     * åˆ†é¡µæŸ¥è¯¢è®¾å¤‡ç‚¹æ£€è®°å½•
     */
    @ApiOperation("分页查询设备点检记录")
    @GetMapping("/getDeviceInspectionRecordByPage")
    public Result<IPage<DeviceInspectionRecord>> getDeviceInspectionRecordByPage(IPage page, DeviceInspectionRecordDto itemParameter) {
        return deviceInspectionRecordService.getDeviceInspectionRecordByPage(page, itemParameter);
    }
    /**
     * æŸ¥è¯¢ç‚¹æ£€è¯¦æƒ…
     */
    @ApiOperation("查询点检详情")
    @GetMapping("/getDeviceInspectionRecord")
    public Result getDeviceInspectionRecord(Integer inspectionRecordId) {
        return deviceInspectionRecordService.getDeviceInspectionRecord(inspectionRecordId);
    }
    /**
     * æ–°å¢žè®¾å¤‡ç‚¹æ£€è®°å½•
     * @param deviceInspectionRecord  è®¾å¤‡ç‚¹æ£€è®°å½•
     */
    @ApiOperation("新增设备点检记录")
    @PostMapping("/addDeviceInspectionRecord")
    public Result addDeviceInspectionRecord(@RequestBody DeviceInspectionRecordDto deviceInspectionRecord) {
        return deviceInspectionRecordService.addDeviceInspectionRecord(deviceInspectionRecord);
    }
    /**
     * ä¿®æ”¹è®¾å¤‡ç‚¹æ£€è®°å½•
     */
    @ApiOperation("修改设备点检记录")
    @PostMapping("/updateDeviceInspectionRecord")
    public Result updateDeviceInspectionRecord(@RequestBody DeviceInspectionRecordDto deviceInspectionRecord) {
        return deviceInspectionRecordService.updateInspectionRecordAndDetails(deviceInspectionRecord);
    }
    /**
     * åˆ é™¤è®¾å¤‡ç‚¹æ£€è®°å½•
     */
    @ApiOperation("删除设备点检记录")
    @DeleteMapping("/deleteDeviceInspectionRecord")
    public Result deleteDeviceInspectionRecord(DeviceInspectionRecordDto deviceInspectionRecord) {
        return deviceInspectionRecordService.deleteDeviceInspectionRecordOrDetails(deviceInspectionRecord);
    }
    /**
     * å¤æ ¸ç‚¹æ£€è®°å½•
     * @return
     */
    @ApiOperation(value = "复核核查记录")
    @PostMapping("/reviewDeviceInspectionRecord")
    public Result reviewDeviceInspectionRecord(@RequestBody DeviceInspectionRecordDto deviceExamineRecordDto){
        return deviceInspectionRecordService.reviewDeviceInspectionRecord(deviceExamineRecordDto);
    }
    /**
     * å¯¼å‡ºè®¾å¤‡ç‚¹æ£€è®°å½•
     */
    @ApiOperation("导出设备点检记录")
    @GetMapping("/exportDeviceInspectionRecord")
    public Result exportDeviceInspectionRecord(@RequestParam("inspectionRecordId") Integer inspectionRecordId, HttpServletResponse response) {
        return deviceInspectionRecordService.exportDeviceInspectionRecord(inspectionRecordId, response);
    }
}
cnas-device/src/main/java/com/ruoyi/device/controller/DeviceInstructionController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,103 @@
package com.ruoyi.device.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.core.domain.Result;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.device.dto.DeviceInstructionDto;
import com.ruoyi.device.dto.DeviceOperationInstructionDto;
import com.ruoyi.device.pojo.DeviceInstruction;
import com.ruoyi.device.pojo.OperationInstruction;
import com.ruoyi.device.service.DeviceInstructionService;
import com.ruoyi.device.service.DeviceOperationInstructionService;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
 * <p>
 * ä½œä¸šæŒ‡å¯¼ä¹¦æ·»åŠ å—æŽ§æ–‡ä»¶è¡¨ å‰ç«¯æŽ§åˆ¶å™¨
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2024-12-04 10:29:18
 */
@RestController
@RequestMapping("/deviceInstruction")
public class DeviceInstructionController {
    @Autowired
    private DeviceInstructionService deviceInstructionService;
    @Autowired
    private DeviceOperationInstructionService deviceOperationInstructionService;
    @ApiOperation(value = "作业指导书 åˆ†é¡µ")
    @GetMapping("/pageByPageQueryOfHomeworkInstructions")
    public Result<IPage<DeviceInstruction>> pageByPageQueryOfHomeworkInstructions(Page page, DeviceOperationInstructionDto operationInstructionDto){
        return Result.success(deviceInstructionService.pageByPageQueryOfHomeworkInstructions(page, operationInstructionDto));
    }
    @ApiOperation(value = "作业指导书新增")
    @PostMapping("/newHomeworkGuidebookAdded")
    public Result newHomeworkGuidebookAdded(@RequestBody DeviceInstructionDto instructionDto){
        deviceInstructionService.newHomeworkGuidebookAdded(instructionDto);
        return Result.success();
    }
    @ApiOperation(value = "作业指导书编辑")
    @GetMapping("/homeworkGuidebookEditor")
    public Result<Map<String, Object>> homeworkGuidebookEditor(Integer instructionId){
        DeviceInstruction instruction = deviceInstructionService.getById(instructionId);
        List<DeviceOperationInstructionDto> list = deviceOperationInstructionService.homeworkGuidebookEditor(instructionId);
        HashMap<String, Object> map = new HashMap<>();
        map.put("list", list);
        map.put("instruction", instruction);
        return Result.success(map);
    }
    @ApiOperation(value = "作业指导书受控文件删除")
    @GetMapping("/deleteHomeworkGuidebook")
    public Result deleteHomeworkGuidebook(String ids){
        if (ObjectUtils.isNotEmpty(ids)) {
            String[] idArray = ids.split(",");
            deviceOperationInstructionService.removeBatchByIds(Arrays.asList(idArray));
        }
        return Result.success();
    }
    @ApiOperation(value = "作业指导书删除")
    @GetMapping("/homeworkGuidebook")
    public Result homeworkGuidebook(String id, String instructionId){
        // åˆ é™¤å­è¡¨æ•°æ®
        deviceOperationInstructionService.removeById(id);
        // å¦‚果子表数据为空
        long count = deviceOperationInstructionService.count(Wrappers.<OperationInstruction>lambdaQuery()
                .eq(OperationInstruction::getInstructionId, instructionId));
        // é‚£ä¹ˆå°±åˆ é™¤çˆ¶è¡¨æ•°æ®
        if (count < 1) {
            deviceInstructionService.removeById(id);
        }
        return Result.success();
    }
    @ApiOperation(value = "作业指导书审批")
    @GetMapping("/approvalOfHomeworkInstructionManual")
    public Result approvalOfHomeworkInstructionManual(String id, Boolean status){
        deviceOperationInstructionService.update(Wrappers.<OperationInstruction>lambdaUpdate()
                .eq(OperationInstruction::getId, id)
                .set(OperationInstruction::getStatus, status)
                .set(OperationInstruction::getApproverId, SecurityUtils.getUserId().intValue())
                .set(OperationInstruction::getEntryIntoForceTime, LocalDateTime.now()));
        return Result.success();
    }
}
cnas-device/src/main/java/com/ruoyi/device/controller/DeviceMaintenanceController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,98 @@
package com.ruoyi.device.controller;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.write.metadata.style.WriteCellStyle;
import com.alibaba.excel.write.style.HorizontalCellStyleStrategy;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.core.domain.Result;
import com.ruoyi.common.numgen.NumberGenerator;
import com.ruoyi.device.excel.DeviceMaintenanceExport;
import com.ruoyi.device.pojo.DeviceMaintenance;
import com.ruoyi.device.service.DeviceMaintenanceService;
import io.swagger.annotations.ApiOperation;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.VerticalAlignment;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Locale;
/**
 * todo: å­™æ²³æ»¨
 */
@RestController
@RequestMapping("/device-maintain")
public class DeviceMaintenanceController {
    @Autowired
    private DeviceMaintenanceService deviceMaintenanceService;
    @Autowired
    private NumberGenerator<DeviceMaintenance> numberGenerator;
    //增
    @PostMapping()
    public Result create(@RequestBody DeviceMaintenance deviceMaintenance){
        String year = new SimpleDateFormat("yy", Locale.CHINESE).format(new Date());
        String month = new SimpleDateFormat("MM", Locale.CHINESE).format(new Date());
        String processNumber = numberGenerator.generateNumberWithPrefix(3, "DG-TC-23FM " + month + "-" + year + month, DeviceMaintenance::getDeviceNumber);
        deviceMaintenance.setDeviceNumber(processNumber);
        return Result.success(deviceMaintenanceService.save(deviceMaintenance));
    }
    //通过deviceId查询维护数据
    @GetMapping("/getDeviceMaintenancePage")
    public Result getDeviceMaintenancePage(@RequestParam("deviceId") Integer deviceId, Page page, String deviceNumber){
        return Result.success(deviceMaintenanceService.getDeviceMaintenancePage(page, deviceId, deviceNumber));
    }
    //删
    @DeleteMapping("/delete/{id}")
    public void deleteDeviceFault(@PathVariable Integer id) {
        deviceMaintenanceService.removeById(id);
    }
    @GetMapping("/deviceMaintenanceExport")
    public Result deviceMaintenanceExport(@RequestParam("deviceId") Integer deviceId, HttpServletResponse response) throws IOException {
        List<DeviceMaintenanceExport> list = deviceMaintenanceService.deviceMaintenanceExport(deviceId);
        response.setHeader("requestType","excel");
        response.setHeader("Access-Control-Expose-Headers", "requestType");
        // è®¾ç½®å•元格样式
        // ä¿å­˜åˆ°ç¬¬ä¸€ä¸ªsheet中
        EasyExcel.write(response.getOutputStream())
                .head(DeviceMaintenanceExport.class)
                .registerWriteHandler(getHorizontalCellStyleStrategy((short) 12))
                .sheet()
                .doWrite(list);
        return Result.success();
    }
    @ApiOperation(value = "设备维护记录导出")
    @GetMapping("/exportMaintenanceRecord")
    public void exportMaintenanceRecord(@RequestParam("deviceId") Integer deviceId, HttpServletResponse response) throws Exception {
        deviceMaintenanceService.exportMaintenanceRecord(deviceId, response);
    }
    /**
     * å•元格样式策略
     */
    public static HorizontalCellStyleStrategy getHorizontalCellStyleStrategy(Short fontHeightInPoints) {
        // å†…容的策略
        WriteCellStyle contentWriteCellStyle = new WriteCellStyle();
        // ã€æ°´å¹³å±…中需要使用以下两行】
        // è®¾ç½®æ–‡å­—左右居中
        contentWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);
        // è®¾ç½®æ–‡å­—上下居中
        contentWriteCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
        // è®¾ç½® è‡ªåŠ¨æ¢è¡Œ
        contentWriteCellStyle.setWrapped(true);
        // æ ·å¼ç­–ç•¥
        return new HorizontalCellStyleStrategy(null, contentWriteCellStyle);
    }
}
cnas-device/src/main/java/com/ruoyi/device/controller/DeviceMaintenancePlanController.java
@@ -65,7 +65,7 @@
     * @param deviceMaintenancePlanDto è®¾å¤‡ä¿å…»è®¡åˆ’
     */
    @ApiOperation("删除设备保养计划")
    @GetMapping("/deleteMaintenancePlan")
    @DeleteMapping("/deleteMaintenancePlan")
    public Result deleteMaintenancePlan(DeviceMaintenancePlanDto deviceMaintenancePlanDto) {
        return deviceMaintenancePlanService.deleteMaintenancePlan(deviceMaintenancePlanDto);
    }
cnas-device/src/main/java/com/ruoyi/device/controller/DeviceMetricRecordController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,89 @@
package com.ruoyi.device.controller;
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.ruoyi.common.core.domain.Result;
import com.ruoyi.common.numgen.NumberGenerator;
import com.ruoyi.common.utils.FileSaveUtil;
import com.ruoyi.device.dto.DeviceMetricRecordDto;
import com.ruoyi.device.pojo.DeviceMetricRecord;
import com.ruoyi.device.pojo.DeviceMetricsCopy;
import com.ruoyi.device.service.DeviceMetricRecordService;
import com.ruoyi.device.service.DeviceMetricsCopyService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
/**
 * <p>
 * è®¾å¤‡æ ¡å‡† - æ ¡å‡†è®°å½• å‰ç«¯æŽ§åˆ¶å™¨
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2024-09-27 10:20:01
 */
@Api(tags = "设备 - è®¾å¤‡æ ¡å‡†")
@RestController
@RequestMapping("/deviceMetricRecord")
public class DeviceMetricRecordController {
    @Autowired
    private DeviceMetricRecordService deviceMetricRecordService;
    @Autowired
    private DeviceMetricsCopyService deviceMetricsCopyService;
    @Autowired
    private NumberGenerator<DeviceMetricRecord> numberGenerator;
    @ApiOperation("设备校准分页查询")
    @GetMapping("/deviceMetricRecordPage")
    public Result deviceMetricRecordPage(@RequestParam("deviceId") Integer deviceId, Page page, @RequestParam("type") String type) {
        return Result.success(deviceMetricRecordService.page(page, Wrappers.<DeviceMetricRecord>lambdaQuery()
                .eq(DeviceMetricRecord::getDeviceId, deviceId)
                .eq(DeviceMetricRecord::getType, type)));
    }
    @ApiOperation("设备校准 æ–°å¢ž æ›´æ–°")
    @PostMapping("/addOrUpdateDeviceMetricRecord")
    public Result addOrUpdateDeviceMetricRecord(@RequestBody DeviceMetricRecordDto deviceMetricRecordDto) {
        if (ObjectUtils.isEmpty(deviceMetricRecordDto.getProcessNumber())) {
            String year = new SimpleDateFormat("yy", Locale.CHINESE).format(new Date());
            String month = new SimpleDateFormat("MM", Locale.CHINESE).format(new Date());
            String processNumber = numberGenerator.generateNumberWithPrefix(5, "SBJZ" + year + month, DeviceMetricRecord::getProcessNumber);
            deviceMetricRecordDto.setProcessNumber(processNumber);
        }
        deviceMetricRecordService.saveOrUpdate(deviceMetricRecordDto);
        if (CollectionUtils.isNotEmpty(deviceMetricRecordDto.getDeviceMetricsCopyList())) {
            deviceMetricRecordDto.getDeviceMetricsCopyList().forEach(i -> i.setDeviceMetricsId(deviceMetricRecordDto.getId()));
            deviceMetricsCopyService.saveOrUpdateBatch(deviceMetricRecordDto.getDeviceMetricsCopyList());
        }
        return Result.success();
    }
    @ApiOperation("设备校准 åˆ é™¤")
    @DeleteMapping("/deleteDeviceMetricRecord")
    public Result deleteDeviceMetricRecord(@RequestParam("id") Integer id) {
        DeviceMetricRecord deviceMetricRecord = deviceMetricRecordService.getById(id);
        deviceMetricsCopyService.remove(Wrappers.<DeviceMetricsCopy>lambdaQuery()
                .eq(DeviceMetricsCopy::getDeviceMetricsId, id));
        // åˆ é™¤æ–‡ä»¶
        FileSaveUtil.DeleteFile(deviceMetricRecord.getSystemFileName());
        return Result.success(deviceMetricRecordService.removeById(id));
    }
    @ApiOperation("设备校准 æ ¡å‡†æ¡ç›®æŸ¥è¯¢")
    @GetMapping("/showDeviceMetricsCopy")
    public Result showDeviceMetricsCopy(@RequestParam("id") Integer id, @RequestParam("type") String type) {
        return Result.success(deviceMetricsCopyService.list(Wrappers.<DeviceMetricsCopy>lambdaQuery()
                .eq(DeviceMetricsCopy::getDeviceMetricsId, id)
                .eq(DeviceMetricsCopy::getType, type)));
    }
}
cnas-device/src/main/java/com/ruoyi/device/controller/DeviceScrappedController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,82 @@
package com.ruoyi.device.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.core.domain.Result;
import com.ruoyi.device.pojo.DeviceScrapped;
import com.ruoyi.device.service.DeviceScrappedService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.util.Map;
/**
 * <p>
 * è®¾å¤‡æŠ¥åºŸç”³è¯·è¡¨ å‰ç«¯æŽ§åˆ¶å™¨
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2024-12-17 01:53:47
 */
@Api(tags = "设备报废申请表")
@AllArgsConstructor
@RestController
@RequestMapping("/deviceScrapped")
public class DeviceScrappedController {
    private DeviceScrappedService deviceScrappedService;
    /**
     * è®¾å¤‡æŠ¥åºŸç”³è¯·åˆ—表
     * @return
     */
    @ApiOperation(value = "设备报废申请列表")
    @GetMapping("/pageDeviceScrapped")
    public Result<IPage<DeviceScrapped>> pageDeviceScrapped(Page page, DeviceScrapped deviceScrapped) {
        return Result.success(deviceScrappedService.pageDeviceScrapped(page, deviceScrapped));
    }
    /**
     * æŸ¥è¯¢è®¾å¤‡æŠ¥åºŸç”³è¯·
     * @return
     */
    @ApiOperation(value = "查询设备报废申请")
    @GetMapping("/getDeviceScrapped")
    public Result getDeviceScrapped(Integer scrappedId){
        return Result.success(deviceScrappedService.getById(scrappedId));
    }
    /**
     * åˆ é™¤è®¾å¤‡æ ¸æŸ¥è®¡åˆ’详情
     * @return
     */
    @ApiOperation(value = "删除设备报废申请")
    @DeleteMapping("/delDeviceScrapped")
    public Result delDeviceScrapped(Integer scrappedId){
        return Result.success(deviceScrappedService.removeById(scrappedId));
    }
    /**
     * æ–°å¢žè®¾å¤‡æŠ¥åºŸç”³è¯·
     * @return
     */
    @ApiOperation(value = "新增设备报废申请")
    @PostMapping("/addDeviceScrapped")
    public Result addDeviceScrapped(@RequestBody DeviceScrapped deviceScrapped){
        return Result.success(deviceScrappedService.addDeviceScrapped(deviceScrapped));
    }
    /**
     * å¯¼å‡ºè®¾å¤‡æŠ¥åºŸç”³è¯·
     */
    @ApiOperation("导出设备报废申请")
    @GetMapping("/exportDeviceScrapped")
    public Result exportDeviceScrapped(Integer scrappedId, HttpServletResponse response) {
        return deviceScrappedService.exportDeviceScrapped(scrappedId, response);
    }
}
cnas-device/src/main/java/com/ruoyi/device/controller/DeviceStateController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,87 @@
package com.ruoyi.device.controller;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson2.JSON;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.core.domain.Result;
import com.ruoyi.common.numgen.NumberGenerator;
import com.ruoyi.device.dto.DeviceStateDto;
import com.ruoyi.device.excel.DeviceStateExport;
import com.ruoyi.device.pojo.DeviceState;
import com.ruoyi.device.service.DeviceStateService;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Locale;
/**
 * <p>
 * è®¾å¤‡åœç”¨/启用 å‰ç«¯æŽ§åˆ¶å™¨
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2024-09-26 09:51:40
 */
@RestController
@RequestMapping("/deviceState")
public class DeviceStateController {
    @Autowired
    private DeviceStateService deviceStateService;
    @Autowired
    private NumberGenerator<DeviceState> numberGenerator;
    @PostMapping("saveDeviceState")
    public Result saveIncidentReportData(@RequestBody DeviceState deviceState) {
        if (ObjectUtils.isEmpty(deviceState.getProcessNumber())) {
            String year = new SimpleDateFormat("yy", Locale.CHINESE).format(new Date());
            String month = new SimpleDateFormat("MM", Locale.CHINESE).format(new Date());
            String processNumber = numberGenerator.generateNumberWithPrefix(3, "DG-TC-23FM " + month + "-" + year + month, DeviceState::getProcessNumber);
            deviceState.setProcessNumber(processNumber);
        }
        deviceStateService.saveOrUpdate(deviceState);
        return Result.success();
    }
    @GetMapping("/getDeviceStatePage")
    public Result getDeviceStatePage(@RequestParam("deviceId") Integer deviceId, Page page, String processNumber){
        return Result.success(deviceStateService.getDeviceStatePage(deviceId, page, processNumber));
    }
    @DeleteMapping("/deleteDeviceState")
    public Result deleteDeviceState(@RequestParam("stateId") Integer stateId){
        return Result.success(deviceStateService.removeById(stateId));
    }
    @PostMapping("/deviceStateExport")
    public Result deviceStateExport(@RequestParam("deviceId") Integer deviceId, String processNumber, HttpServletResponse response) throws Exception {
        IPage<DeviceStateDto> deviceBorrows = deviceStateService.getDeviceStatePage(deviceId, new Page<>(1, -1), processNumber);
        List<DeviceStateExport> studentList  = JSONObject.parseArray(JSON.toJSONString(deviceBorrows.getRecords()), DeviceStateExport.class);
        response.setHeader("requestType", "excel");
        response.setHeader("Access-Control-Expose-Headers", "requestType");
        // è®¾ç½®å•元格样式
        // ä¿å­˜åˆ°ç¬¬ä¸€ä¸ªsheet中
        EasyExcel.write(response.getOutputStream())
                .head(DeviceStateExport.class)
                .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()) // è‡ªé€‚应列宽
                .sheet("sheet")
                .doWrite(studentList);
        return Result.success();
    }
    @ApiOperation(value = "设备启动/停止导出")
    @GetMapping("/exportDeviceStatus")
    public void exportDeviceStatus(@RequestParam("processNumber") String processNumber,@RequestParam("deviceId") Integer deviceId, HttpServletResponse response) throws Exception {
        deviceStateService.exportDeviceStatus(deviceId, processNumber, response);
    }
}
cnas-device/src/main/java/com/ruoyi/device/controller/DeviceTraceabilityManagementController.java
@@ -62,7 +62,7 @@
     * @param deviceTraceabilityManagementDto é‡å€¼æº¯æºè®¡åˆ’
     */
    @ApiOperation("删除量值溯源计划")
    @GetMapping("/deleteTraceabilityManagement")
    @DeleteMapping("/deleteTraceabilityManagement")
    public Result deleteTraceabilityManagement(DeviceTraceabilityManagementDto deviceTraceabilityManagementDto) {
        return deviceTraceabilityManagementService.deleteTraceabilityManagement(deviceTraceabilityManagementDto);
    }
cnas-device/src/main/java/com/ruoyi/device/dto/DeviceAccidentReportDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,31 @@
package com.ruoyi.device.dto;
import com.ruoyi.device.pojo.DeviceAccidentReport;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
 * Author: yuan
 * Date: 2024-12-18 æ˜ŸæœŸä¸‰ 10:00:48
 * Description:
 */
@Data
public class DeviceAccidentReportDto extends DeviceAccidentReport {
    @ApiModelProperty("时间")
    private String accidentDateStr;
    @ApiModelProperty("报告人填写时间")
    private String reportDateStr;
    @ApiModelProperty("评估人填写时间")
    private String assessorDateStr;
    @ApiModelProperty("部门负责人填写时间")
    private String departmentHeadDateStr;
    @ApiModelProperty("技术负责人填写时间")
    private String technicalDirectorDateStr;
    @ApiModelProperty("主任填写时间")
    private String directorHeadDateStr;
}
cnas-device/src/main/java/com/ruoyi/device/dto/DeviceBreakdownMaintenance.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,90 @@
package com.ruoyi.device.dto;
import com.baomidou.mybatisplus.annotation.*;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import java.time.LocalDate;
import java.time.LocalDateTime;
/**
 * <p>
 * è®¾å¤‡æ•…障维修表
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2024-12-17 04:50:57
 */
@Getter
@Setter
@TableName("device_breakdown_maintenance")
@ApiModel(value = "DeviceBreakdownMaintenance对象", description = "设备故障维修表")
public class DeviceBreakdownMaintenance {
    @TableId(value = "maintenance_id", type = IdType.AUTO)
    private Integer maintenanceId;
    @ApiModelProperty("设备id")
    private Integer deviceId;
    @ApiModelProperty("安装地址")
    private String location;
    @ApiModelProperty("损坏或故障情况")
    private String damageOrMalfunction;
    @ApiModelProperty("申请人id")
    private Integer applicantUserId;
    @ApiModelProperty("申请人")
    private String applicantUser;
    @ApiModelProperty("要求修复时间")
    private LocalDate repairDate;
    @ApiModelProperty("部门负责人意见")
    private String departmentHeadOpinion;
    @ApiModelProperty("部门负责人id")
    private Integer departmentHeadUserId;
    @ApiModelProperty("部门负责人")
    private String departmentHeadUser;
    @ApiModelProperty("部门负责人填写时间")
    private LocalDate departmentHeadDate;
    @ApiModelProperty("维修记事")
    private String maintenanceRecord;
    @ApiModelProperty("维修人")
    private String maintenanceUser;
    @ApiModelProperty("维修时间")
    private LocalDate maintenanceDate;
    @ApiModelProperty("是否结束,0 æœªç»“束, 1结束")
    private Integer isFinish;
    @ApiModelProperty("创建人")
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    @ApiModelProperty("创建时间")
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    @ApiModelProperty("修改人")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    @ApiModelProperty("修改时间")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
    @TableField(exist = false,select = false)
    @ApiModelProperty("流程, 0:申请, 1申请部门负责人意见, 2:维修记事")
    private Integer flowType;
}
cnas-device/src/main/java/com/ruoyi/device/dto/DeviceInspectionRecordDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,25 @@
package com.ruoyi.device.dto;
import com.baomidou.mybatisplus.annotation.TableField;
import com.ruoyi.device.pojo.DeviceInspectionRecord;
import com.ruoyi.device.pojo.DeviceInspectionRecordDetails;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
/**
 * Author: yuan
 * Date: 2024-12-16 æ˜ŸæœŸä¸€ 17:23:22
 * Description:
 */
@Data
public class DeviceInspectionRecordDto extends DeviceInspectionRecord {
    @TableField(exist = false)
    @ApiModelProperty("测试详情内容")
    private List<DeviceInspectionRecordDetails> details;
    @ApiModelProperty("测试时间")
    private String testDateString;
}
cnas-device/src/main/java/com/ruoyi/device/dto/DeviceInstructionDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,13 @@
package com.ruoyi.device.dto;
import com.ruoyi.device.pojo.DeviceInstruction;
import com.ruoyi.device.pojo.OperationInstruction;
import lombok.Data;
import java.util.List;
@Data
public class DeviceInstructionDto extends DeviceInstruction {
    private List<OperationInstruction> feTempHumRecordList;
}
cnas-device/src/main/java/com/ruoyi/device/dto/DeviceMetricRecordDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,13 @@
package com.ruoyi.device.dto;
import com.ruoyi.device.pojo.DeviceMetricRecord;
import com.ruoyi.device.pojo.DeviceMetricsCopy;
import lombok.Data;
import java.util.List;
@Data
public class DeviceMetricRecordDto extends DeviceMetricRecord {
    private List<DeviceMetricsCopy> deviceMetricsCopyList;
}
cnas-device/src/main/java/com/ruoyi/device/dto/DeviceOperationInstructionDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,35 @@
package com.ruoyi.device.dto;
import com.ruoyi.device.pojo.OperationInstruction;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
public class DeviceOperationInstructionDto extends OperationInstruction {
    @ApiModelProperty("申请编号")
    private String applicationNumber;
    @ApiModelProperty("申请部门")
    private String applicationDepartment;
    @ApiModelProperty("责任人")
    private String personLiable;
    @ApiModelProperty("受控申请说明")
    private String controlledApplicationDescription;
    @ApiModelProperty("管理编号")
    private String deviceNumber;
    @ApiModelProperty("型号")
    private String deviceModel;
    @ApiModelProperty("设备名称")
    private String deviceName;
    @ApiModelProperty("上传人")
    private String uploaderName;
    @ApiModelProperty("审批人")
    private String approverName;
}
cnas-device/src/main/java/com/ruoyi/device/dto/DeviceScrappedDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,26 @@
package com.ruoyi.device.dto;
import com.ruoyi.device.pojo.DeviceScrapped;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
 * Author: yuan
 * Date: 2024-12-17 æ˜ŸæœŸäºŒ 18:34:17
 * Description:
 */
@Data
public class DeviceScrappedDto extends DeviceScrapped {
    @ApiModelProperty("申请时间")
    private String applicantDateStr;
    @ApiModelProperty("部门负责人填写时间")
    private String departmentHeadDateStr;
    @ApiModelProperty("计量室人填写时间")
    private String meteringRoomDateStr;
    @ApiModelProperty("批准人填写时间")
    private String approverDateStr;
}
cnas-device/src/main/java/com/ruoyi/device/dto/DeviceStateDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,32 @@
package com.ruoyi.device.dto;
import com.ruoyi.device.pojo.DeviceState;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
public class DeviceStateDto extends DeviceState {
    @ApiModelProperty(value = "设备名称")
    private String deviceName;
    @ApiModelProperty(value = "规格型号")
    private String specificationModel;
    @ApiModelProperty(value = "管理编号")
    private String managementNumber;
    @ApiModelProperty(value = "操作日期 yyyy-MM-dd")
    private String submitDateString;
    @ApiModelProperty("负责人审批日期 yyyy-MM-dd")
    private String departmentDateString;
    @ApiModelProperty("计量室审批日期 yyyy-MM-dd")
    private String measuringRoomDateString;
    @ApiModelProperty("批准日期 yyyy-MM-dd")
    private String approvalDateString;
    @ApiModelProperty(value = "设备类型")
    private String largeCategory;
}
cnas-device/src/main/java/com/ruoyi/device/excel/DeviceStateExport.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,36 @@
package com.ruoyi.device.excel;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;
import java.time.LocalDateTime;
@Data
public class DeviceStateExport {
    @ExcelProperty(value = "设备名称")
    private String deviceName;
    @ExcelProperty(value = "规格型号")
    private String specificationModel;
    @ExcelProperty(value = "管理编号")
    private String managementNumber;
    @ExcelProperty("设备状态")
    private String deviceStatus;
    @ExcelProperty("停用启用理由")
    private String reason;
    @ExcelProperty("提交人")
    private String createUser;
    @ExcelProperty("提交日期")
    private LocalDateTime createTime;
    @ExcelProperty("当前状态")
    private String currentState;
    @ExcelProperty("当前负责人")
    private String currentResponsible;
}
cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceAcceptanceFileMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,16 @@
package com.ruoyi.device.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.device.pojo.DeviceAcceptanceFile;
/**
 * <p>
 * è®¾å¤‡éªŒæ”¶(装备)附件表 Mapper æŽ¥å£
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2024-12-20 01:45:26
 */
public interface DeviceAcceptanceFileMapper extends BaseMapper<DeviceAcceptanceFile> {
}
cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceAcceptanceMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,27 @@
package com.ruoyi.device.mapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
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.device.pojo.DeviceAcceptance;
import org.apache.ibatis.annotations.Param;
/**
 * <p>
 * è®¾å¤‡éªŒæ”¶(装备) Mapper æŽ¥å£
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2024-12-20 01:45:14
 */
public interface DeviceAcceptanceMapper extends BaseMapper<DeviceAcceptance> {
    /**
     * è®¾å¤‡éªŒæ”¶åˆ—表
     * @param page
     * @param ew
     * @return
     */
    IPage<DeviceAcceptance> pageDeviceAcceptance(Page page, @Param("ew") QueryWrapper<DeviceAcceptance> ew);
}
cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceAccidentReportMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,35 @@
package com.ruoyi.device.mapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
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.device.dto.DeviceAccidentReportDto;
import com.ruoyi.device.pojo.DeviceAccidentReport;
import org.apache.ibatis.annotations.Param;
/**
 * <p>
 * è®¾å¤‡äº‹æ•…报告单 Mapper æŽ¥å£
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2024-12-17 06:31:12
 */
public interface DeviceAccidentReportMapper extends BaseMapper<DeviceAccidentReport> {
    /**
     * è®¾å¤‡äº‹æ•…报告列表
     * @param page
     * @param ew
     * @return
     */
    IPage<DeviceAccidentReport> pageDeviceAccidentReport(Page page, @Param("ew") QueryWrapper<DeviceAccidentReport> ew);
    /**
     * æŸ¥è¯¢è®¾å¤‡äº‹æ•…报告详情
     * @param accidentReportId è®¾å¤‡äº‹æ•…报告id
     * @return
     */
    DeviceAccidentReportDto selectDeviceAccidentReportById(Integer accidentReportId);
}
cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceBorrowMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,25 @@
package com.ruoyi.device.mapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
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.device.pojo.DeviceBorrow;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
 * <p>
 *  Mapper æŽ¥å£
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2024-09-21 10:53:51
 */
public interface DeviceBorrowMapper extends BaseMapper<DeviceBorrow> {
    IPage<DeviceBorrow> deviceBorrowPage(Page page, @Param("ew")QueryWrapper<DeviceBorrow> ew);
    List<DeviceBorrow> getDeviceBorrowBydeviceId(Integer deviceId);
}
cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceBreakdownMaintenanceMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,27 @@
package com.ruoyi.device.mapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
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.device.dto.DeviceBreakdownMaintenance;
import org.apache.ibatis.annotations.Param;
/**
 * <p>
 * è®¾å¤‡æ•…障维修表 Mapper æŽ¥å£
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2024-12-17 04:50:57
 */
public interface DeviceBreakdownMaintenanceMapper extends BaseMapper<DeviceBreakdownMaintenance> {
    /**
     * è®¾å¤‡æ•…障维修列表
     * @param page
     * @param ew
     * @return
     */
    IPage<DeviceBreakdownMaintenance> pageDeviceBreakdownMaintenance(Page page, @Param("ew") QueryWrapper<DeviceBreakdownMaintenance> ew);
}
cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceInspectionRecordDetailsMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,16 @@
package com.ruoyi.device.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.device.pojo.DeviceInspectionRecordDetails;
/**
 * <p>
 *  Mapper æŽ¥å£
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2024-12-16 04:27:32
 */
public interface DeviceInspectionRecordDetailsMapper extends BaseMapper<DeviceInspectionRecordDetails> {
}
cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceInspectionRecordMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,28 @@
package com.ruoyi.device.mapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.ruoyi.device.dto.DeviceInspectionRecordDto;
import com.ruoyi.device.pojo.DeviceInspectionRecord;
import org.apache.ibatis.annotations.Param;
/**
 * <p>
 *  Mapper æŽ¥å£
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2024-12-16 04:25:14
 */
public interface DeviceInspectionRecordMapper extends BaseMapper<DeviceInspectionRecord> {
    /**
     * åˆ†é¡µæŸ¥è¯¢è®¾å¤‡ç‚¹æ£€è®°å½•
     * @param page
     * @param queryWrappers
     * @return
     */
    IPage<DeviceInspectionRecord> selectDeviceParameterPage(IPage page, @Param("ew") QueryWrapper<DeviceInspectionRecordDto> queryWrappers);
}
cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceLogMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,9 @@
package com.ruoyi.device.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.device.pojo.DeviceLog;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface DeviceLogMapper extends BaseMapper<DeviceLog> {
}
cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceMetricsCopyMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,16 @@
package com.ruoyi.device.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.device.pojo.DeviceMetricsCopy;
/**
 * <p>
 * è®¾å¤‡æ ¡å‡† - æ ¡å‡†è®°å½• - æ ¡å‡†æ¡ç›® Mapper æŽ¥å£
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2024-09-27 10:20:11
 */
public interface DeviceMetricsCopyMapper extends BaseMapper<DeviceMetricsCopy> {
}
cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceScrappedMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,35 @@
package com.ruoyi.device.mapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
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.device.dto.DeviceScrappedDto;
import com.ruoyi.device.pojo.DeviceScrapped;
import org.apache.ibatis.annotations.Param;
/**
 * <p>
 * è®¾å¤‡æŠ¥åºŸç”³è¯·è¡¨ Mapper æŽ¥å£
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2024-12-17 01:53:47
 */
public interface DeviceScrappedMapper extends BaseMapper<DeviceScrapped> {
    /**
     * è®¾å¤‡æŠ¥åºŸç”³è¯·åˆ—表
     * @param page
     * @param ew
     * @return
     */
    IPage<DeviceScrapped> pageDeviceScrapped(Page page, @Param("ew") QueryWrapper<DeviceScrapped> ew);
    /**
     * æ ¹æ®id查询设备报废申请
     * @param scrappedId
     * @return
     */
    DeviceScrappedDto selectDeviceScrappedById(@Param("scrappedId") Integer scrappedId);
}
cnas-device/src/main/java/com/ruoyi/device/mapper/DeviceStateMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
package com.ruoyi.device.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.device.dto.DeviceStateDto;
import com.ruoyi.device.pojo.DeviceState;
/**
 * <p>
 * è®¾å¤‡åœç”¨/启用 Mapper æŽ¥å£
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2024-09-26 09:51:40
 */
public interface DeviceStateMapper extends BaseMapper<DeviceState> {
    IPage<DeviceStateDto> getDeviceStatePage(Integer deviceId, Page page, String processNumber);
}
cnas-device/src/main/java/com/ruoyi/device/mapper/InstructionMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
package com.ruoyi.device.mapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
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.device.dto.DeviceOperationInstructionDto;
import com.ruoyi.device.pojo.DeviceInstruction;
import org.apache.ibatis.annotations.Param;
/**
 * <p>
 * ä½œä¸šæŒ‡å¯¼ä¹¦æ·»åŠ å—æŽ§æ–‡ä»¶è¡¨ Mapper æŽ¥å£
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2024-12-04 10:29:18
 */
public interface InstructionMapper extends BaseMapper<DeviceInstruction> {
    IPage<DeviceInstruction> pageByPageQueryOfHomeworkInstructions(Page page, @Param("ew") QueryWrapper<DeviceOperationInstructionDto> ew);
}
cnas-device/src/main/java/com/ruoyi/device/mapper/OperationInstructionMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
package com.ruoyi.device.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.device.dto.DeviceOperationInstructionDto;
import com.ruoyi.device.pojo.OperationInstruction;
import java.util.List;
/**
 * <p>
 * è®¾å¤‡ - ä½œä¸šæŒ‡å¯¼ä¹¦ æ·»åŠ å—æŽ§æ–‡ä»¶ å­ Mapper æŽ¥å£
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2024-12-04 10:43:32
 */
public interface OperationInstructionMapper extends BaseMapper<OperationInstruction> {
    List<DeviceOperationInstructionDto> homeworkGuidebookEditor(Integer instructionId);
}
cnas-device/src/main/java/com/ruoyi/device/mqtt/MQBean.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,14 @@
package com.ruoyi.device.mqtt;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
@Component
public class MQBean {
    @Bean("mqClient") // å¯åЍWEB服务器的时候调用此方法初始化
    public MQClient myMQTTClient(){
        MQClient mqClient = new MQClient();
        return mqClient;
    }
}
cnas-device/src/main/java/com/ruoyi/device/mqtt/MQCallback.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,93 @@
package com.ruoyi.device.mqtt;
import com.alibaba.fastjson.JSONObject;
import com.ruoyi.device.service.CollectBridgeService;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
import org.eclipse.paho.client.mqttv3.MqttCallback;
import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import javax.annotation.Resource;
@Component
@Slf4j
public class MQCallback<component> implements MqttCallback {
    private MQClient mqClient; // MQTT连接数据
    private MQConfig mqConfig; // yml配置数据
    private static MQCallback mqCallback;
    @Resource
    private CollectBridgeService collectBridgeService;
    @PostConstruct
    public void init() {
        mqCallback = this;
         // åˆä½¿åŒ–时将已静态化的configParam实例化
        mqCallback.collectBridgeService = this.collectBridgeService;
    }
    public MQCallback(MQClient mqClient, MQConfig mqConfig) {
        this.mqClient = mqClient;
        this.mqConfig = mqConfig;
    }
    /** è¿žæŽ¥ä¸¢å¤±åŽï¼Œä¸€èˆ¬åœ¨è¿™é‡Œé¢è¿›è¡Œé‡è¿ž **/
    @SneakyThrows
    @Override
    public void connectionLost(Throwable cause) {
        /** è¿žæŽ¥ä¸¢å¤±åŽï¼Œä¸€èˆ¬åœ¨è¿™é‡Œé¢è¿›è¡Œé‡è¿ž **/
        if (mqClient != null) {
            while (true) {
                try {
                    log.info("==============》》》[MQTT] è¿žæŽ¥ä¸¢å¤±ï¼Œå°è¯•重连...");
                    MQClient mqttPushClient = new MQClient();
                    mqttPushClient.connect(mqConfig);
                    if (mqClient.getClient().isConnected()) {
                        log.info("=============>>重连成功");
                    }
                    break;
                } catch (Exception e) {
                    log.error("=============>>>[MQTT] è¿žæŽ¥æ–­å¼€ï¼Œé‡è¿žå¤±è´¥ï¼<<=============");
                    continue;
                }
            }
        }
        log.info(cause.getMessage());
    }
    /**
     * MQTT服务器向WEB服务器发送的数据会执行到这里面,官方话称为:订阅后的消息
     * @param topic ä¸»é¢˜ï¼šä¹Ÿç§°ä¸ºåº•层网关唯一标识
     * @param message ä¿¡æ¯
     * @throws Exception æŠ¥é”™
     */
    @Override
    public void messageArrived(String topic, MqttMessage message) throws Exception {
        try {
            String parse = new String(message.getPayload());
            JSONObject jsonObject = JSONObject.parseObject(parse);
            // å¡«å……采集数据
            mqCallback.collectBridgeService.addBridgeValue(jsonObject);
        } catch (Exception e) {
            e.printStackTrace();
            log.info("============》》接收消息主题异常 : " + e.getMessage());
        }
    }
    /**
     * WEB服务器向MQTT服务器发送的数据会执行到这里面
     * å®˜æ–¹è¯ç§°ä¸ºï¼šå‘布后会执行到这里
     * @param token è¿žæŽ¥token
     */
    @Override
    public void deliveryComplete(IMqttDeliveryToken token) {
//        log.info("==========发布信息={}==========", token.isComplete());
    }
}
cnas-device/src/main/java/com/ruoyi/device/mqtt/MQClient.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,97 @@
package com.ruoyi.device.mqtt;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.eclipse.paho.client.mqttv3.MqttClient;
import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
import org.eclipse.paho.client.mqttv3.MqttException;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
import org.springframework.stereotype.Component;
@Component
@Slf4j
public class MQClient {
    private static MqttClient client;
    public static MqttClient getClient() {
        return client;
    }
    public static void setClient(MqttClient client) {
        MQClient.client = client;
    }
    /**
     * WEB服务器连接MQTT服务器的配置
     * @param userName è´¦å·
     * @param password å¯†ç 
     * @param outTime è¶…æ—¶æ—¶é—´
     * @param KeepAlive å¿ƒè·³æ£€æµ‹æ—¶é—´
     * @return
     */
    private MqttConnectOptions getOption(String userName, String password, int outTime, int KeepAlive) {
        MqttConnectOptions option = new MqttConnectOptions();
        // è®¾ç½®æ˜¯å¦æ¸…空session,false表示服务器会保留客户端的连接记录,true表示每次连接到服务器都以新的身份连接
        option.setCleanSession(true);
        // è®¾ç½®è¿žæŽ¥çš„用户名
        option.setUserName(userName);
        // è®¾ç½®è¿žæŽ¥çš„密码
        option.setPassword(password.toCharArray());
        // è®¾ç½®è¶…æ—¶æ—¶é—´ å•位为秒
        option.setConnectionTimeout(outTime);
        // è®¾ç½®ä¼šè¯å¿ƒè·³æ—¶é—´ å•位为秒 æœåŠ¡å™¨ä¼šæ¯éš”(1.5*keepTime)秒的时间向客户端发送个消息判断客户端是否在线,但这个方法并没有重连的机制
        option.setKeepAliveInterval(KeepAlive);
        // setWill方法,如果项目中需要知道客户端是否掉线可以调用该方法。设置最终端口的通知消息
        // option.setWill(topic, "close".getBytes(), 2, true);
        //设置最大速度
        option.setMaxInflight(1000);
        log.info("================>>>MQTT连接认证成功<<======================");
        return option;
    }
    /**
     * WEB服务器连接MQTT服务器函数
     * @param mqttConfig yml中MQTT的配置
     */
    public void connect(MQConfig mqttConfig) throws MqttException {
        client = new MqttClient(mqttConfig.getUrl(), mqttConfig.getClientId(), new MemoryPersistence());
        MqttConnectOptions options = getOption(mqttConfig.getUsername(), mqttConfig.getPassword(),
                mqttConfig.getTimeout(), mqttConfig.getKeepAlive());
        MQClient.setClient(client);
        //连接失败调用回调函数,重新连接
        client.setCallback(new MQCallback<Object>(this, mqttConfig));
        if (!client.isConnected()) {
            client.connect(options);
            // è®¢é˜…主题
            MQSubscribe.subscribe_0(mqttConfig.getSubscribe());
            log.info("================>>>MQTT连接成功<<======================");
        } else {// è¿™é‡Œçš„逻辑是如果连接不成功就重新连接
            client.disconnect();
            client.connect(options);
        }
    }
    /**
     * WEB服务器与MQTT服务器的断线重连
     * @throws Exception
     */
    public Boolean reConnect() throws Exception {
        Boolean isConnected = false;
        if (null != client) {
            client.connect();
            if (client.isConnected()) {
                isConnected = true;
            }
        }
        return isConnected;
    }
    /**
     * å¼‚常关闭服务,WEB服务器与MQTT服务器的断开连接函数
     */
    @SneakyThrows
    public void close(){
        client.close();
        client.disconnect();
        log.info("================>>异常关闭与mqtt服务器的连接<<======================");
    }
}
cnas-device/src/main/java/com/ruoyi/device/mqtt/MQConfig.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,64 @@
package com.ruoyi.device.mqtt;
import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
@Data
public class MQConfig {
    /**
     * MQTT-服务端-IP
     */
    @Value("${mqtt.url}")
    private String url;
    /**
     * MQTT-服务端-用户名
     */
    @Value("${mqtt.username}")
    private String username;
    /**
     * MQTT-服务端-密码
     */
    @Value("${mqtt.password}")
    private String password;
    /**
     * è¶…æ—¶æ—¶é—´
     */
    @Value("${mqtt.timeout}")
    private int timeout;
    /**
     * å¿ƒè·³æ£€æµ‹æ—¶é—´
     */
    @Value("${mqtt.keepalive}")
    private int keepAlive;
    /**
     * å¿ƒè·³åŒ…级别
     */
    @Value("${mqtt.qos}")
    private int qos;
    /**
     * æœåŠ¡ç«¯è¿žæŽ¥è¶…æ—¶æ—¶é—´
     */
    @Value("${mqtt.completion-timeout}")
    private int completionTimeout;
    /**
     * clientId
     */
    @Value("${mqtt.clientId}")
    private String clientId;
    /**
     * è®¢é˜…主题
     */
    @Value("${mqtt.subscribe}")
    private String subscribe;
}
cnas-device/src/main/java/com/ruoyi/device/mqtt/MQPublic.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,69 @@
package com.ruoyi.device.mqtt;
import lombok.extern.slf4j.Slf4j;
import org.eclipse.paho.client.mqttv3.*;
import org.springframework.stereotype.Component;
@Component
@Slf4j
public class MQPublic {
    /**
     * é€šä¿¡è´¨é‡qos为0:表示WEB服务器向MQTT服务器只发送一次,不管MQTT服务器有没有收到
     * WEB服务器向MQTT服务器发布数据,此方法封装了publish函数
     * @param topic å‘底层网关发送数据,官方话:称此为主题,向那个主题发送数据 ç½‘关:即主题,设备唯一标识
     * @param pushMessage WEB服务器向MQTT服务器发送的数据
     */
    public void publish_0(int qos, String topic, byte[] pushMessage) {
        publish(0, false, topic, pushMessage);
    }
    /**
     * é€šä¿¡è´¨é‡qos为1:表示WEB服务器向MQTT服务器发送数据,MQTT服务器一定会收到一次数据,如果MQTT服务器没有响应“收到数据”,那么WEB服务器就会一直发送数据
     * WEB服务器向MQTT服务器发布数据,调用此函数,此方法封装了publish函数,通信质量qos为1
     * @param topic å‘底层网关发送数据,官方话:称此为主题,向那个主题发送数据 ç½‘关:即主题,设备唯一标识
     * @param pushMessage WEB服务器向MQTT服务器发送的数据
     */
    public void publish_1(String topic, byte[] pushMessage) {
        publish(1, false, topic, pushMessage);
    }
    /**
     *通信质量qos为2:表示WEB服务器向MQTT服务器发送数据,两者会进行至少两次请求/响应流程,避免数据在传输中的丢失,但是相应的也会消耗计算机中的资源
     * WEB服务器向MQTT服务器发布数据,此方法封装了publish函数,通信质量:2
     * @param topic å‘底层网关发送数据,官方话:称此为主题,向那个主题发送数据 ç½‘关:即主题,设备唯一标识
     * @param pushMessage WEB服务器向MQTT服务器发送的数据
     */
    public void publish_2(String topic, byte[] pushMessage) {
        publish(2,false, topic, pushMessage);
    }
    /**
     * å‘布函数:WEB服务器向MQTT服务器发送数据
     *
     * @param qos é€šä¿¡è´¨é‡
     * @param retained é»˜è®¤ï¼šfalse-非持久化(是指一条消息消费完,就会被删除;持久化,消费完,还会保存在服务器中,当新的订阅者出现,继续给新订阅者消费)
     * @param topic å‘底层网关发送数据,官方话:称此为主题,向那个主题发送数据 ç½‘关:即主题,设备唯一标识
     * @param pushMessage WEB服务器向MQTT服务器发送的数据
     */
    public void publish(int qos, boolean retained, String topic, byte[] pushMessage) {
        MqttMessage message = new MqttMessage();
        message.setQos(qos);
        message.setRetained(retained);
        // å°†String[]数组转换为byte数组发送
        message.setPayload(pushMessage);
        MqttTopic mTopic = MQClient.getClient().getTopic(topic);
        if (null == mTopic) {
            log.error("===============>>>MQTT {} ä¸å­˜åœ¨<<=======================",topic);
        }
        MqttDeliveryToken token;
        try {
            token = mTopic.publish(message);
            token.waitForCompletion();
        } catch (MqttPersistenceException e) {
            e.printStackTrace();
        } catch (MqttException e) {
            e.printStackTrace();
        }
    }
}
cnas-device/src/main/java/com/ruoyi/device/mqtt/MQSubscribe.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,60 @@
package com.ruoyi.device.mqtt;
import org.eclipse.paho.client.mqttv3.MqttException;
import org.springframework.stereotype.Component;
@Component
public class MQSubscribe {
    /**
     * è®¢é˜…某个主题:MQTT服务器向WEB服务器发送数据
     *主题:也称为底层网关唯一标识
     * @param topic è®¾å¤‡ç¼–号,与底层交互的唯一标识
     * @param qos MQTT服务器向WEB服务器发送数据
     *            qos为0:只向WEB服务器发送一次;
     *            qos为1:至少向WEB服务器发送一次,接收方会响应一个报文;
     *            qos为2:两者会进行至少两次请求/响应流程,避免数据在传输中的丢失
     */
    private static void subscribe(String topic, int qos) {
        try {
            MQClient.getClient().subscribe(topic,qos);
        } catch (MqttException e) {
            e.printStackTrace();
        }
    }
    /**
     * è®¢é˜…某个主题,通信质量:qos默认为0
     * ä¸»é¢˜ï¼šä¹Ÿç§°ä¸ºåº•层网关唯一标识
     * @param topic è®¾å¤‡ç¼–号,与底层交互的唯一标识
     */
    public static void subscribe_0(String topic) {
        subscribe(topic, 0);
    }
    /**
     * è®¢é˜…某个主题,通信质量:qos默认为1
     * ä¸»é¢˜ï¼šä¹Ÿç§°ä¸ºåº•层网关唯一标识
     * @param topic è®¾å¤‡ç¼–号,与底层交互的唯一标识
     */
    public void subscribe_1(String topic) {
        subscribe(topic, 1);
    }
    /**
     * è®¢é˜…某个主题,通信质量:qos默认为2
     * ä¸»é¢˜ï¼šä¹Ÿç§°ä¸ºåº•层网关唯一标识
     * @param topic è®¾å¤‡ç¼–号,与底层交互的唯一标识
     */
    public void subscribe_2(String topic) {
        subscribe(topic, 2);
    }
    public void OffSubscribe(String topic) {
        try {
            MQClient.getClient().unsubscribe(topic);
        } catch (MqttException e) {
            e.printStackTrace();
        }
    }
}
cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceAcceptance.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,77 @@
package com.ruoyi.device.pojo;
import com.baomidou.mybatisplus.annotation.*;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import java.time.LocalDate;
import java.time.LocalDateTime;
/**
 * <p>
 * è®¾å¤‡éªŒæ”¶(装备)
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2024-12-20 01:45:14
 */
@Getter
@Setter
@TableName("device_acceptance")
@ApiModel(value = "DeviceAcceptance对象", description = "设备验收(装备)")
public class DeviceAcceptance {
    @TableId(value = "acceptance_id", type = IdType.AUTO)
    private Integer acceptanceId;
    @ApiModelProperty("设备id")
    private Integer deviceId;
    @ApiModelProperty("到货日期")
    private LocalDate arrivalDate;
    @ApiModelProperty("金额")
    private String goldAmount;
    @ApiModelProperty("维修单位")
    private String maintenanceunit;
    @ApiModelProperty("收设备主机和备份情况")
    private String spareParts;
    @ApiModelProperty("安装和调试情况")
    private String installationDebugging;
    @ApiModelProperty("验收情况")
    private String checkSituation;
    @ApiModelProperty("接收签字")
    private String receivingSignature;
    @ApiModelProperty("厂家代表")
    private String producer;
    @ApiModelProperty("接收人")
    private String recipient;
    @ApiModelProperty("接收时间")
    private String recipientDate;
    @ApiModelProperty("创建人")
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    @ApiModelProperty("创建时间")
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    @ApiModelProperty("修改人")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    @ApiModelProperty("修改时间")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
}
cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceAcceptanceFile.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,58 @@
package com.ruoyi.device.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-12-20 01:45:26
 */
@Getter
@Setter
@TableName("device_acceptance_file")
@ApiModel(value = "DeviceAcceptanceFile对象", description = "设备验收(装备)附件表")
public class DeviceAcceptanceFile implements Serializable {
    private static final long serialVersionUID = 1L;
    @TableId(value = "acceptance_file_id", type = IdType.AUTO)
    private Integer acceptanceFileId;
    @ApiModelProperty("设备验收id")
    private Integer acceptanceId;
    @ApiModelProperty("类型:1图片/2文件")
    private Integer type;
    @ApiModelProperty("附件路径")
    private String fileUrl;
    @ApiModelProperty("附件名称")
    private String fileName;
    @ApiModelProperty("创建人")
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    @ApiModelProperty("创建时间")
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    @ApiModelProperty("修改人")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    @ApiModelProperty("修改时间")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
}
cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceAccidentReport.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,120 @@
package com.ruoyi.device.pojo;
import com.baomidou.mybatisplus.annotation.*;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import java.time.LocalDate;
import java.time.LocalDateTime;
/**
 * <p>
 * è®¾å¤‡äº‹æ•…报告单
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2024-12-17 06:31:12
 */
@Getter
@Setter
@TableName("device_accident_report")
@ApiModel(value = "DeviceAccidentReport对象", description = "设备事故报告单")
public class DeviceAccidentReport {
    @TableId(value = "accident_report_id", type = IdType.AUTO)
    private Integer accidentReportId;
    @ApiModelProperty("设备id")
    private Integer deviceId;
    @ApiModelProperty("地址")
    private String address;
    @ApiModelProperty("时间")
    private LocalDateTime accidentDate;
    @ApiModelProperty("事故情况描述")
    private String descriptionOfAccident;
    @ApiModelProperty("报告人id")
    private Integer reportUserId;
    @ApiModelProperty("报告人")
    private String reportUser;
    @ApiModelProperty("报告人填写时间")
    private LocalDate reportDate;
    @ApiModelProperty("评估人意见")
    private String assessorOpinion;
    @ApiModelProperty("评估人id")
    private Integer assessorUserId;
    @ApiModelProperty("评估人")
    private String assessorUser;
    @ApiModelProperty("评估人填写时间")
    private LocalDate assessorDate;
    @ApiModelProperty("部门负责人意见")
    private String departmentHeadOpinion;
    @ApiModelProperty("部门负责人id")
    private Integer departmentHeadUserId;
    @ApiModelProperty("部门负责人")
    private String departmentHeadUser;
    @ApiModelProperty("部门负责人填写时间")
    private LocalDate departmentHeadDate;
    @ApiModelProperty("技术负责人意见")
    private String technicalDirectorOpinion;
    @ApiModelProperty("技术负责人id")
    private Integer technicalDirectorUserId;
    @ApiModelProperty("技术负责人")
    private String technicalDirectorUser;
    @ApiModelProperty("技术负责人填写时间")
    private LocalDate technicalDirectorDate;
    @ApiModelProperty("主任意见")
    private String directorHeadOpinion;
    @ApiModelProperty("主任id")
    private Integer directorHeadUserId;
    @ApiModelProperty("主任")
    private String directorHeadUser;
    @ApiModelProperty("主任填写时间")
    private LocalDate directorHeadDate;
    @ApiModelProperty("是否结束,0 æœªç»“束, 1结束")
    private Integer isFinish;
    @ApiModelProperty("创建人")
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    @ApiModelProperty("创建时间")
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    @ApiModelProperty("修改人")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    @ApiModelProperty("修改时间")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
    @TableField(exist = false,select = false)
    @ApiModelProperty("流程, 0:报告, 1评估, 2:部门负责人意见, 3:技术负责人意见, 4:主任意见")
    private Integer flowType;
}
cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceBorrow.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,133 @@
package com.ruoyi.device.pojo;
import com.alibaba.excel.annotation.ExcelIgnore;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.List;
/**
 * <p>
 *
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2024-09-21 10:53:51
 */
@Getter
@Setter
@TableName("device_borrow")
@ApiModel(value = "DeviceBorrow对象", description = "设备借用")
@ExcelIgnoreUnannotated
public class DeviceBorrow implements Serializable {
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    @ApiModelProperty("流程编号")
    @ExcelProperty(value = "流程编号")
    private String processNumber;
    @ApiModelProperty("设备id")
    private Integer deviceId;
    @ApiModelProperty("管理编号")
    @ExcelProperty(value = "管理编号")
    private String unifyNumber;
    @ApiModelProperty("借用人")
    @ExcelProperty(value = "借用人")
    private String recipientUser;
    @ExcelProperty(value = "借用人联系方式")
    @ApiModelProperty("借用人联系方式")
    private String borrowerContactInformation;
    @ApiModelProperty("借用时状态")
    @ExcelProperty(value = "借用时状态")
    //0合格;1ç»´ä¿®;2停用;3报废
    private Integer recipientState;
    @ApiModelProperty("借用日期")
    @ExcelProperty(value = "提交日期")
    private Date recipientTime;
    @ApiModelProperty("借出人")
    @ExcelProperty(value = "借出人")
    private String submitUser;
    @ApiModelProperty("借出日期")
    @ExcelProperty(value = "借出日期")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    @ApiModelProperty("当前状态")
    @ExcelProperty(value = "当前状态")
    private String nowState;
    @ApiModelProperty("当前责任人")
    @ExcelProperty(value = "当前责任人")
    private String nowUser;
    @ApiModelProperty("附件")
    //路径
    private String url;
    @ApiModelProperty("附件")
    @ExcelProperty(value = "附件")
    //文件名
    private String fileName;
    @ApiModelProperty("下环节责任人")
    private String nextUser;
    @ApiModelProperty("提交操作人")
    private String submitOperationUser;
    @ApiModelProperty("提交操作时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime submitOperationTime;
    @ApiModelProperty("归还人")
    private String rebackUser;
    @ApiModelProperty("归还日期")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime rebackTime;
    @ApiModelProperty("接受状态0合格;1ç»´ä¿®;2停用;3报废")
    private Integer receiveState;
    @ApiModelProperty("设备责任人")
    private String deviceUser;
    @ApiModelProperty("备注")
    private String note;
    @ApiModelProperty("接收操作人")
    private String receiveOperationUser;
    @ApiModelProperty("接收操作时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime receiveOperationTime;
    @ApiModelProperty("设备名称")
    @TableField(select = false, exist = false)
    @ExcelProperty(value = "设备名称")
    private String deviceName;
    @ApiModelProperty("流程跟踪")
    @TableField(select = false, exist = false)
    private List<DeviceLog> deviceLogs;
}
cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceInspectionRecord.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,93 @@
package com.ruoyi.device.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-12-16 04:25:14
 */
@Getter
@Setter
@TableName("device_inspection_record")
@ApiModel(value = "DeviceInspectionRecord对象", description = "")
public class DeviceInspectionRecord implements Serializable {
    @ApiModelProperty("设备点检记录id")
    @TableId(value = "inspection_record_id", type = IdType.AUTO)
    private Integer inspectionRecordId;
    @ApiModelProperty("设备id")
    private Integer deviceId;
    @ApiModelProperty("测量范围")
    private String measurementScope;
    @ApiModelProperty("点检使用物质名称")
    private String materialName;
    @ApiModelProperty("点检使用物质规格型号")
    private String materialModel;
    @ApiModelProperty("点检使用物质管理编号")
    private String materialManagementNumber;
    @ApiModelProperty("点检使用物质精度等级")
    private String materialAccuracyGrade;
    @ApiModelProperty("温度")
    private String temperature;
    @ApiModelProperty("湿度")
    private String humidity;
    @ApiModelProperty("测试结论")
    private String testConclusion;
    @ApiModelProperty("备注")
    private String remark;
    @ApiModelProperty("状态(是否复核)0未复核,1复核")
    private Integer status;
    @ApiModelProperty("测试人")
    private String recorder;
    @ApiModelProperty("测试人id")
    private Integer recorderId;
    @ApiModelProperty("复核人")
    private String reviewer;
    @ApiModelProperty("复核人id")
    private Integer reviewerId;
    @ApiModelProperty("复核信息")
    private String reviewerRemark;
    @ApiModelProperty("测试日期")
    @JsonFormat(pattern = "yyyy-MM-dd")
    private LocalDateTime testDate;
    @ApiModelProperty("创建时间")
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    @ApiModelProperty("修改时间")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
    @ApiModelProperty("修改人id")
    private Integer updateUserId;
}
cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceInspectionRecordDetails.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,63 @@
package com.ruoyi.device.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-12-16 04:27:32
 */
@Getter
@Setter
@TableName("device_inspection_record_details")
@ApiModel(value = "DeviceInspectionRecordDetails对象", description = "")
public class DeviceInspectionRecordDetails implements Serializable {
    private static final long serialVersionUID = 1L;
    @ApiModelProperty("点检详情id")
    @TableId(value = "inspection_record_detail_id", type = IdType.AUTO)
    private Integer inspectionRecordDetailId;
    @ApiModelProperty("点检id")
    private Integer inspectionRecordId;
    @ApiModelProperty("测试项目")
    private String testItems;
    @ApiModelProperty("标准值")
    private String standardValue;
    @ApiModelProperty("实测值")
    private String measuredValue;
    @ApiModelProperty("示值误差")
    private String indicationError;
    @ApiModelProperty("允许误差")
    private String allowableError;
    @ApiModelProperty("单项结论")
    private String singleItemConclusion;
    @ApiModelProperty("创建时间")
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    @ApiModelProperty("修改时间")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
    @ApiModelProperty("修改人id")
    private Integer updateUserId;
}
cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceInstruction.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,64 @@
package com.ruoyi.device.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-12-04 10:29:18
 */
@Getter
@Setter
@TableName("device_instruction")
@ApiModel(value = "Instruction对象", description = "作业指导书添加受控文件表")
public class DeviceInstruction implements Serializable {
    private static final long serialVersionUID = 1L;
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    @ApiModelProperty("申请编号")
    private String applicationNumber;
    @ApiModelProperty("申请部门")
    private String applicationDepartment;
    @ApiModelProperty("责任人")
    private String personLiable;
    @ApiModelProperty("受控申请说明")
    private String controlledApplicationDescription;
    @ApiModelProperty("系统生成名称")
    private String fileName;
    @ApiModelProperty("系统生成名称")
    private String fileSystemName;
    @ApiModelProperty("创建时间")
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    @ApiModelProperty("更新时间")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
    @ApiModelProperty("创建人")
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    @ApiModelProperty("更新人")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
}
cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceLog.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,29 @@
package com.ruoyi.device.pojo;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
@Data
@TableName("device_log") // è®°å½•
public class DeviceLog implements Serializable {
    @TableId(type= IdType.AUTO)
    private Integer id;
    private String operator;
//    @JsonFormat()
    private LocalDateTime operationTime;
    private String operationType;
    private String operationContent;
    private Integer deviceId;
    //关联的表名
    private String relevanceForm;
    //关联的id
    private Integer relevanceId;
}
cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceMetricsCopy.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,66 @@
package com.ruoyi.device.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;
import java.time.LocalDateTime;
/**
 * <p>
 * è®¾å¤‡æ ¡å‡† - æ ¡å‡†è®°å½• - æ ¡å‡†æ¡ç›®
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2024-09-27 10:20:11
 */
@Getter
@Setter
@TableName("device_metrics_copy")
@ApiModel(value = "DeviceMetricsCopy对象", description = "设备校准 - æ ¡å‡†è®°å½• - æ ¡å‡†æ¡ç›®")
public class DeviceMetricsCopy implements Serializable {
    private static final long serialVersionUID = 1L;
    @ApiModelProperty("id")
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    @ApiModelProperty("设备校准 - æ ¡å‡†è®°å½•id")
    private Integer deviceMetricsId;
    @ApiModelProperty("计量参数")
    private String measurementParameter;
    @ApiModelProperty("量程范围")
    private String rangeOfMeasurement;
    @ApiModelProperty("最大允许误差")
    private String maxPermissibleError;
    @ApiModelProperty("判定标准")
    private String judgmentCriteria;
    @ApiModelProperty("创建人")
    private String createdBy;
    @ApiModelProperty("创建时间")
    private LocalDateTime creationTime;
    @ApiModelProperty("是否校准")
    private String isCalibration;
    @ApiModelProperty("判定结果")
    private String result;
    @ApiModelProperty("单项结果说明")
    private String singleResultStatement;
    @ApiModelProperty("calibrate:校准;examine:核查")
    private String type;
}
cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceScrapped.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,105 @@
package com.ruoyi.device.pojo;
import com.baomidou.mybatisplus.annotation.*;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import java.time.LocalDate;
import java.time.LocalDateTime;
/**
 * <p>
 * è®¾å¤‡æŠ¥åºŸç”³è¯·è¡¨
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2024-12-17 01:53:47
 */
@Getter
@Setter
@TableName("device_scrapped")
@ApiModel(value = "DeviceScrapped对象", description = "设备报废申请表")
public class DeviceScrapped {
    @TableId(value = "scrapped_id", type = IdType.AUTO)
    private Integer scrappedId;
    @ApiModelProperty("设备id")
    private Integer deviceId;
    @ApiModelProperty("配件")
    private String parts;
    @ApiModelProperty("报废理由")
    private String reasonsForScrap;
    @ApiModelProperty("申请人id")
    private Integer applicantUserId;
    @ApiModelProperty("申请人")
    private String applicantUser;
    @ApiModelProperty("申请时间")
    private LocalDate applicantDate;
    @ApiModelProperty("部门负责人意见")
    private String departmentHeadOpinion;
    @ApiModelProperty("部门负责人id")
    private Integer departmentHeadUserId;
    @ApiModelProperty("部门负责人")
    private String departmentHeadUser;
    @ApiModelProperty("部门负责人填写时间")
    private LocalDate departmentHeadDate;
    @ApiModelProperty("计量室意见")
    private String meteringRoomOpinion;
    @ApiModelProperty("计量室人id")
    private Integer meteringRoomUserId;
    @ApiModelProperty("计量室人")
    private String meteringRoomUser;
    @ApiModelProperty("计量室人填写时间")
    private LocalDate meteringRoomDate;
    @ApiModelProperty("批准人意见")
    private String approverOpinion;
    @ApiModelProperty("批准人id")
    private Integer approverUserId;
    @ApiModelProperty("批准人")
    private String approverUser;
    @ApiModelProperty("批准人填写时间")
    private LocalDate approverDate;
    @ApiModelProperty("是否结束,0: æœªç»“束, 1:结束")
    private Integer isFinish;
    @ApiModelProperty("创建人")
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    @ApiModelProperty("创建时间")
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    @ApiModelProperty("修改人")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    @ApiModelProperty("修改时间")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
    @TableField(exist = false,select = false)
    @ApiModelProperty("流程, 0:报废申请, 1申请部门负责人意见, 2:计量室意见, 3:批准人")
    private Integer flowType;
}
cnas-device/src/main/java/com/ruoyi/device/pojo/DeviceState.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,107 @@
package com.ruoyi.device.pojo;
import com.alibaba.excel.annotation.ExcelProperty;
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-26 09:51:40
 */
@Getter
@Setter
@TableName("device_state")
@ApiModel(value = "DeviceState对象", description = "设备停用/启用")
public class DeviceState implements Serializable {
    private static final long serialVersionUID = 1L;
    @ApiModelProperty("设备停用启用id")
    @TableId(value = "state_id", type = IdType.AUTO)
    private Integer stateId;
    @ApiModelProperty("流程编号")
    private String processNumber;
    @ApiModelProperty("0配件")
    private String accessoryPart;
    @ApiModelProperty("0设备状态")
    private String deviceStatus;
    @ApiModelProperty("0停用启用理由")
    private String reason;
    @ApiModelProperty("0下环节责任人")
    private String submitNextPesponsible;
    @ApiModelProperty("0操作人")
    private String submitOperatingPersonnel;
    @ApiModelProperty("0日期")
    private LocalDateTime submitDate;
    @ApiModelProperty("1部门负责人意见")
    private String departmentReviewOpinion;
    @ApiModelProperty("1下环节责任人")
    private String departmentNextPesponsible;
    @ApiModelProperty("1操作人")
    private String departmentOperatingPersonnel;
    @ApiModelProperty("1日期")
    private LocalDateTime departmentDate;
    @ApiModelProperty("2计量室意见")
    private String measuringRoomReviewOpinion;
    @ApiModelProperty("2下环节责任人")
    private String measuringRoomNextPesponsible;
    @ApiModelProperty("2操作人")
    private String measuringRoomOperatingPersonnel;
    @ApiModelProperty("2日期")
    private LocalDateTime measuringRoomDate;
    @ApiModelProperty("3批准意见")
    private String approvalOpinion;
    @ApiModelProperty("3下环节责任人")
    private String approvalNextPesponsible;
    @ApiModelProperty("3操作人")
    private String approvalOperatingPersonnel;
    @ApiModelProperty("3日期")
    private LocalDateTime approvalDate;
    @ApiModelProperty("当前状态")
    private String currentState;
    @ApiModelProperty("设备Id")
    private Integer deviceId;
    @ApiModelProperty("当前环节负责人")
    private String currentResponsible;
    @ApiModelProperty("提交人")
    @ExcelProperty(value = "提交人")
    private String createUser;
    @ApiModelProperty("提交日期")
    @ExcelProperty(value = "提交日期")
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
}
cnas-device/src/main/java/com/ruoyi/device/pojo/OperationInstruction.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,88 @@
package com.ruoyi.device.pojo;
import com.baomidou.mybatisplus.annotation.*;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import java.time.LocalDate;
import java.time.LocalDateTime;
/**
 * <p>
 * è®¾å¤‡ - ä½œä¸šæŒ‡å¯¼ä¹¦ æ·»åŠ å—æŽ§æ–‡ä»¶ å­
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2024-12-04 10:43:32
 */
@Getter
@Setter
@TableName("device_operation_instruction")
public class OperationInstruction {
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    @ApiModelProperty("设备主键id")
    private String deviceId;
    @ApiModelProperty("文件类型")
    private String documentType;
    @ApiModelProperty("文档编号")
    private String documentNumber;
    @ApiModelProperty("文件版本")
    private String documentVersion;
    @ApiModelProperty("作者")
    private String author;
    @ApiModelProperty("提交日期")
    private LocalDate submitDate;
    @ApiModelProperty("文档说明")
    private String documentNote;
    @ApiModelProperty("系统生成名称")
    private String fileName;
    @ApiModelProperty("系统生成名称")
    private String fileSystemName;
    @ApiModelProperty("作业指导书id")
    private Integer instructionId;
    @ApiModelProperty("上传人id")
    private Integer uploader;
    @ApiModelProperty("审批人id")
    private Integer approverId;
    @ApiModelProperty("审批状态")
    private Boolean status;
    @ApiModelProperty("生效时间")
    private LocalDateTime entryIntoForceTime;
    @ApiModelProperty("上传时间")
    private LocalDateTime uploadTime;
    @ApiModelProperty("更新时间")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
    @ApiModelProperty("创建时间")
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    @ApiModelProperty("更新人id")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    @ApiModelProperty("创建人id")
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
}
cnas-device/src/main/java/com/ruoyi/device/service/CollectBridgeService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,21 @@
package com.ruoyi.device.service;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.device.pojo.CollectBridge;
/**
 * æ•°å­—电桥采集
 *
 * @author zhuo
 * @since 2025-02-19
 */
public interface CollectBridgeService extends IService<CollectBridge> {
    /**
     * å¡«å……采集数据
     * @param jsonObject
     */
    void addBridgeValue(JSONObject jsonObject);
}
cnas-device/src/main/java/com/ruoyi/device/service/DeviceAcceptanceFileService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,17 @@
package com.ruoyi.device.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.device.pojo.DeviceAcceptanceFile;
/**
 * <p>
 * è®¾å¤‡éªŒæ”¶(装备)附件表 æœåŠ¡ç±»
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2024-12-20 01:45:26
 */
public interface DeviceAcceptanceFileService extends IService<DeviceAcceptanceFile> {
}
cnas-device/src/main/java/com/ruoyi/device/service/DeviceAcceptanceService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,39 @@
package com.ruoyi.device.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.device.pojo.DeviceAcceptance;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
/**
 * <p>
 * è®¾å¤‡éªŒæ”¶(装备) æœåŠ¡ç±»
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2024-12-20 01:45:14
 */
public interface DeviceAcceptanceService extends IService<DeviceAcceptance> {
    /**
     * è®¾å¤‡éªŒæ”¶åˆ—表
     * @param page
     * @param deviceAcceptance
     * @return
     */
    IPage<DeviceAcceptance> pageDeviceAcceptance(Page page, DeviceAcceptance deviceAcceptance);
    boolean uploadDeviceAcceptanceFile(Integer acceptanceId, MultipartFile file);
    /**
     * è®¾å¤‡éªŒæ”¶å¯¼å‡º
     * @param acceptanceId  è®¾å¤‡éªŒæ”¶id
     * @param response   å“åº”体
     * @return
     */
    void exportDeviceAcceptance(Integer acceptanceId, HttpServletResponse response);
}
cnas-device/src/main/java/com/ruoyi/device/service/DeviceAccidentReportService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,41 @@
package com.ruoyi.device.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.device.pojo.DeviceAccidentReport;
import javax.servlet.http.HttpServletResponse;
/**
 * <p>
 * è®¾å¤‡äº‹æ•…报告单 æœåŠ¡ç±»
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2024-12-17 06:31:12
 */
public interface DeviceAccidentReportService extends IService<DeviceAccidentReport> {
    /**
     * è®¾å¤‡äº‹æ•…报告列表
     * @param page
     * @param deviceAccidentReport
     * @return
     */
    IPage<DeviceAccidentReport> pageDeviceAccidentReport(Page page, DeviceAccidentReport deviceAccidentReport);
    /**
     * æ–°å¢žè®¾å¤‡äº‹æ•…报告
     * @param deviceAccidentReport
     * @return
     */
    boolean addDeviceAccidentReport(DeviceAccidentReport deviceAccidentReport);
    /**
     * å¯¼å‡ºè®¾å¤‡äº‹æ•…报告
     * @param accidentReportId è®¾å¤‡äº‹æ•…报告id
     * @param response å“åº”
     */
    void exportDeviceAccidentReport(Integer accidentReportId, HttpServletResponse response);
}
cnas-device/src/main/java/com/ruoyi/device/service/DeviceBorrowService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,28 @@
package com.ruoyi.device.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.device.pojo.DeviceBorrow;
import java.util.List;
import java.util.Map;
/**
 * <p>
 *  æœåŠ¡ç±»
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2024-09-21 10:53:51
 */
public interface DeviceBorrowService extends IService<DeviceBorrow> {
    IPage<DeviceBorrow> deviceBorrowPage(Page page, DeviceBorrow deviceBorrow);
    int saveDeviceBorrow(DeviceBorrow deviceBorrow);
    DeviceBorrow getDeviceBorrow(Integer id);
    List<DeviceBorrow> getDeviceBorrowBydeviceId(Integer deviceId);
}
cnas-device/src/main/java/com/ruoyi/device/service/DeviceBreakdownMaintenanceService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,41 @@
package com.ruoyi.device.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.device.dto.DeviceBreakdownMaintenance;
import javax.servlet.http.HttpServletResponse;
/**
 * <p>
 * è®¾å¤‡æ•…障维修表 æœåŠ¡ç±»
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2024-12-17 04:50:57
 */
public interface DeviceBreakdownMaintenanceService extends IService<DeviceBreakdownMaintenance> {
    /**
     * è®¾å¤‡æ•…障维修列表
     * @param page
     * @param deviceBreakdownMaintenance
     * @return
     */
    IPage<DeviceBreakdownMaintenance> pageDeviceBreakdownMaintenance(Page page, DeviceBreakdownMaintenance deviceBreakdownMaintenance);
    /**
     * æ–°å¢žè®¾å¤‡æ•…障维修
     * @param deviceBreakdownMaintenance
     * @return
     */
    boolean addDeviceBreakdownMaintenance(DeviceBreakdownMaintenance deviceBreakdownMaintenance);
    /**
     * å¯¼å‡ºè®¾å¤‡æ•…障维修
     * @param maintenanceId è®¾å¤‡æ•…障维修id
     * @param response å“åº”
     */
    void exportDeviceBreakdownMaintenance(Integer maintenanceId, HttpServletResponse response);
}
cnas-device/src/main/java/com/ruoyi/device/service/DeviceInspectionRecordDetailsService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,16 @@
package com.ruoyi.device.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.device.pojo.DeviceInspectionRecordDetails;
/**
 * <p>
 *  æœåŠ¡ç±»
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2024-12-16 04:27:32
 */
public interface DeviceInspectionRecordDetailsService extends IService<DeviceInspectionRecordDetails> {
}
cnas-device/src/main/java/com/ruoyi/device/service/DeviceInspectionRecordService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,69 @@
package com.ruoyi.device.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.common.core.domain.Result;
import com.ruoyi.device.dto.DeviceInspectionRecordDto;
import com.ruoyi.device.pojo.DeviceInspectionRecord;
import javax.servlet.http.HttpServletResponse;
/**
 * <p>
 *  è®¾å¤‡ç‚¹æ£€è®°å½•表 æœåŠ¡ç±»
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2024-12-16 04:25:14
 */
public interface DeviceInspectionRecordService extends IService<DeviceInspectionRecord> {
    /**
     * åˆ†é¡µæŸ¥è¯¢è®¾å¤‡ç‚¹æ£€è®°å½•
     * @param page
     */
    Result<IPage<DeviceInspectionRecord>> getDeviceInspectionRecordByPage(IPage page, DeviceInspectionRecordDto deviceInspectionRecord);
    /**
     * æŸ¥è¯¢ç‚¹æ£€è¯¦æƒ…
     * @param inspectionRecordId
     * @return
     */
    Result getDeviceInspectionRecord(Integer inspectionRecordId);
    /**
     * æ–°å¢žè®¾å¤‡ç‚¹æ£€è®°å½•
     *
     * @param deviceInspectionRecord è®¾å¤‡ç‚¹æ£€è®°å½•
     */
    Result addDeviceInspectionRecord(DeviceInspectionRecordDto deviceInspectionRecord);
    /**
     * ä¿®æ”¹è®¾å¤‡ç‚¹æ£€è®°å½•
     * @param deviceInspectionRecord è®¾å¤‡ç‚¹æ£€è®°å½•
     */
    Result updateInspectionRecordAndDetails(DeviceInspectionRecordDto deviceInspectionRecord);
    /**
     * åˆ é™¤è®¾å¤‡ç‚¹æ£€è®°å½•
     * @param deviceInspectionRecord è®¾å¤‡ç‚¹æ£€è®°å½•
     */
    Result deleteDeviceInspectionRecordOrDetails(DeviceInspectionRecordDto deviceInspectionRecord);
    /**
     * å¤æ ¸ç‚¹æ£€è®°å½•
     * @param deviceExamineRecordDto
     * @return
     */
    Result reviewDeviceInspectionRecord(DeviceInspectionRecordDto deviceExamineRecordDto);
    /**
     * å¯¼å‡ºè®¾å¤‡ç‚¹æ£€è®°å½•
     *
     * @param deviceInspectionRecordId è®¾å¤‡ç‚¹æ£€è®°å½•id
     * @param response
     */
    Result exportDeviceInspectionRecord(Integer deviceInspectionRecordId, HttpServletResponse response);
}
cnas-device/src/main/java/com/ruoyi/device/service/DeviceInstructionService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
package com.ruoyi.device.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.device.dto.DeviceInstructionDto;
import com.ruoyi.device.dto.DeviceOperationInstructionDto;
import com.ruoyi.device.pojo.DeviceInstruction;
/**
 * <p>
 * ä½œä¸šæŒ‡å¯¼ä¹¦æ·»åŠ å—æŽ§æ–‡ä»¶è¡¨ æœåŠ¡ç±»
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2024-12-04 10:29:18
 */
public interface DeviceInstructionService extends IService<DeviceInstruction> {
    IPage<DeviceInstruction> pageByPageQueryOfHomeworkInstructions(Page page, DeviceOperationInstructionDto operationInstructionDto);
    void newHomeworkGuidebookAdded(DeviceInstructionDto instructionDto);
}
cnas-device/src/main/java/com/ruoyi/device/service/DeviceMaintenanceService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,24 @@
package com.ruoyi.device.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.device.excel.DeviceMaintenanceExport;
import com.ruoyi.device.pojo.DeviceMaintenance;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
public interface DeviceMaintenanceService extends IService<DeviceMaintenance> {
    IPage<DeviceMaintenance> getDeviceMaintenancePage(Page page, Integer deviceId, String deviceNumber);
    List<DeviceMaintenanceExport> deviceMaintenanceExport(Integer deviceId);
    /**
     * å¯¼å‡ºWord设备维护记录
     *
     * @param deviceId
     * @param response
     */
    void exportMaintenanceRecord(Integer deviceId, HttpServletResponse response);
}
cnas-device/src/main/java/com/ruoyi/device/service/DeviceMetricRecordService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,16 @@
package com.ruoyi.device.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.device.pojo.DeviceMetricRecord;
/**
 * <p>
 * è®¾å¤‡æ ¡å‡† - æ ¡å‡†è®°å½• æœåŠ¡ç±»
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2024-09-27 10:20:01
 */
public interface DeviceMetricRecordService extends IService<DeviceMetricRecord> {
}
cnas-device/src/main/java/com/ruoyi/device/service/DeviceMetricsCopyService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,16 @@
package com.ruoyi.device.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.device.pojo.DeviceMetricsCopy;
/**
 * <p>
 * è®¾å¤‡æ ¡å‡† - æ ¡å‡†è®°å½• - æ ¡å‡†æ¡ç›® æœåŠ¡ç±»
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2024-09-27 10:20:11
 */
public interface DeviceMetricsCopyService extends IService<DeviceMetricsCopy> {
}
cnas-device/src/main/java/com/ruoyi/device/service/DeviceOperationInstructionService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
package com.ruoyi.device.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.device.dto.DeviceOperationInstructionDto;
import com.ruoyi.device.pojo.OperationInstruction;
import java.util.List;
/**
 * <p>
 * è®¾å¤‡ - ä½œä¸šæŒ‡å¯¼ä¹¦ æ·»åŠ å—æŽ§æ–‡ä»¶ å­ æœåŠ¡ç±»
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2024-12-04 10:43:32
 */
public interface DeviceOperationInstructionService extends IService<OperationInstruction> {
    List<DeviceOperationInstructionDto> homeworkGuidebookEditor(Integer instructionId);
}
cnas-device/src/main/java/com/ruoyi/device/service/DeviceScrappedService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,43 @@
package com.ruoyi.device.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.Result;
import com.ruoyi.device.pojo.DeviceScrapped;
import javax.servlet.http.HttpServletResponse;
/**
 * <p>
 * è®¾å¤‡æŠ¥åºŸç”³è¯·è¡¨ æœåŠ¡ç±»
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2024-12-17 01:53:47
 */
public interface DeviceScrappedService extends IService<DeviceScrapped> {
    /**
     * è®¾å¤‡æŠ¥åºŸç”³è¯·åˆ—表
     * @param page
     * @param deviceScrapped
     * @return
     */
    IPage<DeviceScrapped> pageDeviceScrapped(Page page, DeviceScrapped deviceScrapped);
    /**
     * æ–°å¢žè®¾å¤‡æŠ¥åºŸç”³è¯·
     * @param deviceScrapped
     * @return
     */
    boolean addDeviceScrapped(DeviceScrapped deviceScrapped);
    /**
     * ä¿®æ”¹è®¾å¤‡æŠ¥åºŸç”³è¯·
     * @param scrappedId è®¾å¤‡æŠ¥åºŸç”³è¯·id
     * @return
     */
    Result exportDeviceScrapped(Integer scrappedId, HttpServletResponse response);
}
cnas-device/src/main/java/com/ruoyi/device/service/DeviceStateService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,31 @@
package com.ruoyi.device.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.device.dto.DeviceStateDto;
import com.ruoyi.device.pojo.DeviceState;
import javax.servlet.http.HttpServletResponse;
/**
 * <p>
 * è®¾å¤‡åœç”¨/启用 æœåŠ¡ç±»
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2024-09-26 09:51:40
 */
public interface DeviceStateService extends IService<DeviceState> {
    IPage<DeviceStateDto> getDeviceStatePage(Integer deviceId, Page page, String processNumber);
    /**
     * å¯¼å‡ºè®¾å¤‡çŠ¶æ€
     *
     * @param deviceId
     * @param processNumber
     * @param response
     */
    void exportDeviceStatus(Integer deviceId, String processNumber, HttpServletResponse response);
}
cnas-device/src/main/java/com/ruoyi/device/service/impl/CollectBridgeServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,107 @@
package com.ruoyi.device.service.impl;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.device.mapper.CollectBridgeMapper;
import com.ruoyi.device.pojo.CollectBridge;
import com.ruoyi.device.service.CollectBridgeService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.time.Duration;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
/**
 * æ•°å­—电桥采集
 *
 * @author zhuo
 * @since 2025-02-19
 */
@Service
@Slf4j
public class CollectBridgeServiceImpl extends ServiceImpl<CollectBridgeMapper, CollectBridge> implements CollectBridgeService {
    /**
     * å¡«å……采集数据
     * @param jsonObject
     */
    @Override
    public void addBridgeValue(JSONObject jsonObject) {
        JSONArray dataArray = jsonObject.getJSONArray("data");
        for (int i = 0; i < dataArray.size(); i++) {
            JSONObject listInfo = dataArray.getJSONObject(i);
            // å­˜å‚¨æ•°æ®
            String dataStream = listInfo.getString("dataStream");
            if (dataStream.equals("DQCS.DQCS.SN")) {
                JSONArray dataPoints = listInfo.getJSONArray("dataPoints");
                JSONObject pointsJSONObject = dataPoints.getJSONObject(0);
                String entrustCode = pointsJSONObject.getString("value");
                // è§£æžæ—¶é—´æˆ³
                Instant instant = Instant.ofEpochMilli(pointsJSONObject.getLong("time"));
                LocalDateTime collectDate = LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
                // å…ˆå­˜å‚¨ç¼–号, åŽç»­å­˜å‚¨å€¼
                CollectBridge collectBridge = new CollectBridge();
                collectBridge.setEntrustCode(entrustCode);
                collectBridge.setCollectDate(collectDate);
                baseMapper.insert(collectBridge);
            }
            // å¯„存器地址等于64获取结果值
            if (dataStream.equals("DQCS.DQCS.64")) {
                JSONArray dataPoints = listInfo.getJSONArray("dataPoints");
                JSONObject pointsJSONObject = dataPoints.getJSONObject(0);
                String value = pointsJSONObject.getString("value");
                if (value.equals("64")) {
                    for (int j = 0; j < dataArray.size(); j++) {
                        JSONObject listInfo2 = dataArray.getJSONObject(j);
                        String dataStream2 = listInfo2.getString("dataStream");
                        // å¯„存器地址等于64获取结果值
                        if (dataStream2.equals("DQCS.DQCS.DZZ")) {
                            JSONArray dataPoints2 = listInfo2.getJSONArray("dataPoints");
                            JSONObject pointsJSONObject2 = dataPoints2.getJSONObject(0);
                            String collectValue = pointsJSONObject2.getString("value");
                            // è§£æžæ—¶é—´æˆ³
                            Instant instant = Instant.ofEpochMilli(pointsJSONObject2.getLong("time"));
                            LocalDateTime collectDate = LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
                            // æŸ¥è¯¢æœ€æ–°ä¸€æ¡æ•°æ®
                            CollectBridge collectBridge = baseMapper.selectOne(Wrappers.<CollectBridge>lambdaQuery()
                                    .orderByDesc(CollectBridge::getCollectDate)
                                    .last("limit 1"));
                            // åˆ¤æ–­ä¸¤æ¡æ•°æ®æ˜¯å¦ç›¸å·®åœ¨10分钟之内和有没有编号
                            if (isWithinTenMinutes(collectDate, collectBridge.getCollectDate()) &&
                                    StringUtils.isNotBlank(collectBridge.getEntrustCode())) {
                                // ä¿®æ”¹æ£€éªŒå€¼
                                collectBridge.setCollectValue(collectValue);
                                baseMapper.updateById(collectBridge);
                            } else {
                                // åªå­˜å‚¨å€¼
                                CollectBridge bridge = new CollectBridge();
                                bridge.setCollectValue(collectValue);
                                bridge.setCollectDate(collectDate);
                                baseMapper.insert(bridge);
                            }
                        }
                    }
                }
            }
        }
    }
    public static boolean isWithinTenMinutes(LocalDateTime dateTime1, LocalDateTime dateTime2) {
        Duration duration = Duration.between(dateTime1, dateTime2);
        long minutesDifference = Math.abs(duration.toMinutes());
        return minutesDifference <= 10;
    }
}
cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceAcceptanceFileServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
package com.ruoyi.device.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.device.mapper.DeviceAcceptanceFileMapper;
import com.ruoyi.device.pojo.DeviceAcceptanceFile;
import com.ruoyi.device.service.DeviceAcceptanceFileService;
import org.springframework.stereotype.Service;
/**
 * <p>
 * è®¾å¤‡éªŒæ”¶(装备)附件表 æœåŠ¡å®žçŽ°ç±»
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2024-12-20 01:45:26
 */
@Service
public class DeviceAcceptanceFileServiceImpl extends ServiceImpl<DeviceAcceptanceFileMapper, DeviceAcceptanceFile> implements DeviceAcceptanceFileService {
}
cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceAcceptanceServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,159 @@
package com.ruoyi.device.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.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.config.Configure;
import com.ruoyi.common.utils.QueryWrappers;
import com.ruoyi.device.mapper.DeviceAcceptanceFileMapper;
import com.ruoyi.device.mapper.DeviceAcceptanceMapper;
import com.ruoyi.device.mapper.DeviceMapper;
import com.ruoyi.device.pojo.Device;
import com.ruoyi.device.pojo.DeviceAcceptance;
import com.ruoyi.device.pojo.DeviceAcceptanceFile;
import com.ruoyi.device.service.DeviceAcceptanceService;
import com.ruoyi.framework.exception.ErrorException;
import com.ruoyi.inspect.util.HackLoopTableRenderPolicy;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.HashMap;
/**
 * <p>
 * è®¾å¤‡éªŒæ”¶(装备) æœåŠ¡å®žçŽ°ç±»
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2024-12-20 01:45:14
 */
@Service
public class DeviceAcceptanceServiceImpl extends ServiceImpl<DeviceAcceptanceMapper, DeviceAcceptance> implements DeviceAcceptanceService {
    @Resource
    private DeviceAcceptanceFileMapper deviceAcceptanceFileMapper;
    @Resource
    private DeviceMapper deviceMapper;
    @Value("${file.path}")
    private String imgUrl;
    @Value("${wordUrl}")
    private String wordUrl;
    /**
     * è®¾å¤‡éªŒæ”¶åˆ—表
     * @param page
     * @param deviceAcceptance
     * @return
     */
    @Override
    public IPage<DeviceAcceptance> pageDeviceAcceptance(Page page, DeviceAcceptance deviceAcceptance) {
        return baseMapper.pageDeviceAcceptance(page, QueryWrappers.queryWrappers(deviceAcceptance));
    }
    /**
     * è®¾å¤‡éªŒæ”¶é™„ä»¶
     * @param acceptanceId
     * @param file
     * @return
     */
    @Override
    public boolean uploadDeviceAcceptanceFile(Integer acceptanceId, MultipartFile file) {
        if (acceptanceId == null) {
            throw new ErrorException("缺少验收id");
        }
        String urlString;
        String pathName;
        String path;
        String filename = file.getOriginalFilename();
        String contentType = file.getContentType();
        DeviceAcceptanceFile acceptanceFile = new DeviceAcceptanceFile();
        acceptanceFile.setAcceptanceId(acceptanceId);
        acceptanceFile.setFileName(filename);
        if (contentType != null && contentType.startsWith("image/")) {
            // æ˜¯å›¾ç‰‡
            path = imgUrl;
            acceptanceFile.setType(1);
        } else {
            // æ˜¯æ–‡ä»¶
            path = wordUrl;
            acceptanceFile.setType(2);
        }
        try {
            File realpath = new File(path);
            if (!realpath.exists()) {
                realpath.mkdirs();
            }
            pathName = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyMMddHHmmss")) + "_" + file.getOriginalFilename();
            urlString = realpath + "/" + pathName;
            file.transferTo(new File(urlString));
            acceptanceFile.setFileUrl(pathName);
            deviceAcceptanceFileMapper.insert(acceptanceFile);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            System.err.println("附件上传错误");
            return false;
        }
    }
    /**
     * è®¾å¤‡éªŒæ”¶å¯¼å‡º
     * @param acceptanceId  è®¾å¤‡éªŒæ”¶id
     * @param response   å“åº”体
     * @return
     */
    @Override
    public void exportDeviceAcceptance(Integer acceptanceId, HttpServletResponse response) {
        DeviceAcceptance deviceAcceptance = baseMapper.selectById(acceptanceId);
        if (deviceAcceptance == null) {
            throw new ErrorException("设备验收不存在");
        }
        Device device = null;
        if (deviceAcceptance.getDeviceId() != null) {
            device = deviceMapper.selectById(deviceAcceptance.getDeviceId());
        }
        // èŽ·å–è·¯å¾„
        InputStream inputStream = this.getClass().getResourceAsStream("/static/word/acceptance-certificate.docx");
        Configure configure = Configure.builder()
                .bind("deviceInspectionRecordDetailsList", new HackLoopTableRenderPolicy())
                .build();
        Device finalDevice = device;
        String deviceName = device.getDeviceName() == null ? "" : device.getDeviceName();
        XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
                new HashMap<String, Object>() {{
                    put("deviceAcceptance", deviceAcceptance);
                    put("device", finalDevice);
                }});
        try {
            response.setContentType("application/msword");
            String fileName = URLEncoder.encode(
                    deviceName+ "验收单", "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-device/src/main/java/com/ruoyi/device/service/impl/DeviceAccidentReportServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,189 @@
package com.ruoyi.device.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.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.config.Configure;
import com.ruoyi.common.core.domain.entity.User;
import com.ruoyi.common.utils.QueryWrappers;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.device.dto.DeviceAccidentReportDto;
import com.ruoyi.device.mapper.DeviceAccidentReportMapper;
import com.ruoyi.device.mapper.DeviceMapper;
import com.ruoyi.device.pojo.Device;
import com.ruoyi.device.pojo.DeviceAccidentReport;
import com.ruoyi.device.service.DeviceAccidentReportService;
import com.ruoyi.inspect.util.UserUtils;
import com.ruoyi.system.mapper.UserMapper;
import org.springframework.beans.BeanUtils;
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.LocalDate;
import java.util.HashMap;
/**
 * <p>
 * è®¾å¤‡äº‹æ•…报告单 æœåŠ¡å®žçŽ°ç±»
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2024-12-17 06:31:12
 */
@Service
public class DeviceAccidentReportServiceImpl extends ServiceImpl<DeviceAccidentReportMapper, DeviceAccidentReport> implements DeviceAccidentReportService {
    @Resource
    private UserMapper userMapper;
    @Resource
    private DeviceMapper deivceMapper;
    /**
     * è®¾å¤‡äº‹æ•…报告列表
     * @param page
     * @param deviceAccidentReport
     * @return
     */
    @Override
    public IPage<DeviceAccidentReport> pageDeviceAccidentReport(Page page, DeviceAccidentReport deviceAccidentReport) {
        return baseMapper.pageDeviceAccidentReport(page, QueryWrappers.queryWrappers(deviceAccidentReport));
    }
    /**
     * æ–°å¢žè®¾å¤‡äº‹æ•…报告
     * @param deviceAccidentReport
     * @return
     */
    @Override
    public boolean addDeviceAccidentReport(DeviceAccidentReport deviceAccidentReport) {
        DeviceAccidentReport accidentReport = new DeviceAccidentReport();
        User user = userMapper.selectById(SecurityUtils.getUserId().intValue());
        switch (deviceAccidentReport.getFlowType()) {
            case 0:
                // æŠ¥å‘Š
                BeanUtils.copyProperties(deviceAccidentReport, accidentReport);
                accidentReport.setDescriptionOfAccident(deviceAccidentReport.getDescriptionOfAccident());
                accidentReport.setReportUserId(user.getId());
                accidentReport.setReportUser(user.getName());
                accidentReport.setReportDate(LocalDate.now());
                // è¯„估人信息
                User assessorUser = userMapper.selectById(deviceAccidentReport.getAssessorUserId());
                accidentReport.setAssessorUserId(assessorUser.getId());
                accidentReport.setAssessorUser(assessorUser.getName());
                baseMapper.insert(accidentReport);
                break;
            case 1:
                accidentReport.setAccidentReportId(deviceAccidentReport.getAccidentReportId());
                // è¯„ä¼°
                accidentReport.setAssessorOpinion(deviceAccidentReport.getAssessorOpinion());
                accidentReport.setAssessorDate(LocalDate.now());
                // éƒ¨é—¨è´Ÿè´£äºº
                User departmentHeadUser = userMapper.selectById(deviceAccidentReport.getDepartmentHeadUserId());
                accidentReport.setDepartmentHeadUserId(departmentHeadUser.getId());
                accidentReport.setDepartmentHeadUser(departmentHeadUser.getName());
                baseMapper.updateById(accidentReport);
                break;
            case 2:
                accidentReport.setAccidentReportId(deviceAccidentReport.getAccidentReportId());
                // éƒ¨é—¨è´Ÿè´£äººæ„è§
                accidentReport.setDepartmentHeadOpinion(deviceAccidentReport.getDepartmentHeadOpinion());
                accidentReport.setDepartmentHeadDate(LocalDate.now());
                // æŠ€æœ¯è´Ÿè´£äººä¿¡æ¯
                User technicalDirectorUser = userMapper.selectById(deviceAccidentReport.getTechnicalDirectorUserId());
                accidentReport.setTechnicalDirectorUserId(technicalDirectorUser.getId());
                accidentReport.setTechnicalDirectorUser(technicalDirectorUser.getName());
                baseMapper.updateById(accidentReport);
                break;
            case 3:
                accidentReport.setAccidentReportId(deviceAccidentReport.getAccidentReportId());
                // æŠ€æœ¯è´Ÿè´£äººæ„è§
                accidentReport.setTechnicalDirectorOpinion(deviceAccidentReport.getTechnicalDirectorOpinion());
                accidentReport.setTechnicalDirectorDate(LocalDate.now());
                // ä¸»ä»»ä¿¡æ¯
                User directorHeadUser = userMapper.selectById(deviceAccidentReport.getDirectorHeadUserId());
                accidentReport.setDirectorHeadUserId(directorHeadUser.getId());
                accidentReport.setDirectorHeadUser(directorHeadUser.getName());
                baseMapper.updateById(accidentReport);
                break;
            case 4:
                accidentReport.setAccidentReportId(deviceAccidentReport.getAccidentReportId());
                // ä¸»ä»»æ„è§
                accidentReport.setDirectorHeadOpinion(deviceAccidentReport.getDirectorHeadOpinion());
                accidentReport.setDirectorHeadDate(LocalDate.now());
                accidentReport.setIsFinish(1);
                baseMapper.updateById(accidentReport);
                break;
        }
        return true;
    }
    /**
     * å¯¼å‡ºè®¾å¤‡äº‹æ•…报告
     * @param accidentReportId è®¾å¤‡äº‹æ•…报告id
     * @param response å“åº”
     */
    @Override
    public void exportDeviceAccidentReport(Integer accidentReportId, HttpServletResponse response) {
        // æŸ¥è¯¢äº‹æ•…报告
        DeviceAccidentReportDto deviceAccidentReport = baseMapper.selectDeviceAccidentReportById(accidentReportId);
        Device device = deivceMapper.selectById(deviceAccidentReport.getDeviceId());
        device = device == null ? new Device() : device;
        // èŽ·å–è·¯å¾„
        InputStream inputStream = this.getClass().getResourceAsStream("/static/word/device-accident-report.docx");
        Configure configure = Configure.builder()
                .build();
        Device finalDevice = device;
        XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
                new HashMap<String, Object>() {{
                    put("deviceAccidentReport", deviceAccidentReport);
                    put("device", finalDevice);
                    // æŠ¥å‘Šäººç­¾å
                    put("reportUserUrl", UserUtils.getFinalUserSignatureUrl(deviceAccidentReport.getReportUserId()));
                    // è¯„估人签名
                    put("assessorUserUrl", UserUtils.getFinalUserSignatureUrl(deviceAccidentReport.getAssessorUserId()));
                    // éƒ¨é—¨è´Ÿè´£äººç­¾å
                    put("departmentHeadUserUrl", UserUtils.getFinalUserSignatureUrl(deviceAccidentReport.getDepartmentHeadUserId()));
                    // æŠ€æœ¯è´Ÿè´£äººç­¾å
                    put("technicalDirectorUserUrl", UserUtils.getFinalUserSignatureUrl(deviceAccidentReport.getTechnicalDirectorUserId()));
                    // ä¸»ä»»ç­¾å
                    put("directorHeadUserUrl", UserUtils.getFinalUserSignatureUrl(deviceAccidentReport.getDepartmentHeadUserId()));
                }});
        try {
            response.setContentType("application/msword");
            String deviceName = device.getDeviceName() == null ? "" : device.getDeviceName();
            String fileName = URLEncoder.encode(
                    deviceName + "设备事故报告单", "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-device/src/main/java/com/ruoyi/device/service/impl/DeviceBorrowServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,116 @@
package com.ruoyi.device.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.core.domain.entity.User;
import com.ruoyi.common.numgen.NumberGenerator;
import com.ruoyi.common.utils.QueryWrappers;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.device.mapper.DeviceBorrowMapper;
import com.ruoyi.device.mapper.DeviceLogMapper;
import com.ruoyi.device.pojo.DeviceBorrow;
import com.ruoyi.device.pojo.DeviceLog;
import com.ruoyi.device.service.DeviceBorrowService;
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 java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.util.*;
/**
 * <p>
 * æœåŠ¡å®žçŽ°ç±»
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2024-09-21 10:53:51
 */
@Service
@Transactional(rollbackFor = Exception.class)
public class DeviceBorrowServiceImpl extends ServiceImpl<DeviceBorrowMapper, DeviceBorrow> implements DeviceBorrowService {
    @Resource
    private DeviceBorrowMapper deviceBorrowMapper;
    @Resource
    private DeviceLogMapper deviceLogMapper;
    @Resource
    private UserMapper userMapper;
    @Autowired
    private NumberGenerator<DeviceBorrow> numberGenerator;
    @Override
    public IPage<DeviceBorrow> deviceBorrowPage(Page page, DeviceBorrow deviceBorrow) {
        return deviceBorrowMapper.deviceBorrowPage(page, QueryWrappers.queryWrappers(deviceBorrow));
    }
    @Override
    public int saveDeviceBorrow(DeviceBorrow deviceBorrow) {
        Integer userId = SecurityUtils.getUserId().intValue();
        User user = userMapper.selectById(userId);
        //新增的时候添加新建流程
        if (ObjectUtils.isEmpty(deviceBorrow.getId())) {
            deviceBorrow.setSubmitUser(user.getName());
            String year = new SimpleDateFormat("yy", Locale.CHINESE).format(new Date());
            String month = new SimpleDateFormat("MM", Locale.CHINESE).format(new Date());
            String processNumber = numberGenerator.generateNumberWithPrefix(3, "DG-TC-23FM " + month + "-" + year + month, DeviceBorrow::getProcessNumber);
            deviceBorrow.setProcessNumber(processNumber);
            deviceBorrowMapper.insert(deviceBorrow);
            DeviceLog deviceLog = new DeviceLog();
            deviceLog.setOperator(user.getName());
            deviceLog.setOperationTime(LocalDateTime.now());
            deviceLog.setOperationType("新建");
            deviceLog.setOperationContent("新建流程");
            deviceLog.setRelevanceForm("device_borrow");
            deviceLog.setRelevanceId(deviceBorrow.getId());
            deviceLogMapper.insert(deviceLog);
        } else {
            DeviceBorrow borrow = deviceBorrowMapper.selectById(deviceBorrow.getId());
            deviceBorrowMapper.updateById(deviceBorrow);
            //通过或者驳回增加流程跟踪
            if (deviceBorrow.getNowState().equals("关闭")) {
                DeviceLog deviceLog = new DeviceLog();
                deviceLog.setOperator(user.getName());
                deviceLog.setOperationTime(LocalDateTime.now());
                deviceLog.setOperationType("接收通过");
                deviceLog.setRelevanceForm("device_borrow");
                deviceLog.setRelevanceId(deviceBorrow.getId());
                deviceLogMapper.insert(deviceLog);
            }
            else if (deviceBorrow.getNowState().equals("提交") && borrow.getNowState().equals("接收")) {
                DeviceLog deviceLog = new DeviceLog();
                deviceLog.setOperator(user.getName());
                deviceLog.setOperationTime(LocalDateTime.now());
                deviceLog.setOperationType("接收驳回");
                deviceLog.setRelevanceForm("device_borrow");
                deviceLog.setRelevanceId(deviceBorrow.getId());
                deviceLogMapper.insert(deviceLog);
            }
        }
        return 0;
    }
    @Override
    public DeviceBorrow getDeviceBorrow(Integer id) {
        List<DeviceLog> deviceLogs = deviceLogMapper.selectList(Wrappers.<DeviceLog>lambdaQuery()
                .eq(DeviceLog::getRelevanceForm, "device_borrow")
                .eq(DeviceLog::getRelevanceId, id));
        DeviceBorrow deviceBorrow = deviceBorrowMapper.selectById(id);
        deviceBorrow.setDeviceLogs(deviceLogs);
        return deviceBorrow;
    }
    @Override
    public List<DeviceBorrow> getDeviceBorrowBydeviceId(Integer deviceId) {
        return deviceBorrowMapper.getDeviceBorrowBydeviceId(deviceId);
    }
}
cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceBreakdownMaintenanceServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,152 @@
package com.ruoyi.device.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.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.config.Configure;
import com.ruoyi.common.core.domain.entity.User;
import com.ruoyi.common.utils.QueryWrappers;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.device.dto.DeviceBreakdownMaintenance;
import com.ruoyi.device.mapper.DeviceBreakdownMaintenanceMapper;
import com.ruoyi.device.mapper.DeviceMapper;
import com.ruoyi.device.pojo.Device;
import com.ruoyi.device.service.DeviceBreakdownMaintenanceService;
import com.ruoyi.inspect.util.UserUtils;
import com.ruoyi.system.mapper.UserMapper;
import org.springframework.beans.BeanUtils;
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.LocalDate;
import java.util.HashMap;
/**
 * <p>
 * è®¾å¤‡æ•…障维修表 æœåŠ¡å®žçŽ°ç±»
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2024-12-17 04:50:57
 */
@Service
public class DeviceBreakdownMaintenanceServiceImpl extends ServiceImpl<DeviceBreakdownMaintenanceMapper, DeviceBreakdownMaintenance> implements DeviceBreakdownMaintenanceService {
    @Resource
    private UserMapper userMapper;
    @Resource
    private DeviceMapper deivceMapper;
    /**
     * è®¾å¤‡æ•…障维修列表
     * @param page
     * @param deviceBreakdownMaintenance
     * @return
     */
    @Override
    public IPage<DeviceBreakdownMaintenance> pageDeviceBreakdownMaintenance(Page page, DeviceBreakdownMaintenance deviceBreakdownMaintenance) {
        return baseMapper.pageDeviceBreakdownMaintenance(page, QueryWrappers.queryWrappers(deviceBreakdownMaintenance));
    }
    /**
     * æ–°å¢žè®¾å¤‡æ•…障维修
     * @param deviceBreakdownMaintenance
     * @return
     */
    @Override
    public boolean addDeviceBreakdownMaintenance(DeviceBreakdownMaintenance deviceBreakdownMaintenance) {
        DeviceBreakdownMaintenance breakdownMaintenance = new DeviceBreakdownMaintenance();
        //当前登录用户
        User user = userMapper.selectById(SecurityUtils.getUserId().intValue());
        switch (deviceBreakdownMaintenance.getFlowType()) {
            case 0:
                BeanUtils.copyProperties(deviceBreakdownMaintenance, breakdownMaintenance);
                // ç”³è¯·
                breakdownMaintenance.setDamageOrMalfunction(deviceBreakdownMaintenance.getDamageOrMalfunction());
                breakdownMaintenance.setApplicantUserId(user.getId());
                breakdownMaintenance.setApplicantUser(user.getName());
                breakdownMaintenance.setRepairDate(deviceBreakdownMaintenance.getRepairDate());
                // å¤„理人信息
                User departmentHeadUser = userMapper.selectById(deviceBreakdownMaintenance.getDepartmentHeadUserId());
                breakdownMaintenance.setApplicantUserId(departmentHeadUser.getId());
                breakdownMaintenance.setApplicantUser(departmentHeadUser.getName());
                baseMapper.insert(breakdownMaintenance);
                break;
            case 1:
                breakdownMaintenance.setMaintenanceId(deviceBreakdownMaintenance.getMaintenanceId());
                // ç”³è¯·éƒ¨é—¨è´Ÿè´£äººæ„è§
                breakdownMaintenance.setDepartmentHeadOpinion(deviceBreakdownMaintenance.getDepartmentHeadOpinion());
                breakdownMaintenance.setDepartmentHeadDate(LocalDate.now());
                baseMapper.updateById(breakdownMaintenance);
                break;
            case 2:
                breakdownMaintenance.setMaintenanceId(deviceBreakdownMaintenance.getMaintenanceId());
                // è®¡é‡å®¤æ„è§
                breakdownMaintenance.setMaintenanceRecord(deviceBreakdownMaintenance.getMaintenanceRecord());
                breakdownMaintenance.setMaintenanceUser(deviceBreakdownMaintenance.getMaintenanceUser());
                breakdownMaintenance.setMaintenanceDate(deviceBreakdownMaintenance.getMaintenanceDate());
                breakdownMaintenance.setIsFinish(1);
                baseMapper.updateById(breakdownMaintenance);
                break;
        }
        return true;
    }
    /**
     * å¯¼å‡ºè®¾å¤‡æ•…障维修
     * @param maintenanceId è®¾å¤‡æ•…障维修id
     * @param response å“åº”
     */
    @Override
    public void exportDeviceBreakdownMaintenance(Integer maintenanceId, HttpServletResponse response) {
        // æŸ¥è¯¢å¤–部设备申请
        DeviceBreakdownMaintenance deviceBreakdownMaintenance = baseMapper.selectById(maintenanceId);
        Device device = null;
        if (deviceBreakdownMaintenance.getDeviceId() != null) {
            device = deivceMapper.selectById(deviceBreakdownMaintenance.getDeviceId());
            device = device == null ? new Device() : device;
        }
        // èŽ·å–è·¯å¾„
        InputStream inputStream = this.getClass().getResourceAsStream("/static/word/device-breakdown-maintenance.docx");
        Configure configure = Configure.builder()
                .build();
        Device finalDevice = device;
        XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
                new HashMap<String, Object>() {{
                    put("deviceBreakdownMaintenance", deviceBreakdownMaintenance);
                    put("device", finalDevice);
                    // ç”³è¯·äººç­¾å
                    put("applicantUrl", UserUtils.getFinalUserSignatureUrl(deviceBreakdownMaintenance.getApplicantUserId()));
                    // éƒ¨é—¨è´Ÿè´£äººç­¾å
                    put("headUrl", UserUtils.getFinalUserSignatureUrl(deviceBreakdownMaintenance.getDepartmentHeadUserId()));
                }});
        try {
            response.setContentType("application/msword");
            String deviceName = device.getDeviceName() == null ? "" : device.getDeviceName();
            String fileName = URLEncoder.encode(
                    deviceName + "设备故障维修申请表", "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-device/src/main/java/com/ruoyi/device/service/impl/DeviceInspectionRecordDetailsServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
package com.ruoyi.device.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.device.mapper.DeviceInspectionRecordDetailsMapper;
import com.ruoyi.device.pojo.DeviceInspectionRecordDetails;
import com.ruoyi.device.service.DeviceInspectionRecordDetailsService;
import org.springframework.stereotype.Service;
/**
 * <p>
 *  æœåŠ¡å®žçŽ°ç±»
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2024-12-16 04:27:32
 */
@Service
public class DeviceInspectionRecordDetailsServiceImpl extends ServiceImpl<DeviceInspectionRecordDetailsMapper, DeviceInspectionRecordDetails> implements DeviceInspectionRecordDetailsService {
}
cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceInspectionRecordServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,221 @@
package com.ruoyi.device.service.impl;
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.Wrappers;
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.Result;
import com.ruoyi.common.core.domain.entity.User;
import com.ruoyi.common.utils.QueryWrappers;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.device.dto.DeviceInspectionRecordDto;
import com.ruoyi.device.mapper.DeviceInspectionRecordMapper;
import com.ruoyi.device.mapper.DeviceMapper;
import com.ruoyi.device.pojo.Device;
import com.ruoyi.device.pojo.DeviceInspectionRecord;
import com.ruoyi.device.pojo.DeviceInspectionRecordDetails;
import com.ruoyi.device.service.DeviceInspectionRecordDetailsService;
import com.ruoyi.device.service.DeviceInspectionRecordService;
import com.ruoyi.inspect.util.HackLoopTableRenderPolicy;
import com.ruoyi.inspect.util.UserUtils;
import com.ruoyi.system.mapper.UserMapper;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.time.format.DateTimeFormatter;
import java.util.HashMap;
import java.util.List;
/**
 * <p>
 * è®¾å¤‡ç‚¹æ£€è®°å½•表 æœåŠ¡å®žçŽ°ç±»
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2024-12-16 04:25:14
 */
@Service
@Transactional(rollbackFor = Exception.class)
public class DeviceInspectionRecordServiceImpl extends ServiceImpl<DeviceInspectionRecordMapper, DeviceInspectionRecord> implements DeviceInspectionRecordService {
    @Resource
    private UserMapper userMapper;
    @Resource
    private DeviceMapper deviceMapper;
    @Resource
    private DeviceInspectionRecordDetailsService deviceInspectionRecordDetailsService;
    /**
     * åˆ†é¡µæŸ¥è¯¢è®¾å¤‡ç‚¹æ£€è®°å½•
     *
     * @param page å½“前页码
     */
    @Override
    public Result<IPage<DeviceInspectionRecord>> getDeviceInspectionRecordByPage(IPage page, DeviceInspectionRecordDto deviceInspectionRecordDto) {
        IPage<DeviceInspectionRecord> iPage = baseMapper.selectDeviceParameterPage(page, QueryWrappers.queryWrappers(deviceInspectionRecordDto));
        return Result.success(iPage);
    }
    /**
     * æŸ¥è¯¢ç‚¹æ£€è¯¦æƒ…
     * @param inspectionRecordId
     * @return
     */
    @Override
    public Result getDeviceInspectionRecord(Integer inspectionRecordId) {
        DeviceInspectionRecord deviceInspectionRecord = baseMapper.selectById(inspectionRecordId);
        DeviceInspectionRecordDto dto = new DeviceInspectionRecordDto();
        BeanUtils.copyProperties(deviceInspectionRecord, dto);
        List<DeviceInspectionRecordDetails> list = deviceInspectionRecordDetailsService.list(Wrappers.<DeviceInspectionRecordDetails>lambdaQuery().eq(DeviceInspectionRecordDetails::getInspectionRecordId, inspectionRecordId));
        dto.setDetails(list);
        return Result.success(dto);
    }
    /**
     * æ–°å¢žè®¾å¤‡ç‚¹æ£€è®°å½•
     *
     * @param deviceInspectionRecord è®¾å¤‡ç‚¹æ£€è®°å½•
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public Result addDeviceInspectionRecord(DeviceInspectionRecordDto deviceInspectionRecord) {
        Integer userId = SecurityUtils.getUserId().intValue();
        User user = userMapper.selectById(userId);
        deviceInspectionRecord.setRecorderId(userId);
        deviceInspectionRecord.setRecorder(user.getName());
        // æŸ¥è¯¢å¤æ ¸äººid
        if (deviceInspectionRecord.getReviewerId() != null) {
            User reviewUser = userMapper.selectById(deviceInspectionRecord.getReviewerId());
            deviceInspectionRecord.setReviewer(reviewUser.getName());
        }
        this.saveOrUpdate(deviceInspectionRecord);
        if (CollectionUtils.isNotEmpty(deviceInspectionRecord.getDetails())) {
            for (DeviceInspectionRecordDetails detail : deviceInspectionRecord.getDetails()) {
                detail.setInspectionRecordId(deviceInspectionRecord.getInspectionRecordId());
            }
            deviceInspectionRecordDetailsService.saveBatch( deviceInspectionRecord.getDetails());
        }
        return Result.success();
    }
    /**
     * ä¿®æ”¹è®¾å¤‡ç‚¹æ£€è®°å½•
     *
     * @param deviceInspectionRecord è®¾å¤‡ç‚¹æ£€è®°å½•
     */
    @Override
    public Result updateInspectionRecordAndDetails(DeviceInspectionRecordDto deviceInspectionRecord) {
        // æŸ¥è¯¢å¤æ ¸äººid
        if (deviceInspectionRecord.getReviewerId() != null) {
            User reviewUser = userMapper.selectById(deviceInspectionRecord.getReviewerId());
            deviceInspectionRecord.setReviewer(reviewUser.getName());
        }
        this.saveOrUpdate(deviceInspectionRecord);
        deviceInspectionRecordDetailsService.remove(Wrappers.<DeviceInspectionRecordDetails>lambdaQuery().eq(DeviceInspectionRecordDetails::getInspectionRecordId, deviceInspectionRecord.getInspectionRecordId()));
        if (CollectionUtils.isNotEmpty(deviceInspectionRecord.getDetails())) {
            for (DeviceInspectionRecordDetails detail : deviceInspectionRecord.getDetails()) {
                detail.setInspectionRecordId(deviceInspectionRecord.getInspectionRecordId());
            }
            deviceInspectionRecordDetailsService.saveBatch( deviceInspectionRecord.getDetails());
        }
        return Result.success();
    }
    /**
     * åˆ é™¤è®¾å¤‡ç‚¹æ£€è®°å½•
     *
     * @param deviceInspectionRecord è®¾å¤‡ç‚¹æ£€è®°å½•
     */
    @Override
    public Result deleteDeviceInspectionRecordOrDetails(DeviceInspectionRecordDto deviceInspectionRecord) {
        this.removeById(deviceInspectionRecord);
        deviceInspectionRecordDetailsService.remove(Wrappers.<DeviceInspectionRecordDetails>lambdaQuery().eq(DeviceInspectionRecordDetails::getInspectionRecordId, deviceInspectionRecord.getInspectionRecordId()));
        return Result.success();
    }
    /**
     * å¤æ ¸ç‚¹æ£€è®°å½•
     * @param dto
     * @return
     */
    @Override
    public Result reviewDeviceInspectionRecord(DeviceInspectionRecordDto dto) {
        LambdaUpdateWrapper<DeviceInspectionRecord> wrapper = Wrappers.<DeviceInspectionRecord>lambdaUpdate()
                .eq(DeviceInspectionRecord::getInspectionRecordId, dto.getInspectionRecordId())
                .set(DeviceInspectionRecord::getStatus, dto.getStatus())
                .set(DeviceInspectionRecord::getReviewerRemark, dto.getReviewerRemark());
        // ä¸º0清除审核人
        if (dto.getStatus().equals(0)) {
            wrapper.set(DeviceInspectionRecord::getReviewerId, null)
                    .set(DeviceInspectionRecord::getReviewer, null);
        }
        this.update(wrapper);
        return Result.success();
    }
    /**
     * å¯¼å‡ºè®¾å¤‡ç‚¹æ£€è®°å½•
     *
     * @param deviceInspectionRecordId è®¾å¤‡ç‚¹æ£€è®°å½•id
     * @param response                 å“åº”
     */
    @Override
    public Result exportDeviceInspectionRecord(Integer deviceInspectionRecordId, HttpServletResponse response) {
        DeviceInspectionRecord deviceInspectionRecord = baseMapper.selectById(deviceInspectionRecordId);
        DeviceInspectionRecordDto deviceInspectionRecordDto = new DeviceInspectionRecordDto();
        BeanUtils.copyProperties(deviceInspectionRecord, deviceInspectionRecordDto);
        DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        deviceInspectionRecordDto.setTestDateString(deviceInspectionRecord.getTestDate() == null ? null : deviceInspectionRecord.getTestDate().format(dateFormatter));
        List<DeviceInspectionRecordDetails> deviceInspectionRecordDetailsList = deviceInspectionRecordDetailsService.list(Wrappers.<DeviceInspectionRecordDetails>lambdaQuery().eq(DeviceInspectionRecordDetails::getInspectionRecordId, deviceInspectionRecordId));
        Integer deviceId = deviceInspectionRecord.getDeviceId();
        Device device = deviceMapper.selectById(deviceId);
        // èŽ·å–è·¯å¾„
        InputStream inputStream = this.getClass().getResourceAsStream("/static/word/device-inspection-record.docx");
        Configure configure = Configure.builder()
                .bind("deviceInspectionRecordDetailsList", new HackLoopTableRenderPolicy())
                .build();
        XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
                new HashMap<String, Object>() {{
                    put("deviceInspectionRecord", deviceInspectionRecordDto);
                    put("deviceInspectionRecordDetailsList", deviceInspectionRecordDetailsList);
                    put("device", device);
                    put("recorderUrl", UserUtils.getFinalUserSignatureUrl(deviceInspectionRecordDto.getRecorderId()));
                    put("reviewerUrl", UserUtils.getFinalUserSignatureUrl(deviceInspectionRecordDto.getReviewerId()));
                }});
        try {
            response.setContentType("application/msword");
            String fileName = URLEncoder.encode(
                    device.getDeviceName() + "点检记录", "UTF-8");
            response.setHeader("Content-disposition",
                    "attachment;filename=" + fileName + ".docx");
            OutputStream os = response.getOutputStream();
            template.write(os);
            os.flush();
            os.close();
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException("导出失败");
        }
        return Result.success();
    }
}
cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceInstructionServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,67 @@
package com.ruoyi.device.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.ruoyi.common.numgen.NumberGenerator;
import com.ruoyi.common.utils.QueryWrappers;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.device.dto.DeviceInstructionDto;
import com.ruoyi.device.dto.DeviceOperationInstructionDto;
import com.ruoyi.device.mapper.InstructionMapper;
import com.ruoyi.device.pojo.DeviceInstruction;
import com.ruoyi.device.service.DeviceInstructionService;
import com.ruoyi.device.service.DeviceOperationInstructionService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.Locale;
/**
 * <p>
 * ä½œä¸šæŒ‡å¯¼ä¹¦æ·»åŠ å—æŽ§æ–‡ä»¶è¡¨ æœåŠ¡å®žçŽ°ç±»
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2024-12-04 10:29:18
 */
@Service
@Transactional(rollbackFor = Exception.class)
public class DeviceInstructionServiceImpl extends ServiceImpl<InstructionMapper, DeviceInstruction> implements DeviceInstructionService {
    @Autowired
    private DeviceOperationInstructionService operationInstructionService;
    @Autowired
    private NumberGenerator<DeviceInstruction> numberGenerator;
    @Override
    public IPage<DeviceInstruction> pageByPageQueryOfHomeworkInstructions(Page page, DeviceOperationInstructionDto operationInstructionDto) {
        return baseMapper.pageByPageQueryOfHomeworkInstructions(page, QueryWrappers.queryWrappers(operationInstructionDto));
    }
    @Override
    public void newHomeworkGuidebookAdded(DeviceInstructionDto instructionDto) {
        if (ObjectUtils.isEmpty(instructionDto.getApplicationNumber())) {
            String year = new SimpleDateFormat("yy", Locale.CHINESE).format(new Date());
            String month = new SimpleDateFormat("MM", Locale.CHINESE).format(new Date());
            String day = new SimpleDateFormat("dd", Locale.CHINESE).format(new Date());
            String processNumber = numberGenerator.generateNumberWithPrefix(3, "WJSK" + year + month + day, DeviceInstruction::getApplicationNumber);
            instructionDto.setApplicationNumber(processNumber);
        }
        saveOrUpdate(instructionDto);
        if (ObjectUtils.isNotEmpty(instructionDto.getFeTempHumRecordList())) {
            instructionDto.getFeTempHumRecordList().forEach(i -> {
                i.setInstructionId(instructionDto.getId());
                i.setUploader(SecurityUtils.getUserId().intValue());
                i.setUpdateTime(LocalDateTime.now());
            });
            operationInstructionService.saveOrUpdateBatch(instructionDto.getFeTempHumRecordList());
        }
    }
}
cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceMaintenanceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,86 @@
package com.ruoyi.device.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.config.Configure;
import com.ruoyi.device.excel.DeviceMaintenanceExport;
import com.ruoyi.device.mapper.DeviceMaintenanceMapper;
import com.ruoyi.device.mapper.DeviceMapper;
import com.ruoyi.device.pojo.DeviceMaintenance;
import com.ruoyi.device.service.DeviceMaintenanceService;
import com.ruoyi.inspect.util.HackLoopTableRenderPolicy;
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;
@Service
public class DeviceMaintenanceImpl extends ServiceImpl<DeviceMaintenanceMapper, DeviceMaintenance> implements DeviceMaintenanceService {
    @Override
    public IPage<DeviceMaintenance> getDeviceMaintenancePage(Page page, Integer deviceId, String deviceNumber) {
        return baseMapper.selectPage(page, Wrappers.<DeviceMaintenance>lambdaQuery()
                .eq(DeviceMaintenance::getDeviceId, deviceId)
                .like(DeviceMaintenance::getDeviceNumber, deviceNumber));
    }
    @Override
    public List<DeviceMaintenanceExport> deviceMaintenanceExport(Integer deviceId) {
        return baseMapper.deviceMaintenanceExport(deviceId);
    }
    @Override
    public void exportMaintenanceRecord(Integer deviceId, HttpServletResponse response) {
        // æŸ¥è¯¢cnas设备维修记录
        List<DeviceMaintenance> deviceMaintenanceList = baseMapper.selectList(Wrappers.<DeviceMaintenance>lambdaQuery()
                .eq(DeviceMaintenance::getDeviceId, deviceId)
                .select(DeviceMaintenance::getDate,
                        DeviceMaintenance::getDeviceNumber,
                        DeviceMaintenance::getDeviceName,
                        DeviceMaintenance::getManagementNumber,
                        DeviceMaintenance::getContent,
                        DeviceMaintenance::getName,
                        DeviceMaintenance::getComments));
        // èŽ·å–è·¯å¾„
        InputStream inputStream = this.getClass().getResourceAsStream("/static/word/maintenance-records.docx");
        Configure configure = Configure.builder()
                .bind("deviceMaintenanceList", new HackLoopTableRenderPolicy())
                .build();
        // èŽ·å–è®¾å¤‡ åç§° å’Œ ç¼–号
        DeviceMaintenance deviceMaintenance = deviceMaintenanceList.get(0);
        String deviceName = deviceMaintenance.getDeviceName();
        String managementNumber = deviceMaintenance.getManagementNumber();
        XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
                new HashMap<String, Object>() {{
                    put("deviceMaintenanceList", deviceMaintenanceList);
                    put("deviceName", deviceName);
                    put("managementNumber", managementNumber);
                }});
        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-device/src/main/java/com/ruoyi/device/service/impl/DeviceMetricRecordServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
package com.ruoyi.device.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.device.mapper.DeviceMetricRecordMapper;
import com.ruoyi.device.pojo.DeviceMetricRecord;
import com.ruoyi.device.service.DeviceMetricRecordService;
import org.springframework.stereotype.Service;
/**
 * <p>
 * è®¾å¤‡æ ¡å‡† - æ ¡å‡†è®°å½• æœåŠ¡å®žçŽ°ç±»
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2024-09-27 10:20:01
 */
@Service
public class DeviceMetricRecordServiceImpl extends ServiceImpl<DeviceMetricRecordMapper, DeviceMetricRecord> implements DeviceMetricRecordService {
}
cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceMetricsCopyServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
package com.ruoyi.device.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.device.mapper.DeviceMetricsCopyMapper;
import com.ruoyi.device.pojo.DeviceMetricsCopy;
import com.ruoyi.device.service.DeviceMetricsCopyService;
import org.springframework.stereotype.Service;
/**
 * <p>
 * è®¾å¤‡æ ¡å‡† - æ ¡å‡†è®°å½• - æ ¡å‡†æ¡ç›® æœåŠ¡å®žçŽ°ç±»
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2024-09-27 10:20:11
 */
@Service
public class DeviceMetricsCopyServiceImpl extends ServiceImpl<DeviceMetricsCopyMapper, DeviceMetricsCopy> implements DeviceMetricsCopyService {
}
cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceOperationInstructionServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,27 @@
package com.ruoyi.device.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.device.dto.DeviceOperationInstructionDto;
import com.ruoyi.device.mapper.OperationInstructionMapper;
import com.ruoyi.device.pojo.OperationInstruction;
import com.ruoyi.device.service.DeviceOperationInstructionService;
import org.springframework.stereotype.Service;
import java.util.List;
/**
 * <p>
 * è®¾å¤‡ - ä½œä¸šæŒ‡å¯¼ä¹¦ æ·»åŠ å—æŽ§æ–‡ä»¶ å­ æœåŠ¡å®žçŽ°ç±»
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2024-12-04 10:43:32
 */
@Service
public class DeviceOperationInstructionServiceImpl extends ServiceImpl<OperationInstructionMapper, OperationInstruction> implements DeviceOperationInstructionService {
    @Override
    public List<DeviceOperationInstructionDto> homeworkGuidebookEditor(Integer instructionId) {
        return baseMapper.homeworkGuidebookEditor(instructionId);
    }
}
cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceScrappedServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,179 @@
package com.ruoyi.device.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.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.config.Configure;
import com.ruoyi.common.core.domain.Result;
import com.ruoyi.common.core.domain.entity.User;
import com.ruoyi.common.utils.QueryWrappers;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.device.dto.DeviceScrappedDto;
import com.ruoyi.device.mapper.DeviceMapper;
import com.ruoyi.device.mapper.DeviceScrappedMapper;
import com.ruoyi.device.pojo.Device;
import com.ruoyi.device.pojo.DeviceScrapped;
import com.ruoyi.device.service.DeviceScrappedService;
import com.ruoyi.inspect.util.UserUtils;
import com.ruoyi.system.mapper.UserMapper;
import org.springframework.beans.BeanUtils;
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.LocalDate;
import java.util.HashMap;
/**
 * <p>
 * è®¾å¤‡æŠ¥åºŸç”³è¯·è¡¨ æœåŠ¡å®žçŽ°ç±»
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2024-12-17 01:53:47
 */
@Service
public class DeviceScrappedServiceImpl extends ServiceImpl<DeviceScrappedMapper, DeviceScrapped> implements DeviceScrappedService {
    @Resource
    private DeviceMapper deivceMapper;
    @Resource
    private UserMapper userMapper;
    /**
     * è®¾å¤‡æŠ¥åºŸç”³è¯·åˆ—表
     *
     * @param deviceScrapped
     * @return
     */
    @Override
    public IPage<DeviceScrapped> pageDeviceScrapped(Page page, DeviceScrapped deviceScrapped) {
        return baseMapper.pageDeviceScrapped(page, QueryWrappers.queryWrappers(deviceScrapped));
    }
    /**
     * æ–°å¢žè®¾å¤‡æŠ¥åºŸç”³è¯·
     *
     * @return
     */
    @Override
    public boolean addDeviceScrapped(DeviceScrapped deviceScrapped) {
        DeviceScrapped scrapped = new DeviceScrapped();
        // å½“前登录用户信息和部门
        User user = userMapper.selectById(SecurityUtils.getUserId().intValue());
        switch (deviceScrapped.getFlowType()) {
            case 0:
                BeanUtils.copyProperties(deviceScrapped, scrapped);
                // ç”³è¯·
                scrapped.setReasonsForScrap(deviceScrapped.getReasonsForScrap());
                scrapped.setApplicantUserId(user.getId());
                scrapped.setApplicantUser(user.getName());
                scrapped.setApplicantDate(LocalDate.now());
                // å¤„理人信息
                User departmentHeadUser = userMapper.selectById(deviceScrapped.getDepartmentHeadUserId());
                scrapped.setApplicantUserId(departmentHeadUser.getId());
                scrapped.setApplicantUser(departmentHeadUser.getName());
                baseMapper.insert(scrapped);
                break;
            case 1:
                scrapped.setScrappedId(deviceScrapped.getScrappedId());
                // ç”³è¯·éƒ¨é—¨è´Ÿè´£äººæ„è§
                scrapped.setDepartmentHeadOpinion(deviceScrapped.getDepartmentHeadOpinion());
                scrapped.setDepartmentHeadDate(LocalDate.now());
                // è®¡é‡å®¤ä¿¡æ¯
                User meteringRoomUser = userMapper.selectById(deviceScrapped.getMeteringRoomUserId());
                scrapped.setMeteringRoomUserId(meteringRoomUser.getId());
                scrapped.setMeteringRoomUser(meteringRoomUser.getName());
                baseMapper.updateById(scrapped);
                break;
            case 2:
                scrapped.setScrappedId(deviceScrapped.getScrappedId());
                // è®¡é‡å®¤æ„è§
                scrapped.setMeteringRoomOpinion(deviceScrapped.getMeteringRoomOpinion());
                scrapped.setMeteringRoomDate(LocalDate.now());
                // æ‰¹å‡†äººä¿¡æ¯
                User approverUser = userMapper.selectById(deviceScrapped.getApproverUserId());
                scrapped.setApproverUserId(approverUser.getId());
                scrapped.setApproverUser(approverUser.getName());
                baseMapper.updateById(scrapped);
                break;
            case 3:
                scrapped.setScrappedId(deviceScrapped.getScrappedId());
                //批准人
                scrapped.setApproverOpinion(deviceScrapped.getApproverOpinion());
                scrapped.setApproverDate(LocalDate.now());
                scrapped.setIsFinish(1);
                baseMapper.updateById(scrapped);
                break;
        }
        return true;
    }
    /**
     * å¯¼å‡ºè®¾å¤‡æŠ¥åºŸç”³è¯·
     *
     * @param scrappedId è®¾å¤‡æŠ¥åºŸç”³è¯·id
     * @param response   å“åº”
     * @return ç»“æžœ
     */
    @Override
    public Result<?> exportDeviceScrapped(Integer scrappedId, HttpServletResponse response) {
        // æŸ¥è¯¢æŠ¥åºŸæ•°æ®
        DeviceScrappedDto deviceScrapped = baseMapper.selectDeviceScrappedById(scrappedId);
        if (deviceScrapped == null) {
            return Result.fail("设备报废申请不存在");
        }
        Device device = null;
        if (deviceScrapped.getDeviceId() != null) {
            device = deivceMapper.selectById(deviceScrapped.getDeviceId());
            device = device == null ? new Device() : device;
        }
        // èŽ·å–è·¯å¾„
        InputStream inputStream = this.getClass().getResourceAsStream("/static/word/device-scrapped.docx");
        Configure configure = Configure.builder()
                .build();
        Device finalDevice = device;
        XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
                new HashMap<String, Object>() {{
                    put("deviceScrapped", deviceScrapped);
                    put("device", finalDevice);
                    // ç”³è¯·äººç­¾å
                    put("applicantUrl", UserUtils.getFinalUserSignatureUrl(deviceScrapped.getApplicantUserId()));
                    // éƒ¨é—¨è´Ÿè´£äººç­¾å
                    put("headUrl", UserUtils.getFinalUserSignatureUrl(deviceScrapped.getDepartmentHeadUserId()));
                    // è®¡é‡å®¤ç­¾å
                    put("metrologyRoomUrl", UserUtils.getFinalUserSignatureUrl(deviceScrapped.getMeteringRoomUserId()));
                    // æ‰¹å‡†äººç­¾å
                    put("approverUrl", UserUtils.getFinalUserSignatureUrl(deviceScrapped.getApproverUserId()));
                }});
        try {
            response.setContentType("application/msword");
            String deviceName = device.getDeviceName() == null ? "" : device.getDeviceName();
            String fileName = URLEncoder.encode(
                    deviceName + "设备报废申请", "UTF-8");
            response.setHeader("Content-disposition",
                    "attachment;filename=" + fileName + ".docx");
            OutputStream os = response.getOutputStream();
            template.write(os);
            os.flush();
            os.close();
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException("导出失败");
        }
        return Result.success();
    }
}
cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceStateServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,159 @@
package com.ruoyi.device.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.data.Pictures;
import com.ruoyi.basic.mapper.LaboratoryMapper;
import com.ruoyi.basic.pojo.Laboratory;
import com.ruoyi.common.core.domain.entity.User;
import com.ruoyi.device.dto.DeviceStateDto;
import com.ruoyi.device.mapper.DeviceStateMapper;
import com.ruoyi.device.pojo.DeviceState;
import com.ruoyi.device.service.DeviceStateService;
import com.ruoyi.framework.exception.ErrorException;
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.format.DateTimeFormatter;
import java.util.HashMap;
/**
 * <p>
 * è®¾å¤‡åœç”¨/启用 æœåŠ¡å®žçŽ°ç±»
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2024-09-26 09:51:40
 */
@Service
public class DeviceStateServiceImpl extends ServiceImpl<DeviceStateMapper, DeviceState> implements DeviceStateService {
    @Resource
    private LaboratoryMapper laboratoryMapper;
    @Resource
    private UserMapper userMapper;
    @Value("${file.path}")
    private String imgUrl;
    @Override
    public IPage<DeviceStateDto> getDeviceStatePage(Integer deviceId, Page page, String processNumber) {
        return baseMapper.getDeviceStatePage(deviceId, page, processNumber);
    }
    @Override
    public void exportDeviceStatus(Integer deviceId, String processNumber, HttpServletResponse response) {
        // æ ¹æ®æµç¨‹ç¼–号 æŸ¥è¯¢cnas设备状态
        DeviceStateDto deviceStateDto = baseMapper.getDeviceStatePage(deviceId,new Page<DeviceStateDto>(1,1), processNumber).getRecords().get(0);
        // å¯¹æ—¶é—´è¿›è¡Œä¿®æ”¹
        DateTimeFormatter format = DateTimeFormatter.ofPattern("yyyyå¹´MM月dd日");
        deviceStateDto.setSubmitDateString(deviceStateDto.getSubmitDate() != null ? deviceStateDto.getSubmitDate().format(format) : "  å¹´ æœˆ æ—¥");
        deviceStateDto.setDepartmentDateString(deviceStateDto.getDepartmentDate() != null? deviceStateDto.getDepartmentDate().format(format) : "  å¹´ æœˆ æ—¥");
        deviceStateDto.setMeasuringRoomDateString(deviceStateDto.getMeasuringRoomDate() != null? deviceStateDto.getMeasuringRoomDate().format(format) : "  å¹´ æœˆ æ—¥");
        deviceStateDto.setApprovalDateString(deviceStateDto.getApprovalDate() != null? deviceStateDto.getApprovalDate().format(format) : "  å¹´ æœˆ æ—¥");
        // æŸ¥è¯¢è®¾å¤‡å±žäºŽå“ªä¸ªå®žéªŒå®¤
        String laboratoryName;
        String largeCategory = deviceStateDto.getLargeCategory();
        if (StringUtils.isNotBlank(largeCategory)) {
            largeCategory = largeCategory.substring(0, 1);
            Laboratory laboratory = laboratoryMapper.selectOne(Wrappers.<Laboratory>lambdaQuery()
                    .eq(Laboratory::getLaboratoryNumber, largeCategory)
                    .select(Laboratory::getLaboratoryName));
            laboratoryName = laboratory.getLaboratoryName();
        } else {
            laboratoryName = "";
        }
        //todo: è®¾å¤‡çŠ¶æ€æŸ¥è¯¢ç­¾ååœ°å€ æš‚时人名查询
        //获取申请人的签名地址
        String applicantUrl = null;
        if (deviceStateDto.getSubmitOperatingPersonnel() != null) {
            applicantUrl = userMapper.selectOne(Wrappers.<User>lambdaQuery()
                            .eq(User::getName, deviceStateDto.getSubmitOperatingPersonnel()))
                    .getSignatureUrl();
            if (StringUtils.isBlank(applicantUrl)) {
                throw new ErrorException("找不到申请人的签名");
            }
        }
        //获取部门负责人的签名地址
        String headOfDepartmentUrl = null;
        if (deviceStateDto.getDepartmentNextPesponsible() != null) {
            headOfDepartmentUrl = userMapper.selectOne(Wrappers.<User>lambdaQuery()
                    .eq(User::getName, deviceStateDto.getDepartmentNextPesponsible()))
                    .getSignatureUrl();
            if (StringUtils.isBlank(headOfDepartmentUrl)) {
                throw new ErrorException("找不到部门负责人的签名");
            }
        }
        //获取计量室复测人的签名地址
        String measurementRoomUrl = null;
        if (deviceStateDto.getMeasuringRoomNextPesponsible() != null) {
            measurementRoomUrl = userMapper.selectOne(Wrappers.<User>lambdaQuery()
                            .eq(User::getName, deviceStateDto.getMeasuringRoomNextPesponsible()))
                    .getSignatureUrl();
            if (StringUtils.isBlank(measurementRoomUrl)) {
                throw new ErrorException("找不到计量室复测人的签名");
            }
        }
        //获取批准人的签名地址
        String approvedUrl = null;
        if (deviceStateDto.getApprovalNextPesponsible() != null) {
            approvedUrl = userMapper.selectOne(Wrappers.<User>lambdaQuery()
                            .eq(User::getName, deviceStateDto.getApprovalNextPesponsible()))
                    .getSignatureUrl();
            if (StringUtils.isBlank(approvedUrl)) {
                throw new ErrorException("找不到批准人的签名");
            }
        }
        // èŽ·å–è·¯å¾„
        InputStream inputStream = this.getClass().getResourceAsStream("/static/word/device-status.docx");
        Configure configure = Configure.builder()
                .build();
        String finalApplicantUrl = applicantUrl; // ç”³è¯·äººçš„签名地址
        String finalHeadOfDepartmentUrl = headOfDepartmentUrl; // éƒ¨é—¨è´Ÿè´£äººçš„签名地址
        String finalMeasurementRoomUrl = measurementRoomUrl; // è®¡é‡å®¤å¤æµ‹äººçš„签名地址
        String finalApprovedUrl = approvedUrl; // æ‰¹å‡†äººçš„签名地址
        XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
                new HashMap<String, Object>() {{
                    put("deviceStateDto", deviceStateDto);
                    put("submitOperatingPersonnelUrl", StringUtils.isNotBlank(finalApplicantUrl) ? Pictures.ofLocal(imgUrl + "/" + finalApplicantUrl).create() : null);
                    put("departmentNextPesponsibleUrl", StringUtils.isNotBlank(finalHeadOfDepartmentUrl) ? Pictures.ofLocal(imgUrl + "/" + finalHeadOfDepartmentUrl).create() : null);
                    put("measuringRoomNextPesponsibleUrl", StringUtils.isNotBlank(finalMeasurementRoomUrl) ? Pictures.ofLocal(imgUrl + "/" + finalMeasurementRoomUrl).create() : null);
                    put("approvalNextPesponsibleUrl", StringUtils.isNotBlank(finalApprovedUrl) ? Pictures.ofLocal(imgUrl + "/" + finalApprovedUrl).create() : null);
                    put("laboratory", laboratoryName);
                }});
        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-device/src/main/java/com/ruoyi/device/task/DeviceRecordSchedule.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,65 @@
package com.ruoyi.device.task;
import com.ruoyi.common.core.domain.entity.User;
import com.ruoyi.common.utils.WxCpUtils;
import com.ruoyi.device.dto.DeviceRecordDto;
import com.ruoyi.device.mapper.DeviceRecordMapper;
import com.ruoyi.device.pojo.DeviceRecord;
import com.ruoyi.system.mapper.UserMapper;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
 * è®¾å¤‡ä½¿ç”¨è®°å½•提醒
 */
@Component
public class DeviceRecordSchedule {
    @Resource
    private DeviceRecordMapper deviceRecordMapper;
    @Resource
    private UserMapper userMapper;
    @Resource
    private ThreadPoolTaskExecutor threadPoolTaskExecutor;
    /**
     * æé†’填写设备使用记录
     */
//    @Scheduled(cron = "0/5 * * * * *")
    @Scheduled(cron = "0 0 9 * * 6") // æ¯å‘¨å…­æ‰§è¡Œä¸€æ¬¡
    public void task1() {
        // æŸ¥è¯¢æœªå¡«å†™çš„设备使用记录
        List<DeviceRecordDto> deviceRecords = deviceRecordMapper.selectNotFilled();
        Map<Integer, List<DeviceRecordDto>> userPersonIdMap = deviceRecords.stream().collect(Collectors.groupingBy(DeviceRecord::getUsePersonId));
        userPersonIdMap.forEach((userId, recordList) -> {
            threadPoolTaskExecutor.execute(() -> {
                // ä¼ä¸šå¾®ä¿¡é€šçŸ¥å¡«å†™è®¾å¤‡ä½¿ç”¨è®°å½•
                User user = userMapper.selectById(userId);
                String message = "";
                message += "设备使用记录未填写提醒通知";
                for (DeviceRecordDto deviceRecord : recordList) {
                    message += "\n设备名称编号: " + deviceRecord.getDeviceName() + "-" + deviceRecord.getManagementNumber();
                    message += "\n委托编号: " + deviceRecord.getSampleCode();
                    message += "\n";
                }
                message += "\n请去填写设备使用记录";
                //发送企业微信消息通知
                try {
                    WxCpUtils.inform(user.getAccount(), message, null);
                } catch (Exception e) {
                    throw new RuntimeException(e);
                }
            });
        });
    }
}
cnas-device/src/main/resources/mapper/DeviceAcceptanceMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,17 @@
<?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.device.mapper.DeviceAcceptanceMapper">
    <!-- è®¾å¤‡éªŒæ”¶åˆ—表 -->
    <select id="pageDeviceAcceptance" resultType="com.ruoyi.device.pojo.DeviceAcceptance">
        select * from (
        select *
        from device_acceptance
        order by create_time desc
        ) a
        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
            ${ew.customSqlSegment}
        </if>
    </select>
</mapper>
cnas-device/src/main/resources/mapper/DeviceAccidentReportMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,29 @@
<?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.device.mapper.DeviceAccidentReportMapper">
    <!-- è®¾å¤‡äº‹æ•…报告列表 -->
    <select id="pageDeviceAccidentReport" resultType="com.ruoyi.device.pojo.DeviceAccidentReport">
        select * from (
        select *
        from device_accident_report
        order by create_time desc
        ) a
        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
            ${ew.customSqlSegment}
        </if>
    </select>
    <select id="selectDeviceAccidentReportById" resultType="com.ruoyi.device.dto.DeviceAccidentReportDto">
        select
            d.*,
            date_format(d.accident_date,'%Y-%m-%d') accidentDateStr, -- æ—¶é—´
            date_format(d.report_date,'%Y-%m-%d') reportDateStr, -- æŠ¥å‘Šäººå¡«å†™æ—¶é—´
            date_format(d.assessor_date,'%Y-%m-%d') assessorDateStr, -- è¯„估人填写时间
            date_format(d.department_head_date,'%Y-%m-%d') departmentHeadDateStr, -- éƒ¨é—¨è´Ÿè´£äººå¡«å†™æ—¶é—´
            date_format(d.technical_director_date,'%Y-%m-%d') technicalDirectorDateStr, -- æŠ€æœ¯è´Ÿè´£äººå¡«å†™æ—¶é—´
            date_format(d.director_head_date,'%Y-%m-%d') directorHeadDateStr -- ä¸»ä»»å¡«å†™æ—¶é—´
        from device_accident_report d
        where d.accident_report_id = #{accidentReportId}
    </select>
</mapper>
cnas-device/src/main/resources/mapper/DeviceBorrowMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,21 @@
<?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.device.mapper.DeviceBorrowMapper">
    <select id="deviceBorrowPage" resultType="com.ruoyi.device.pojo.DeviceBorrow">
        select * from (
        select db.*,device_name
        from device_borrow db
        left join `center-lims`.device on db.device_id=device.id
        )a
        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
            ${ew.customSqlSegment}
        </if>
    </select>
    <select id="getDeviceBorrowBydeviceId" resultType="com.ruoyi.device.pojo.DeviceBorrow">
        select db.*,device_name
        from device_borrow db
                 left join `center-lims`.device on db.device_id=device.id
        where device_id=#{deviceId}
    </select>
</mapper>
cnas-device/src/main/resources/mapper/DeviceBreakdownMaintenanceMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,17 @@
<?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.device.mapper.DeviceBreakdownMaintenanceMapper">
    <!--设备故障维修列表-->
    <select id="pageDeviceBreakdownMaintenance" resultType="com.ruoyi.device.dto.DeviceBreakdownMaintenance">
        select * from (
        select *
        from device_breakdown_maintenance
        order by create_time desc
        ) a
        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
            ${ew.customSqlSegment}
        </if>
    </select>
</mapper>
cnas-device/src/main/resources/mapper/DeviceInspectionRecordMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,14 @@
<?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.device.mapper.DeviceInspectionRecordMapper">
    <select id="selectDeviceParameterPage" resultType="com.ruoyi.device.pojo.DeviceInspectionRecord">
        SELECT
            *
        from device_inspection_record
        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
            ${ew.customSqlSegment}
        </if>
    </select>
</mapper>
cnas-device/src/main/resources/mapper/DeviceScrappedMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,27 @@
<?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.device.mapper.DeviceScrappedMapper">
    <!-- è®¾å¤‡æŠ¥åºŸç”³è¯·åˆ—表 -->
    <select id="pageDeviceScrapped" resultType="com.ruoyi.device.pojo.DeviceScrapped">
        select * from (
        select *
        from device_scrapped
        order by create_time desc
        ) a
        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
            ${ew.customSqlSegment}
        </if>
    </select>
    <select id="selectDeviceScrappedById" resultType="com.ruoyi.device.dto.DeviceScrappedDto">
        select
            *,
            date_format(applicant_date,'%Yå¹´%m月%d日') as applicantDateStr,
            date_format(department_head_date,'%Yå¹´%m月%d日') as departmentHeadDateStr,
            date_format(metering_room_date,'%Yå¹´%m月%d日') as meteringRoomDateStr,
            date_format(approver_date,'%Yå¹´%m月%d日') as approverDateStr
        from device_scrapped
        where scrapped_id = #{scrappedId}
    </select>
</mapper>
cnas-device/src/main/resources/mapper/DeviceStateMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,19 @@
<?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.device.mapper.DeviceStateMapper">
    <select id="getDeviceStatePage" resultType="com.ruoyi.device.dto.DeviceStateDto">
        select ds.*,
               d.device_name,
               d.management_number,
               d.specification_model,
               d.large_category
        from device_state ds
                 left join device d on d.id = ds.device_id
        where ds.device_id = #{deviceId}
        <if test="processNumber != '' and processNumber != null">
            and ds.process_number like concat('%', #{processNumber}, '%')
        </if>
    </select>
</mapper>
cnas-device/src/main/resources/mapper/InstructionMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,19 @@
<?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.device.mapper.InstructionMapper">
    <select id="pageByPageQueryOfHomeworkInstructions" resultType="com.ruoyi.device.pojo.DeviceInstruction">
        SELECT
            doi.*,di.*,d.device_name, d.management_number device_number, d.specification_model device_model, u.name uploader_name, u1.name approver_name
        FROM
            device_operation_instruction doi
                LEFT JOIN device_instruction di ON di.id = doi.instruction_id
                left join device d on d.id = doi.device_id
                left join user u on u.id = doi.uploader
                left join user u1 on u1.id = doi.approver_id
        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
            ${ew.customSqlSegment}
        </if>
    </select>
</mapper>
cnas-device/src/main/resources/mapper/OperationInstructionMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,13 @@
<?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.device.mapper.OperationInstructionMapper">
    <select id="homeworkGuidebookEditor" resultType="com.ruoyi.device.dto.DeviceOperationInstructionDto">
        SELECT
            doi.*,d.device_name, d.management_number device_number, d.specification_model device_model
        FROM
            device_operation_instruction doi
                left join device d on d.id = doi.device_id
        where doi.instruction_id = #{instructionId}
    </select>
</mapper>
cnas-device/src/main/resources/static/word/acceptance-certificate.docx
Binary files differ
cnas-device/src/main/resources/static/word/device-accident-report.docx
Binary files differ
cnas-device/src/main/resources/static/word/device-breakdown-maintenance.docx
Binary files differ
cnas-device/src/main/resources/static/word/device-calibration-plan.docx
Binary files differ
cnas-device/src/main/resources/static/word/device-document.docx
Binary files differ
cnas-device/src/main/resources/static/word/device-external-apply.docx
Binary files differ
cnas-device/src/main/resources/static/word/device-inspection-record.docx
Binary files differ
cnas-device/src/main/resources/static/word/device-scrapped.docx
Binary files differ
cnas-device/src/main/resources/static/word/device-status.docx
Binary files differ
cnas-device/src/main/resources/static/word/examine-plan-detail.docx
Binary files differ
cnas-device/src/main/resources/static/word/examine-record.docx
Binary files differ
cnas-device/src/main/resources/static/word/incident-report.docx
Binary files differ
cnas-device/src/main/resources/static/word/maintenance-plan.docx
Binary files differ
cnas-device/src/main/resources/static/word/maintenance-records.docx
Binary files differ
cnas-device/src/main/resources/static/word/quipment-details.docx
Binary files differ
cnas-device/src/main/resources/static/word/review-examine-record-contrast.docx
Binary files differ
cnas-device/src/main/resources/static/word/traceability-management-details.docx
Binary files differ
cnas-device/src/main/resources/static/word/use-record.docx
Binary files differ
cnas-manage/src/main/java/com/ruoyi/manage/controller/ClientSatisfactionController.java
@@ -71,7 +71,7 @@
     */
    @ApiOperation(value = "客户满意度调查新增")
    @GetMapping("/delClientSatisfaction")
    @DeleteMapping("/delClientSatisfaction")
    public Result updateClientSatisfaction(Integer clientSatisfactionId){
        return Result.success(clientSatisfactionService.removeById(clientSatisfactionId));
    }
@@ -132,7 +132,7 @@
     */
    @ApiOperation(value = "删除户分析附件")
    @GetMapping("/delAnalyseFile")
    @DeleteMapping("/delAnalyseFile")
    public Result delAnalyseFile(Integer analyseFileId){
        return Result.success(clientSatisfactionAnalyseFileMapper.deleteById(analyseFileId));
    }
cnas-personnel/pom.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,46 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.ruoyi</groupId>
        <artifactId>ruoyi</artifactId>
        <version>3.8.9</version>
    </parent>
    <artifactId>cnas-personnel</artifactId>
    <dependencies>
        <!-- é€šç”¨å·¥å…·-->
        <dependency>
            <groupId>com.ruoyi</groupId>
            <artifactId>ruoyi-common</artifactId>
        </dependency>
        <!-- æ ¸å¿ƒæ¨¡å—-->
        <dependency>
            <groupId>com.ruoyi</groupId>
            <artifactId>ruoyi-framework</artifactId>
        </dependency>
        <!-- ç³»ç»Ÿæ¨¡å—-->
        <dependency>
            <groupId>com.ruoyi</groupId>
            <artifactId>ruoyi-system</artifactId>
        </dependency>
        <!-- ç³»ç»Ÿæ¨¡å—-->
        <dependency>
            <groupId>com.ruoyi</groupId>
            <artifactId>inspect-server</artifactId>
        </dependency>
    </dependencies>
    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
</project>
cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonBasicInfoController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,229 @@
package com.ruoyi.personnel.controller;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.core.domain.Result;
import com.ruoyi.common.core.domain.entity.DepartmentDto;
import com.ruoyi.common.utils.FileSaveUtil;
import com.ruoyi.framework.exception.ErrorException;
import com.ruoyi.personnel.dto.PersonBasicInfoDetailsDto;
import com.ruoyi.personnel.dto.PersonBasicInfoDto;
import com.ruoyi.personnel.dto.UserPageDto;
import com.ruoyi.personnel.pojo.Annex;
import com.ruoyi.personnel.pojo.PersonBasicInfoFile;
import com.ruoyi.personnel.pojo.PersonBasicInfoWork;
import com.ruoyi.personnel.service.AnnexService;
import com.ruoyi.personnel.service.PersonBasicInfoFileService;
import com.ruoyi.personnel.service.PersonBasicInfoService;
import com.ruoyi.personnel.service.PersonBasicInfoWorkService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
import java.util.Map;
/**
 * <p>
 *  å‰ç«¯æŽ§åˆ¶å™¨
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2024-08-30 09:19:57
 */
@Api(tags = "人员-人员基本信息")
@RestController
@RequestMapping("/personBasicInfo")
public class PersonBasicInfoController {
    @Resource
    private PersonBasicInfoService personBasicInfoService;
    @Resource
    private PersonBasicInfoFileService personBasicInfoFileService;
    @Resource
    private PersonBasicInfoWorkService personBasicInfoWorkService;
    @Resource
    private AnnexService annexService;
    @ApiOperation(value = "查询CNAS人员侧边栏")
    @GetMapping("/selectCNSAPersonTree")
    public Result<List<DepartmentDto>> selectCNSAPersonTree() {
        return Result.success(personBasicInfoService.selectCNSAPersonTree());
    }
    @ApiOperation(value = "获取CNAS人员基本信息")
    @GetMapping("/getCNASPersonnelInfo")
    public Result getCNASPersonnelInfo(Integer userId) {
        return Result.success(personBasicInfoService.getCNASPersonnelInfo(userId));
    }
    @ApiOperation(value = "保存CNAS人员基本信息")
    @PostMapping("/saveCNASPersonnelInfo")
    public Result saveCNASPersonnelInfo(@RequestBody PersonBasicInfoDto personBasicInfoDto) {
        personBasicInfoService.saveCNASPersonnelInfo(personBasicInfoDto);
        return Result.success();
    }
    @ApiOperation(value = "人员明细分页查询")
    @GetMapping("basicInformationOfPersonnelSelectPage")
    public Result<IPage<Map<String, Object>>> basicInformationOfPersonnelSelectPage(Page<List<PersonBasicInfoDetailsDto>> page, String name, Integer departmentId) {
        return Result.success(personBasicInfoService.basicInformationOfPersonnelSelectPage(page, name, departmentId));
    }
    // ä¸Šä¼ æ–‡ä»¶æŽ¥å£
    @ApiOperation(value = "上传文件接口")
    @PostMapping("/saveCNASFile")
    public Result saveFile(@RequestPart("file") MultipartFile file) {
        String s = FileSaveUtil.uploadWordFile(file);
        return Result.success("上传成功", s);
    }
    @GetMapping("/getAnnexByUserId")
    public Result<List<Annex>> getAnnexByUserId(Integer userId) {
        List<Annex> list = annexService.list(new LambdaQueryWrapper<Annex>().eq(Annex::getUserId, userId));
        return Result.success(list);
    }
    // åˆ é™¤æ–‡ä»¶
    @DeleteMapping("/deleteCNASFile")
    public Result saveFile(String fileName) {
        String[] split = fileName.split(",");
        for (String s : split) {
            FileSaveUtil.DeleteFile(s);
        }
        return Result.success();
    }
    /**
     * äººå‘˜åŸºæœ¬ä¿¡æ¯é™„件新增
     */
    @PostMapping("/addAnnex")
    public Result addAnnex(@RequestBody Annex annex) {
        annexService.save(annex);
        return Result.success();
    }
    @GetMapping("/getAnnex")
    public Result<Annex> getAnnex(Integer id) {
        return Result.success(annexService.getById(id));
    }
    /**
     * äººå‘˜åŸºæœ¬ä¿¡æ¯é™„件删除
     */
    @DeleteMapping("/deleteAnnex")
    public Result deleteAnnex(Integer id) {
        annexService.removeById(id);
        return Result.success();
    }
    /**
     * äººå‘˜åŸºæœ¬ä¿¡æ¯é™„件修改
     *
     */
    @PostMapping("/updateAnnex")
    public Result updateAnnex(@RequestBody Annex annex) {
        annexService.updateById(annex);
        return Result.success();
    }
    @ApiOperation(value = "导出人员基本信息")
    @GetMapping("/exportPersonBasicInfo")
    public void exportPersonBasicInfo(UserPageDto userPageDto, HttpServletResponse response) throws Exception {
        personBasicInfoService.exportPersonBasicInfo(userPageDto,response);
    }
    @ApiOperation(value = "下载人员档案卡")
    @GetMapping("/exportPersonBasicInfoById")
    public Result exportPersonBasicInfoById(Integer id, HttpServletResponse response) {
        return Result.success(personBasicInfoService.exportPersonBasicInfoById(id,response));
    }
    /**
     * äººå‘˜åŸ¹è®­åŸºæœ¬ä¿¡æ¯é™„件新增
     * @param userId
     * @param file
     * @return
     */
    @ApiOperation(value = "人员培训基本信息附件新增")
    @PostMapping("/uploadBasicInfoFile")
    public Result<?> uploadBasicInfoFile(Integer userId, MultipartFile file) {
        return Result.success(personBasicInfoService.uploadBasicInfoFile(userId, file));
    }
    /**
     * äººå‘˜åŸ¹è®­åŸºæœ¬ä¿¡æ¯é™„件列表
     * @return
     */
    @ApiOperation(value = "人员培训基本信息附件列表")
    @GetMapping("/getBasicInfoFileList")
    public Result<List<PersonBasicInfoFile>> getBasicInfoFileList(Integer userId){
        return Result.success(personBasicInfoFileService.list(Wrappers.<PersonBasicInfoFile>lambdaQuery()
                .eq(PersonBasicInfoFile::getUserId, userId)));
    }
    /**
     * äººå‘˜åŸ¹è®­åŸºæœ¬ä¿¡æ¯é™„件删除
     * @return
     */
    @ApiOperation(value = "人员培训基本信息附件删除")
    @GetMapping("/delBasicInfoFileList")
    public Result delBasicInfoFileList(Integer basicInfoFileId){
        return Result.success(personBasicInfoFileService.removeById(basicInfoFileId));
    }
    /**
     * äººå‘˜åŸ¹è®­åŸºæœ¬ä¿¡æ¯å·¥ä½œç»åŽ†æ–°å¢ž
     * @return
     */
    @ApiOperation(value = "人员培训基本信息工作经历新增")
    @PostMapping("/addBasicInfoWork")
    public Result<?> addBasicInfoWork(@RequestBody PersonBasicInfoWork basicInfoWork) {
        if (basicInfoWork.getUserId() == null) {
            throw new ErrorException("缺少人员id");
        }
        basicInfoWork.setUserId(basicInfoWork.getUserId());
        return Result.success(personBasicInfoWorkService.save(basicInfoWork));
    }
    /**
     * äººå‘˜å·¥ä½œç»åŽ†åˆ—è¡¨
     * @return
     */
    @ApiOperation(value = "人员工作经历列表")
    @GetMapping("/getBasicInfoWorkList")
    public Result<List<PersonBasicInfoWork>> getBasicInfoWorkList(Integer userId){
        return Result.success(personBasicInfoWorkService.list(Wrappers.<PersonBasicInfoWork>lambdaQuery()
                .eq(PersonBasicInfoWork::getUserId, userId)));
    }
    /**
     * äººå‘˜å·¥ä½œç»åŽ†åˆ é™¤
     * @return
     */
    @ApiOperation(value = "人员工作经历删除")
    @GetMapping("/delBasicInfoWorkList")
    public Result delBasicInfoWorkList(Integer basicInfoWorkId){
        return Result.success(personBasicInfoWorkService.removeById(basicInfoWorkId));
    }
    /**
     * äººå‘˜åŸºæœ¬ä¿¡æ¯é™„件删除
     * @return
     */
    @ApiOperation(value = "人员工作经历修改")
    @PostMapping("/updateBasicInfoWorkList")
    public Result updateBasicInfoWorkList(@RequestBody PersonBasicInfoWork basicInfoWork){
        return Result.success(personBasicInfoWorkService.updateById(basicInfoWork));
    }
}
cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonCommunicationAbilityController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,61 @@
package com.ruoyi.personnel.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.core.domain.Result;
import com.ruoyi.personnel.dto.PersonCommunicationAbilityDto;
import com.ruoyi.personnel.pojo.PersonCommunicationAbility;
import com.ruoyi.personnel.service.PersonCommunicationAbilityService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
/**
 * <p>
 * æ²Ÿé€šè®°å½• å‰ç«¯æŽ§åˆ¶å™¨
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2024-10-09 12:00:57
 */
@Api(tags = "人员 - æ²Ÿé€šè®°å½•")
@RestController
@RequestMapping("/personCommunicationAbility")
public class PersonCommunicationAbilityController {
    @Autowired
    private PersonCommunicationAbilityService personCommunicationAbilityService;
    @ApiOperation(value = "新增/更新 æ²Ÿé€šè®°å½•")
    @PostMapping("addOrUpdatePersonCommunicationAbility")
    public Result<?> addOrUpdatePersonCommunicationAbility(@RequestBody PersonCommunicationAbility personCommunicationAbility) {
        personCommunicationAbilityService.saveOrUpdate(personCommunicationAbility);
        return Result.success();
    }
    @ApiOperation(value = "删除 æ²Ÿé€šè®°å½•")
    @DeleteMapping("deletePersonCommunicationAbility")
    public Result<?> deletePersonCommunicationAbility(@RequestParam("id") Integer id) {
        personCommunicationAbilityService.removeById(id);
        return Result.success();
    }
    @ApiOperation(value = "查询 æ²Ÿé€šè®°å½•")
    @GetMapping("personPersonCommunicationAbilityPage")
    public Result<IPage<PersonCommunicationAbilityDto>> personPersonCommunicationAbilityPage(Page page,
                                                                                             Integer departLimsId,
                                                                                             Integer userId,
                                                                                             String userName) {
        return Result.success(personCommunicationAbilityService.personPersonCommunicationAbilityPage(page, departLimsId, userId, userName));
    }
    @ApiOperation(value = "导出沟通记录")
    @PostMapping("exportPersonCommunicationAbility")
    public void exportPersonCommunicationAbility(Integer id, HttpServletResponse response) throws Exception{
        personCommunicationAbilityService.exportPersonCommunicationAbility(id,response);
    }
}
cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonJobResponsibilitiesController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,60 @@
package com.ruoyi.personnel.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.core.domain.Result;
import com.ruoyi.personnel.dto.PersonJobResponsibilitiesDto;
import com.ruoyi.personnel.pojo.PersonJobResponsibilities;
import com.ruoyi.personnel.service.PersonJobResponsibilitiesService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
/**
 * <p>
 * å²—位职责 å‰ç«¯æŽ§åˆ¶å™¨
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2024-10-09 02:07:49
 */
@Api(tags = "人员 - å²—位职责")
@RestController
@RequestMapping("/personJobResponsibilities")
public class PersonJobResponsibilitiesController {
    @Autowired
    private PersonJobResponsibilitiesService personJobResponsibilitiesService;
    @ApiOperation(value = "新增/更新 å²—位职责")
    @PostMapping("/personJobResponsibilitiesSave")
    public Result<?> personJobResponsibilitiesSave(@RequestBody PersonJobResponsibilities personJobResponsibilities) {
        personJobResponsibilitiesService.saveOrUpdate(personJobResponsibilities);
        return Result.success();
    }
    @ApiOperation(value = "删除 å²—位职责")
    @DeleteMapping("/personJobResponsibilitiesDelete")
    public Result<?> personJobResponsibilitiesDelete(@RequestParam("id") Integer id) {
        personJobResponsibilitiesService.removeById(id);
        return Result.success();
    }
    @ApiOperation(value = "查询 å²—位职责")
    @GetMapping("/personJobResponsibilitiesSelect")
    public Result<IPage<PersonJobResponsibilitiesDto>> personJobResponsibilitiesSelect(Page page, String userId, String departmentId, String userName) {
        IPage<PersonJobResponsibilitiesDto> iPage = personJobResponsibilitiesService.personJobResponsibilitiesSelect(page, userId, departmentId, userName);
        return Result.success(iPage);
    }
    @ApiOperation(value = "导出任职岗位说明说")
    @PostMapping("/exportPersonJobResponsibilities")
    public void exportPersonJobResponsibilities(Integer id, HttpServletResponse response){
        personJobResponsibilitiesService.exportPersonJobResponsibilities(id,response);
    }
}
cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonPersonnelCapacityController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,92 @@
package com.ruoyi.personnel.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.core.domain.Result;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.personnel.dto.PersonPersonnelCapacityDto;
import com.ruoyi.personnel.pojo.PersonPersonnelCapacity;
import com.ruoyi.personnel.service.PersonPersonnelCapacityService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.time.LocalDateTime;
/**
 * <p>
 * äººå‘˜èƒ½åŠ› å‰ç«¯æŽ§åˆ¶å™¨
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2024-10-10 11:26:18
 */
@Api(tags = "人员 - äººå‘˜èƒ½åŠ›")
@RestController
@RequestMapping("/personPersonnelCapacity")
public class PersonPersonnelCapacityController {
    @Autowired
    private PersonPersonnelCapacityService personPersonnelCapacityService;
    @ApiOperation(value = "新增/更新 äººå‘˜èƒ½åŠ›")
    @PostMapping("addOrUpdatePersonPersonnelCapacity")
    public Result<?> addOrUpdatePersonPersonnelCapacity(@RequestBody PersonPersonnelCapacity personPersonnelCapacity) {
        personPersonnelCapacityService.saveOrUpdate(personPersonnelCapacity);
        return Result.success();
    }
    @ApiOperation(value = "删除 äººå‘˜èƒ½åŠ›")
    @DeleteMapping("deletePersonPersonnelCapacity")
    public Result<?> deletePersonPersonnelCapacity(@RequestParam("id") Integer id) {
        // åˆ é™¤æ•°æ®
        personPersonnelCapacityService.removeById(id);
        return Result.success();
    }
    @ApiOperation(value = "查询 äººå‘˜èƒ½åŠ›")
    @GetMapping("personPersonnelCapacityPage")
    public Result<IPage<PersonPersonnelCapacityDto>> personPersonnelCapacityPage(Page page,
                                                                                 Integer departmentId,
                                                                                 Integer userId,
                                                                                 String userName) {
        return Result.success(personPersonnelCapacityService.personPersonnelCapacityPage(page, departmentId, userId, userName));
    }
    @ApiOperation(value = "确认 äººå‘˜èƒ½åŠ›")
    @GetMapping("confirmPersonnelCapability")
    public Result<?> confirmPersonnelCapability(@RequestParam("id") Integer id) {
        Integer userId = SecurityUtils.getUserId().intValue();
        personPersonnelCapacityService.update(Wrappers.<PersonPersonnelCapacity>lambdaUpdate()
                .eq(PersonPersonnelCapacity::getId, id)
                .set(PersonPersonnelCapacity::getConfirmOperatingPersonnelId, userId)
                .set(PersonPersonnelCapacity::getConfirmDate, LocalDateTime.now()));
        return Result.success();
    }
    /**
     * å¯¼å‡ºäººå‘˜èƒ½åŠ›
     * @return
     */
    @ApiOperation(value = "导出人员能力")
    @GetMapping("/exportPersonnelCapacity")
    public void exportPersonnelCapacity(Integer id, HttpServletResponse response){
        personPersonnelCapacityService.exportPersonnelCapacity(id, response);
    }
    /**
     * æäº¤ç¡®è®¤äººå‘˜èƒ½åŠ›
     * @param personPersonnelCapacity
     * @return
     */
    @ApiOperation(value = "提交")
    @PostMapping("submitConfirmPersonnelCapability")
    public Result<?> submitConfirmPersonnelCapability(@RequestBody PersonPersonnelCapacity personPersonnelCapacity) {
        personPersonnelCapacityService.submitConfirmPersonnelCapability(personPersonnelCapacity);
        return Result.success();
    }
}
cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonPostAuthorizationRecordController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,66 @@
package com.ruoyi.personnel.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.core.domain.Result;
import com.ruoyi.common.utils.FileSaveUtil;
import com.ruoyi.personnel.dto.PersonPostAuthorizationRecordDto;
import com.ruoyi.personnel.pojo.PersonPostAuthorizationRecord;
import com.ruoyi.personnel.service.PersonPostAuthorizationRecordService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
/**
 * <p>
 * ä»»èŒæŽˆæƒè®°å½• å‰ç«¯æŽ§åˆ¶å™¨
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2024-10-09 10:48:17
 */
@Api(tags = "人员 - ä»»èŒæŽˆæƒè®°å½•")
@RestController
@RequestMapping("/personPostAuthorizationRecord")
public class PersonPostAuthorizationRecordController {
    @Autowired
    private PersonPostAuthorizationRecordService personPostAuthorizationRecordService;
    @ApiOperation(value = "新增/更新 ä»»èŒæŽˆæƒè®°å½•")
    @PostMapping("/addOrUpdatePersonPostAuthorizationRecord")
    public Result<?> addOrUpdatePersonPostAuthorizationRecord(@RequestBody PersonPostAuthorizationRecord personRewardPunishmentRecord) {
        personPostAuthorizationRecordService.saveOrUpdate(personRewardPunishmentRecord);
        return Result.success();
    }
    @ApiOperation(value = "删除 ä»»èŒæŽˆæƒè®°å½•")
    @DeleteMapping("/deletePersonPostAuthorizationRecord")
    public Result<?> deletePersonPostAuthorizationRecord(@RequestParam("id") Integer id) {
        // åˆ é™¤æ–‡ä»¶
        PersonPostAuthorizationRecord postAuthorizationRecord = personPostAuthorizationRecordService.getById(id);
        FileSaveUtil.DeleteFile(postAuthorizationRecord.getSystemFileName());
        // åˆ é™¤æ•°æ®
        personPostAuthorizationRecordService.removeById(id);
        return Result.success();
    }
    @ApiOperation(value = "查询 ä»»èŒæŽˆæƒè®°å½•")
    @GetMapping("/PersonPostAuthorizationRecordPage")
    public Result<IPage<PersonPostAuthorizationRecordDto>> PersonPostAuthorizationRecordPage(Page page,
                                                                                             Integer departLimsId,
                                                                                             Integer userId,
                                                                                             String userName) {
        return Result.success(personPostAuthorizationRecordService.personPostAuthorizationRecordPage(page, departLimsId, userId, userName));
    }
    @ApiOperation(value = "导出岗位职业资格证书")
    @PostMapping("/exportPersonPostAuthorizationRecord")
    public void exportPersonPostAuthorizationRecord(Integer id, HttpServletResponse response){
        personPostAuthorizationRecordService.exportPersonPostAuthorizationRecord(id,response);
    }
}
cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonRewardPunishmentRecordController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,100 @@
package com.ruoyi.personnel.controller;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.core.domain.Result;
import com.ruoyi.personnel.dto.PersonRewardPunishmentRecordDto;
import com.ruoyi.personnel.excel.PersonRewardPunishmentRecordExcel;
import com.ruoyi.personnel.pojo.PersonRewardPunishmentRecord;
import com.ruoyi.personnel.service.PersonRewardPunishmentRecordService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.SneakyThrows;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
/**
 * <p>
 * å¥–惩记录 å‰ç«¯æŽ§åˆ¶å™¨
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2024-10-08 11:25:02
 */
@Api(tags = "人员 - å¥–惩记录")
@RestController
@RequestMapping("/personRewardPunishmentRecord")
public class PersonRewardPunishmentRecordController {
    @Autowired
    private PersonRewardPunishmentRecordService personRewardPunishmentRecordService;
    @ApiOperation(value = "新增/更新 å¥–惩记录")
    @PostMapping("/addOrUpdateRewardPunishment")
    public Result<?> PersonTrainingSave(@RequestBody PersonRewardPunishmentRecord personRewardPunishmentRecord) {
        personRewardPunishmentRecordService.saveOrUpdate(personRewardPunishmentRecord);
        return Result.success();
    }
    @ApiOperation(value = "删除奖惩记录")
    @DeleteMapping("/deleteRewardPunishment")
    public Result<?> deleteRewardPunishment(@RequestParam("id") Integer id) {
        personRewardPunishmentRecordService.removeById(id);
        return Result.success();
    }
    @ApiOperation(value = "查询 å¥–惩记录")
    @GetMapping("/rewardPunishmentPage")
    @SneakyThrows
    public Result<IPage<PersonRewardPunishmentRecordDto>> rewardPunishmentPage(Page page,
                                                                               Integer userId,
                                                                               Integer departmentId,
                                                                               String userName,
                                                                               @RequestParam(value = "startTime",required = false) String startTimeStr,
                                                                               @RequestParam(value = "endTime",required = false) String endTimeStr) {
        Date startTime = null;
        Date endTime = null;
        if (StringUtils.isNotEmpty(startTimeStr) || StringUtils.isNotEmpty(endTimeStr)) {
            SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
            startTime = formatter.parse(startTimeStr);
            endTime = formatter.parse(endTimeStr);
        }
        return Result.success(personRewardPunishmentRecordService.rewardPunishmentPage(page, userId, userName, startTime, endTime, departmentId));
    }
    @ApiOperation(value = "奖惩记录导出")
    @GetMapping("/rewardPunishmentExport")
    public void rewardPunishmentExport(Integer userId,
                                       Integer departmentId,
                                       String userName,
                                       @RequestParam(value = "startTime",required = false) String startTimeStr,
                                       @RequestParam(value = "endTime",required = false) String endTimeStr,
                                       HttpServletResponse response) throws Exception {
        Date startTime = null;
        Date endTime = null;
        if (StringUtils.isNotEmpty(startTimeStr) || StringUtils.isNotEmpty(endTimeStr)) {
            SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
            startTime = formatter.parse(startTimeStr);
            endTime = formatter.parse(endTimeStr);
        }
        List<PersonRewardPunishmentRecordExcel> data = personRewardPunishmentRecordService.rewardPunishmentExport(userId, departmentId, userName, startTime, endTime);
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        response.setHeader("requestType", "excel");
        response.setHeader("Access-Control-Expose-Headers", "requestType");
        // è®¾ç½®å•元格样式
        // ä¿å­˜åˆ°ç¬¬ä¸€ä¸ªsheet中
        EasyExcel.write(response.getOutputStream())
                .head(PersonRewardPunishmentRecordExcel.class)
                .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()) // è‡ªé€‚应列宽
                .sheet()
                .doWrite(data);
    }
}
cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonTrainingController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,246 @@
package com.ruoyi.personnel.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.core.domain.Result;
import com.ruoyi.common.numgen.NumberGenerator;
import com.ruoyi.personnel.dto.PersonTrainingDetailedDto;
import com.ruoyi.personnel.dto.PersonTrainingDto;
import com.ruoyi.personnel.dto.PersonTrainingRecordDto;
import com.ruoyi.personnel.dto.PersonTrainingRecordSubmitDto;
import com.ruoyi.personnel.mapper.PersonTrainingDetailedFileMapper;
import com.ruoyi.personnel.pojo.PersonTraining;
import com.ruoyi.personnel.pojo.PersonTrainingDetailed;
import com.ruoyi.personnel.pojo.PersonTrainingDetailedFile;
import com.ruoyi.personnel.pojo.PersonTrainingRecord;
import com.ruoyi.personnel.service.PersonTrainingDetailedService;
import com.ruoyi.personnel.service.PersonTrainingRecordService;
import com.ruoyi.personnel.service.PersonTrainingService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
/**
 * <p>
 * åŸ¹è®­è®¡åˆ’ å‰ç«¯æŽ§åˆ¶å™¨
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2024-10-11 01:11:49
 */
@Api(tags = "人员 - åŸ¹è®­è®¡åˆ’")
@RestController
@RequestMapping("/personTraining")
public class PersonTrainingController {
    @Autowired
    private PersonTrainingService personTrainingService;
    @Autowired
    private PersonTrainingDetailedService personTrainingDetailedService;
    @Autowired
    private PersonTrainingRecordService personTrainingRecordService;
    @Autowired
    private PersonTrainingDetailedFileMapper personTrainingDetailedFileMapper;
    @Autowired
    private NumberGenerator<PersonTrainingDetailed> numberGenerator;
    @ApiOperation(value = "培训计划 å¯¼å…¥")
    @PostMapping("personTrainingImport")
    public Result<?> personTrainingImport(@RequestPart("file") MultipartFile file, PersonTraining training) {
        personTrainingService.personTrainingImport(file, training);
        return Result.success();
    }
    @ApiOperation(value = "培训计划 åˆ é™¤")
    @DeleteMapping("personTrainingDelete")
    public Result<?> personTrainingDelete(@RequestParam("id") Integer id) {
        personTrainingService.personTrainingDelete(id);
        return Result.success();
    }
    @ApiOperation(value = "培训计划 æŸ¥è¯¢")
    @GetMapping("personTrainingSelect")
    public Result<IPage<PersonTrainingDto>> personTrainingSelect(Page page, String compilerName, String departmentId) {
        IPage<PersonTrainingDto> iPage = personTrainingService.personTrainingSelect(page, compilerName, departmentId);
        return Result.success(iPage);
    }
    @ApiOperation(value = "年度培训计划 å®¡æ ¸")
    @PostMapping("reviewAnnualPersonnelTraining")
    public Result<?> reviewAnnualPersonnelTraining(@RequestBody PersonTraining training) {
        personTrainingService.reviewAnnualPersonnelTraining(training);
        return Result.success();
    }
    @ApiOperation(value = "培训计划 æ‰¹å‡†")
    @PostMapping("approveAnnualPersonnelTraining")
    public Result<?> approveAnnualPersonnelTraining(@RequestBody PersonTraining training) {
        personTrainingService.approveAnnualPersonnelTraining(training);
        return Result.success();
    }
    @ApiOperation(value = "年度计划明细表 æ–°å¢ž/编辑")
    @PostMapping("addOrUpdatePersonTrainingDetailed")
    public Result<?> addOrUpdatePersonTrainingDetailed(@RequestBody PersonTrainingDetailed personTrainingDetailed) {
        if (ObjectUtils.isEmpty(personTrainingDetailed.getId())) {
            personTrainingDetailed.setState(3);
        }
        personTrainingDetailedService.saveOrUpdate(personTrainingDetailed);
        return Result.success();
    }
    @ApiOperation(value = "年度计划明细表 æ‰¹é‡åˆ é™¤")
    @DeleteMapping("deleteAnnualPlanDetailTable")
    public Result<?> deleteAnnualPlanDetailTable(String ids) {
        personTrainingDetailedService.deleteAnnualPlanDetailTable(ids);
        return Result.success();
    }
    @ApiOperation(value = "年度计划明细表 æŸ¥è¯¢")
    @GetMapping("queryTheAnnualPlanDetailsTable")
    public Result<IPage<PersonTrainingDetailedDto>> queryTheAnnualPlanDetailsTable(Page page,
                                                                                   String trainingLecturerName, String courseCode,
                                                                                   String trainingDate, Integer id, Integer userId) {
        IPage<PersonTrainingDetailedDto> iPage = personTrainingDetailedService.queryTheAnnualPlanDetailsTable(page,
                trainingLecturerName, courseCode, trainingDate, id, userId);
        return Result.success(iPage);
    }
    @ApiOperation(value = "培训与考核记录 æŸ¥è¯¢")
    @GetMapping("trainingAndAssessmentRecordsPage")
    public Result<List<PersonTrainingRecordDto>> trainingAndAssessmentRecordsPage(Integer trainingDetailedId,
                                                                                   String userName) {
        List<PersonTrainingRecordDto> list = personTrainingRecordService.trainingAndAssessmentRecordsPage(trainingDetailedId, userName);
        return Result.success(list);
    }
    @ApiOperation(value = "培训与考核记录 æ–°å¢žäººå‘˜")
    @PostMapping("newPersonnelAddedToTrainingRecords")
    public Result<?> newPersonnelAddedToTrainingRecords(@RequestBody List<PersonTrainingRecord> personTrainingRecord) {
        personTrainingRecordService.saveBatch(personTrainingRecord);
        return Result.success();
    }
    @ApiOperation(value = "培训与考核记录 è®¤é¢†")
    @PostMapping("claimOfTrainingAndAssessmentRecords")
    public Result<?> claimOfTrainingAndAssessmentRecords(@RequestParam("claimAndClaim") Boolean claimAndClaim,
                                                         @RequestParam("courseId") Integer courseId) {
        personTrainingRecordService.claimOfTrainingAndAssessmentRecords(claimAndClaim, courseId);
        return Result.success();
    }
    @ApiOperation(value = "培训与考核记录 æäº¤/撤销")
    @PostMapping("trainingAndAssessmentRecordsAdded")
    public Result<?> trainingAndAssessmentRecordsAdded(@RequestBody PersonTrainingRecordSubmitDto personTrainingRecordSubmitDto) {
        personTrainingRecordService.trainingAndAssessmentRecordsAdded(personTrainingRecordSubmitDto);
        return Result.success();
    }
    @ApiOperation(value = "培训与考核记录 è¯„ä»·")
    @PostMapping("trainingAndAssessmentRecordsEvaluate")
    public Result<?> trainingAndAssessmentRecordsEvaluate(@RequestBody PersonTrainingRecordSubmitDto personTrainingRecordSubmitDto) {
        personTrainingDetailedService.update(Wrappers.<PersonTrainingDetailed>lambdaUpdate()
                .eq(PersonTrainingDetailed::getId, personTrainingRecordSubmitDto.getTrainingDetailedId())
                .set(PersonTrainingDetailed::getComprehensiveAssessment, personTrainingRecordSubmitDto.getComprehensiveAssessment())
                .set(PersonTrainingDetailed::getAssessmentDate, personTrainingRecordSubmitDto.getAssessmentDate())
                .set(PersonTrainingDetailed::getState, personTrainingRecordSubmitDto.getState()));
        return Result.success();
    }
    @ApiOperation(value = "培训与考核记录 åˆ é™¤")
    @DeleteMapping("deleteTrainingAndAssessmentRecords")
    public Result<?> deleteTrainingAndAssessmentRecords(String ids) {
        personTrainingRecordService.deleteTrainingAndAssessmentRecords(ids);
        return Result.success();
    }
    @PostMapping("outOfFocusPreservation")
    public Result<?> outOfFocusPreservation(@RequestBody PersonTrainingRecord personTrainingRecord) {
        personTrainingRecordService.updateById(personTrainingRecord);
        return Result.success();
    }
    /**
     * å¯¼å‡ºäººå‘˜åŸ¹è®­è®¡åˆ’
     * @return
     */
    @ApiOperation(value = "导出人员培训计划")
    @GetMapping("/exportPersonTraining")
    public void exportPersonTraining(Integer id, HttpServletResponse response){
        personTrainingService.exportPersonTraining(id, response);
    }
    /**
     * å¯¼å‡ºäººå‘˜åŸ¹è®­ä¸Žè€ƒæ ¸è®°å½•
     * @return
     */
    @ApiOperation(value = "导出人员培训与考核记录")
    @GetMapping("/exportPersonTrainingRecord")
    public void exportPersonTrainingRecord(Integer id, HttpServletResponse response){
        personTrainingService.exportPersonTrainingRecord(id, response);
    }
    /**
     * äººå‘˜åŸ¹è®­è¯¦æƒ…附件新增
     * @param trainingDetailedId
     * @param file
     * @return
     */
    @ApiOperation(value = "人员培训详情附件新增")
    @PostMapping("/uploadTrainingDetailedFile")
    public Result<?> uploadTrainingDetailedFile(Integer trainingDetailedId, MultipartFile file) {
        return Result.success(personTrainingService.uploadTrainingDetailedFile(trainingDetailedId, file));
    }
    /**
     * äººå‘˜åŸ¹è®­è¯¦æƒ…附件列表
     * @return
     */
    @ApiOperation(value = "人员培训详情附件列表")
    @GetMapping("/getTrainingDetailedFileList")
    public Result<List<PersonTrainingDetailedFile>> getTrainingDetailedFileList(Integer trainingDetailedId){
        return Result.success(personTrainingDetailedFileMapper.selectList(Wrappers.<PersonTrainingDetailedFile>lambdaQuery()
                .eq(PersonTrainingDetailedFile::getTrainingDetailedId, trainingDetailedId)));
    }
    /**
     * äººå‘˜åŸ¹è®­è¯¦æƒ…附件删除
     * @return
     */
    @ApiOperation(value = "人员培训详情附件删除")
    @DeleteMapping("/delTrainingDetailedFileList")
    public Result delTrainingDetailedFileList(Integer detailedFileId){
        return Result.success(personTrainingDetailedFileMapper.deleteById(detailedFileId));
    }
    /**
     * æŸ¥è¯¢ä»Šå¹´äººå‘˜åŸ¹è®­ä¿¡æ¯
     * @return
     */
    @ApiOperation(value = "查询今年人员培训信息")
    @GetMapping("/getThisYearTrainingDetailed")
    public Result<List<PersonTrainingDetailed>> getThisYearTrainingDetailed(){
        return Result.success(personTrainingService.getThisYearTrainingDetailed());
    }
}
cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonTrainingRecordController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,59 @@
package com.ruoyi.personnel.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.core.domain.Result;
import com.ruoyi.personnel.dto.PersonTrainingRecordListDto;
import com.ruoyi.personnel.dto.TrainingRecordPersonDetailedDto;
import com.ruoyi.personnel.service.PersonTrainingRecordService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletResponse;
/**
 * <p>
 * åŸ¹è®­è®¡åˆ’ å‰ç«¯æŽ§åˆ¶å™¨
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2024-10-11 01:11:49
 */
@Api(tags = "人员 - åŸ¹è®­è®°å½•")
@RestController
@RequestMapping("/personTrainingRecord")
public class PersonTrainingRecordController {
    @Autowired
    private PersonTrainingRecordService personTrainingRecordService;
    @ApiOperation(value = "查询人员 åŸ¹è®­è®°å½•")
    @GetMapping("trainingSelectTrainingRecord")
    public Result<IPage<PersonTrainingRecordListDto>> trainingSelectTrainingRecord(Page page, String userName, Integer userId, Integer departmentId) {
        IPage<PersonTrainingRecordListDto> iPage = personTrainingRecordService.personnelTrainingPersonnel(page, userName, userId, departmentId);
        return Result.success(iPage);
    }
    @ApiOperation(value = "查询人员明细 åŸ¹è®­è®°å½•")
    @GetMapping("queryPersonnelDetails")
    public Result<IPage<TrainingRecordPersonDetailedDto>> queryPersonnelDetails(Page page, Integer userId, Integer trainingDate) {
        IPage<TrainingRecordPersonDetailedDto> iPage = personTrainingRecordService.queryPersonnelDetailsOfUserIdAndYear(page, userId, trainingDate); // æ–°å¢žæ ¹æ®å¹´ä»½æŸ¥è¯¢
        return Result.success(iPage);
    }
    /**
     * å¯¼å‡ºäººå‘˜åŸ¹è®­è®°å½•
     * @return
     */
    @ApiOperation(value = "导出人员培训记录")
    @GetMapping("/exportTrainingRecord")
    public void exportTrainingRecord(Integer userId, Integer trainingDate, HttpServletResponse response){
        personTrainingRecordService.exportTrainingRecordAddTrainingDate(userId, trainingDate, response);// æ–°å¢žæ ¹æ®å¹´ä»½æŸ¥è¯¢
    }
}
cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonBasicInfoDetailsDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,65 @@
package com.ruoyi.personnel.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.time.LocalDateTime;
/**
 * Author: yuan
 * Date: 2024-12-13 æ˜ŸæœŸäº” 13:52:52
 * Description:
 */
@Data
public class PersonBasicInfoDetailsDto {
    @ApiModelProperty("用户id")
    private Integer userId;
    @ApiModelProperty("用户姓名")
    private String name;
    @ApiModelProperty("入职时间")
    private String entryTimeStr;
    @ApiModelProperty("实际实习结束")
    private String endPracticalPracticeStr;
    @ApiModelProperty("籍贯")
    private String nativePlace;
    @ApiModelProperty("身份证号")
    private String identityCard;
    @ApiModelProperty("身份证地址")
    private String idAddress;
    @ApiModelProperty("用户手机号")
    private String phone;
    @ApiModelProperty("毕业院校")
    private String graduatedInstitutions1;
    @ApiModelProperty("专业")
    private String major1;
    @ApiModelProperty("毕业时间1")
    private LocalDateTime graduationTime1;
    @ApiModelProperty("最高学历")
    private String officialAcademicRedentials;
    @ApiModelProperty("最高学位")
    private String highestDegree;
    @ApiModelProperty("职称")
    private String professionalTitle;
    // èŒä¸šèƒ½åŠ›
    @ApiModelProperty("紧急联系人")
    private String emergencyContact;
    @ApiModelProperty("紧急联系人电话")
    private String emergencyContactPhone;
}
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/PersonBasicInfoWorkDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,16 @@
package com.ruoyi.personnel.dto;
import com.ruoyi.personnel.pojo.PersonBasicInfoWork;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
 * @Author zhuo
 * @Date 2025/1/14
 */
@Data
public class PersonBasicInfoWorkDto extends PersonBasicInfoWork {
    @ApiModelProperty("填充使用")
    private String fill;
}
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 confirmOperatingPersonnelName;
    @ApiModelProperty("人员姓名")
    private String userName;
    @ApiModelProperty("岗位名称")
    private String postName;
    @ApiModelProperty("岗位职责")
    private String responsibilities;
    @ApiModelProperty("工作经历")
    private String placeWork;
    @ApiModelProperty("专业")
    private String major;
    @ApiModelProperty(value = "职称")
    private String professionalTitle;
}
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/PersonTrainingDetailedDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,29 @@
package com.ruoyi.personnel.dto;
import com.baomidou.mybatisplus.annotation.TableField;
import com.ruoyi.personnel.pojo.PersonTrainingDetailed;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
public class PersonTrainingDetailedDto extends PersonTrainingDetailed {
    @ApiModelProperty("举办部门名称")
    private String holdingDepartmentName;
    @ApiModelProperty("培训讲师名称")
    private String trainingLecturerName;
    @ApiModelProperty("当前登录人是否认领")
    private Boolean whetherClaim;
    @ApiModelProperty("培训日期")
    private String trainingDateString;
    // å¯¼å‡ºä½¿ç”¨
    @TableField(select = false, exist = false)
    @ApiModelProperty("序号(导出使用)")
    private Integer index;
}
cnas-personnel/src/main/java/com/ruoyi/personnel/dto/PersonTrainingDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
package com.ruoyi.personnel.dto;
import com.ruoyi.personnel.pojo.PersonTraining;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
@ApiModel(value = "PersonTrainingDto对象", description = "培训计划")
public class PersonTrainingDto extends PersonTraining {
    @ApiModelProperty("编制人姓名")
    private String compilerName;
    @ApiModelProperty("审核人姓名")
    private String reviewerName;
    @ApiModelProperty("批准人姓名")
    private String approverName;
    @ApiModelProperty("创建人姓名")
    private String createUserName;
}
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,35 @@
package com.ruoyi.personnel.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.time.LocalDate;
@Data
public class PersonTrainingRecordSubmitDto {
    @ApiModelProperty("年度计划明细ID")
    private Integer trainingDetailedId;
    @ApiModelProperty("培训地点")
    private String placeTraining;
    @ApiModelProperty("培训完成时间")
    private LocalDate openingTime;
    @ApiModelProperty("考核方式")
    private String assessmentMethod;
    @ApiModelProperty("本次培训综合评价")
    private String comprehensiveAssessment;
    @ApiModelProperty("评价人")
    private Integer assessmentUserId;
    @ApiModelProperty("评价时间")
    private LocalDate assessmentDate;
    private Integer state;
}
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,26 @@
package com.ruoyi.personnel.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
public class TrainingRecordPersonDetailedDto {
    @ApiModelProperty("培训日期")
    private String trainingDateString;
    @ApiModelProperty("培训日期")
    private String trainingDate;
    @ApiModelProperty("培训内容")
    private String trainingContent;
    @ApiModelProperty("课时")
    private Integer classHour;
    @ApiModelProperty("考核结果")
    private String examinationResults;
    @ApiModelProperty("备注")
    private String remarks;
}
cnas-personnel/src/main/java/com/ruoyi/personnel/dto/UserPageDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,24 @@
package com.ruoyi.personnel.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;
}
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/PersonTrainingDetailedListener.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,42 @@
package com.ruoyi.personnel.excel;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.ruoyi.personnel.service.PersonTrainingDetailedService;
import lombok.Data;
import java.util.ArrayList;
import java.util.List;
@Data
public class PersonTrainingDetailedListener extends AnalysisEventListener<PersonTrainingDetailedUpload> {
    private Integer planId;
    private static final int BATCH_COUNT = 1000;
    List<PersonTrainingDetailedUpload> list = new ArrayList<>();
    private PersonTrainingDetailedService personTrainingDetailedService;
    public PersonTrainingDetailedListener(PersonTrainingDetailedService personTrainingDetailedService) {
        this.personTrainingDetailedService = personTrainingDetailedService;
    }
    @Override
    public void invoke(PersonTrainingDetailedUpload data, AnalysisContext context) {
        list.add(data);
        if (list.size() >= BATCH_COUNT) {
            save();
            list.clear();
        }
    }
    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
        save();
    }
    private void save() {
        personTrainingDetailedService.importExcel(list, this.planId);
    }
}
cnas-personnel/src/main/java/com/ruoyi/personnel/excel/PersonTrainingDetailedUpload.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,35 @@
package com.ruoyi.personnel.excel;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;
@Data
public class PersonTrainingDetailedUpload {
    @ExcelProperty("培训目标")
    private String trainingObjectives;
    @ExcelProperty("培训内容")
    private String trainingContent;
    @ExcelProperty("培训方式")
    private String trainingMode;
    @ExcelProperty("参加对象")
    private String participants;
    @ExcelProperty("举办部门")
    private String holdingDepartment;
    @ExcelProperty("培训讲师")
    private String trainingLecturerName;
    @ExcelProperty("培训时间")
    private String trainingDate;
    @ExcelProperty("课时")
    private Integer classHour;
    @ExcelProperty("备注")
    private String remarks;
}
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/PersonBasicInfoFileMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,16 @@
package com.ruoyi.personnel.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.personnel.pojo.PersonBasicInfoFile;
/**
 * <p>
 * äººå‘˜åŸºæœ¬ä¿¡æ¯é™„ä»¶ Mapper æŽ¥å£
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2025-01-09 05:28:55
 */
public interface PersonBasicInfoFileMapper extends BaseMapper<PersonBasicInfoFile> {
}
cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonBasicInfoMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,42 @@
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.domain.entity.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);
    /**
     * äººå‘˜åŸºæœ¬ä¿¡æ¯åˆ†é¡µæŸ¥è¯¢
     * @param page
     * @param name
     * @param departmentId
     * @return
     */
    IPage<Map<String, Object>> selectPersonBasecInfoAndUser(Page page, String name, Integer departmentId);
    /**
     * å¯¼å‡ºæŸ¥è¯¢äººå‘˜ä¿¡æ¯
     * @param userId
     * @return
     */
    Map<String, Object> selectexportPersonBasic(Integer userId);
}
cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonBasicInfoWorkMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,16 @@
package com.ruoyi.personnel.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.personnel.pojo.PersonBasicInfoWork;
/**
 * <p>
 * äººå‘˜åŸºæœ¬ä¿¡æ¯ Mapper æŽ¥å£
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2025-01-09 05:45:04
 */
public interface PersonBasicInfoWorkMapper extends BaseMapper<PersonBasicInfoWork> {
}
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/PersonTrainingDetailedFileMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,15 @@
package com.ruoyi.personnel.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.personnel.pojo.PersonTrainingDetailedFile;
/**
 * äººå‘˜åŸ¹è®­è®¡åˆ’详情附件表(CnasPersonTrainingDetailedFile)$desc
 *
 * @author makejava
 * @since 2024-12-25 14:18:22
 */
public interface PersonTrainingDetailedFileMapper extends BaseMapper<PersonTrainingDetailedFile> {
}
cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonTrainingDetailedMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,48 @@
package com.ruoyi.personnel.mapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.framework.mybatis_config.MyBaseMapper;
import com.ruoyi.personnel.dto.PersonTrainingDetailedDto;
import com.ruoyi.personnel.pojo.PersonTrainingDetailed;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
 * <p>
 * åŸ¹è®­è®¡åˆ’详情 Mapper æŽ¥å£
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2024-10-11 01:46:27
 */
public interface PersonTrainingDetailedMapper extends MyBaseMapper<PersonTrainingDetailed> {
    IPage<PersonTrainingDetailedDto> queryTheAnnualPlanDetailsTable(Page page,
                                                                    String trainingLecturerName,
                                                                    String courseCode, String trainingDate,
                                                                    Integer id,
                                                                    Integer userId,
                                                                    Integer loginUserId);
    /**
     * æ ¹æ®ä¸»è¡¨id查询详情
     * @param trainingId
     * @return
     */
    List<PersonTrainingDetailedDto> selectTrainingList(@Param("trainingId") Integer trainingId);
    /**
     * æŸ¥è¯¢è¯¦ç»†
     * @param id
     * @return
     */
    PersonTrainingDetailedDto selectTrainingDetail(@Param("id") Integer id);
    /**
     * æŸ¥è¯¢ä»Šå¹´äººå‘˜åŸ¹è®­ä¿¡æ¯
     * @return
     */
    List<PersonTrainingDetailed> getThisYearTrainingDetailed();
}
cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonTrainingMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
package com.ruoyi.personnel.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.personnel.dto.PersonTrainingDto;
import com.ruoyi.personnel.pojo.PersonTraining;
/**
 * <p>
 * åŸ¹è®­è®¡åˆ’ Mapper æŽ¥å£
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2024-10-11 01:11:49
 */
public interface PersonTrainingMapper extends BaseMapper<PersonTraining> {
    IPage<PersonTrainingDto> personTrainingSelect(Page page, String compilerName, String departLimsId);
}
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,156 @@
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.LocalDateTime;
/**
 * <p>
 *
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2024-08-30 09:19:57
 */
@Getter
@Setter
@TableName("cnas_person_basic_info")
@ApiModel(value = "PersonBasicInfo对象", description = "")
public class PersonBasicInfo implements Serializable {
    private static final long serialVersionUID = 1L;
    @ApiModelProperty("主键id")
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    @ApiModelProperty("当前状态")
    private String currentState;
    @ApiModelProperty("职称")
    @ExcelProperty("职称")
    private String professionalTitle;
    @ApiModelProperty("性别")
    private String sex;
    @ApiModelProperty("人员分类")
    private String personnelClassification;
    @ApiModelProperty("出生日期")
    @TableField(updateStrategy = FieldStrategy.IGNORED) // ä¸ºç©ºå¯ä»¥æ›´æ–°
    private LocalDateTime dateBirth;
    @ApiModelProperty("身份证号")
    @ExcelProperty("证件号码")
    private String identityCard;
    @ApiModelProperty("民族")
    private String nation;
    @ApiModelProperty("政治面貌")
    private String politicalStatus;
    @ApiModelProperty("最高学历")
    @ExcelProperty("最高学历")
    private String officialAcademicRedentials;
    @ApiModelProperty("毕业时间1")
    @ExcelProperty("毕业时间")
    private LocalDateTime graduationTime1;
    @ApiModelProperty("毕业院校1")
    @ExcelProperty("毕业院校")
    private String graduatedInstitutions1;
    @ApiModelProperty("专业1")
    @ExcelProperty("所学专业")
    private String major1;
    @ApiModelProperty("毕业时间2")
    @TableField(updateStrategy = FieldStrategy.IGNORED) // ä¸ºç©ºå¯ä»¥æ›´æ–°
    private LocalDateTime graduationTime2;
    @ApiModelProperty("毕业院校2")
    private String graduatedInstitutions2;
    @ApiModelProperty("专业2")
    private String major2;
    @ApiModelProperty("手机号")
    private String telephone;
    @ApiModelProperty("备注")
    private String remarks;
    @ApiModelProperty("用户表(user)id")
    private Integer userId;
    @ApiModelProperty("公司名称")
    private String corporateName;
    @ApiModelProperty("岗位名称")
    private String postName;
    @ApiModelProperty("入集团时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
    @TableField(updateStrategy = FieldStrategy.IGNORED) // ä¸ºç©ºå¯ä»¥æ›´æ–°
    @ExcelProperty("入集团时间")
    private LocalDateTime groupTime;
    @ApiModelProperty("劳动关系")
    private Integer laborRelations;
    @ApiModelProperty("工作时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
    @TableField(updateStrategy = FieldStrategy.IGNORED) // ä¸ºç©ºå¯ä»¥æ›´æ–°
    private LocalDateTime workingTime;
    @ApiModelProperty("合同有效期")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
    @TableField(updateStrategy = FieldStrategy.IGNORED) // ä¸ºç©ºå¯ä»¥æ›´æ–°
    private LocalDateTime contractLifeTime;
    @ApiModelProperty("籍贯")
    @ExcelProperty("籍贯")
    private String nativePlace;
    @ApiModelProperty("证件有效期")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
    @TableField(updateStrategy = FieldStrategy.IGNORED) // ä¸ºç©ºå¯ä»¥æ›´æ–°
    private LocalDateTime validityPeriod;
    @ApiModelProperty("婚姻状况")
    private Integer maritalStatus;
    @ApiModelProperty("证件地址")
    @ExcelProperty("证件地址")
    private String idAddress;
    @ApiModelProperty("证件详细地址")
    private String idDetailAddress;
    @ApiModelProperty("入党/团时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
    @TableField(updateStrategy = FieldStrategy.IGNORED) // ä¸ºç©ºå¯ä»¥æ›´æ–°
    private LocalDateTime dumplingTime;
    @ApiModelProperty("最高学位")
    @ExcelProperty("最高学位")
    private String highestDegree;
    @ApiModelProperty("最后更新时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime lastUpdateTime;
}
cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonBasicInfoFile.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,58 @@
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 2025-01-09 05:28:55
 */
@Getter
@Setter
@TableName("cnas_person_basic_info_file")
@ApiModel(value = "PersonBasicInfoFile对象", description = "人员基本信息附件")
public class PersonBasicInfoFile implements Serializable {
    private static final long serialVersionUID = 1L;
    @TableId(value = "basic_info_file_id", type = IdType.AUTO)
    private Integer basicInfoFileId;
    @ApiModelProperty("人员基本信息id")
    private Integer userId;
    @ApiModelProperty("类型:1图片/2文件")
    private Integer type;
    @ApiModelProperty("附件路径")
    private String fileUrl;
    @ApiModelProperty("附件名称")
    private String fileName;
    @ApiModelProperty("创建人")
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    @ApiModelProperty("创建时间")
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    @ApiModelProperty("修改人")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    @ApiModelProperty("修改时间")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
}
cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonBasicInfoWork.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,53 @@
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 2025-01-09 05:45:04
 */
@Getter
@Setter
@TableName("cnas_person_basic_info_work")
@ApiModel(value = "PersonBasicInfoWork对象", description = "人员基本信息")
public class PersonBasicInfoWork implements Serializable {
    private static final long serialVersionUID = 1L;
    @TableId(value = "basic_info_work_id", type = IdType.AUTO)
    private Integer basicInfoWorkId;
    @ApiModelProperty("人员id")
    private Integer userId;
    @ApiModelProperty("工作经历")
    private String workExperience;
    @ApiModelProperty("创建人")
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    @ApiModelProperty("创建时间")
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    @ApiModelProperty("修改人")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    @ApiModelProperty("修改时间")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
}
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,114 @@
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("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;
}
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/PersonTraining.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,83 @@
package com.ruoyi.personnel.pojo;
import com.baomidou.mybatisplus.annotation.*;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
 * <p>
 * åŸ¹è®­è®¡åˆ’
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2024-10-11 01:11:49
 */
@Getter
@Setter
@TableName("cnas_person_training")
@ApiModel(value = "PersonTraining对象", description = "培训计划")
public class PersonTraining implements Serializable {
    private static final long serialVersionUID = 1L;
    @ApiModelProperty("主键id")
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    @ApiModelProperty("文件名称")
    private String fileName;
    @ApiModelProperty("计划年份")
    private String planYear;
    @ApiModelProperty("编制人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;
}
cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonTrainingDetailed.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,99 @@
package com.ruoyi.personnel.pojo;
import com.baomidou.mybatisplus.annotation.*;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
import java.time.LocalDate;
import java.time.LocalDateTime;
/**
 * <p>
 * åŸ¹è®­è®¡åˆ’详情
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2024-10-11 01:46:27
 */
@Getter
@Setter
@TableName("cnas_person_training_detailed")
@ApiModel(value = "PersonTrainingDetailed对象", description = "培训计划详情")
public class PersonTrainingDetailed implements Serializable {
    private static final long serialVersionUID = 1L;
    @ApiModelProperty("培训计划")
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    @ApiModelProperty("培训目标")
    private String trainingObjectives;
    @ApiModelProperty("培训内容")
    private String trainingContent;
    @ApiModelProperty("培训方式")
    private String trainingMode;
    @ApiModelProperty("状态(1:已完成;2:待评价;3: æœªå¼€å§‹)")
    private Integer state;
    @ApiModelProperty("参加对象")
    private String participants;
    @ApiModelProperty("举办部门")
    private String holdingDepartment;
    @ApiModelProperty("培训地点")
    private String placeTraining;
    @ApiModelProperty("培训讲师_id")
    private Integer trainingLecturerId;
    @ApiModelProperty("计划培训日期")
    private String trainingDate;
    @ApiModelProperty("培训完成时间")
    private LocalDate openingTime;
    @ApiModelProperty("课时")
    private Integer classHour;
    @ApiModelProperty("备注")
    private String remarks;
    @ApiModelProperty("培训计划id")
    private Integer planId;
    @ApiModelProperty(value = "创建时间", hidden = true)
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    @ApiModelProperty(value = "创建人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;
}
cnas-personnel/src/main/java/com/ruoyi/personnel/pojo/PersonTrainingDetailedFile.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,49 @@
package com.ruoyi.personnel.pojo;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
/**
 * äººå‘˜åŸ¹è®­è®¡åˆ’详情附件表(CnasPersonTrainingDetailedFile)$desc
 *
 * @author makejava
 * @since 2024-12-25 14:18:22
 */
@Data
@TableName("cnas_person_training_detailed_file")
public class PersonTrainingDetailedFile {
    @TableId(type = IdType.AUTO)
    private Integer detailedFileId;
    @ApiModelProperty("人员你培训计划详情id")
    private Integer trainingDetailedId;
    @ApiModelProperty("类型:1图片/2文件")
    private Integer type;
    @ApiModelProperty("附件路径")
    private String fileUrl;
    @ApiModelProperty("附件名称")
    private String fileName;
    @ApiModelProperty("创建人")
    private Integer createUser;
    @ApiModelProperty("创建时间")
    private Date createTime;
    @ApiModelProperty("修改人")
    private Integer updateUser;
    @ApiModelProperty("修改时间")
    private Date updateTime;
}
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/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/PersonBasicInfoFileService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,16 @@
package com.ruoyi.personnel.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.personnel.pojo.PersonBasicInfoFile;
/**
 * <p>
 * äººå‘˜åŸºæœ¬ä¿¡æ¯é™„ä»¶ æœåŠ¡ç±»
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2025-01-09 05:28:55
 */
public interface PersonBasicInfoFileService extends IService<PersonBasicInfoFile> {
}
cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonBasicInfoService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,45 @@
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.DepartmentDto;
import com.ruoyi.personnel.dto.PersonBasicInfoDto;
import com.ruoyi.personnel.dto.UserPageDto;
import com.ruoyi.personnel.pojo.PersonBasicInfo;
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);
    /**
     * äººå‘˜åŸ¹è®­åŸºæœ¬ä¿¡æ¯é™„件新增
     * @param basicInfoId
     * @param file
     * @return
     */
    boolean uploadBasicInfoFile(Integer basicInfoId, MultipartFile file);
}
cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonBasicInfoWorkService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,16 @@
package com.ruoyi.personnel.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.personnel.pojo.PersonBasicInfoWork;
/**
 * <p>
 * äººå‘˜åŸºæœ¬ä¿¡æ¯ æœåŠ¡ç±»
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2025-01-09 05:45:04
 */
public interface PersonBasicInfoWorkService extends IService<PersonBasicInfoWork> {
}
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,35 @@
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);
    /**
     * submitConfirmPersonnelCapability
     * @param personPersonnelCapacity
     */
    void submitConfirmPersonnelCapability(PersonPersonnelCapacity personPersonnelCapacity);
}
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/PersonTrainingDetailedService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,29 @@
package com.ruoyi.personnel.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.personnel.dto.PersonTrainingDetailedDto;
import com.ruoyi.personnel.excel.PersonTrainingDetailedUpload;
import com.ruoyi.personnel.pojo.PersonTrainingDetailed;
import java.util.List;
/**
 * <p>
 * åŸ¹è®­è®¡åˆ’详情 æœåŠ¡ç±»
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2024-10-11 01:46:27
 */
public interface PersonTrainingDetailedService extends IService<PersonTrainingDetailed> {
    void importExcel(List<PersonTrainingDetailedUpload> list, Integer planId);
    void deleteAnnualPlanDetailTable(String ids);
    IPage<PersonTrainingDetailedDto> queryTheAnnualPlanDetailsTable(Page page,
                                                                    String trainingLecturerName,
                                                                    String courseCode, String trainingDate, Integer id, Integer userId);
}
cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonTrainingRecordService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,59 @@
package com.ruoyi.personnel.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.personnel.dto.PersonTrainingRecordDto;
import com.ruoyi.personnel.dto.PersonTrainingRecordListDto;
import com.ruoyi.personnel.dto.PersonTrainingRecordSubmitDto;
import com.ruoyi.personnel.dto.TrainingRecordPersonDetailedDto;
import com.ruoyi.personnel.pojo.PersonTrainingRecord;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
/**
 * <p>
 * åŸ¹è®­è®°å½• æœåŠ¡ç±»
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2024-10-12 04:50:48
 */
public interface PersonTrainingRecordService extends IService<PersonTrainingRecord> {
    List<PersonTrainingRecordDto> trainingAndAssessmentRecordsPage(Integer trainingDetailedId, String userName);
    void deleteTrainingAndAssessmentRecords(String ids);
    IPage<PersonTrainingRecordListDto> personnelTrainingPersonnel(Page page,
                                                                  String userName, Integer userId, Integer departLimsId);
    void claimOfTrainingAndAssessmentRecords(Boolean claimAndClaim, Integer courseId);
    /**
     * æ ¹æ®ç”¨æˆ·id和年份查询人员明细 åŸ¹è®­è®°å½•
     * @param page
     * @param userId
     * @param year
     * @return
     */
    IPage<TrainingRecordPersonDetailedDto> queryPersonnelDetailsOfUserIdAndYear(Page page, Integer userId, Integer year);
    /**
     * å¯¼å‡ºäººå‘˜åŸ¹è®­è®°å½•
     * @param userId
     * @param trainingDate
     * @param response
     */
    void exportTrainingRecordAddTrainingDate(Integer userId, Integer trainingDate, HttpServletResponse response);
    /**
     * åŸ¹è®­æäº¤
     * @param personTrainingRecordSubmitDto
     */
    void trainingAndAssessmentRecordsAdded(PersonTrainingRecordSubmitDto personTrainingRecordSubmitDto);
}
cnas-personnel/src/main/java/com/ruoyi/personnel/service/PersonTrainingService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,63 @@
package com.ruoyi.personnel.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.personnel.dto.PersonTrainingDto;
import com.ruoyi.personnel.pojo.PersonTraining;
import com.ruoyi.personnel.pojo.PersonTrainingDetailed;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
/**
 * <p>
 * åŸ¹è®­è®¡åˆ’ æœåŠ¡ç±»
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2024-10-11 01:11:49
 */
public interface PersonTrainingService extends IService<PersonTraining> {
    IPage<PersonTrainingDto> personTrainingSelect(Page page,
                                                  String compilerName, String departmentId);
    void personTrainingImport(MultipartFile file, PersonTraining training);
    void personTrainingDelete(Integer id);
    void reviewAnnualPersonnelTraining(PersonTraining training);
    void approveAnnualPersonnelTraining(PersonTraining training);
    /**
     * å¯¼å‡ºäººå‘˜åŸ¹è®­è®¡åˆ’
     * @param id
     * @param response
     */
    void exportPersonTraining(Integer id, HttpServletResponse response);
    /**
     * å¯¼å‡ºäººå‘˜åŸ¹è®­ä¸Žè€ƒæ ¸è®°å½•
     * @param id
     * @param response
     */
    void exportPersonTrainingRecord(Integer id, HttpServletResponse response);
    /**
     * äººå‘˜åŸ¹è®­è¯¦æƒ…附件新增
     * @param trainingDetailedId
     * @param file
     * @return
     */
    boolean uploadTrainingDetailedFile(Integer trainingDetailedId, MultipartFile file);
    /**
     * æŸ¥è¯¢ä»Šå¹´äººå‘˜åŸ¹è®­ä¿¡æ¯
     * @return
     */
    List<PersonTrainingDetailed> getThisYearTrainingDetailed();
}
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/PersonBasicInfoFileServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
package com.ruoyi.personnel.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.personnel.mapper.PersonBasicInfoFileMapper;
import com.ruoyi.personnel.pojo.PersonBasicInfoFile;
import com.ruoyi.personnel.service.PersonBasicInfoFileService;
import org.springframework.stereotype.Service;
/**
 * <p>
 * äººå‘˜åŸºæœ¬ä¿¡æ¯é™„ä»¶ æœåŠ¡å®žçŽ°ç±»
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2025-01-09 05:28:55
 */
@Service
public class PersonBasicInfoFileServiceImpl extends ServiceImpl<PersonBasicInfoFileMapper, PersonBasicInfoFile> implements PersonBasicInfoFileService {
}
cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonBasicInfoServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,340 @@
package com.ruoyi.personnel.service.impl;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.config.Configure;
import com.ruoyi.common.core.domain.entity.DepartmentDto;
import com.ruoyi.common.core.domain.entity.DepartmentLims;
import com.ruoyi.common.core.domain.entity.User;
import com.ruoyi.common.utils.QueryWrappers;
import com.ruoyi.framework.exception.ErrorException;
import com.ruoyi.inspect.util.HackLoopTableRenderPolicy;
import com.ruoyi.personnel.dto.PersonBasicInfoDto;
import com.ruoyi.personnel.dto.PersonBasicInfoWorkDto;
import com.ruoyi.personnel.dto.UserPageDto;
import com.ruoyi.personnel.mapper.AnnexMapper;
import com.ruoyi.personnel.mapper.PersonBasicInfoFileMapper;
import com.ruoyi.personnel.mapper.PersonBasicInfoMapper;
import com.ruoyi.personnel.mapper.PersonBasicInfoWorkMapper;
import com.ruoyi.personnel.pojo.Annex;
import com.ruoyi.personnel.pojo.PersonBasicInfo;
import com.ruoyi.personnel.pojo.PersonBasicInfoFile;
import com.ruoyi.personnel.pojo.PersonBasicInfoWork;
import com.ruoyi.personnel.service.PersonBasicInfoService;
import com.ruoyi.system.mapper.DepartmentLimsMapper;
import com.ruoyi.system.mapper.UserMapper;
import org.apache.poi.xwpf.usermodel.XWPFTable;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STMerge;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.stream.Collectors;
/**
 * <p>
 *  æœåŠ¡å®žçŽ°ç±»
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2024-08-30 09:19:57
 */
@Service
@Transactional(rollbackFor = Exception.class)
public class PersonBasicInfoServiceImpl extends ServiceImpl<PersonBasicInfoMapper, PersonBasicInfo> implements PersonBasicInfoService {
    @Autowired
    private DepartmentLimsMapper departmentMapper;
    @Value("${file.path}")
    private String imgUrl;
    @Value("${wordUrl}")
    private String wordUrl;
    @Resource
    private UserMapper userMapper;
    @Resource
    private AnnexMapper annexMapper;
    @Resource
    private PersonBasicInfoFileMapper personBasicInfoFileMapper;
    @Resource
    private PersonBasicInfoWorkMapper personBasicInfoWorkMapper;
    @Override
    public List<DepartmentDto> selectCNSAPersonTree() {
        List<DepartmentDto> departments = departmentMapper.selectDepartment();
        List<DepartmentDto> limsUser = baseMapper.selectLimsUser();
        departments.addAll(limsUser);
        //获取父节点
        return departments.stream().filter(m -> m.getFatherId() == null).peek(
                (m) -> m.setChildren(getChildren(m, departments))
        ).collect(Collectors.toList());
    }
    @Override
    public Map<String,Object> getCNASPersonnelInfo(Integer userId) {
        Map<String, Object> map = new HashMap<>();
        Map<Integer,List<DepartmentLims>>  childrenMap = new HashMap<>();
        List<DepartmentLims> deptS = departmentMapper.selectList(null);
        for (DepartmentLims dept : deptS) {
            if(!Objects.isNull(dept.getFatherId())) {
                if(!childrenMap.containsKey(dept.getFatherId())) {
                        childrenMap.put(dept.getFatherId(),new ArrayList<>());
                }
                childrenMap.get(dept.getFatherId()).add(dept);
            }
        }
        // çˆ¶èŠ‚ç‚¹
        List<DepartmentLims> deptF = new ArrayList<>();
        for (DepartmentLims dept : deptS) {
            if(Objects.isNull(dept.getFatherId())) {
                deptF.add(buildTree(dept,childrenMap));
            }
        }
        map.put("department",deptF);
        map.put("PersonBasicInfoDto",baseMapper.getCNASPersonnelInfo(userId));
        map.put("annexList",annexMapper.selectList(new LambdaQueryWrapper<Annex>().eq(Annex::getUserId,userId)));
        return map;
    }
    private DepartmentLims buildTree(DepartmentLims departmentLims, Map<Integer,List<DepartmentLims>> childrenMap) {
        if(childrenMap.containsKey(departmentLims.getId())) {
            departmentLims.setChildren(childrenMap.get(departmentLims.getId()));
            for (DepartmentLims departmentLims1 : departmentLims.getChildren()) {
                buildTree(departmentLims1,childrenMap);
            }
        }
        return departmentLims;
    }
    @Override
    public void saveCNASPersonnelInfo(PersonBasicInfoDto personBasicInfoDto) {
        User user = new User();
        user.setId(personBasicInfoDto.getUserId());
        user.setAccount(personBasicInfoDto.getAccount());
        user.setName(personBasicInfoDto.getName());
        user.setNameEn(personBasicInfoDto.getNameEn());
        user.setAge(personBasicInfoDto.getAge());
        user.setPhone(personBasicInfoDto.getPhone());
        user.setEmail(personBasicInfoDto.getEmail());
        user.setSignatureUrl(personBasicInfoDto.getSignatureUrl());
        user.setPictureUrl(personBasicInfoDto.getPictureUrl());
        user.setDepartLimsId(personBasicInfoDto.getDepartLimsId());
        userMapper.updateById(user);
        PersonBasicInfo personBasicInfo = JSONObject.parseObject(JSON.toJSONString(personBasicInfoDto), PersonBasicInfo.class);
        PersonBasicInfo one = baseMapper.selectOne(new LambdaQueryWrapper<PersonBasicInfo>()
                .eq(PersonBasicInfo::getUserId, personBasicInfoDto.getUserId()));
        if(Objects.isNull(one)) {
            baseMapper.insert(personBasicInfo);
        }else {
            baseMapper.updateById(personBasicInfo);
        }
    }
    @Override
    public IPage<Map<String, Object>> basicInformationOfPersonnelSelectPage(Page page, String name, Integer departmentId) {
        return baseMapper.selectPersonBasecInfoAndUser(page, name, departmentId);
    }
    @Override
    public void exportPersonBasicInfo(UserPageDto userPageDto, HttpServletResponse response) throws Exception {
        ArrayList<PersonBasicInfoDto> data = new ArrayList<>();
        List<User> list = userMapper.selectList(null);
        for (User user : list) {
            PersonBasicInfoDto personBasicInfoDto = new PersonBasicInfoDto();
            PersonBasicInfo personBasicInfo = baseMapper.selectOne(Wrappers.<PersonBasicInfo>lambdaQuery().eq(PersonBasicInfo::getUserId, user.getId()));
            if (ObjectUtils.isNotEmpty(personBasicInfo)) {
                BeanUtils.copyProperties(personBasicInfo, personBasicInfoDto);
            }
            personBasicInfoDto.setName(user.getName());
            personBasicInfoDto.setAccount(user.getAccount());
            personBasicInfoDto.setPhone(ObjectUtils.isNotEmpty(user.getPhone()) ? user.getPhone() : " ");
            data.add(personBasicInfoDto);
        }
        response.setContentType("application/vnd.ms-excel");
        response.setCharacterEncoding("UTF-8");
        String fileName = URLEncoder.encode("人员基本信息列表导出", "UTF-8");
        response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
        try {
            // æ–°å»ºExcelWriter
            ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()).build();
            WriteSheet mainSheet = EasyExcel.writerSheet(0, "人员基本信息导出").head(PersonBasicInfoDto.class).build();
            excelWriter.write(data, mainSheet);
            // å…³é—­æµ
            excelWriter.finish();
        } catch (IOException e) {
            throw new RuntimeException("导出失败");
        }
    }
    @Override
    public String exportPersonBasicInfoById(Integer id, HttpServletResponse response) {
        Map<String, Object> userMap = baseMapper.selectexportPersonBasic(id);
        User user = userMapper.selectById(id);
        PersonBasicInfo personBasicInfo = baseMapper.selectOne(Wrappers.<PersonBasicInfo>lambdaQuery().eq(PersonBasicInfo::getUserId, user.getId()));
        if (ObjectUtils.isEmpty(personBasicInfo)){
            throw new ErrorException("该用户的基本信息没有录入,暂无法导出");
        }
        // è¯ä»¶
        List<Annex> annexList = annexMapper.selectList(Wrappers.<Annex>lambdaQuery()
                .eq(Annex::getUserId, id));
        // å·¥ä½œç»åކ
        List<PersonBasicInfoWork> personBasicInfoWorks = personBasicInfoWorkMapper.selectList(Wrappers.<PersonBasicInfoWork>lambdaQuery()
                .eq(PersonBasicInfoWork::getUserId, id));
        List<PersonBasicInfoWorkDto> workList = personBasicInfoWorks.stream().map(basicInfoWork -> {
            PersonBasicInfoWorkDto personBasicInfoWorkDto = new PersonBasicInfoWorkDto();
            personBasicInfoWorkDto.setWorkExperience(basicInfoWork.getWorkExperience());
            personBasicInfoWorkDto.setFill("主要工作经历\nMain work experience∑1");
            return personBasicInfoWorkDto;
        }).collect(Collectors.toList());
        // æ£€æŸ¥åˆ—表长度并填充空对象
        while (annexList.size() < 10) {
            annexList.add(new Annex());
        }
        // æ£€æŸ¥åˆ—表长度并填充空对象
        while (workList.size() < 4) {
            workList.add(new PersonBasicInfoWorkDto());
        }
        // èŽ·å–è·¯å¾„
        InputStream inputStream = this.getClass().getResourceAsStream("/static/person-basic-info.docx");
        Configure configure = Configure.builder()
                .bind("annexList", new HackLoopTableRenderPolicy())
                .bind("workList", new HackLoopTableRenderPolicy())
                .build();
        XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
                new HashMap<String, Object>() {{
                    put("user", userMap);
                    put("annexList", annexList);
                    put("workList", workList);
                }});
        try {
            response.setContentType("application/msword");
            String fileName = URLEncoder.encode(
                    userMap.get("name") + "人员档案", "UTF-8");
            response.setHeader("Content-disposition",
                    "attachment;filename=" + fileName + ".docx");
            OutputStream os = response.getOutputStream();
            template.write(os);
            os.flush();
            os.close();
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException("导出失败");
        }
        return null;
    }
    /**
     * äººå‘˜åŸ¹è®­åŸºæœ¬ä¿¡æ¯é™„件新增
     * @param userId
     * @param file
     * @return
     */
    @Override
    public boolean uploadBasicInfoFile(Integer userId, MultipartFile file) {
        if (userId == null) {
            throw new ErrorException("缺少人员id");
        }
        String urlString;
        String pathName;
        String path;
        String filename = file.getOriginalFilename();
        String contentType = file.getContentType();
        PersonBasicInfoFile personBasicInfoFile = new PersonBasicInfoFile();
        personBasicInfoFile.setUserId(userId);
        personBasicInfoFile.setFileName(filename);
        if (contentType != null && contentType.startsWith("image/")) {
            // æ˜¯å›¾ç‰‡
            path = imgUrl;
            personBasicInfoFile.setType(1);
        } else {
            // æ˜¯æ–‡ä»¶
            path = wordUrl;
            personBasicInfoFile.setType(2);
        }
        try {
            File realpath = new File(path);
            if (!realpath.exists()) {
                realpath.mkdirs();
            }
            pathName = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyMMddHHmmss")) + "_" + file.getOriginalFilename();
            urlString = realpath + "/" + pathName;
            file.transferTo(new File(urlString));
            personBasicInfoFile.setFileUrl(pathName);
            personBasicInfoFileMapper.insert(personBasicInfoFile);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            System.err.println("附件上传错误");
            return false;
        }
    }
    /**
     * é€’归查询子节点
     * @param root  æ ¹èŠ‚ç‚¹
     * @param all   æ‰€æœ‰èŠ‚ç‚¹
     * @return æ ¹èŠ‚ç‚¹ä¿¡æ¯
     */
    private List<DepartmentDto> getChildren(DepartmentDto root, List<DepartmentDto> all) {
        if (ObjectUtils.isNotEmpty(root.getId())) {
            return all.stream().filter(m -> Objects.equals(m.getFatherId(), root.getId())).peek(
                    (m) -> m.setChildren(getChildren(m, all))
            ).collect(Collectors.toList());
        } else {
            return Collections.emptyList();
        }
    }
    // æ°´å¹³åˆå¹¶å•元格
    private static void mergeCellsHorizontally(XWPFTable table, int row, int fromCol, int toCol) {
        for (int i = fromCol; i <= toCol; i++) {
            if (i == fromCol) {
                table.getRow(row).getCell(i).getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.RESTART);
            } else {
                table.getRow(row).getCell(i).getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.CONTINUE);
            }
        }
    }
    // åž‚直合并单元格
    private static void mergeCellsVertically(XWPFTable table, int col, int fromRow, int toRow) {
        for (int i = fromRow; i <= toRow; i++) {
            if (i == fromRow) {
                table.getRow(i).getCell(col).getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.RESTART);
            } else {
                table.getRow(i).getCell(col).getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.CONTINUE);
            }
        }
    }
}
cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonBasicInfoWorkServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
package com.ruoyi.personnel.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.personnel.mapper.PersonBasicInfoWorkMapper;
import com.ruoyi.personnel.pojo.PersonBasicInfoWork;
import com.ruoyi.personnel.service.PersonBasicInfoWorkService;
import org.springframework.stereotype.Service;
/**
 * <p>
 * äººå‘˜åŸºæœ¬ä¿¡æ¯ æœåŠ¡å®žçŽ°ç±»
 * </p>
 *
 * @author æ±Ÿè‹éµ·é›ç½‘络科技有限公司
 * @since 2025-01-09 05:45:04
 */
@Service
public class PersonBasicInfoWorkServiceImpl extends ServiceImpl<PersonBasicInfoWorkMapper, PersonBasicInfoWork> implements PersonBasicInfoWorkService {
}
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
    private 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,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.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
    private 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,158 @@
package com.ruoyi.personnel.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
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.core.domain.entity.InformationNotification;
import com.ruoyi.common.core.domain.entity.User;
import com.ruoyi.common.utils.DateImageUtil;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.WxCpUtils;
import com.ruoyi.framework.exception.ErrorException;
import com.ruoyi.personnel.dto.PersonPersonnelCapacityDto;
import com.ruoyi.personnel.dto.PersonPersonnelCapacityExportDto;
import com.ruoyi.personnel.pojo.PersonPersonnelCapacity;
import com.ruoyi.personnel.mapper.PersonPersonnelCapacityMapper;
import com.ruoyi.personnel.service.PersonPersonnelCapacityService;
import com.ruoyi.system.mapper.UserMapper;
import com.ruoyi.system.service.InformationNotificationService;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import 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 11:26:18
 */
@Service
public class PersonPersonnelCapacityServiceImpl extends ServiceImpl<PersonPersonnelCapacityMapper, PersonPersonnelCapacity> implements PersonPersonnelCapacityService {
    @Resource
    private UserMapper userMapper;
    @Resource
    private InformationNotificationService informationNotificationService;
    @Resource
    private ThreadPoolTaskExecutor threadPoolTaskExecutor;
    @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 personPersonnelCapacity
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void submitConfirmPersonnelCapability(PersonPersonnelCapacity personPersonnelCapacity) {
        if (personPersonnelCapacity.getConfirmOperatingPersonnelId() == null) {
            throw new ErrorException("缺少确认人");
        }
        User formUser = userMapper.selectById(personPersonnelCapacity.getUserId());
        Integer userId = SecurityUtils.getUserId().intValue();
        User user = userMapper.selectById(userId);
        // æ¶ˆæ¯å‘送
        InformationNotification info = new InformationNotification();
        // å‘送人
        info.setCreateUser(user.getName());
        info.setMessageType("6");
        info.setTheme("CNAS人员能力确认通知");
        info.setContent(formUser.getName() + "的人员能力待确认");
        info.setSenderId(userId);
        // æŽ¥æ”¶äºº
        info.setConsigneeId(personPersonnelCapacity.getConfirmOperatingPersonnelId());
        info.setJumpPath("a6-personnel");
        informationNotificationService.addInformationNotification(info);
        this.saveOrUpdate(personPersonnelCapacity);
        // å‘送企业微信通知
        threadPoolTaskExecutor.execute(() -> {
            // æŸ¥è¯¢æŽ¥æ”¶äºº
            User personnel = userMapper.selectById(personPersonnelCapacity.getConfirmOperatingPersonnelId());
            String message = "";
            message += "CNAS人员能力确认通知";
            message += "\n请去资源管理-人员-人员能力填写";
            message += "\n" + formUser.getName() + "的人员能力待确认";
            //发送企业微信消息通知
            try {
                WxCpUtils.inform(personnel.getAccount(), message, null);
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        });
    }
}
cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonPostAuthorizationRecordServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,132 @@
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 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
    private 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();
        //todo: äººå‘˜ä»»èŒæŽˆæƒè®°å½•姓名英文
//        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 nameEn = user.getNameEn();
        //理论知识考试成绩
        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/PersonTrainingDetailedServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,85 @@
package com.ruoyi.personnel.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.core.domain.entity.User;
import com.ruoyi.common.numgen.NumberGenerator;
import com.ruoyi.framework.exception.ErrorException;
import com.ruoyi.personnel.dto.PersonTrainingDetailedDto;
import com.ruoyi.personnel.excel.PersonTrainingDetailedUpload;
import com.ruoyi.personnel.mapper.PersonTrainingDetailedMapper;
import com.ruoyi.personnel.pojo.PersonTrainingDetailed;
import com.ruoyi.personnel.service.PersonTrainingDetailedService;
import com.ruoyi.system.mapper.UserMapper;
import lombok.AllArgsConstructor;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.List;
/**
 * <p>
 * åŸ¹è®­è®¡åˆ’详情 æœåŠ¡å®žçŽ°ç±»
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2024-10-11 01:46:27
 */
@Service
@Transactional(rollbackFor = Exception.class)
@AllArgsConstructor
public class PersonTrainingDetailedServiceImpl extends ServiceImpl<PersonTrainingDetailedMapper, PersonTrainingDetailed> implements PersonTrainingDetailedService {
    private UserMapper userMapper;
    @Override
    public void importExcel(List<PersonTrainingDetailedUpload> list, Integer planId) {
        List<PersonTrainingDetailed> personTrainingDetailedList = new ArrayList<>();
        list.forEach(i -> {
            PersonTrainingDetailed personTrainingDetailed = new PersonTrainingDetailed();
            BeanUtils.copyProperties(i, personTrainingDetailed);
            // åŒ¹é…è®²å¸ˆ
            User user = userMapper.selectOne(Wrappers.<User>lambdaQuery()
                    .eq(User::getName, i.getTrainingLecturerName()));
            if (ObjectUtils.isEmpty(user)) {
                throw new ErrorException("未找到该讲师:" + i.getTrainingLecturerName());
            }
            personTrainingDetailed.setTrainingLecturerId(user.getId());
            personTrainingDetailed.setPlanId(planId);
            personTrainingDetailed.setState(3);
            personTrainingDetailed.setTrainingDate(i.getTrainingDate());
            personTrainingDetailedList.add(personTrainingDetailed);
        });
        // æ‰¹é‡æ–°å¢ž
        if (CollectionUtils.isNotEmpty(personTrainingDetailedList)) {
            baseMapper.insertBatchSomeColumn(personTrainingDetailedList);
        }
    }
    @Override
    public void deleteAnnualPlanDetailTable(String ids) {
        String[] split = ids.split(",");
        if (split.length > 0) {
            for (String s : split) {
                baseMapper.deleteById(s);
            }
        }
    }
    @Override
    public IPage<PersonTrainingDetailedDto> queryTheAnnualPlanDetailsTable(Page page, String trainingLecturerName, String courseCode, String trainingDate, Integer id, Integer userId) {
        return baseMapper.queryTheAnnualPlanDetailsTable(page, trainingLecturerName, courseCode, trainingDate, id, userId, null);
    }
}
cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonTrainingRecordServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,177 @@
package com.ruoyi.personnel.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.config.Configure;
import com.ruoyi.common.core.domain.entity.InformationNotification;
import com.ruoyi.common.core.domain.entity.User;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.WxCpUtils;
import com.ruoyi.inspect.util.HackLoopTableRenderPolicy;
import com.ruoyi.personnel.dto.PersonTrainingRecordDto;
import com.ruoyi.personnel.dto.PersonTrainingRecordListDto;
import com.ruoyi.personnel.dto.PersonTrainingRecordSubmitDto;
import com.ruoyi.personnel.dto.TrainingRecordPersonDetailedDto;
import com.ruoyi.personnel.mapper.PersonTrainingRecordMapper;
import com.ruoyi.personnel.pojo.PersonTrainingDetailed;
import com.ruoyi.personnel.pojo.PersonTrainingRecord;
import com.ruoyi.personnel.service.PersonTrainingDetailedService;
import com.ruoyi.personnel.service.PersonTrainingRecordService;
import com.ruoyi.system.mapper.UserMapper;
import com.ruoyi.system.service.InformationNotificationService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.List;
/**
 * <p>
 * åŸ¹è®­è®°å½• æœåŠ¡å®žçŽ°ç±»
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2024-10-12 04:50:48
 */
@Transactional(rollbackFor = Exception.class)
@Service
public class PersonTrainingRecordServiceImpl extends ServiceImpl<PersonTrainingRecordMapper, PersonTrainingRecord> implements PersonTrainingRecordService {
    @Autowired
    private PersonTrainingDetailedService personTrainingDetailedService;
    @Resource
    private InformationNotificationService informationNotificationService;
    @Resource
    private ThreadPoolTaskExecutor threadPoolTaskExecutor;
    @Resource
    private UserMapper userMapper;
    @Override
    public List<PersonTrainingRecordDto> trainingAndAssessmentRecordsPage(Integer trainingDetailedId, String userName) {
        return baseMapper.trainingAndAssessmentRecordsPage(trainingDetailedId, userName);
    }
    @Override
    public void deleteTrainingAndAssessmentRecords(String ids) {
        String[] split = ids.split(",");
        if (split.length > 0) {
            for (String s : split) {
                baseMapper.deleteById(s);
            }
        }
    }
    @Override
    public IPage<PersonTrainingRecordListDto> personnelTrainingPersonnel(Page page, String userName, Integer userId, Integer departLimsId) {
        return baseMapper.personnelTrainingPersonnel(page, userName, userId, departLimsId);
    }
    @Override
    public void claimOfTrainingAndAssessmentRecords(Boolean claimAndClaim, Integer courseId) {
    }
    @Override
    public IPage<TrainingRecordPersonDetailedDto> queryPersonnelDetailsOfUserIdAndYear(Page page, Integer userId, Integer year) {
        return baseMapper.queryPersonnelDetailsOfUserIdAndYear(page, userId, year);
    }
    @Override
    public void exportTrainingRecordAddTrainingDate(Integer userId, Integer trainingDate, HttpServletResponse response) {
        // æŸ¥è¯¢äººå‘˜äººä¿¡æ¯
        PersonTrainingRecordListDto trainingRecordListDto = baseMapper.selectUserTraining(userId);
        // æŸ¥è¯¢åŸ¹è®­è®°å½•
        List<TrainingRecordPersonDetailedDto> personDetailedDtos = baseMapper.selectPersonDetailedDtosByTrainingDate(userId, trainingDate);
        // èŽ·å–è·¯å¾„
        InputStream inputStream = this.getClass().getResourceAsStream("/static/training-record.docx");
        Configure configure = Configure.builder()
                .bind("personnelDetailsLisat", new HackLoopTableRenderPolicy())
                .build();
        XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
                new HashMap<String, Object>() {{
                    put("traning", trainingRecordListDto);
                    put("personnelDetailsLisat", personDetailedDtos);
                }});
        try {
            response.setContentType("application/msword");
            String fileName = URLEncoder.encode(
                    "人员培训记录导出", "UTF-8");
            response.setHeader("Content-disposition",
                    "attachment;filename=" + fileName + ".docx");
            OutputStream os = response.getOutputStream();
            template.write(os);
            os.flush();
            os.close();
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException("导出失败");
        }
    }
    /**
     * åŸ¹è®­æäº¤
     * @param personTrainingRecordSubmitDto
     */
    @Override
    public void trainingAndAssessmentRecordsAdded(PersonTrainingRecordSubmitDto personTrainingRecordSubmitDto) {
        personTrainingDetailedService.update(Wrappers.<PersonTrainingDetailed>lambdaUpdate()
                .eq(PersonTrainingDetailed::getId, personTrainingRecordSubmitDto.getTrainingDetailedId())
                .set(PersonTrainingDetailed::getAssessmentMethod, personTrainingRecordSubmitDto.getAssessmentMethod())
                .set(PersonTrainingDetailed::getPlaceTraining, personTrainingRecordSubmitDto.getPlaceTraining())
                .set(PersonTrainingDetailed::getOpeningTime, personTrainingRecordSubmitDto.getOpeningTime())
                .set(PersonTrainingDetailed::getAssessmentUserId, personTrainingRecordSubmitDto.getAssessmentUserId())
                .set(PersonTrainingDetailed::getState, personTrainingRecordSubmitDto.getState()));
        // å‘送消息通知
        if (personTrainingRecordSubmitDto.getState().equals(2)) {
            PersonTrainingDetailed personPersonnelCapacity = personTrainingDetailedService.getById(personTrainingRecordSubmitDto.getTrainingDetailedId());
            Integer userId = SecurityUtils.getUserId().intValue();
            User user = userMapper.selectById(userId);
            // æ¶ˆæ¯å‘送
            InformationNotification info = new InformationNotification();
            // å‘送人
            info.setCreateUser(user.getName());
            info.setMessageType("6");
            info.setTheme("CNAS人员培训计划待评价");
            info.setContent("培训内容:" + personPersonnelCapacity.getTrainingContent() + "的人员培训待评价");
            info.setSenderId(userId);
            // æŽ¥æ”¶äºº
            info.setConsigneeId(personTrainingRecordSubmitDto.getAssessmentUserId());
            info.setJumpPath("a6-personnel");
            informationNotificationService.addInformationNotification(info);
            // å‘送企业微信通知
            threadPoolTaskExecutor.execute(() -> {
                // æŸ¥è¯¢æŽ¥æ”¶äºº
                User personnel = userMapper.selectById(personTrainingRecordSubmitDto.getAssessmentUserId());
                String message = "";
                message += "CNAS人员培训计划待评价";
                message += "\n请去资源管理-人员-人员培训计划";
                message += "\n" + "培训内容:" + personPersonnelCapacity.getTrainingContent() + "的人员培训待评价";
                //发送企业微信消息通知
                try {
                    WxCpUtils.inform(personnel.getAccount(), message, null);
                } catch (Exception e) {
                    throw new RuntimeException(e);
                }
            });
        }
    }
}
cnas-personnel/src/main/java/com/ruoyi/personnel/service/impl/PersonTrainingServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,429 @@
package com.ruoyi.personnel.service.impl;
import com.alibaba.excel.EasyExcel;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.config.Configure;
import com.deepoove.poi.data.Pictures;
import com.ruoyi.common.core.domain.entity.InformationNotification;
import com.ruoyi.common.core.domain.entity.User;
import com.ruoyi.common.utils.DateImageUtil;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.WxCpUtils;
import com.ruoyi.framework.exception.ErrorException;
import com.ruoyi.inspect.util.HackLoopTableRenderPolicy;
import com.ruoyi.personnel.dto.PersonTrainingDetailedDto;
import com.ruoyi.personnel.dto.PersonTrainingDto;
import com.ruoyi.personnel.dto.PersonTrainingRecordDto;
import com.ruoyi.personnel.dto.TrainingRecordExportDto;
import com.ruoyi.personnel.excel.PersonTrainingDetailedListener;
import com.ruoyi.personnel.excel.PersonTrainingDetailedUpload;
import com.ruoyi.personnel.mapper.PersonTrainingDetailedFileMapper;
import com.ruoyi.personnel.mapper.PersonTrainingDetailedMapper;
import com.ruoyi.personnel.mapper.PersonTrainingMapper;
import com.ruoyi.personnel.mapper.PersonTrainingRecordMapper;
import com.ruoyi.personnel.pojo.PersonTraining;
import com.ruoyi.personnel.pojo.PersonTrainingDetailed;
import com.ruoyi.personnel.pojo.PersonTrainingDetailedFile;
import com.ruoyi.personnel.service.PersonTrainingDetailedService;
import com.ruoyi.personnel.service.PersonTrainingService;
import com.ruoyi.system.mapper.UserMapper;
import com.ruoyi.system.service.InformationNotificationService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Optional;
/**
 * <p>
 * åŸ¹è®­è®¡åˆ’ æœåŠ¡å®žçŽ°ç±»
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2024-10-11 01:11:49
 */
@Service
@Transactional(rollbackFor = Exception.class)
public class PersonTrainingServiceImpl extends ServiceImpl<PersonTrainingMapper, PersonTraining> implements PersonTrainingService {
    @Autowired
    private PersonTrainingDetailedService personTrainingDetailedService;
    @Autowired
    private UserMapper userMapper;
    @Autowired
    private PersonTrainingDetailedMapper personTrainingDetailedMapper;
    @Autowired
    private PersonTrainingRecordMapper personTrainingRecordMapper;
    @Autowired
    private PersonTrainingDetailedFileMapper personTrainingDetailedFileMapper;
    @Resource
    private InformationNotificationService informationNotificationService;
    @Resource
    private ThreadPoolTaskExecutor threadPoolTaskExecutor;
    @Value("${file.path}")
    private String imgUrl;
    @Value("${wordUrl}")
    private String wordUrl;
    @Override
    public IPage<PersonTrainingDto> personTrainingSelect(Page page, String compilerName, String departmentId) {
        return baseMapper.personTrainingSelect(page, compilerName, departmentId);
    }
    @Override
    public void personTrainingImport(MultipartFile file, PersonTraining training) {
        Integer userId = SecurityUtils.getUserId().intValue();
        // å¹´åº¦è®¡åˆ’父级新增数据
        PersonTraining personSupervisePlan = new PersonTraining();
        String fileName = file.getOriginalFilename().substring(0, file.getOriginalFilename().lastIndexOf("."));
        personSupervisePlan.setFileName(fileName);
        personSupervisePlan.setPlanYear(training.getPlanYear());
        personSupervisePlan.setCompilerId(userId);
        personSupervisePlan.setReviewerId(training.getReviewerId());
        personSupervisePlan.setCompilationDate(LocalDateTime.now());
        baseMapper.insert(personSupervisePlan);
        User user = userMapper.selectById(userId);
        // æ¶ˆæ¯å‘送
        InformationNotification info = new InformationNotification();
        // å‘送人
        info.setCreateUser(user.getName());
        info.setMessageType("6");
        info.setTheme("CNAS培训计划审核通知");
        info.setContent("您有一条培训计划待审核");
        info.setSenderId(userId);
        // æŽ¥æ”¶äºº
        info.setConsigneeId(training.getApproverId());
        info.setJumpPath("a6-personnel");
        informationNotificationService.addInformationNotification(info);
        // å‘送企业微信通知
        threadPoolTaskExecutor.execute(() -> {
            // æŸ¥è¯¢æŽ¥æ”¶äºº
            User personnel = userMapper.selectById(training.getApproverId());
            String message = "";
            message += "CNAS培训计划审核通知";
            message += "\n请去资源管理-人员-培训计划填写";
            message += "\n" + fileName + "的培训计划待审核";
            //发送企业微信消息通知
            try {
                WxCpUtils.inform(personnel.getAccount(), message, null);
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        });
        // å¹´åº¦è®¡åˆ’详情 æ–°å¢ž
        try {
            PersonTrainingDetailedListener personSupervisePlanDetailsListener = new PersonTrainingDetailedListener(personTrainingDetailedService);
            personSupervisePlanDetailsListener.setPlanId(personSupervisePlan.getId());
            EasyExcel.read(file.getInputStream(), PersonTrainingDetailedUpload.class, personSupervisePlanDetailsListener).sheet().doRead();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    @Override
    public void personTrainingDelete(Integer id) {
        personTrainingDetailedService.remove(Wrappers.<PersonTrainingDetailed>lambdaQuery()
                .eq(PersonTrainingDetailed::getPlanId, id));
        baseMapper.deleteById(id);
    }
    @Override
    public void reviewAnnualPersonnelTraining(PersonTraining training) {
        PersonTraining personTraining = new PersonTraining();
        personTraining.setId(training.getId());
        personTraining.setApproverId(training.getApproverId());// æ·»åŠ æ‰¹å‡†äºº
        personTraining.setAuditDate(LocalDateTime.now());
        personTraining.setAuditRemarks(training.getAuditRemarks());
        personTraining.setReviewerStatus(training.getReviewerStatus());
        PersonTraining old = baseMapper.selectById(training.getId());
        // æ¶ˆæ¯å‘送
        Integer userId = SecurityUtils.getUserId().intValue();
        User user = userMapper.selectById(userId);
        InformationNotification info = new InformationNotification();
        // å‘送人
        info.setCreateUser(user.getName());
        info.setMessageType("6");
        info.setTheme("CNAS培训计划审核通知");
        info.setContent("您有一条培训计划待批准");
        info.setSenderId(userId);
        // æŽ¥æ”¶äºº
        info.setConsigneeId(training.getApproverId());
        info.setJumpPath("a6-personnel");
        informationNotificationService.addInformationNotification(info);
        // å‘送企业微信通知
        threadPoolTaskExecutor.execute(() -> {
            // æŸ¥è¯¢æŽ¥æ”¶äºº
            User personnel = userMapper.selectById(training.getApproverId());
            String message = "";
            message += "CNAS培训计划批准通知";
            message += "\n请去资源管理-人员-培训计划填写";
            message += "\n" + old.getFileName() + "的培训计划待批准";
            //发送企业微信消息通知
            try {
                WxCpUtils.inform(personnel.getAccount(), message, null);
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        });
        baseMapper.updateById(personTraining);
    }
    @Override
    public void approveAnnualPersonnelTraining(PersonTraining training) {
        LambdaUpdateWrapper<PersonTraining> wrapper = Wrappers.<PersonTraining>lambdaUpdate()
                .eq(PersonTraining::getId, training.getId())
                .set(PersonTraining::getApprovalDate, LocalDateTime.now())
                .set(PersonTraining::getApprovalRemarks, training.getApprovalRemarks())
                .set(PersonTraining::getApprovalStatus, training.getApprovalStatus());
        baseMapper.update(new PersonTraining(), wrapper);
    }
    /**
     * å¯¼å‡ºäººå‘˜åŸ¹è®­è®¡åˆ’
     * @param id
     * @param response
     */
    @Override
    public void exportPersonTraining(Integer id, HttpServletResponse response) {
        // æŸ¥è¯¢è¯¦æƒ…
        PersonTraining personTraining = baseMapper.selectById(id);
        //获取提交人的签名地址
        String writeUrl = userMapper.selectById(personTraining.getCompilerId()).getSignatureUrl();
        if (ObjectUtils.isEmpty(writeUrl) || writeUrl.equals("")) {
            throw new ErrorException("找不到检验人的签名");
        }
        //获取复核人的签名地址
        String examineUrl = null;
        if (personTraining.getReviewerId() != null) {
            examineUrl = userMapper.selectById(personTraining.getReviewerId()).getSignatureUrl();
            if (StringUtils.isBlank(examineUrl)) {
                throw new ErrorException("找不到复核人的签名");
            }
        }
        //获取批准人的签名地址
        String ratifyUrl = null;
        if (personTraining.getApproverId() != null) {
            ratifyUrl = userMapper.selectById(personTraining.getApproverId()).getSignatureUrl();
            if (StringUtils.isBlank(ratifyUrl)) {
                throw new ErrorException("找不到复核人的签名");
            }
        }
        // æŸ¥è¯¢è¯¦æƒ…
        List<PersonTrainingDetailedDto> detailedDtos = personTrainingDetailedMapper.selectTrainingList(id);
        int index = 1;
        for (PersonTrainingDetailedDto detailedDto : detailedDtos) {
            detailedDto.setTrainingDateString(detailedDto.getTrainingDate());
            detailedDto.setIndex(index);
            index++;
        }
        // èŽ·å–è·¯å¾„
        InputStream inputStream = this.getClass().getResourceAsStream("/static/person-training.docx");
        String finalExamineUrl = examineUrl;
        String finalRatifyUrl = ratifyUrl;
        Configure configure = Configure.builder()
                .bind("trainingDetailedList", new HackLoopTableRenderPolicy())
                .build();
        XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
                new HashMap<String, Object>() {{
                    put("year", personTraining.getPlanYear());
                    put("trainingDetailedList", detailedDtos);
                    put("writeUrl", StringUtils.isNotBlank(writeUrl) ? Pictures.ofLocal(imgUrl + "/" + writeUrl).create() : null);
                    put("examineUrl", StringUtils.isNotBlank(finalExamineUrl) ? Pictures.ofLocal(imgUrl + "/" + finalExamineUrl).create() : null);
                    put("ratifyUrl", StringUtils.isNotBlank(finalRatifyUrl) ? Pictures.ofLocal(imgUrl + "/" + finalRatifyUrl).create() : null);
                    put("writeDateUrl", personTraining.getCompilationDate() != null ?
                            Pictures.ofStream(DateImageUtil.createDateImage(personTraining.getCompilationDate())).create() : null);
                    put("examineDateUrl", personTraining.getAuditDate() != null ?
                            Pictures.ofStream(DateImageUtil.createDateImage(personTraining.getAuditDate())).create() : null);
                    put("ratifyDateUrl", personTraining.getApprovalDate() != null ?
                            Pictures.ofStream(DateImageUtil.createDateImage(personTraining.getApprovalDate())).create() : null);
                }});
        try {
            response.setContentType("application/msword");
            String fileName = URLEncoder.encode(
                    "人员培训计划导出", "UTF-8");
            response.setHeader("Content-disposition",
                    "attachment;filename=" + fileName + ".docx");
            OutputStream os = response.getOutputStream();
            template.write(os);
            os.flush();
            os.close();
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException("导出失败");
        }
    }
    /**
     * å¯¼å‡ºäººå‘˜åŸ¹è®­ä¸Žè€ƒæ ¸è®°å½•
     * @param id
     * @param response
     */
    @Override
    public void exportPersonTrainingRecord(Integer id, HttpServletResponse response) {
        // æŸ¥è¯¢äººå‘˜åŸ¹è®­æ˜Žç»†
        PersonTrainingDetailedDto detailedDto = personTrainingDetailedMapper.selectTrainingDetail(id);
        // æŸ¥è¯¢åŸ¹è®­çš„人员
        List<PersonTrainingRecordDto> recordDtos = personTrainingRecordMapper.selectListByTrainingDetailedId(id);
        List<TrainingRecordExportDto> exportDtoList = new ArrayList<>();
        TrainingRecordExportDto exportDto = new TrainingRecordExportDto();
        int count = 0;
        for (PersonTrainingRecordDto recordDto : recordDtos) {
            switch (count) {
                case 0:
                    exportDto.setUserName1(recordDto.getUserName());
                    exportDto.setDepartment1(recordDto.getDepartment());
                    exportDto.setExaminationResults1(recordDto.getExaminationResults());
                    count ++;
                    break;
                case 1:
                    exportDto.setUserName2(recordDto.getUserName());
                    exportDto.setDepartment2(recordDto.getDepartment());
                    exportDto.setExaminationResults2(recordDto.getExaminationResults());
                    exportDtoList.add(exportDto);
                    exportDto = new TrainingRecordExportDto();
                    count = 0;
                    break;
            }
        }
        exportDtoList.add(exportDto);
        // è´¨é‡è´Ÿè´£äºº
        String assessmentUserUrl = null;
        if (detailedDto.getAssessmentUserId() != null) {
            assessmentUserUrl = userMapper.selectById(detailedDto.getAssessmentUserId()).getSignatureUrl();
            if (StringUtils.isBlank(assessmentUserUrl)) {
                throw new ErrorException("找不到评价人的签名");
            }
        }
        // èŽ·å–è·¯å¾„
        InputStream inputStream = this.getClass().getResourceAsStream("/static/person-training-record.docx");
        Configure configure = Configure.builder()
                .bind("trainingRecordsList", new HackLoopTableRenderPolicy())
                .build();
        String finalAssessmentUserUrl = assessmentUserUrl;
        XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
                new HashMap<String, Object>() {{
                    put("trainingDetail", detailedDto);
                    put("trainingRecordsList", exportDtoList);
                    put("assessmentUserUrl", StringUtils.isNotBlank(finalAssessmentUserUrl) ? Pictures.ofLocal(imgUrl + "/" + finalAssessmentUserUrl).create() : null);
                }});
        try {
            response.setContentType("application/msword");
            String fileName = URLEncoder.encode(
                    "培训与考核记录导出", "UTF-8");
            response.setHeader("Content-disposition",
                    "attachment;filename=" + fileName + ".docx");
            OutputStream os = response.getOutputStream();
            template.write(os);
            os.flush();
            os.close();
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException("导出失败");
        }
    }
    /**
     * äººå‘˜åŸ¹è®­è¯¦æƒ…附件新增
     * @param trainingDetailedId
     * @param file
     * @return
     */
    @Override
    public boolean uploadTrainingDetailedFile(Integer trainingDetailedId, MultipartFile file) {
        if (trainingDetailedId == null) {
            throw new ErrorException("缺少验收id");
        }
        String urlString;
        String pathName;
        String path;
        String filename = file.getOriginalFilename();
        String contentType = file.getContentType();
        PersonTrainingDetailedFile detailedFile = new PersonTrainingDetailedFile();
        detailedFile.setTrainingDetailedId(trainingDetailedId);
        detailedFile.setFileName(filename);
        if (contentType != null && contentType.startsWith("image/")) {
            // æ˜¯å›¾ç‰‡
            path = imgUrl;
            detailedFile.setType(1);
        } else {
            // æ˜¯æ–‡ä»¶
            path = wordUrl;
            detailedFile.setType(2);
        }
        try {
            File realpath = new File(path);
            if (!realpath.exists()) {
                realpath.mkdirs();
            }
            pathName = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyMMddHHmmss")) + "_" + file.getOriginalFilename();
            urlString = realpath + "/" + pathName;
            file.transferTo(new File(urlString));
            detailedFile.setFileUrl(pathName);
            personTrainingDetailedFileMapper.insert(detailedFile);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            System.err.println("附件上传错误");
            return false;
        }
    }
    /**
     * æŸ¥è¯¢ä»Šå¹´äººå‘˜åŸ¹è®­ä¿¡æ¯
     * @return
     */
    @Override
    public List<PersonTrainingDetailed> getThisYearTrainingDetailed() {
        return personTrainingDetailedMapper.getThisYearTrainingDetailed();
    }
}
cnas-personnel/src/main/resources/mapper/PersonBasicInfoMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,65 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.personnel.mapper.PersonBasicInfoMapper">
    <select id="selectLimsUser" resultType="com.ruoyi.common.core.domain.entity.DepartmentDto">
        SELECT u.id userId, u.name, SUBSTRING_INDEX(SUBSTRING_INDEX(u.depart_lims_id, ',', -2), ',', 1) AS fatherId
        FROM user u
        where u.is_custom = 0
          and u.depart_lims_id is not null
          and u.depart_lims_id != ''
    </select>
    <select id="getCNASPersonnelInfo" resultType="com.ruoyi.personnel.dto.PersonBasicInfoDto">
        SELECT *
        FROM user u
                 left join cnas_person_basic_info cpbi on cpbi.user_id = u.id
        where u.id = #{userId}
    </select>
    <select id="selectPersonBasecInfoAndUser" resultType="java.util.Map">
        select
            u.id  userId,
            u.`name`  name,
            u.account account,
            DATE_FORMAT(cpbi.group_time, '%Y-%m-%d') groupTime,
            cpbi.native_place nativePlace,
            cpbi.identity_card identityCard,
            cpbi.id_address idAddress,
            u.phone telephone,
            cpbi.graduated_institutions1 graduatedInstitutions1,
            cpbi.major1 major1,
            DATE_FORMAT(cpbi.graduation_time1, '%Y-%m-%d')  graduationTime1,
            cpbi.official_academic_redentials officialAcademicRedentials,
            cpbi.highest_degree highestDegree,
            cpbi.professional_title professionalTitle
        from user u
                 left join cnas_person_basic_info cpbi on cpbi.user_id = u.id
                 left join user u1 on u1.id = u.create_user
        <where>
            FIND_IN_SET(#{departmentId},u.depart_lims_id)
            <if test="name != null and name != ''">
                and u.name like concat('%',#{name},'%')
            </if>
        </where>
    </select>
    <!-- å¯¼å‡ºæŸ¥è¯¢äººå‘˜ä¿¡æ¯ -->
    <select id="selectexportPersonBasic" resultType="java.util.Map">
        select DATE_FORMAT(cpbi.last_update_time, '%Yå¹´%m月%d日') lastUpdateTimeString,
               u.account,
               u.`name`,
               cpbi.sex,
               cpbi.post_name postName,
               u.age,
               DATE_FORMAT(cpbi.working_time, '%Yå¹´%m月')   workingTimeString,
               cpbi.major1,
               DATE_FORMAT(cpbi.graduation_time1, '%Yå¹´%m月')   graduationTime1string,
               cpbi.official_academic_redentials officialAcademicRedentials,
               cpbi.graduated_institutions1 graduatedInstitutions1,
               cpbi.remarks
        from user u
                 left join cnas_person_basic_info cpbi on cpbi.user_id = u.id
        where u.id = #{userId}
    </select>
</mapper>
cnas-personnel/src/main/resources/mapper/PersonCommunicationAbilityMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,19 @@
<?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">
    <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,24 @@
<?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">
    <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,118 @@
<?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">
    <select id="personPersonnelCapacityPage" resultType="com.ruoyi.personnel.dto.PersonPersonnelCapacityDto">
        select cppc.*,
        u2.name confirm_operating_personnel_name,
        u3.name user_name,
        cpbi.post_name,
        ecp.responsibilities,
        cpbi.professional_title,
        TRIM(',' FROM CONCAT(cpbi.major1, ',', cpbi.major2)) AS major
        from cnas_person_personnel_capacity cppc
        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(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_name,
               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.work_experience) place_work, cptr.user_id
                            from cnas_person_basic_info_work cptr
                            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,23 @@
<?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">
    <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,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.PersonRewardPunishmentRecordMapper">
    <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/PersonTrainingMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,46 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.personnel.mapper.PersonTrainingMapper">
    <!-- æ ¹æ®åˆ›å»ºäººçš„部门筛选数据,可是创建人可能未分配部门也需要查看 -->
    <select id="personTrainingSelect" resultType="com.ruoyi.personnel.dto.PersonTrainingDto">
        SELECT
        cpt.*,
        u1.name compiler_name,
        u2.name reviewer_name,
        u3.name approver_name,
        u4.name create_user_name
        FROM
        cnas_person_training cpt
        LEFT JOIN user u1 ON cpt.compiler_id = u1.id
        LEFT JOIN user u2 ON cpt.reviewer_id = u2.id
        LEFT JOIN user u3 ON cpt.approver_id = u3.id
        LEFT JOIN user u4 ON cpt.create_user = u4.id
        <where>
            <if test="departLimsId != null and departLimsId != ''">
                and FIND_IN_SET(#{departLimsId}, u4.depart_lims_id)
            </if>
            <if test="compilerName != null and compilerName != ''">
                and u4.name like concat('%', #{compilerName}, '%')
            </if>
        </where>
        union
        SELECT
        cpt.*,
        u1.name compiler_name,
        u2.name reviewer_name,
        u3.name approver_name,
        u4.name create_user_name
        FROM
        cnas_person_training cpt
        LEFT JOIN user u1 ON cpt.compiler_id = u1.id
        LEFT JOIN user u2 ON cpt.reviewer_id = u2.id
        LEFT JOIN user u3 ON cpt.approver_id = u3.id
        LEFT JOIN user u4 ON cpt.create_user = u4.id
        WHERE
        u4.depart_lims_id is not null and length(u4.depart_lims_id) = 0
        <if test="compilerName != null and compilerName != ''">
            and u4.name like concat('%', #{compilerName}, '%')
        </if>
    </select>
</mapper>
cnas-personnel/src/main/resources/mapper/PersonTrainingRecordMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,126 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.personnel.mapper.PersonTrainingRecordMapper">
    <select id="trainingAndAssessmentRecordsPage" resultType="com.ruoyi.personnel.dto.PersonTrainingRecordDto">
        select cptr.*, u.account, u.name user_name, u.phone, r.name role_name
        from cnas_person_training_record cptr
                 left join user u on u.id = cptr.user_id
                 left join role r on r.id = u.role_id
        where cptr.course_id = #{trainingDetailedId}
        <if test="userName != null and userName != ''">
            and u.name like concat('%', #{userName}, '%')
        </if>
    </select>
    <select id="personnelTrainingPersonnel" resultType="com.ruoyi.personnel.dto.PersonTrainingRecordListDto">
        select u.name, u.account, dl.name depart_lims_name, cpbi.professional_title,
        cpbi.official_academic_redentials, u.id user_id
        from user u
        left join cnas_person_basic_info cpbi on cpbi.user_id = u.id
        left join department_lims dl on dl.id = SUBSTRING_INDEX(SUBSTRING_INDEX(u.depart_lims_id, ',', -2), ',', 1)
        where u.is_custom = 0
        <if test="userName != '' and userName != null and userName != 'null'">
            and u.name like concat('%', #{userName}, '%')
        </if>
        <if test="userId != null and userId != ''">
            and u.id = #{userId}
        </if>
        <if test="departLimsId != null and departLimsId != ''">
            and FIND_IN_SET(#{departLimsId}, u.depart_lims_id)
        </if>
    </select>
    <select id="queryPersonnelDetails" resultType="com.ruoyi.personnel.dto.TrainingRecordPersonDetailedDto">
        select cptd.training_date, cptd.training_content, cptd.class_hour, cptr.examination_results, cptd.remarks
        from cnas_person_training_record cptr
                 inner join cnas_person_training_detailed cptd on cptd.id = cptr.course_id
        <where>
            <if test="userId != null and userId != ''">
                and cptr.user_id = #{userId}
            </if>
        </where>
    </select>
    <!-- æ ¹æ®è¯¦æƒ…id查询培训信息 -->
    <select id="selectListByTrainingDetailedId" resultType="com.ruoyi.personnel.dto.PersonTrainingRecordDto">
        select cptr.*,
               u.name  userName,
               dl.name department
        from cnas_person_training_record cptr
                 left join user u on u.id = cptr.user_id
                 left join department_lims dl on find_in_set(dl.id, u.depart_lims_id) and dl.id != 1
        where cptr.course_id = #{trainingDetailedId}
    </select>
    <!-- æ ¹æ®id查询人员信息 -->
    <select id="selectUserTraining" resultType="com.ruoyi.personnel.dto.PersonTrainingRecordListDto">
        select u.name,
               u.account,
               dl.name                                    depart_lims_name,
               cpbi.professional_title,
               cpbi.official_academic_redentials,
               cpbi.unit_time,
               cpbi.major1,
               u.id                                       user_id,
               DATE_FORMAT(cpbi.unit_time, '%Y-%m-%d') AS unitTimeSting
        from user u
                 left join cnas_person_basic_info cpbi on cpbi.user_id = u.id
                 left join department_lims dl on dl.id = SUBSTRING_INDEX(SUBSTRING_INDEX(u.depart_lims_id, ',', -2), ',', 1)
        where u.is_custom = 0
        and u.id = #{userId}
    </select>
    <!-- æ ¹æ®ç”¨æˆ·id查询人员记录 -->
    <select id="selectPersonDetailedDtos" resultType="com.ruoyi.personnel.dto.TrainingRecordPersonDetailedDto">
        select cptd.training_date,
               cptd.training_content,
               cptd.class_hour,
               cptr.examination_results,
               cptd.remarks,
               DATE_FORMAT(cptd.training_date, '%Y-%m-%d') AS trainingDateString
        from cnas_person_training_record cptr
                 inner join cnas_person_training_detailed cptd on cptd.id = cptr.course_id
            and cptr.user_id = #{userId}
        <where>
            <if test="year!= null and year!= ''">
                and YEAR(cptd.training_date) = ${year}
            </if>
        </where>
    </select>
    <!--根据用户id和年份查询人员明细 åŸ¹è®­è®°å½•-->
    <select id="queryPersonnelDetailsOfUserIdAndYear"
            resultType="com.ruoyi.personnel.dto.TrainingRecordPersonDetailedDto">
        select cptd.training_date, cptd.training_content, cptd.class_hour, cptr.examination_results, cptd.remarks
        from cnas_person_training_record cptr
        inner join cnas_person_training_detailed cptd on cptd.id = cptr.course_id
        <where>
            <if test="userId != null and userId != ''">
                and cptr.user_id = #{userId}
            </if>
            <if test="year!= null and year!= ''">
                and YEAR(cptd.training_date) = ${year}
            </if>
        </where>
    </select>
    <!-- æ ¹æ®ç”¨æˆ·id和年份查询人员明细 åŸ¹è®­è®°å½•导出 -->
    <select id="selectPersonDetailedDtosByTrainingDate"
            resultType="com.ruoyi.personnel.dto.TrainingRecordPersonDetailedDto">
        select cptd.training_date,
        cptd.training_content,
        cptd.class_hour,
        cptr.examination_results,
        cptd.remarks,
        DATE_FORMAT(cptd.training_date, '%Y-%m-%d') AS trainingDateString
        from cnas_person_training_record cptr
        inner join cnas_person_training_detailed cptd on cptd.id = cptr.course_id
        and cptr.user_id = #{userId}
        <where>
            <if test="year!= null and year!= ''">
                and YEAR(cptd.training_date) = ${year}
            </if>
        </where>
    </select>
</mapper>
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-basic-info.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
pom.xml
@@ -278,6 +278,13 @@
                <version>${ruoyi.version}</version>
            </dependency>
            <!--cnas人员-->
            <dependency>
                <groupId>com.ruoyi</groupId>
                <artifactId>cnas-personnel</artifactId>
                <version>${ruoyi.version}</version>
            </dependency>
            <!-- minio -->
            <dependency>
                <groupId>io.minio</groupId>
@@ -392,6 +399,7 @@
        <module>cnas-manage</module>
        <module>cnas-device</module>
        <module>cnas-process</module>
        <module>cnas-personnel</module>
    </modules>
    <packaging>pom</packaging>
ruoyi-admin/pom.xml
@@ -103,6 +103,13 @@
            <artifactId>cnas-process</artifactId>
        </dependency>
        <!--cnas人员-->
        <dependency>
            <groupId>com.ruoyi</groupId>
            <artifactId>cnas-personnel</artifactId>
        </dependency>
    </dependencies>
    <build>
ruoyi-admin/src/main/java/com/ruoyi/web/MqttApplicationRunner.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,29 @@
package com.ruoyi.web;
import com.ruoyi.device.mqtt.MQClient;
import com.ruoyi.device.mqtt.MQConfig;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;
@Component
@Slf4j
public class MqttApplicationRunner implements ApplicationRunner {
    @Autowired
    private MQConfig mqConfig;
    @Value("${mqtt.client}")
    private Boolean client;
    @Override
    public void run(ApplicationArguments args) throws Exception {
        if (client) {
            MQClient mqttPushClient = new MQClient();
            mqttPushClient.connect(mqConfig);
        }
    }
}
ruoyi-admin/src/main/resources/application-druid.yml
@@ -98,3 +98,16 @@
  custorder: http://192.168.20.47/PurchService.ashx?
  custorder-port: http://192.168.20.47:8008/PurchService.ashx?
  erp-services: http://192.168.20.47:8081
# å¤‡æ³¨ 18083密码:zttZTT123!@
mqtt:
  url: tcp://mqtt-ztt.zttiot.com:1883 # æœåС噍ip
  username: forwarder # MQTT-服务端-用户名,后期会修改为用户登录名
  password: ZTlink12345 # MQTT-服务端-密码,,后期会修改为用户登录密码
  timeout: 100 # è¶…æ—¶æ—¶é—´ ï¼ˆå•位:秒)
  keepalive: 60 # å¿ƒè·³ ï¼ˆå•位:秒)
  qos: 1 # å¿ƒè·³åŒ…级别
  completion-timeout: 3000 # è¿žæŽ¥è¶…时时间(单位:秒)
  clientId: javaPublish # clientId
  subscribe: /ztt/v3/2443521/publish # è®¢é˜…主题
  client: false # å¦‚果开发需要启动测试,需要改为false不然会一直报错
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/DepartmentDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
package com.ruoyi.common.core.domain.entity;
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/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/utils/FileSaveUtil.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,179 @@
package com.ruoyi.common.utils;
import com.alibaba.excel.util.IoUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.util.FileSystemUtils;
import org.springframework.util.ObjectUtils;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.PostConstruct;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Random;
/**
 * ä¿å­˜æ–‡ä»¶å·¥å…·
 */
@Slf4j
@Component
public class FileSaveUtil {
    // å–yml中的路径 + /
    private static String FILE_PATH;
    private static String WORD_URL_PATH;
    private static String[] ALLOWED;
    @Value("${file.path}")
    private String file;
    @Value("${wordUrl}")
    private String wordUrl;
    @Value("${file.allowed}")
    private String[] allowed;
    @PostConstruct
    public void getFile() {
        FILE_PATH = this.file;
    }
    @PostConstruct
    public void getWordUrl(){
        WORD_URL_PATH = this.wordUrl;
    }
    @PostConstruct
    public void getAllowed(){
        ALLOWED = this.allowed;
    }
    /**
     * å­˜å‚¨æ–‡ä»¶ä¸»å‡½æ•°
     * @param file æ–‡ä»¶äºŒè¿›åˆ¶æµ
     * @return è¿”回文件名称用于存储数据库
     */
    public static String StoreFile(MultipartFile file) {
        String originalFilename = file.getOriginalFilename();
        // ç”Ÿæˆéšæœºåç§°ï¼šæ—¶é—´_随机6位数字
        String FileName = System.currentTimeMillis() + "_" + getNumber(6);
        String suffix = null;
        if (originalFilename != null) {
            suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
            // å¦‚果后缀名不通过抛出异常
            if (!isFileAllowed(suffix)){
                throw new RuntimeException(suffix);
            }
        }
        // åç§°æ‹¼æŽ¥
        String fileName = FileName + suffix;
        // è¿›è¡Œå­˜å‚¨
        try {
            storeFileWithFileName(file.getBytes(), fileName);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        return fileName;
    }
    public static Boolean DeleteFile(String fileName) {
        if (ObjectUtils.isEmpty(fileName)) {
            return false;
        }
        return FileSystemUtils.deleteRecursively(new File(FILE_PATH + "/" + fileName));
    }
    /**
     * å­˜å‚¨æ–‡ä»¶å‡½æ•°
     * @param content æ–‡ä»¶äºŒè¿›åˆ¶æµ
     * @param fileName æ–‡ä»¶åç§°
     */
    private static void storeFileWithFileName(byte[] content, String fileName) {
        // å­˜å‚¨è·¯å¾„
        String path = FILE_PATH + File.separatorChar;
        // ç›®å½•不存在则创建
        File file = new File(path);
        if (!file.exists()) {
            file.mkdirs();
        }
        // å¼€å§‹å­˜å‚¨
        try (FileOutputStream os = new FileOutputStream(path + fileName);
             ByteArrayInputStream is = new ByteArrayInputStream(content)) {
             IoUtils.copy(is, os);
        } catch (IOException e) {
            throw new RuntimeException("文件存储格式异常");
        }
    }
    /**
     * åˆ¤æ–­æ–‡ä»¶æ˜¯å¦è¢«å…è®¸ä¸Šä¼ 
     *
     * @param fileName æ–‡ä»¶å
     * @return å…è®¸true, å¦åˆ™false
     */
    private static boolean isFileAllowed(String fileName) {
        // èŽ·å–åŽç¼€å
        String suffixName = fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase();
        for (String allow : ALLOWED) {
            if (allow.equals(suffixName)) {
                return true;
            }
        }
        return false;
    }
    /**
     * ä¿å­˜æ–‡ä»¶åˆ°word文件夹里
     * @param file
     * @return
     */
    public static String uploadWordFile(MultipartFile file) {
        String urlString;
        String pathName;
        String path;
        try {
            String contentType = file.getContentType();
            if (contentType != null && contentType.startsWith("image/")) {
                // æ˜¯å›¾ç‰‡
                path = FILE_PATH;
            } else {
                // æ˜¯æ–‡ä»¶
                path = WORD_URL_PATH;
            }
            File realpath = new File(path);
            if (!realpath.exists()) {
                realpath.mkdirs();
            }
            pathName = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyMMddHHmmss")) + "-" + file.getOriginalFilename();
            urlString = realpath + "/" + pathName;
            file.transferTo(new File(urlString));
            return pathName;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
    /**
     * èŽ·å–éšæœºæ•°å­—
     * @param n ä½æ•°
     * @return è¿”回随机值
     */
    public static String getNumber(int n) {
        char[] chars = "1234567890".toCharArray();
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < n; i++) {
            char c = chars[new Random().nextInt(chars.length)];
            sb.append(c);
        }
        return sb.toString();
    }
}
ruoyi-common/src/main/java/com/ruoyi/common/utils/MyUtil.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,17 @@
package com.ruoyi.common.utils;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;
@Component
public class MyUtil<T> {
}
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.DepartmentDto;
import com.ruoyi.common.core.domain.entity.DepartmentLims;
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/resources/mapper/system/DepartmentLimsMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,25 @@
<?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">
    <select id="selectDepartment" resultType="com.ruoyi.common.core.domain.entity.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>