zouyu
2025-11-14 113cd73922b9b67c261c19c744e46eb2822d7b41
Merge branch 'prod' into dev_tide

# Conflicts:
# src/main/resources/application.yml
已添加383个文件
已修改128个文件
27350 ■■■■■ 文件已修改
pom.xml 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/account/controller/AccountExpenseController.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/account/controller/AccountFileController.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/account/controller/AccountIncomeController.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/account/service/AccountExpenseService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/account/service/AccountIncomeService.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/account/service/impl/AccountExpenseServiceImpl.java 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/account/service/impl/AccountIncomeServiceImpl.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/aftersalesservice/controller/AfterSalesServiceController.java 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/aftersalesservice/dto/AfterSalesServiceDto.java 68 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/aftersalesservice/pojo/AfterSalesService.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/approve/controller/ApproveProcessController.java 77 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/approve/controller/HolidaySettingsController.java 173 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/approve/controller/KnowledgeBaseController.java 72 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/approve/controller/NotificationManagementController.java 82 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/approve/controller/RpaProcessAutomationController.java 74 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/approve/mapper/AnnualLeaveSettingMapper.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/approve/mapper/FileSharingMapper.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/approve/mapper/HolidaySettingsMapper.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/approve/mapper/KnowledgeBaseMapper.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/approve/mapper/NotificationManagementMapper.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/approve/mapper/OnlineMeetingMapper.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/approve/mapper/OvertimeSettingMapper.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/approve/mapper/RpaProcessAutomationMapper.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/approve/mapper/WorkingHoursSettingMapper.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/approve/pojo/AnnualLeaveSetting.java 70 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/approve/pojo/ApproveProcess.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/approve/pojo/FileSharing.java 69 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/approve/pojo/HolidaySettings.java 80 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/approve/pojo/KnowledgeBase.java 86 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/approve/pojo/NotificationManagement.java 88 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/approve/pojo/OnlineMeeting.java 80 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/approve/pojo/OvertimeSetting.java 79 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/approve/pojo/RpaProcessAutomation.java 65 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/approve/pojo/WorkingHoursSetting.java 79 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/approve/service/HolidaySettingsService.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/approve/service/IApproveProcessService.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/approve/service/KnowledgeBaseService.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/approve/service/NotificationManagementService.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/approve/service/RpaProcessAutomationService.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/approve/service/impl/ApproveNodeServiceImpl.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/approve/service/impl/ApproveProcessServiceImpl.java 58 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/approve/service/impl/HolidaySettingsServiceImpl.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/approve/service/impl/KnowledgeBaseServiceImpl.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/approve/service/impl/NotificationManagementServiceImpl.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/approve/service/impl/RpaProcessAutomationServiceImpl.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/approve/utils/ListToStringTypeHandler.java 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/approve/utils/StartAndEndDateDto.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/approve/vo/ApproveGetAndUpdateVo.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/approve/vo/ApproveProcessVO.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/basic/controller/CustomerController.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/basic/controller/SupplierManageController.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/basic/dto/StorageBlobDTO.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/basic/mapper/StorageAttachmentMapper.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/basic/pojo/StorageAttachment.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/basic/pojo/StorageBlob.java 47 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/basic/pojo/SupplierManage.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/basic/service/StorageAttachmentService.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/basic/service/StorageBlobService.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/basic/service/impl/StorageAttachmentServiceImpl.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/basic/service/impl/StorageBlobServiceImpl.java 91 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/collaborativeApproval/controller/DutyPlanController.java 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/collaborativeApproval/controller/MeetingController.java 148 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/collaborativeApproval/controller/NoticeController.java 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/collaborativeApproval/controller/RulesRegulationsManagementController.java 87 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/collaborativeApproval/controller/SealApplicationManagementController.java 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/collaborativeApproval/controller/StaffContactsPersonalController.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/collaborativeApproval/dto/DutyPlanDTO.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/collaborativeApproval/dto/MeetSummaryDto.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/collaborativeApproval/dto/MeetUseDto.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/collaborativeApproval/dto/MeetingItem.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/collaborativeApproval/dto/MeetingSimpleDto.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/collaborativeApproval/dto/NoticeDTO.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/collaborativeApproval/dto/RulesRegulationsManagementDTO.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/collaborativeApproval/dto/SealApplicationManagementDTO.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/collaborativeApproval/dto/StaffContactsPersonalDTO.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/collaborativeApproval/mapper/DutyPlanMapper.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/collaborativeApproval/mapper/MeetApplicationMapper.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/collaborativeApproval/mapper/MeetDraftMapper.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/collaborativeApproval/mapper/MeetingMinutesMapper.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/collaborativeApproval/mapper/MeetingRoomMapper.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/collaborativeApproval/mapper/NoticeMapper.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/collaborativeApproval/mapper/ReadingStatusMapper.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/collaborativeApproval/mapper/RulesRegulationsManagementMapper.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/collaborativeApproval/mapper/SealApplicationManagementMapper.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/collaborativeApproval/mapper/StaffContactsPersonalMapper.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/collaborativeApproval/pojo/DutyPlan.java 125 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/collaborativeApproval/pojo/MeetApplication.java 140 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/collaborativeApproval/pojo/MeetDraft.java 132 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/collaborativeApproval/pojo/MeetingMinutes.java 79 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/collaborativeApproval/pojo/MeetingRoom.java 98 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/collaborativeApproval/pojo/Notice.java 88 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/collaborativeApproval/pojo/ReadingStatus.java 70 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/collaborativeApproval/pojo/RulesRegulationsManagement.java 111 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/collaborativeApproval/pojo/SealApplicationManagement.java 72 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/collaborativeApproval/pojo/StaffContactsPersonal.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/collaborativeApproval/service/DutyPlanService.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/collaborativeApproval/service/MeetingService.java 73 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/collaborativeApproval/service/NoticeService.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/collaborativeApproval/service/RulesRegulationsManagementService.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/collaborativeApproval/service/SealApplicationManagementService.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/collaborativeApproval/service/StaffContactsPersonalService.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/collaborativeApproval/service/impl/DutyPlanServiceImpl.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/collaborativeApproval/service/impl/MeetingServiceImpl.java 244 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/collaborativeApproval/service/impl/NoticeServiceImpl.java 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/collaborativeApproval/service/impl/RulesRegulationsManagementServiceImpl.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/collaborativeApproval/service/impl/SealApplicationManagementServiceImpl.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/collaborativeApproval/service/impl/StaffContactsPersonalServiceImpl.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/collaborativeApproval/vo/SearchMeetingApplicationVo.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/collaborativeApproval/vo/SearchMeetingDraftVo.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/collaborativeApproval/vo/SearchMeetingRoomVo.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/collaborativeApproval/vo/SearchMeetingUseVo.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/common/enums/FileNameType.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/common/enums/StorageAttachmentRecordType.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/common/utils/MinioUtils.java 132 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/common/utils/OrderUtils.java 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/common/utils/excel/ConfigurableMergeStrategy.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/common/utils/excel/CustomCellStyleHandler.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/common/utils/excel/ExcelClassField.java 77 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/common/utils/excel/ExcelExport.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/common/utils/excel/ExcelImport.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/common/utils/excel/ExcelUtils.java 1039 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/compensationperformance/controller/CompensationPerformanceController.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/compensationperformance/pojo/CompensationPerformance.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/customervisits/controller/CustomerVisitsController.java 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/customervisits/mapper/CustomerVisitsMapper.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/customervisits/pojo/CustomerVisits.java 115 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/customervisits/service/CustomerVisitsService.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/customervisits/service/impl/CustomerVisitsServiceImpl.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/device/controller/DeviceDefectRecordController.java 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/device/controller/DeviceLedgerController.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/device/controller/DeviceRepairController.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/device/dto/DeviceDefectRecordDto.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/device/dto/DeviceLedgerDto.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/device/execl/DeviceMaintenanceExeclDto.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/device/execl/DeviceRepairExeclDto.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/device/mapper/DeviceDefectRecordMapper.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/device/mapper/DeviceLedgerMapper.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/device/mapper/DeviceMaintenanceMapper.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/device/pojo/DeviceDefectRecord.java 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/device/pojo/DeviceLedger.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/device/service/DeviceDefectRecordService.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/device/service/impl/DeviceDefectRecordServiceImpl.java 67 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/device/service/impl/DeviceLedgerServiceImpl.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/device/service/impl/DeviceMaintenanceServiceImpl.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/device/service/impl/DeviceRepairServiceImpl.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/dto/PageDto.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/equipmentenergyconsumption/controller/ElectricityConsumptionAreaController.java 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/equipmentenergyconsumption/controller/EnergyPeriodController.java 84 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/equipmentenergyconsumption/controller/EquipmentEnergyConsumptionController.java 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/equipmentenergyconsumption/dto/ElectricityConsumptionAreaTreeDto.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/equipmentenergyconsumption/dto/EquipmentEnergyConsumptionDto.java 111 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/equipmentenergyconsumption/mapper/ElectricityConsumptionAreaMapper.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/equipmentenergyconsumption/mapper/EnergyPeriodMapper.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/equipmentenergyconsumption/pojo/ElectricityConsumptionArea.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/equipmentenergyconsumption/pojo/EnergyPeriod.java 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/equipmentenergyconsumption/pojo/EquipmentEnergyConsumption.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/equipmentenergyconsumption/service/ElectricityConsumptionAreaService.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/equipmentenergyconsumption/service/EnergyPeriodService.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/equipmentenergyconsumption/service/impl/ElectricityConsumptionAreaServiceImpl.java 80 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/equipmentenergyconsumption/service/impl/EnergyPeriodServiceImpl.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/framework/config/SwaggerConfig.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/home/controller/HomeController.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/home/service/HomeService.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java 54 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/inspectiontask/StorageAttachmentRecordType.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/inspectiontask/controller/InspectionTaskController.java 77 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/inspectiontask/controller/QrCodeController.java 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/inspectiontask/controller/QrCodeScanRecordController.java 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/inspectiontask/controller/TimingTaskController.java 74 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/inspectiontask/dto/InspectionTaskDto.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/inspectiontask/dto/QrCodeDto.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/inspectiontask/dto/QrCodeScanRecordDto.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/inspectiontask/dto/TimingTaskDto.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/inspectiontask/mapper/InspectionTaskMapper.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/inspectiontask/mapper/QrCodeMapper.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/inspectiontask/mapper/QrCodeScanRecordMapper.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/inspectiontask/mapper/TimingTaskMapper.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/inspectiontask/pojo/InspectionTask.java 92 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/inspectiontask/pojo/QrCode.java 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/inspectiontask/pojo/QrCodeScanRecord.java 73 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/inspectiontask/pojo/TimingTask.java 108 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/inspectiontask/service/InspectionTaskService.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/inspectiontask/service/QrCodeScanRecordService.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/inspectiontask/service/QrCodeService.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/inspectiontask/service/TimingTaskService.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/inspectiontask/service/impl/InspectionTaskServiceImpl.java 257 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/inspectiontask/service/impl/QrCodeScanRecordServiceImpl.java 194 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/inspectiontask/service/impl/QrCodeServiceImpl.java 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/inspectiontask/service/impl/QuartzConfig.java 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/inspectiontask/service/impl/SpringContextHolder.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskJob.java 259 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskScheduler.java 239 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskServiceImpl.java 450 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/lavorissue/controller/LavorIssueController.java 150 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/lavorissue/dto/StatisticsLaborIssue.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/lavorissue/mapper/LavorIssueMapper.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/lavorissue/pojo/LaborIssue.java 172 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/lavorissue/service/LavorIssueService.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/lavorissue/service/impl/LavorIssueServiceImpl.java 365 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/measuringinstrumentledger/controller/SparePartsController.java 62 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/measuringinstrumentledger/dto/SparePartsDto.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/measuringinstrumentledger/mapper/SparePartsMapper.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/measuringinstrumentledger/pojo/SpareParts.java 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/measuringinstrumentledger/service/SparePartsService.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/measuringinstrumentledger/service/impl/MeasuringInstrumentLedgerRecordServiceImpl.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/measuringinstrumentledger/service/impl/MeasuringInstrumentLedgerServiceImpl.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/measuringinstrumentledger/service/impl/SparePartsServiceImpl.java 73 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/oA/controller/OaProjectController.java 76 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/oA/controller/OaProjectPhaseController.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/oA/controller/OaProjectPhaseTaskController.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/oA/dto/OaProjectDto.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/oA/dto/OaProjectPhaseDto.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/oA/mapper/OaProjectMapper.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/oA/mapper/OaProjectPhaseMapper.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/oA/mapper/OaProjectPhaseTaskMapper.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/oA/pojo/OaProject.java 107 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/oA/pojo/OaProjectPhase.java 92 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/oA/pojo/OaProjectPhaseTask.java 117 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/oA/service/OaProjectPhaseService.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/oA/service/OaProjectPhaseTaskService.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/oA/service/OaProjectService.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/oA/service/impl/OaProjectPhaseServiceImpl.java 62 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/oA/service/impl/OaProjectPhaseTaskServiceImpl.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/oA/service/impl/OaProjectServiceImpl.java 69 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/officesupplies/controller/OfficeSuppliesController.java 87 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/officesupplies/mapper/OfficeSuppliesMapper.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/officesupplies/pojo/OfficeSupplies.java 160 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/officesupplies/service/OfficeSuppliesService.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/officesupplies/service/impl/OfficeSuppliesServiceImpl.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/other/service/impl/TempFileServiceImpl.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/controller/GasTankWarningController.java 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/controller/InboundManagementController.java 64 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/controller/ProcurementPlanController.java 67 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/controller/ProcurementPriceManagementController.java 73 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/controller/ProcurementRecordController.java 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/controller/ReturnManagementController.java 69 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/dto/Details.java 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/dto/ProcurementDto.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/dto/ProcurementManagementUpdateDto.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/dto/ProcurementPageDto.java 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/dto/ProcurementPageDtoCopy.java 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/dto/ProcurementRecordOutPageDto.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/dto/ProcurementUpdateDto.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/mapper/GasTankWarningMapper.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/mapper/InboundManagementMapper.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/mapper/ProcurementPlanMapper.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/mapper/ProcurementPriceManagementMapper.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/mapper/ReturnManagementMapper.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/pojo/GasTankWarning.java 158 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/pojo/InboundManagement.java 73 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementPlan.java 105 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementPriceManagement.java 122 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecordOut.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecordStorage.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/pojo/ReturnManagement.java 72 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/service/GasTankWarningService.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/service/InboundManagementService.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/service/ProcurementPlanService.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/service/ProcurementPriceManagementService.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/service/ProcurementRecordService.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/service/ReturnManagementService.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/service/impl/GasTankWarningServiceImpl.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/service/impl/InboundManagementServiceImpl.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementPlanServiceImpl.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementPriceManagementServiceImpl.java 78 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordOutServiceImpl.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordServiceImpl.java 113 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/service/impl/ReturnManagementServiceImpl.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/controller/SalesLedgerSchedulingController.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/controller/SalesLedgerWorkController.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/dto/DaiDto.java 110 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/dto/SalesLedgerSchedulingDto.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/dto/SalesLedgerSchedulingProcessDto.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/dto/SalesLedgerWorkDto.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/SalesLedgerSchedulingService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/impl/SalesLedgerSchedulingServiceImpl.java 31 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/project/common/CommonController.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/project/system/mapper/SysUserMapper.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/purchase/controller/AccountingReportController.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/purchase/controller/PaymentRegistrationController.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/purchase/controller/PurchaseLedgerController.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/purchase/controller/TicketRegistrationController.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/purchase/dto/InvoicePurchaseReportDto.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/purchase/dto/PaymentRegistrationDto.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/purchase/dto/ProductRecordDto.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/purchase/dto/PurchaseLedgerDto.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/purchase/dto/VatDto.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/purchase/pojo/PaymentRegistration.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/purchase/pojo/PurchaseLedger.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/purchase/pojo/TicketRegistration.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java 50 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/purchase/service/impl/TicketRegistrationServiceImpl.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/quality/controller/QualityInspectController.java 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/quality/service/IQualityInspectService.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/controller/PaymentShippingController.java 70 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/controller/ReceiptPaymentController.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/controller/SalesLedgerController.java 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/controller/SalesQuotationController.java 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/controller/SalespersonManagementController.java 65 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/controller/ShippingInfoController.java 95 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/dto/ReceiptPaymentDto.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/dto/ReceiptPaymentRecordDto.java 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/dto/SalesQuotationDto.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/mapper/PaymentShippingMapper.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/mapper/ReceiptPaymentMapper.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/mapper/SalesQuotationMapper.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/mapper/SalesQuotationProductMapper.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/mapper/SalespersonManagementMapper.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/mapper/ShippingInfoMapper.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/pojo/PaymentShipping.java 83 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/pojo/SalesLedger.java 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/pojo/SalesQuotation.java 69 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/pojo/SalesQuotationProduct.java 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/pojo/SalespersonManagement.java 79 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/pojo/ShippingInfo.java 68 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/service/PaymentShippingService.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/service/SalesQuotationProductService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/service/SalesQuotationService.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/service/SalespersonManagementService.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/service/ShippingInfoService.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/service/impl/CommonFileServiceImpl.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/service/impl/PaymentShippingServiceImpl.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/service/impl/ReceiptPaymentServiceImpl.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java 44 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/service/impl/SalesQuotationProductServiceImpl.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/service/impl/SalesQuotationServiceImpl.java 96 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/service/impl/SalespersonManagementServiceImpl.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/service/impl/ShippingInfoServiceImpl.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/staff/controller/HolidayApplicationController.java 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/staff/controller/PersonalAttendanceRecordsController.java 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/staff/controller/StaffOnJobController.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/staff/controller/StaffSchedulingController.java 67 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/staff/dto/SaveStaffSchedulingDto.java 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/staff/dto/StaffSchedulingDto.java 85 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/staff/mapper/HolidayApplicationMapper.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/staff/mapper/PersonalAttendanceRecordsMapper.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/staff/mapper/StaffSchedulingMapper.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/staff/pojo/HolidayApplication.java 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/staff/pojo/PersonalAttendanceRecords.java 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/staff/pojo/StaffJoinLeaveRecord.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/staff/pojo/StaffOnJob.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/staff/pojo/StaffScheduling.java 106 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/staff/service/HolidayApplicationService.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/staff/service/IStaffOnJobService.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/staff/service/PersonalAttendanceRecordsService.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/staff/service/StaffSchedulingService.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/staff/service/impl/HolidayApplicationServiceImpl.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/staff/service/impl/PersonalAttendanceRecordsServiceImpl.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/staff/service/impl/StaffOnJobServiceImpl.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/staff/service/impl/StaffSchedulingServiceImpl.java 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/staff/vo/SearchSchedulingVo.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/warehouse/controller/DocumentClassificationController.java 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/warehouse/controller/DocumentationBorrowManagementController.java 113 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/warehouse/controller/DocumentationController.java 91 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/warehouse/controller/DocumentationFileController.java 64 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/warehouse/controller/WarehouseController.java 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/warehouse/controller/WarehouseGoodsShelvesController.java 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/warehouse/controller/WarehouseGoodsShelvesRowcolController.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/warehouse/dto/DocumentClassificationDto.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/warehouse/dto/DocumentClassificationTreeDto.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/warehouse/dto/DocumentationBorrowManagementDto.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/warehouse/dto/DocumentationDto.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/warehouse/dto/DocumentationReturnManagementDto.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/warehouse/dto/ReturnExportDto.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/warehouse/dto/WarehouseDto.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/warehouse/dto/WarehouseGoodsShelvesDto.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/warehouse/dto/WarehouseGoodsShelvesRowcolDto.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/warehouse/dto/WarehouseTreeDto.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/warehouse/mapper/DocumentClassificationMapper.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/warehouse/mapper/DocumentationBorrowManagementMapper.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/warehouse/mapper/DocumentationFileMapper.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/warehouse/mapper/DocumentationMapper.java 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/warehouse/mapper/DocumentationReturnManagementMapper.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/warehouse/mapper/WarehouseGoodsShelvesMapper.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/warehouse/mapper/WarehouseGoodsShelvesRowcolMapper.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/warehouse/mapper/WarehouseMapper.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/warehouse/pojo/DocumentClassification.java 67 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/warehouse/pojo/Documentation.java 175 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/warehouse/pojo/DocumentationBorrowManagement.java 129 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/warehouse/pojo/DocumentationFile.java 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/warehouse/pojo/DocumentationReturnManagement.java 130 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/warehouse/pojo/Warehouse.java 62 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/warehouse/pojo/WarehouseGoodsShelves.java 79 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/warehouse/pojo/WarehouseGoodsShelvesRowcol.java 79 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/warehouse/service/DocumentClassificationService.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/warehouse/service/DocumentationBorrowManagementService.java 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/warehouse/service/DocumentationFileService.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/warehouse/service/DocumentationService.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/warehouse/service/WarehouseGoodsShelvesRowcolService.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/warehouse/service/WarehouseGoodsShelvesService.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/warehouse/service/WarehouseService.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/warehouse/service/impl/DocumentClassificationServiceImpl.java 97 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/warehouse/service/impl/DocumentationBorrowManagementServiceImpl.java 168 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/warehouse/service/impl/DocumentationFileServiceImpl.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/warehouse/service/impl/DocumentationServiceImpl.java 116 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/warehouse/service/impl/WarehouseGoodsShelvesRowcolServiceImpl.java 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/warehouse/service/impl/WarehouseGoodsShelvesServiceImpl.java 179 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/warehouse/service/impl/WarehouseServiceImpl.java 175 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/waterrecord/controller/WaterRecordController.java 91 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/waterrecord/mapper/WaterRecordMapper.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/waterrecord/pojo/WaterRecord.java 135 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/waterrecord/service/WaterRecordService.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/waterrecord/service/impl/WaterRecordServiceImpl.java 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-bdsm.yml 219 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-bhmy.yml 219 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-cjny.yml 219 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-cmny.yml 219 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-demo.yml 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-dhdc.yml 219 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-hbkj.yml 219 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-hbxm.yml 219 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-hckx.yml 219 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-hcmy.yml 219 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-hhkj.yml 219 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-hsmy.yml 219 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-hsxny.yml 219 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-hxgy.yml 219 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-hxsj.yml 219 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-hysn.yml 219 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-jjxm.yml 219 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-jlsn.yml 219 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-jsmy.yml 219 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-jsyny.yml 219 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-jyhj.yml 219 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-mkzs.yml 219 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-mqsp.yml 219 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-mxsc.yml 219 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-nydl.yml 219 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-phmk.yml 219 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-prod.yml 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-qlmc.yml 219 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-rzny.yml 219 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-tjxm.yml 219 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-tymk.yml 219 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-wdsy.yml 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-xyhb.yml 219 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-zjyj.yml 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-zqhx.yml 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-zyrq.yml 219 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-zyrqCopy.yml 219 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/account/AccountFileMapper.xml 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/approve/AnnualLeaveSettingMapper.xml 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/approve/ApproveProcessMapper.xml 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/approve/FileSharingMapper.xml 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/approve/HolidaySettingsMapper.xml 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/approve/KnowledgeBaseMapper.xml 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/approve/NotificationManagementMapper.xml 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/approve/OnlineMeetingMapper.xml 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/approve/OvertimeSettingMapper.xml 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/approve/RpaProcessAutomationMapper.xml 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/approve/WorkingHoursSettingMapper.xml 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/collaborativeApproval/DutyPlanMapper.xml 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/collaborativeApproval/MeetApplicationMapper.xml 80 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/collaborativeApproval/MeetDraftMapper.xml 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/collaborativeApproval/MeetingMinutesMapper.xml 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/collaborativeApproval/MeetingRoomMapper.xml 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/collaborativeApproval/NoticeMapper.xml 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/collaborativeApproval/ReadingStatusMapper.xml 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/collaborativeApproval/RulesRegulationsManagementMapper.xml 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/collaborativeApproval/SealApplicationManagementMapper.xml 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/collaborativeApproval/StaffContactsPersonalMapper.xml 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/customervisits/CustomerVisitsMapper.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/device/DeviceDefectRecordMapper.xml 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/device/DeviceLedgerMapper.xml 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/device/DeviceMaintenanceMapper.xml 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/equipmentenergyconsumption/EnergyPeriodMapper.xml 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/equipmentenergyconsumption/electricityConsumptionAreaMapper.xml 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/inspectiontask/TimingTaskMapper.xml 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/lavorissue/LavorIssueMapper.xml 78 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/measuringinstrumentledger/SparePartsMapper.xml 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/oA/OaProjectMapper.xml 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/oA/OaProjectPhaseMapper.xml 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/oA/OaProjectPhaseTaskMapper.xml 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/officesupplies/OfficeSuppliesMapper.xml 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/procurementrecord/GasTankWarningMapper.xml 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/procurementrecord/InboundManagementMapper.xml 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/procurementrecord/ProcurementPlanMapper.xml 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/procurementrecord/ProcurementPriceManagementMapper.xml 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/procurementrecord/ProcurementRecordMapper.xml 40 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/procurementrecord/ProcurementRecordOutMapper.xml 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/procurementrecord/ReturnManagementMapper.xml 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/production/SalesLedgerProductionAccountingMapper.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/purchase/PaymentRegistrationMapper.xml 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/purchase/ProductRecordMapper.xml 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/sales/InvoiceLedgerMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/sales/PaymentShippingMapper.xml 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/sales/ReceiptPaymentMapper.xml 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/sales/SalesQuotationMapper.xml 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/sales/SalesQuotationProductMapper.xml 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/sales/SalespersonManagementMapper.xml 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/sales/ShippingInfoMapper.xml 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/staff/HolidayApplicationMapper.xml 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/staff/PersonalAttendanceRecordsMapper.xml 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/staff/StaffJoinLeaveRecordMapper.xml 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/staff/StaffSchedulingMapper.xml 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/system/SysUserDeptMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/system/SysUserMapper.xml 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/warehouse/DocumentClassificationMapper.xml 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/warehouse/DocumentationBorrowManagementMapper.xml 88 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/warehouse/DocumentationFileMapper.xml 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/warehouse/DocumentationMapper.xml 87 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/warehouse/DocumentationReturnManagementMapper.xml 57 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/warehouse/WarehouseGoodsShelvesMapper.xml 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/warehouse/WarehouseGoodsShelvesRowcolMapper.xml 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/warehouse/WarehouseMapper.xml 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/waterrecord/WaterRecordMapper.xml 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mybatis/mybatis-config.xml 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/static/report-template.docx 补丁 | 查看 | 原始文档 | blame | 历史
pom.xml
@@ -294,6 +294,12 @@
            <version>1.12.2</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>4.0.3</version>
        </dependency>
    </dependencies>
    <build>
src/main/java/com/ruoyi/account/controller/AccountExpenseController.java
@@ -11,6 +11,8 @@
import com.ruoyi.dto.DateQueryDto;
import com.ruoyi.framework.security.LoginUser;
import com.ruoyi.framework.web.domain.AjaxResult;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.*;
@@ -24,6 +26,7 @@
 */
@RestController
@RequestMapping("/account/accountExpense")
@Api(tags = "财务管理--支出管理")
public class AccountExpenseController {
    @Resource
@@ -39,6 +42,7 @@
     * @return
     */
    @PostMapping("/add")
    @ApiOperation("新增")
    public AjaxResult add(@RequestBody AccountExpense accountExpense) {
        accountExpense.setInputTime(new Date());
        LoginUser loginUser = SecurityUtils.getLoginUser();
@@ -52,6 +56,7 @@
     * @return
     */
    @DeleteMapping("/del")
    @ApiOperation("删除")
    public AjaxResult delQualityInspect(@RequestBody List<Integer> ids) {
        if(CollectionUtils.isEmpty(ids)){
            return AjaxResult.error("请选择至少一条数据");
@@ -66,6 +71,7 @@
     * @return
     */
    @PostMapping("/update")
    @ApiOperation("修改")
    public AjaxResult update(@RequestBody AccountExpense accountExpense) {
        return AjaxResult.success(accountExpenseService.updateById(accountExpense));
    }
@@ -77,6 +83,7 @@
     * @return
     */
    @GetMapping("/listPage")
    @ApiOperation("分页查询")
    public AjaxResult accountExpenseListPage(Page page, AccountExpense accountExpense) {
        return AjaxResult.success(accountExpenseService.accountExpenseListPage(page, accountExpense));
    }
@@ -87,6 +94,7 @@
     * @return
     */
    @GetMapping("/{id}")
    @ApiOperation("详情")
    public AjaxResult accountExpenseDetail(@PathVariable("id") Integer id) {
        return AjaxResult.success(accountExpenseService.getById(id));
    }
@@ -97,6 +105,7 @@
     * @param accountExpense
     */
    @PostMapping("/export")
    @ApiOperation("导出")
    public void accountExpenseExport(HttpServletResponse response,AccountExpense accountExpense) {
        accountExpenseService.accountExpenseExport(response, accountExpense);
    }
@@ -107,8 +116,19 @@
     * @return
     */
    @GetMapping("/report/forms")
    @ApiOperation("财务报表图表查询")
    public AjaxResult report(DateQueryDto dateQueryDto) {
        return AjaxResult.success(accountExpenseService.report(dateQueryDto));
    }
    /**
     * è´¢åŠ¡æŠ¥è¡¨-财务分析
     * @return
     */
    @GetMapping("/report/analysis")
    @ApiOperation("财务报表-财务分析")
    public AjaxResult analysis() {
        return AjaxResult.success(accountExpenseService.analysis());
    }
    /**
@@ -117,6 +137,7 @@
     * @return
     */
    @GetMapping("/report/income")
    @ApiOperation("财务报表图表收入年度查询")
    public AjaxResult reportIncome() {
        return AjaxResult.success(accountIncomeService.reportIncome());
    }
@@ -127,6 +148,7 @@
     * @return
     */
    @GetMapping("/report/expense")
    @ApiOperation("财务报表图表支出年度查询")
    public AjaxResult reportExpense() {
        return AjaxResult.success(accountExpenseService.reportExpense());
    }
src/main/java/com/ruoyi/account/controller/AccountFileController.java
@@ -6,6 +6,8 @@
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.quality.pojo.QualityInspectFile;
import com.ruoyi.quality.service.IQualityInspectFileService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.*;
@@ -17,6 +19,7 @@
 */
@RestController
@RequestMapping("/account/accountFile")
@Api(tags = "财务附件")
public class AccountFileController {
@@ -30,6 +33,7 @@
     * @return
     */
    @PostMapping("/add")
    @ApiOperation("新增")
    public AjaxResult add(@RequestBody AccountFile accountFile) {
        return AjaxResult.success(accountFileService.save(accountFile));
    }
@@ -40,6 +44,7 @@
     * @return
     */
    @DeleteMapping("/del")
    @ApiOperation("删除")
    public AjaxResult delAccountFile(@RequestBody List<Integer> ids) {
        if(CollectionUtils.isEmpty(ids)){
            return AjaxResult.error("请选择至少一条数据");
@@ -55,6 +60,7 @@
     * @return
     */
    @GetMapping("/listPage")
    @ApiOperation("分页查询")
    public AjaxResult accountFileListPage(Page page, AccountFile accountFile) {
        return AjaxResult.success(accountFileService.accountFileListPage(page, accountFile));
    }
src/main/java/com/ruoyi/account/controller/AccountIncomeController.java
@@ -14,6 +14,8 @@
import com.ruoyi.quality.service.IQualityInspectFileService;
import com.ruoyi.quality.service.IQualityInspectParamService;
import com.ruoyi.quality.service.IQualityInspectService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.*;
@@ -27,6 +29,7 @@
 */
@RestController
@RequestMapping("/account/accountIncome")
@Api(tags = "财务管理--收入管理")
public class AccountIncomeController {
    @Resource
@@ -39,6 +42,7 @@
     * @return
     */
    @PostMapping("/add")
    @ApiOperation("新增")
    public AjaxResult add(@RequestBody AccountIncome accountIncome) {
        accountIncome.setInputTime(new Date());
        LoginUser loginUser = SecurityUtils.getLoginUser();
@@ -52,6 +56,7 @@
     * @return
     */
    @DeleteMapping("/del")
    @ApiOperation("删除")
    public AjaxResult delQualityInspect(@RequestBody List<Integer> ids) {
        if(CollectionUtils.isEmpty(ids)){
            return AjaxResult.error("请选择至少一条数据");
@@ -66,6 +71,7 @@
     * @return
     */
    @PostMapping("/update")
    @ApiOperation("修改")
    public AjaxResult update(@RequestBody AccountIncome accountIncome) {
        return AjaxResult.success(accountIncomeService.updateById(accountIncome));
    }
@@ -77,6 +83,7 @@
     * @return
     */
    @GetMapping("/listPage")
    @ApiOperation("分页查询")
    public AjaxResult accountIncomeListPage(Page page, AccountIncome accountIncome) {
        return AjaxResult.success(accountIncomeService.accountIncomeListPage(page, accountIncome));
    }
@@ -87,6 +94,7 @@
     * @return
     */
    @GetMapping("/{id}")
    @ApiOperation("详情")
    public AjaxResult accountIncomeDetail(@PathVariable("id") Integer id) {
        return AjaxResult.success(accountIncomeService.getById(id));
    }
@@ -97,6 +105,7 @@
     * @param accountIncome
     */
    @PostMapping("/export")
    @ApiOperation("导出")
    public void accountIncomeExport(HttpServletResponse response,AccountIncome accountIncome) {
        accountIncomeService.accountIncomeExport(response, accountIncome);
    }
src/main/java/com/ruoyi/account/service/AccountExpenseService.java
@@ -7,10 +7,12 @@
import com.ruoyi.account.dto.AccountDto2;
import com.ruoyi.account.dto.AccountDto3;
import com.ruoyi.account.pojo.AccountExpense;
import com.ruoyi.account.pojo.AccountIncome;
import com.ruoyi.dto.DateQueryDto;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
import java.util.Map;
public interface AccountExpenseService extends IService<AccountExpense> {
@@ -21,4 +23,10 @@
    AccountDto report(DateQueryDto dateQueryDto);
    List<AccountDto3> reportExpense();
    Map<String,List<String>> analysis();
    AccountExpense getByInvoiceNumber(String purchaseContractNumber);
    List<AccountExpense> getByInvoiceNumberList(String purchaseContractNumber);
}
src/main/java/com/ruoyi/account/service/AccountIncomeService.java
@@ -18,4 +18,8 @@
    void accountIncomeExport(HttpServletResponse response, AccountIncome accountIncome);
    List<AccountDto3> reportIncome();
    AccountIncome getByInvoiceNumber(String purchaseContractNumber);
    List<AccountIncome> getByInvoiceNumberList(String purchaseContractNumber);
}
src/main/java/com/ruoyi/account/service/impl/AccountExpenseServiceImpl.java
@@ -22,12 +22,10 @@
import javax.servlet.http.HttpServletResponse;
import java.math.BigDecimal;
import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.*;
@AllArgsConstructor
@Service
@@ -115,5 +113,55 @@
        return accountDto3s;
    }
    @Override
    public Map<String, List<String>> analysis() {
        // èŽ·å–æœ¬å‘¨çš„æ—¶é—´èŒƒå›´
        LocalDate startOfWeek = LocalDate.now().with(DayOfWeek.MONDAY);
        LocalDate endOfWeek = LocalDate.now().with(DayOfWeek.SUNDAY);
        Map<String, List<String>> result = new HashMap<>();
        List<String> days = new ArrayList<>();
        List<String> totalIncomeList = new ArrayList<>();
        List<String> totalExpenseList = new ArrayList<>();
        List<String> netIncomeList = new ArrayList<>();
        // æ ¹æ®æ—¶é—´èŒƒå›´å¾ªçŽ¯æŸ¥è¯¢æ¯ä¸€å¤©çš„æ€»æ”¶å…¥ï¼Œæ€»æ”¯å‡º,净收入(总收入-总支出)
        for (LocalDate date = startOfWeek; date.isBefore(endOfWeek) || date.isEqual(endOfWeek); date = date.plusDays(1)) {
            BigDecimal totalIncome = accountIncomeMapper.selectList(Wrappers.<AccountIncome>lambdaQuery()
                    .eq(AccountIncome::getInputTime, date.toString()))
                    .stream()
                    .map(AccountIncome::getIncomeMoney)
                    .filter(Objects::nonNull)
                    .reduce(BigDecimal.ZERO, BigDecimal::add);
            BigDecimal totalExpense = accountExpenseMapper.selectList(Wrappers.<AccountExpense>lambdaQuery()
                    .eq(AccountExpense::getInputTime, date.toString()))
                    .stream()
                    .map(AccountExpense::getExpenseMoney)
                    .filter(Objects::nonNull)
                    .reduce(BigDecimal.ZERO, BigDecimal::add);
            BigDecimal netIncome = totalIncome.subtract(totalExpense);
            days.add(date.toString());
            totalIncomeList.add(totalIncome.toString());
            totalExpenseList.add(totalExpense.toString());
            netIncomeList.add(netIncome.toString());
        }
        result.put("days", days);  //  å¤©
        result.put("totalIncome", totalIncomeList); // æ”¶å…¥
        result.put("totalExpense", totalExpenseList); // æ”¯å‡º
        result.put("netIncome", netIncomeList); // å‡€æ”¶å…¥
        return result;
    }
    @Override
    public AccountExpense getByInvoiceNumber(String purchaseContractNumber) {
        return accountExpenseMapper.selectOne(Wrappers.<AccountExpense>lambdaQuery()
                .eq(AccountExpense::getInvoiceNumber, purchaseContractNumber));
    }
    @Override
    public List<AccountExpense> getByInvoiceNumberList(String purchaseContractNumber) {
        return accountExpenseMapper.selectList(Wrappers.<AccountExpense>lambdaQuery()
                .eq(AccountExpense::getInvoiceNumber, purchaseContractNumber));
    }
}
src/main/java/com/ruoyi/account/service/impl/AccountIncomeServiceImpl.java
@@ -1,6 +1,7 @@
package com.ruoyi.account.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -74,4 +75,17 @@
        }
        return accountDto3s;
    }
    @Override
    public AccountIncome getByInvoiceNumber(String purchaseContractNumber) {
        AccountIncome accountIncome = accountIncomeMapper.selectOne(new LambdaQueryWrapper<AccountIncome>()
                .eq(AccountIncome::getInvoiceNumber, purchaseContractNumber));
        return accountIncome;
    }
    @Override
    public List<AccountIncome> getByInvoiceNumberList(String purchaseContractNumber) {
        return accountIncomeMapper.selectList(new LambdaQueryWrapper<AccountIncome>()
                .eq(AccountIncome::getInvoiceNumber, purchaseContractNumber));
    }
}
src/main/java/com/ruoyi/aftersalesservice/controller/AfterSalesServiceController.java
@@ -2,9 +2,11 @@
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.aftersalesservice.dto.AfterSalesServiceDto;
import com.ruoyi.aftersalesservice.pojo.AfterSalesService;
import com.ruoyi.aftersalesservice.service.AfterSalesServiceService;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.equipmentenergyconsumption.pojo.EquipmentEnergyConsumption;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
@@ -12,12 +14,16 @@
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.project.system.domain.SysUser;
import com.ruoyi.project.system.mapper.SysUserMapper;
import com.ruoyi.purchase.dto.VatDto;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.List;
/**
@@ -44,6 +50,38 @@
        return AjaxResult.success(listPage);
    }
    @Log(title = "售后服务-反馈登记", businessType = BusinessType.EXPORT)
    @PostMapping("/export")
    @ApiOperation("售后服务-反馈登记")
    public void export(HttpServletResponse response) {
        Page page = new Page(-1,-1);
        AfterSalesService afterSalesService = new AfterSalesService();
        IPage<AfterSalesService> listPage = afterSalesServiceService.listPage(page, afterSalesService);
        List<AfterSalesServiceDto> list = new ArrayList<>();
        listPage.getRecords().forEach(item -> {
            AfterSalesServiceDto dto = new AfterSalesServiceDto();
            BeanUtils.copyProperties(item, dto);
            dto.setStatusName(item.getStatus().toString());
            list.add(dto);
        });
        ExcelUtil<AfterSalesServiceDto> util = new ExcelUtil<AfterSalesServiceDto>(AfterSalesServiceDto.class);
        util.exportExcel(response, list , "反馈登记");
    }
    @Log(title = "售后服务-售后处理", businessType = BusinessType.EXPORT)
    @PostMapping("/exportTwo")
    @ApiOperation("售后服务-售后处理")
    public void exportTwo(HttpServletResponse response) {
        Page page = new Page(-1,-1);
        AfterSalesService afterSalesService = new AfterSalesService();
        IPage<AfterSalesService> listPage = afterSalesServiceService.listPage(page, afterSalesService);
        listPage.getRecords().forEach(item -> {
            item.setStatusName(item.getStatus().toString());
        });
        ExcelUtil<AfterSalesService> util = new ExcelUtil<AfterSalesService>(AfterSalesService.class);
        util.exportExcel(response, listPage.getRecords() , "售后处理");
    }
    @PostMapping("/add")
    @ApiOperation("售后服务-新增")
    @Log(title = "售后服务-新增", businessType = BusinessType.INSERT)
src/main/java/com/ruoyi/aftersalesservice/dto/AfterSalesServiceDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,68 @@
package com.ruoyi.aftersalesservice.dto;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import java.util.Date;
/**
 * @author :yys
 * @date : 2025/11/3 11:14
 */
@Data
public class AfterSalesServiceDto {
    /**
     * çŠ¶æ€ 1-待处理 2-已处理
     */
    @ApiModelProperty("状态 1-待处理 2-已处理")
    private Integer status;
    @Excel(name = "状态", readConverterExp = "1=待处理,2=已处理")
    private String statusName;
    /**
     * ç™»è®°äººåç§°
     */
    @ApiModelProperty("登记人名称")
    @Excel(name = "登记人名称")
    private String checkNickName;
    /**
     * å®¢æˆ·åç§°
     */
    @ApiModelProperty("客户名称")
    @Excel(name = "客户名称")
    private String customerName;
    /**
     * é—®é¢˜æè¿°
     */
    @ApiModelProperty("问题描述")
    @Excel(name = "问题描述")
    private String proDesc;
    /**
     * åé¦ˆæ—¥æœŸ
     */
    @ApiModelProperty("反馈日期")
    @JsonFormat(pattern = "yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @Excel(name = "反馈日期", width = 30, dateFormat = "yyyy-MM-dd")
    private Date feedbackDate;
    @ApiModelProperty("关联部门")
    @Excel(name = "关联部门")
    private String deptName;
}
src/main/java/com/ruoyi/aftersalesservice/pojo/AfterSalesService.java
@@ -2,6 +2,7 @@
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@@ -32,6 +33,10 @@
    @ApiModelProperty("状态 1-待处理 2-已处理")
    private Integer status;
    @Excel(name = "状态", readConverterExp = "1=待处理,2=已处理")
    private String statusName;
    /**
     * ç™»è®°äºº
     */
@@ -42,6 +47,7 @@
     * ç™»è®°äººåç§°
     */
    @ApiModelProperty("登记人名称")
    @Excel(name = "登记人名称")
    private String checkNickName;
    /**
@@ -54,24 +60,28 @@
     * å¤„理人名称
     */
    @ApiModelProperty("处理人名称")
    @Excel(name = "处理人名称")
    private String disposeNickName;
    /**
     * å®¢æˆ·åç§°
     */
    @ApiModelProperty("客户名称")
    @Excel(name = "客户名称")
    private String customerName;
    /**
     * é—®é¢˜æè¿°
     */
    @ApiModelProperty("问题描述")
    @Excel(name = "问题描述")
    private String proDesc;
    /**
     * å¤„理结果
     */
    @ApiModelProperty("处理结果")
    @Excel(name = "处理结果")
    private String disRes;
    /**
@@ -80,6 +90,7 @@
    @ApiModelProperty("反馈日期")
    @JsonFormat(pattern = "yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @Excel(name = "反馈日期", width = 30, dateFormat = "yyyy-MM-dd")
    private Date feedbackDate;
    /**
@@ -88,6 +99,7 @@
    @ApiModelProperty("处理日期")
    @JsonFormat(pattern = "yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @Excel(name = "处理日期", width = 30, dateFormat = "yyyy-MM-dd")
    private Date disDate;
src/main/java/com/ruoyi/approve/controller/ApproveProcessController.java
@@ -1,23 +1,31 @@
package com.ruoyi.approve.controller;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.account.pojo.AccountExpense;
import com.ruoyi.approve.pojo.ApproveProcess;
import com.ruoyi.approve.service.IApproveProcessService;
import com.ruoyi.approve.vo.ApproveGetAndUpdateVo;
import com.ruoyi.approve.vo.ApproveProcessVO;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.framework.security.LoginUser;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.project.system.domain.SysDept;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.text.ParseException;
import java.util.List;
@RestController
@RequestMapping("/approveProcess")
@Api(tags = "审批")
public class ApproveProcessController {
    @GetMapping("/test")
@@ -50,7 +58,8 @@
     */
    @PostMapping("/add")
    @Transactional(rollbackFor = Exception.class)
    public AjaxResult add(@RequestBody ApproveProcessVO approveProcessVO) throws ParseException {
    @ApiOperation(value = "添加审批")
    public AjaxResult add(@RequestBody ApproveProcessVO approveProcessVO) throws Exception {
        if (approveProcessVO == null) {
            return AjaxResult.warn("参数不能为空");
        }
@@ -65,6 +74,7 @@
     * @return
     */
    @GetMapping("/get")
    @ApiOperation(value = "审批详情")
    public AjaxResult get(ApproveGetAndUpdateVo approveGetAndUpdateVo){
        if (approveGetAndUpdateVo.getId() == null || approveGetAndUpdateVo.getId().isEmpty()) {
            return AjaxResult.warn("参数不能为空");
@@ -79,7 +89,8 @@
     */
    @PostMapping("/update")
    @Transactional(rollbackFor = Exception.class)
    public AjaxResult update(@RequestBody ApproveGetAndUpdateVo approveGetAndUpdateVo) {
    @ApiOperation(value = "更新审批")
    public AjaxResult update(@RequestBody ApproveGetAndUpdateVo approveGetAndUpdateVo) throws IOException {
        if (approveGetAndUpdateVo == null) {
            return AjaxResult.warn("参数不能为空");
        }
@@ -91,6 +102,7 @@
     * @return
     */
    @GetMapping("/list")
    @ApiOperation(value = "获取审批列表")
    public AjaxResult list(Page page, ApproveProcess approveProcess) {
        return AjaxResult.success(approveProcessService.listAll(page, approveProcess));
    }
@@ -101,6 +113,7 @@
     * @return
     */
    @DeleteMapping("/deleteIds")
    @ApiOperation(value = "删除审批")
    @Transactional(rollbackFor = Exception.class)
    public AjaxResult deleteIds(@RequestBody Long[] ids) {
        if (ids == null || ids.length == 0) {
@@ -109,4 +122,64 @@
        approveProcessService.delApprove(ids);
        return AjaxResult.success("操作成功");
    }
    @ApiOperation(value = "公出管理导出")
    @PostMapping("/exportOne")
    public void exportOne(HttpServletResponse response) {
        List<ApproveProcess> accountExpenses = approveProcessService.list(new LambdaQueryWrapper<ApproveProcess>()
                .eq(ApproveProcess::getApproveDelete, 0)
                .eq(ApproveProcess::getApproveType, 1));
        ExcelUtil<ApproveProcess> util = new ExcelUtil<ApproveProcess>(ApproveProcess.class);
        util.exportExcel(response, accountExpenses, "公出管理导出");
    }
    @ApiOperation(value = "请假管理导出")
    @PostMapping("/exportTwo")
    public void exportTwo(HttpServletResponse response) {
        List<ApproveProcess> accountExpenses = approveProcessService.list(new LambdaQueryWrapper<ApproveProcess>()
                .eq(ApproveProcess::getApproveDelete, 0)
                .eq(ApproveProcess::getApproveType, 2));
        ExcelUtil<ApproveProcess> util = new ExcelUtil<ApproveProcess>(ApproveProcess.class);
        util.exportExcel(response, accountExpenses, "请假管理导出");
    }
    @ApiOperation(value = "出差管理导出")
    @PostMapping("/exportThree")
    public void exportThree(HttpServletResponse response) {
        List<ApproveProcess> accountExpenses = approveProcessService.list(new LambdaQueryWrapper<ApproveProcess>()
                .eq(ApproveProcess::getApproveDelete, 0)
                .eq(ApproveProcess::getApproveType, 3));
        ExcelUtil<ApproveProcess> util = new ExcelUtil<ApproveProcess>(ApproveProcess.class);
        util.exportExcel(response, accountExpenses, "出差管理导出");
    }
    @ApiOperation(value = "报销管理导出")
    @PostMapping("/exportFour")
    public void exportFour(HttpServletResponse response) {
        List<ApproveProcess> accountExpenses = approveProcessService.list(new LambdaQueryWrapper<ApproveProcess>()
                .eq(ApproveProcess::getApproveDelete, 0)
                .eq(ApproveProcess::getApproveType, 4));
        ExcelUtil<ApproveProcess> util = new ExcelUtil<ApproveProcess>(ApproveProcess.class);
        util.exportExcel(response, accountExpenses, "报销管理导出");
    }
    @ApiOperation(value = "采购申请导出")
    @PostMapping("/exportFive")
    public void exportFive(HttpServletResponse response) {
        List<ApproveProcess> accountExpenses = approveProcessService.list(new LambdaQueryWrapper<ApproveProcess>()
                .eq(ApproveProcess::getApproveDelete, 0)
                .eq(ApproveProcess::getApproveType, 5));
        ExcelUtil<ApproveProcess> util = new ExcelUtil<ApproveProcess>(ApproveProcess.class);
        util.exportExcel(response, accountExpenses, "采购申请导出");
    }
    @ApiOperation(value = "协同审批导出")
    @PostMapping("/exportZero")
    public void exportZero(HttpServletResponse response) {
        List<ApproveProcess> accountExpenses = approveProcessService.list(new LambdaQueryWrapper<ApproveProcess>()
                        .eq(ApproveProcess::getApproveDelete, 0)
                .eq(ApproveProcess::getApproveType, 0));
        ExcelUtil<ApproveProcess> util = new ExcelUtil<ApproveProcess>(ApproveProcess.class);
        util.exportExcel(response, accountExpenses, "协同审批导出");
    }
}
src/main/java/com/ruoyi/approve/controller/HolidaySettingsController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,173 @@
package com.ruoyi.approve.controller;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.approve.mapper.AnnualLeaveSettingMapper;
import com.ruoyi.approve.mapper.OvertimeSettingMapper;
import com.ruoyi.approve.mapper.WorkingHoursSettingMapper;
import com.ruoyi.approve.pojo.*;
import com.ruoyi.approve.service.HolidaySettingsService;
import com.ruoyi.framework.web.domain.AjaxResult;
import lombok.AllArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/holidaySettings")
@AllArgsConstructor
public class HolidaySettingsController {
    @Autowired
    private HolidaySettingsService holidaySettingsService;
    @Autowired
    private AnnualLeaveSettingMapper annualLeaveSettingMapper;
    @Autowired
    private OvertimeSettingMapper overtimeSettingMapper;
    @Autowired
    private WorkingHoursSettingMapper workingHoursSettingMapper;
    /**、
     * èŽ·å–å‡æœŸè®¾ç½®åˆ—è¡¨
     * @return
     */
    @GetMapping("/getList")
    public AjaxResult getList(@RequestParam(defaultValue = "1") long current,
                              @RequestParam(defaultValue = "50") long size, HolidaySettings holidaySettings) {
        Page page = new Page(current, size);
        return AjaxResult.success(holidaySettingsService.listpage(page,holidaySettings));
    }
    /**、
     * å¢žæ·»
     * @return
     */
    @PostMapping("/add")
    public AjaxResult add(@RequestBody HolidaySettings holidaySettings){
        return AjaxResult.success(holidaySettingsService.save(holidaySettings));
    }
    /**
     * æ›´æ–°
     * @return
     */
    @PostMapping("/update")
    public AjaxResult update(@RequestBody HolidaySettings holidaySettings){
        return AjaxResult.success(holidaySettingsService.updateById(holidaySettings));
    }
    /**
     * åˆ é™¤
     * @return
     */
    @DeleteMapping("/delete")
    public AjaxResult delete(@RequestBody List<Long> ids){
        if(CollectionUtils.isEmpty(ids)) return AjaxResult.error("请传入要删除的ID");
        return AjaxResult.success(holidaySettingsService.removeByIds(ids));
    }
    /**、
     * èŽ·å–å¹´å‡è§„åˆ™åˆ—è¡¨
     * @return
     */
    @GetMapping("/getAnnualLeaveSettingList")
    public AjaxResult getAnnualLeaveSettingList(@RequestParam(defaultValue = "1") long current,
                              @RequestParam(defaultValue = "50") long size, AnnualLeaveSetting annualLeaveSetting) {
        Page page = new Page(current, size);
        return AjaxResult.success(annualLeaveSettingMapper.listPage(page,annualLeaveSetting));
    }
    /**、
     * å¢žæ·»å¹´å‡è§„则
     * @return
     */
    @PostMapping("/addAnnualLeaveSetting")
    public AjaxResult addAnnualLeaveSetting(@RequestBody AnnualLeaveSetting annualLeaveSetting){
        return AjaxResult.success(annualLeaveSettingMapper.insert(annualLeaveSetting));
    }
    /**、
     * æ›´æ–°å¹´å‡è§„则
     * @return
     */
    @PostMapping("/updateAnnualLeaveSetting")
    public AjaxResult updateAnnualLeaveSetting(@RequestBody AnnualLeaveSetting annualLeaveSetting){
        return AjaxResult.success(annualLeaveSettingMapper.updateById(annualLeaveSetting));
    }
    /**、
     * åˆ é™¤å¹´å‡è§„则
     * @return
     */
    @DeleteMapping("/deleteAnnualLeaveSetting")
    public AjaxResult deleteAnnualLeaveSetting(@RequestBody List<Long> ids){
        if(CollectionUtils.isEmpty(ids)) return AjaxResult.error("请传入要删除的ID");
        return AjaxResult.success(annualLeaveSettingMapper.deleteBatchIds(ids));
    }
    /**、
     * èŽ·å–åŠ ç­è§„åˆ™åˆ—è¡¨
     * @return
     */
    @GetMapping("/getOvertimeSettingList")
    public AjaxResult getOvertimeSettingList(@RequestParam(defaultValue = "1") long current,
                              @RequestParam(defaultValue = "50") long size, OvertimeSetting overtimeSetting) {
        Page page = new Page(current, size);
        return AjaxResult.success(overtimeSettingMapper.listPage(page,overtimeSetting));
    }
    /**、
     * å¢žæ·»åŠ ç­è§„åˆ™
     * @return
     */
    @PostMapping("/addOvertimeSetting")
    public AjaxResult addOvertimeSetting(@RequestBody OvertimeSetting overtimeSetting){
        return AjaxResult.success(overtimeSettingMapper.insert(overtimeSetting));
    }
    /**、
     * æ›´æ–°åŠ ç­è§„åˆ™
     * @return
     */
    @PostMapping("/updateOvertimeSetting")
    public AjaxResult updateOvertimeSetting(@RequestBody OvertimeSetting overtimeSetting){
        return AjaxResult.success(overtimeSettingMapper.updateById(overtimeSetting));
    }
    /**、
     * åˆ é™¤åŠ ç­è§„åˆ™
     * @return
     */
    @DeleteMapping("/deleteOvertimeSetting")
    public AjaxResult deleteOvertimeSetting(@RequestBody List<Long> ids){
        if(CollectionUtils.isEmpty(ids)) return AjaxResult.error("请传入要删除的ID");
        return AjaxResult.success(overtimeSettingMapper.deleteBatchIds(ids));
    }
    /**、
     * èŽ·å–ä¸Šç­æ—¶é—´è®¾ç½®-班制规则列表
     * @return
     */
    @GetMapping("/getWorkingHoursSettingList")
    public AjaxResult getWorkingHoursSettingList(@RequestParam(defaultValue = "1") long current,
                              @RequestParam(defaultValue = "50") long size, WorkingHoursSetting workingHoursSetting) {
        Page page = new Page(current, size);
        return AjaxResult.success(workingHoursSettingMapper.listPage(page,workingHoursSetting));
    }
    /**、
     * å¢žæ·»ç­åˆ¶è§„则
     * @return
     */
    @PostMapping("/addWorkingHoursSetting")
    public AjaxResult addWorkingHoursSetting(@RequestBody WorkingHoursSetting workingHoursSetting){
        return AjaxResult.success(workingHoursSettingMapper.insert(workingHoursSetting));
    }
    /**、
     * æ›´æ–°ç­åˆ¶è§„则
     * @return
     */
    @PostMapping("/updateWorkingHoursSetting")
    public AjaxResult updateWorkingHoursSetting(@RequestBody WorkingHoursSetting workingHoursSetting){
        return AjaxResult.success(workingHoursSettingMapper.updateById(workingHoursSetting));
    }
    /**、
     * åˆ é™¤ç­åˆ¶è§„则
     * @return
     */
    @DeleteMapping("/deleteWorkingHoursSetting")
    public AjaxResult deleteWorkingHoursSetting(@RequestBody List<Long> ids){
        if(CollectionUtils.isEmpty(ids)) return AjaxResult.error("请传入要删除的ID");
        return AjaxResult.success(workingHoursSettingMapper.deleteBatchIds(ids));
    }
}
src/main/java/com/ruoyi/approve/controller/KnowledgeBaseController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,72 @@
package com.ruoyi.approve.controller;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.approve.mapper.KnowledgeBaseMapper;
import com.ruoyi.approve.pojo.KnowledgeBase;
import com.ruoyi.approve.pojo.RpaProcessAutomation;
import com.ruoyi.approve.service.KnowledgeBaseService;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.framework.web.domain.AjaxResult;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
@RestController
@RequestMapping("/knowledgeBase")
@AllArgsConstructor
@Api(tags = "知识库管理")
public class KnowledgeBaseController {
    @Autowired
    private KnowledgeBaseService knowledgeBaseService;
    /**、
     * èŽ·å–åˆ—è¡¨
     * @return
     */
    @GetMapping("/getList")
    public AjaxResult getList(@RequestParam(defaultValue = "1") long current,
                              @RequestParam(defaultValue = "10") long size, KnowledgeBase knowledgeBase) {
        Page page = new Page(current, size);
        return AjaxResult.success(knowledgeBaseService.listpage(page,knowledgeBase));
    }
    /**、
     * å¢žæ·»
     * @return
     */
    @PostMapping("/add")
    public AjaxResult add(@RequestBody KnowledgeBase knowledgeBase){
        return AjaxResult.success(knowledgeBaseService.save(knowledgeBase));
    }
    /**
     * æ›´æ–°
     * @return
     */
    @PostMapping("/update")
    public AjaxResult update(@RequestBody KnowledgeBase knowledgeBase){
        return AjaxResult.success(knowledgeBaseService.updateById(knowledgeBase));
    }
    /**
     * åˆ é™¤
     * @return
     */
    @DeleteMapping("/delete")
    public AjaxResult delete(@RequestBody List<Long> ids){
        if(CollectionUtils.isEmpty(ids)) return AjaxResult.error("请传入要删除的ID");
        return AjaxResult.success(knowledgeBaseService.removeByIds(ids));
    }
    @ApiOperation(value = "知识库管理导出")
    @PostMapping("/export")
    public void export(HttpServletResponse response) {
        List<KnowledgeBase> accountExpenses = knowledgeBaseService.list();
        ExcelUtil<KnowledgeBase> util = new ExcelUtil<KnowledgeBase>(KnowledgeBase.class);
        util.exportExcel(response, accountExpenses, "知识库管理导出");
    }
}
src/main/java/com/ruoyi/approve/controller/NotificationManagementController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,82 @@
package com.ruoyi.approve.controller;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.approve.mapper.FileSharingMapper;
import com.ruoyi.approve.mapper.OnlineMeetingMapper;
import com.ruoyi.approve.pojo.FileSharing;
import com.ruoyi.approve.pojo.NotificationManagement;
import com.ruoyi.approve.pojo.OnlineMeeting;
import com.ruoyi.approve.service.NotificationManagementService;
import com.ruoyi.framework.web.domain.AjaxResult;
import lombok.AllArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/notificationManagement")
@AllArgsConstructor
public class NotificationManagementController {
    @Autowired
    private NotificationManagementService notificationManagementService ;
    @Autowired
    private OnlineMeetingMapper onlineMeetingMapper;
    @Autowired
    private FileSharingMapper fileSharingMapper;
    /**、
     * èŽ·å–åˆ—è¡¨
     * @return
     */
    @GetMapping("/getList")
    public AjaxResult getList(@RequestParam(defaultValue = "1") long current,
                              @RequestParam(defaultValue = "50") long size, NotificationManagement notificationManagement) {
        Page page = new Page(current, size);
        return AjaxResult.success(notificationManagementService.listpage(page,notificationManagement));
    }
    /**、
     * å¢žæ·»
     * @return
     */
    @PostMapping("/add")
    public AjaxResult add(@RequestBody NotificationManagement notificationManagement){
        return AjaxResult.success(notificationManagementService.save(notificationManagement));
    }
    /**
     * æ›´æ–°
     * @return
     */
    @PostMapping("/update")
    public AjaxResult update(@RequestBody NotificationManagement notificationManagement){
        return AjaxResult.success(notificationManagementService.updateById(notificationManagement));
    }
    /**
     * åˆ é™¤
     * @return
     */
    @DeleteMapping("/delete")
    public AjaxResult delete(@RequestBody List<Long> ids){
        if(CollectionUtils.isEmpty(ids)) return AjaxResult.error("请传入要删除的ID");
        return AjaxResult.success(notificationManagementService.removeByIds(ids));
    }
    /**
     *新增会议
     * @param onlineMeeting
     * @return
     */
    @PostMapping("/addOnlineMeeting")
    public AjaxResult addOnlineMeeting(@RequestBody OnlineMeeting onlineMeeting){
        return AjaxResult.success(onlineMeetingMapper.insert(onlineMeeting));
    }
    /**
     *新增文件共享
     *
     */
    @PostMapping("/addFileSharing")
    public AjaxResult addFileSharing(@RequestBody FileSharing fileSharing){
        return AjaxResult.success(fileSharingMapper.insert(fileSharing));
    }
}
src/main/java/com/ruoyi/approve/controller/RpaProcessAutomationController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,74 @@
package com.ruoyi.approve.controller;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.approve.pojo.ApproveProcess;
import com.ruoyi.approve.pojo.RpaProcessAutomation;
import com.ruoyi.approve.service.RpaProcessAutomationService;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.framework.security.LoginUser;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.project.system.domain.SysDept;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
@RestController
@RequestMapping("/rpaProcessAutomation")
@AllArgsConstructor
@Api(tags = "RPA流程自动化")
public class RpaProcessAutomationController {
    @Autowired
    private RpaProcessAutomationService rpaProcessAutomationService;
    /**、
     * èŽ·å–åˆ—è¡¨
     * @return
     */
    @GetMapping("/getList")
    public AjaxResult getList(@RequestParam(defaultValue = "1") long current,
                              @RequestParam(defaultValue = "100") long size, RpaProcessAutomation rpaProcessAutomation) {
        Page page = new Page(current, size);
        return AjaxResult.success(rpaProcessAutomationService.listpage(page,rpaProcessAutomation));
    }
    /**、
     * å¢žæ·»
     * @return
     */
    @PostMapping("/add")
    public AjaxResult add(@RequestBody RpaProcessAutomation rpaProcessAutomation){
        return AjaxResult.success(rpaProcessAutomationService.save(rpaProcessAutomation));
    }
    /**
     * æ›´æ–°
     * @return
     */
    @PostMapping("/update")
    public AjaxResult update(@RequestBody RpaProcessAutomation rpaProcessAutomation){
        return AjaxResult.success(rpaProcessAutomationService.updateById(rpaProcessAutomation));
    }
    /**
     * åˆ é™¤
     * @return
     */
    @DeleteMapping("/delete")
    public AjaxResult delete(@RequestBody List<Long> ids){
        if(CollectionUtils.isEmpty(ids)) return AjaxResult.error("请传入要删除的ID");
        return AjaxResult.success(rpaProcessAutomationService.removeByIds(ids));
    }
    @ApiOperation(value = "RPA流程自动化导出")
    @PostMapping("/export")
    public void export(HttpServletResponse response) {
        List<RpaProcessAutomation> accountExpenses = rpaProcessAutomationService.list();
        ExcelUtil<RpaProcessAutomation> util = new ExcelUtil<RpaProcessAutomation>(RpaProcessAutomation.class);
        util.exportExcel(response, accountExpenses, "RPA流程自动化导出");
    }
}
src/main/java/com/ruoyi/approve/mapper/AnnualLeaveSettingMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,13 @@
package com.ruoyi.approve.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.approve.pojo.AnnualLeaveSetting;
import io.lettuce.core.dynamic.annotation.Param;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface AnnualLeaveSettingMapper extends BaseMapper<AnnualLeaveSetting> {
    IPage<AnnualLeaveSetting> listPage(Page page,@Param("annualLeaveSetting") AnnualLeaveSetting annualLeaveSetting);
}
src/main/java/com/ruoyi/approve/mapper/FileSharingMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,9 @@
package com.ruoyi.approve.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.approve.pojo.FileSharing;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface FileSharingMapper extends BaseMapper<FileSharing> {
}
src/main/java/com/ruoyi/approve/mapper/HolidaySettingsMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,13 @@
package com.ruoyi.approve.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.approve.pojo.HolidaySettings;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@Mapper
public interface HolidaySettingsMapper extends BaseMapper<HolidaySettings> {
    IPage<HolidaySettings> listpage(Page page,@Param("holidaySettings") HolidaySettings holidaySettings);
}
src/main/java/com/ruoyi/approve/mapper/KnowledgeBaseMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,13 @@
package com.ruoyi.approve.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.approve.pojo.KnowledgeBase;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface KnowledgeBaseMapper extends BaseMapper<KnowledgeBase> {
    IPage<KnowledgeBase> listpage(Page page, KnowledgeBase knowledgeBase);
}
src/main/java/com/ruoyi/approve/mapper/NotificationManagementMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,13 @@
package com.ruoyi.approve.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.approve.pojo.NotificationManagement;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@Mapper
public interface NotificationManagementMapper extends BaseMapper<NotificationManagement> {
    IPage<NotificationManagement> listpage(Page<NotificationManagement> page,@Param("notificationManagement") NotificationManagement notificationManagement);
}
src/main/java/com/ruoyi/approve/mapper/OnlineMeetingMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,9 @@
package com.ruoyi.approve.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.approve.pojo.OnlineMeeting;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface OnlineMeetingMapper extends BaseMapper<OnlineMeeting> {
}
src/main/java/com/ruoyi/approve/mapper/OvertimeSettingMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,13 @@
package com.ruoyi.approve.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.approve.pojo.OvertimeSetting;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.data.repository.query.Param;
@Mapper
public interface OvertimeSettingMapper extends BaseMapper<OvertimeSetting> {
    IPage<OvertimeSetting> listPage(Page<OvertimeSetting> page,@Param("overtimeSetting") OvertimeSetting overtimeSetting);
}
src/main/java/com/ruoyi/approve/mapper/RpaProcessAutomationMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,16 @@
package com.ruoyi.approve.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.approve.pojo.RpaProcessAutomation;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@Mapper
public interface RpaProcessAutomationMapper extends BaseMapper<RpaProcessAutomation> {
    IPage<RpaProcessAutomation> listpage(Page page,@Param("rpaProcessAutomation")RpaProcessAutomation rpaProcessAutomation);
}
src/main/java/com/ruoyi/approve/mapper/WorkingHoursSettingMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,13 @@
package com.ruoyi.approve.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.approve.pojo.WorkingHoursSetting;
import io.lettuce.core.dynamic.annotation.Param;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface WorkingHoursSettingMapper extends BaseMapper<WorkingHoursSetting> {
    IPage<WorkingHoursSetting> listPage(Page page,@Param("workingHoursSetting") WorkingHoursSetting workingHoursSetting);
}
src/main/java/com/ruoyi/approve/pojo/AnnualLeaveSetting.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,70 @@
package com.ruoyi.approve.pojo;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.time.LocalDate;
import java.time.LocalDateTime;
@Data
@TableName("annual_leave_setting")
public class AnnualLeaveSetting implements Serializable {
    @TableId(type = IdType.AUTO)
    private Long id;
    /**
     * å‘˜å·¥ç±»åž‹
     */
    private String employeeType;
    /**
     * å·¥ä½œå¹´é™
     */
    private String workYears;
    /**
     * å¹´å‡å¤©æ•°
     */
    private Integer annualDays;
    /**
     * æœ€å¤§å¯ç»“转天数
     */
    private Integer maxCarryOver;
    /**
     * çŠ¶æ€
     */
    private String status;
    /**
     * åˆ›å»ºæ—¶é—´
     */
    @TableField(fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    /**
     * æ›´æ–°æ—¶é—´
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;
    /**
     * åˆ›å»ºäºº
     */
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    /**
     * æ›´æ–°äºº
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    /**
     * ç§Ÿæˆ·ID
     */
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
}
src/main/java/com/ruoyi/approve/pojo/ApproveProcess.java
@@ -3,9 +3,12 @@
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.List;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
import com.ruoyi.sales.pojo.CommonFile;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@@ -24,10 +27,14 @@
    @TableId(type = IdType.AUTO)
    private Long id;
    @TableField(exist = false)
    private List<CommonFile> commonFileList;
    /**
     * æµç¨‹ç¼–号
     */
    @ApiModelProperty(value = "流程编号")
    @Excel(name = "流程编号")
    private String approveId;
    /**
@@ -38,6 +45,8 @@
    /**
     * ç”³è¯·äººåç§°
     */
    @ApiModelProperty(value = "申请人名称")
    @Excel(name = "申请人")
    private String approveUserName;
    /**
@@ -49,6 +58,7 @@
     * ç”³è¯·éƒ¨é—¨åç§°
     */
    @ApiModelProperty(value = "申请部门名称")
    @Excel(name = "申请部门")
    private String approveDeptName;
    /**
@@ -65,6 +75,7 @@
     * ç”³è¯·åŽŸå› 
     */
    @ApiModelProperty(value = "申请原因")
    @Excel(name = "审批事由")
    private String approveReason;
    /**
@@ -75,6 +86,8 @@
    /**
     * å½“前审批用户名称
     */
    @ApiModelProperty(value = "当前审批人")
    @Excel(name = "当前审批人")
    private String approveUserCurrentName;
    /**
@@ -82,18 +95,22 @@
     */
    @JsonFormat(pattern = "yyyy-MM-dd")
    @ApiModelProperty(value = "申请日期")
    @Excel(name = "申请日期" ,dateFormat = "yyyy-MM-dd")
    private Date approveTime;
    /**
     * å®¡æ‰¹å®Œæˆæ—¶é—´
     */
    @JsonFormat(pattern = "yyyy-MM-dd")
    @ApiModelProperty(value = "审批完成时间")
    @Excel(name = "结束日期" ,dateFormat = "yyyy-MM-dd")
    private Date approveOverTime;
    /**
     * å®¡æ‰¹çŠ¶æ€ï¼š0待审核,1审核中,2审核完成 3审核未通过 4已重新提交
     */
    @ApiModelProperty(value = "审批状态:0待审核,1审核中,2审核完成 3审核未通过 4已重新提交")
    @Excel(name = "审批状态", readConverterExp = "0=待审核,1=审核中,2=审核完成,3=审核未通过,4=已重新提交")
    private Integer approveStatus;
    /**
src/main/java/com/ruoyi/approve/pojo/FileSharing.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,69 @@
package com.ruoyi.approve.pojo;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.approve.utils.ListToStringTypeHandler;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.List;
@Data
@TableName("file_sharing")
public class FileSharing implements Serializable {
    @TableId(type = IdType.AUTO)
    private Long id;
    /**
     * å…±äº«æ ‡é¢˜
     */
    private String title;
    /**
     * ä¸Šä¼ æ–‡ä»¶
     */
//    private String files;
    @TableField(value = "files",typeHandler = ListToStringTypeHandler.class)
    private List<String> files;
    /**
     * æŽ¥æ”¶éƒ¨é—¨
     */
    @TableField(value = "departments",typeHandler = ListToStringTypeHandler.class)
    private List<String> departments;
    /**
     * å…±äº«æè¿°
     */
    private String description;
    /**
     * åˆ›å»ºæ—¶é—´
     */
    @TableField(fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    /**
     * æ›´æ–°æ—¶é—´
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;
    /**
     * åˆ›å»ºäºº
     */
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    /**
     * æ›´æ–°äºº
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    /**
     * ç§Ÿæˆ·ID
     */
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
}
src/main/java/com/ruoyi/approve/pojo/HolidaySettings.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,80 @@
package com.ruoyi.approve.pojo;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.approve.utils.ListToStringTypeHandler;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;
@Data
@TableName("holiday_settings")
public class HolidaySettings implements Serializable {
    @TableId(type = IdType.AUTO)
    private Long id;
    /**
     * å‡æœŸåç§°
     */
    private String name;
    /**
     * å‡æœŸç±»åž‹
     */
    private String type;
    /**
     * å¼€å§‹æ—¥æœŸ
     */
    @JsonFormat(pattern = "yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private LocalDate startDate;
    /**
     * ç»“束日期
     */
    @JsonFormat(pattern = "yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private LocalDate endDate;
    /**
     * å¤©æ•°
     */
    private Integer days;
    /**
     * çŠ¶æ€
     */
    private String status;
    /**
     * åˆ›å»ºæ—¶é—´
     */
    @TableField(fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    /**
     * æ›´æ–°æ—¶é—´
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;
    /**
     * åˆ›å»ºäºº
     */
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    /**
     * æ›´æ–°äºº
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    /**
     * ç§Ÿæˆ·ID
     */
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
}
src/main/java/com/ruoyi/approve/pojo/KnowledgeBase.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,86 @@
package com.ruoyi.approve.pojo;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.time.LocalDateTime;
@Data
@TableName("knowledge_base")
public class KnowledgeBase implements Serializable {
    @TableId(type = IdType.AUTO)
    private Long id;
    /**
     * çŸ¥è¯†æ ‡é¢˜
     */
    @Excel(name = "知识标题")
    private String title;
    /**
     * çŸ¥è¯†ç±»åž‹
     */
    @Excel(name = "知识类型",readConverterExp = "contract=合同特批,approval=审批案例,solution=解决方案,experience=经验总结,guide=操作指南")
    private String type;
    /**
     * é€‚用场景
     */
    @Excel(name = "适用场景")
    private String scenario;
    /**
     * è§£å†³æ•ˆçއ
     */
    @Excel(name = "解决效率",readConverterExp = "low=轻微提升,medium=一般提升,high=显著提升")
    private String efficiency;
    /**
     * é—®é¢˜æè¿°
     */
    private String problem;
    /**
     * è§£å†³æ–¹æ¡ˆ
     */
    private String solution;
    /**
     * å…³é”®è¦ç‚¹
     */
    private String keyPoints;
    /**
     * åˆ›å»ºäºº
     */
    @Excel(name = "创建人")
    private String creator;
    /**
     * ä½¿ç”¨æ¬¡æ•°
     */
    @Excel(name = "使用次数")
    private Integer usageCount;
    /**
     * åˆ›å»ºæ—¶é—´
     */
    @TableField(fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @Excel(name = "创建时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    /**
     * æ›´æ–°æ—¶é—´
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;
    /**
     * æ›´æ–°äºº
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    /**
     * ç§Ÿæˆ·ID
     */
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
}
src/main/java/com/ruoyi/approve/pojo/NotificationManagement.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,88 @@
package com.ruoyi.approve.pojo;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.approve.utils.ListToStringTypeHandler;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;
@Data
@TableName("notification_management")
public class NotificationManagement implements Serializable {
    @TableId(type = IdType.AUTO)
    private Long id;
    /**
     * é€šçŸ¥æ ‡é¢˜
     */
    private String title;
    /**
     * é€šçŸ¥ç±»åž‹
     */
    private String type;
    /**
     * ä¼˜å…ˆçº§
     */
    private String priority;
    /**
     * é€šçŸ¥çŠ¶æ€
     */
    private String status;
    /**
     * æœ‰æ•ˆæœŸæ—¶é—´
     */
    @JsonFormat(pattern = "yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private LocalDate expireDate;
    /**
     * æŽ¥æ”¶éƒ¨é—¨
     */
    @TableField(value = "departments",typeHandler = ListToStringTypeHandler.class)
    private List<String> departments;
    /**
     * åŒæ­¥æ–¹å¼
     */
    @TableField(value = "sync_methods",typeHandler = ListToStringTypeHandler.class)
    private List<String> syncMethods;
    /**
     * é€šçŸ¥å†…容
     */
    private String content;
    /**
     * åˆ›å»ºæ—¶é—´
     */
    @TableField(fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    /**
     * æ›´æ–°æ—¶é—´
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;
    /**
     * åˆ›å»ºäºº
     */
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    /**
     * æ›´æ–°äºº
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    /**
     * ç§Ÿæˆ·ID
     */
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
}
src/main/java/com/ruoyi/approve/pojo/OnlineMeeting.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,80 @@
package com.ruoyi.approve.pojo;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.approve.utils.ListToStringTypeHandler;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;
@Data
@TableName("online_meeting")
public class OnlineMeeting implements Serializable {
    @TableId(type = IdType.AUTO)
    private Long id;
    /**
     * ä¼šè®®æ ‡é¢˜
     */
    private String title;
    /**
     * å¼€å§‹æ—¶é—´
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime startTime;
    /**
     * ä¼šè®®æ—¶é•¿
     */
    private Integer duration;
    /**
     * ä¼šè®®å¹³å°
     */
    private String platform;
    /**
     * ä¼šè®®æè¿°
     */
    private String description;
    /**
     * å‚会人员
     */
    @TableField(value = "participants",typeHandler = ListToStringTypeHandler.class)
    private List<String> participants;
    /**
     * åˆ›å»ºæ—¶é—´
     */
    @TableField(fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    /**
     * æ›´æ–°æ—¶é—´
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;
    /**
     * åˆ›å»ºäºº
     */
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    /**
     * æ›´æ–°äºº
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    /**
     * ç§Ÿæˆ·ID
     */
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
}
src/main/java/com/ruoyi/approve/pojo/OvertimeSetting.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,79 @@
package com.ruoyi.approve.pojo;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
@Data
@TableName("overtime_setting")
public class OvertimeSetting implements Serializable {
    @TableId(type = IdType.AUTO)
    private Long id;
    /**
     * åŠ ç­è§„åˆ™åç§°
     */
    private String name;
    /**
     * åŠ ç­ç±»åž‹
     */
    private String type;
    /**
     * å¼€å§‹æ—¶é—´
     */
    @JsonFormat(pattern = "HH:mm")
    @DateTimeFormat(pattern = "HH:mm")
    private LocalTime startTime;
    /**
     * ç»“束时间
     */
    @JsonFormat(pattern = "HH:mm")
    @DateTimeFormat(pattern = "HH:mm")
    private LocalTime endTime;
    /**
     * å€çއ
     */
    private Double rate;
    /**
     * çŠ¶æ€
     */
    private String status;
    /**
     * åˆ›å»ºæ—¶é—´
     */
    @TableField(fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    /**
     * æ›´æ–°æ—¶é—´
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;
    /**
     * åˆ›å»ºäºº
     */
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    /**
     * æ›´æ–°äºº
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    /**
     * ç§Ÿæˆ·ID
     */
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
}
src/main/java/com/ruoyi/approve/pojo/RpaProcessAutomation.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,65 @@
package com.ruoyi.approve.pojo;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.time.LocalDateTime;
@Data
@TableName("rpa_process_automation")
public class RpaProcessAutomation implements Serializable {
    @TableId(type = IdType.AUTO)
    private Long id;
    /**
     * ç¨‹åºå
     */
    @Excel(name = "程序名")
    private String programName;
    /**
     * ç¨‹åºæè¿°
     */
    @Excel(name = "程序描述")
    private String description;
    /**
     * çŠ¶æ€
     */
    @Excel(name = "状态")
    private String status;
    /**
     * åˆ›å»ºæ—¶é—´
     */
    @TableField(fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    /**
     * æ›´æ–°æ—¶é—´
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;
    /**
     * åˆ›å»ºäºº
     */
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    /**
     * æ›´æ–°äºº
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    /**
     * ç§Ÿæˆ·ID
     */
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
}
src/main/java/com/ruoyi/approve/pojo/WorkingHoursSetting.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,79 @@
package com.ruoyi.approve.pojo;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.time.LocalTime;
@Data
@TableName("working_hours_setting")
public class WorkingHoursSetting implements Serializable {
    @TableId(type = IdType.AUTO)
    private Long id;
    /**
     * æ—¶é—´æ®µåç§°
     */
    private String name;
    /**
     * ä¸Šç­æ—¶é—´
     */
    @JsonFormat(pattern = "HH:mm")
    @DateTimeFormat(pattern = "HH:mm")
    private LocalTime startTime;
    /**
     * ä¸‹ç­æ—¶é—´
     */
    @JsonFormat(pattern = "HH:mm")
    @DateTimeFormat(pattern = "HH:mm")
    private LocalTime endTime;
    /**
     * å¼¹æ€§ä¸Šç­
     */
    private String flexibleStart;
    /**
     * å¼¹æ€§æ—¶é—´(分钟)
     */
    private Integer flexibleMinutes;
    /**
     * çŠ¶æ€
     */
    private String status;
    /**
     * åˆ›å»ºæ—¶é—´
     */
    @TableField(fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    /**
     * æ›´æ–°æ—¶é—´
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;
    /**
     * åˆ›å»ºäºº
     */
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    /**
     * æ›´æ–°äºº
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    /**
     * ç§Ÿæˆ·ID
     */
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
}
src/main/java/com/ruoyi/approve/service/HolidaySettingsService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,10 @@
package com.ruoyi.approve.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.approve.pojo.HolidaySettings;
public interface HolidaySettingsService extends IService<HolidaySettings> {
    IPage listpage(Page page, HolidaySettings holidaySettings);
}
src/main/java/com/ruoyi/approve/service/IApproveProcessService.java
@@ -9,6 +9,7 @@
import com.ruoyi.approve.vo.ApproveProcessVO;
import com.ruoyi.project.system.domain.SysDept;
import java.io.IOException;
import java.text.ParseException;
import java.util.List;
@@ -17,7 +18,7 @@
     * æ·»åŠ å®¡æ‰¹æµç¨‹
     * @param approveProcessVO å®¡æ‰¹æµç¨‹VO对象
     */
    void addApprove(ApproveProcessVO approveProcessVO) throws ParseException;
    void addApprove(ApproveProcessVO approveProcessVO) throws  Exception;
    /**
     * æ ¹æ®éƒ¨é—¨id查询部门信息
     * @param deptIds éƒ¨é—¨ID数组
@@ -28,7 +29,7 @@
    void delApprove(Long[] ids);
    void updateByApproveId(ApproveGetAndUpdateVo approveGetAndUpdateVo);
    void updateByApproveId(ApproveGetAndUpdateVo approveGetAndUpdateVo) throws IOException;
    ApproveProcess getApproveById(String id);
src/main/java/com/ruoyi/approve/service/KnowledgeBaseService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,10 @@
package com.ruoyi.approve.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.approve.pojo.KnowledgeBase;
public interface KnowledgeBaseService extends IService<KnowledgeBase> {
    IPage<KnowledgeBase> listpage(Page page, KnowledgeBase knowledgeBase);
}
src/main/java/com/ruoyi/approve/service/NotificationManagementService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,10 @@
package com.ruoyi.approve.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.approve.pojo.NotificationManagement;
public interface NotificationManagementService extends IService<NotificationManagement> {
    IPage listpage(Page page, NotificationManagement notificationManagement);
}
src/main/java/com/ruoyi/approve/service/RpaProcessAutomationService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,10 @@
package com.ruoyi.approve.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.approve.pojo.RpaProcessAutomation;
public interface RpaProcessAutomationService extends IService<RpaProcessAutomation> {
    IPage<RpaProcessAutomation> listpage(Page page, RpaProcessAutomation rpaProcessAutomation);
}
src/main/java/com/ruoyi/approve/service/impl/ApproveNodeServiceImpl.java
@@ -132,7 +132,7 @@
        ApproveNode approveNode1 = approveNodeMapper.selectOne(approveNodeLambdaQueryWrapper);
        approveProcess.setApproveStatus(status);
        if(approveNode1 != null){
            approveProcess.setApproveUserCurrentId(approveNode.getApproveNodeUserId());
            approveProcess.setApproveUserCurrentId(approveNode1.getApproveNodeUserId());
            approveProcess.setApproveUserCurrentName(approveNode1.getApproveNodeUser());
        }
        approveProcessMapper.updateById(approveProcess);
src/main/java/com/ruoyi/approve/service/impl/ApproveProcessServiceImpl.java
@@ -14,11 +14,15 @@
import com.ruoyi.approve.utils.DailyRedisCounter;
import com.ruoyi.approve.vo.ApproveGetAndUpdateVo;
import com.ruoyi.approve.vo.ApproveProcessVO;
import com.ruoyi.common.enums.FileNameType;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.other.service.impl.TempFileServiceImpl;
import com.ruoyi.project.system.domain.SysDept;
import com.ruoyi.project.system.domain.SysUser;
import com.ruoyi.project.system.mapper.SysDeptMapper;
import com.ruoyi.project.system.mapper.SysUserMapper;
import com.ruoyi.sales.mapper.CommonFileMapper;
import com.ruoyi.sales.pojo.CommonFile;
import lombok.AllArgsConstructor;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
@@ -28,6 +32,7 @@
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
@@ -52,9 +57,11 @@
    private final IApproveNodeService approveNodeService;
    private final SysUserMapper sysUserMapper;
    private final ApproveProcessMapper approveProcessMapper;
    private final TempFileServiceImpl tempFileService;
    private final CommonFileMapper commonFileMapper;
    @Override
    public void addApprove(ApproveProcessVO approveProcessVO) throws ParseException {
    public void addApprove(ApproveProcessVO approveProcessVO) throws  Exception {
        SysUser sysUser = sysUserMapper.selectUserById(approveProcessVO.getApproveUser());
        SysDept sysDept = sysDeptMapper.selectDeptById(approveProcessVO.getApproveDeptId());
        String[] split = approveProcessVO.getApproveUserIds().split(",");
@@ -83,6 +90,7 @@
        approveProcess.setApproveOverTime(null);
        approveProcess.setApproveStatus(0);
        approveProcess.setApproveDelete(0);
        approveProcess.setApproveType(approveProcessVO.getApproveType());
        approveProcess.setCreateTime(LocalDateTime.now());
        approveProcess.setTenantId(approveProcessVO.getApproveDeptId());
        approveProcess.setApproveUserIds(approveProcessVO.getApproveUserIds());
@@ -102,6 +110,8 @@
        save(approveProcess);
        //初始化审批节点
        approveNodeService.initApproveNodes(approveProcessVO.getApproveUserIds(),approveID,approveProcessVO.getApproveDeptId());
        // é™„件绑定
        tempFileService.migrateTempFilesToFormal(approveProcess.getId(), approveProcessVO.getTempFileIds(), FileNameType.ApproveProcess.getValue());
    }
    @Override
@@ -117,6 +127,13 @@
    @Override
    public IPage<ApproveProcess> listAll(Page page,ApproveProcess approveProcess) {
        IPage<ApproveProcess> approveProcessIPage = approveProcessMapper.listPage(page,approveProcess);
        List<ApproveProcess> records = approveProcessIPage.getRecords();
        for (ApproveProcess record : records) {
            List<CommonFile> commonFiles = commonFileMapper.selectList(new LambdaQueryWrapper<CommonFile>()
                    .eq(CommonFile::getCommonId, record.getId())
                    .eq(CommonFile::getType, FileNameType.ApproveProcess.getValue()));
            record.setCommonFileList(commonFiles);
        }
        return approveProcessIPage;
    }
@@ -142,6 +159,9 @@
        queryWrapper.eq(ApproveProcess::getTenantId, SecurityUtils.getLoginUser().getTenantId());
        queryWrapper.last("limit 1");
        ApproveProcess one = getOne(queryWrapper);
        one.setCommonFileList(commonFileMapper.selectList(new LambdaQueryWrapper<CommonFile>()
                .eq(CommonFile::getCommonId, one.getId())
                .eq(CommonFile::getType, FileNameType.ApproveProcess.getValue())));
        return one;
    }
@@ -149,7 +169,7 @@
    @Override
    public void updateByApproveId(ApproveGetAndUpdateVo approveGetAndUpdateVo) {
    public void updateByApproveId(ApproveGetAndUpdateVo approveGetAndUpdateVo) throws IOException {
        ApproveProcess approve = approveProcessMapper.selectById(approveGetAndUpdateVo.getId());
        approve.setApproveUserIds(approveGetAndUpdateVo.getApproveUserIds());
        approve.setApproveReason(approveGetAndUpdateVo.getApproveReason());
@@ -170,24 +190,32 @@
        }
        updateById(approve);
        //修改审批人
        // å…ˆåˆ é™¤ åŽæ–°å¢ž
        LambdaQueryWrapper<ApproveNode> approveNodeLambdaQueryWrapper = new LambdaQueryWrapper<>();
        approveNodeLambdaQueryWrapper.eq(ApproveNode::getApproveProcessId, approve.getApproveId())
                .eq(ApproveNode::getDeleteFlag, 0)
                .eq(ApproveNode::getTenantId, SecurityUtils.getLoginUser().getTenantId())
                .orderByAsc(ApproveNode::getApproveNodeOrder);
        List<ApproveNode> list = approveNodeMapper.selectList(approveNodeLambdaQueryWrapper);
        int i = 0;
        for (ApproveNode approveNode : list) {
            int finalI = i;
            List<SysUser> collect = sysUsers.stream().filter(user -> user.getUserId().equals(Long.parseLong(split[finalI]))).collect(Collectors.toList());
            if(CollectionUtils.isEmpty(collect)){
                throw new RuntimeException("请选择正确的审批人");
            }
            approveNode.setApproveNodeUserId(collect.get(0).getUserId());
            approveNode.setApproveNodeUser(collect.get(0).getNickName());
            approveNodeMapper.updateById(approveNode);
            i++;
        }
        approveNodeMapper.delete(approveNodeLambdaQueryWrapper);
        approveNodeService.initApproveNodes(approveGetAndUpdateVo.getApproveUserIds(),approve.getApproveId(),approve.getTenantId());
//        int i = 0;
//        for (ApproveNode approveNode : list) {
//            int finalI = i;
//            if(i >= split.length){
//                approveNode.setDeleteFlag(1);
//            }else{
//                List<SysUser> collect = sysUsers.stream().filter(user -> user.getUserId().equals(Long.parseLong(split[finalI]))).collect(Collectors.toList());
//                if(CollectionUtils.isEmpty(collect)){
//                    throw new RuntimeException("请选择正确的审批人");
//                }
//                approveNode.setApproveNodeUserId(collect.get(0).getUserId());
//                approveNode.setApproveNodeUser(collect.get(0).getNickName());
//            }
//            approveNodeMapper.updateById(approveNode);
//            i++;
//        }
        tempFileService.migrateTempFilesToFormal(approve.getId(), approveGetAndUpdateVo.getTempFileIds(), FileNameType.ApproveProcess.getValue());
    }
src/main/java/com/ruoyi/approve/service/impl/HolidaySettingsServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,21 @@
package com.ruoyi.approve.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.approve.mapper.HolidaySettingsMapper;
import com.ruoyi.approve.pojo.HolidaySettings;
import com.ruoyi.approve.service.HolidaySettingsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class HolidaySettingsServiceImpl extends ServiceImpl<HolidaySettingsMapper, HolidaySettings> implements HolidaySettingsService {
    @Autowired
    private HolidaySettingsMapper holidaySettingsMapper;
    @Override
    public IPage<HolidaySettings> listpage(Page page, HolidaySettings holidaySettings) {
        return holidaySettingsMapper.listpage(page,holidaySettings);
    }
}
src/main/java/com/ruoyi/approve/service/impl/KnowledgeBaseServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,21 @@
package com.ruoyi.approve.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.approve.mapper.KnowledgeBaseMapper;
import com.ruoyi.approve.pojo.KnowledgeBase;
import com.ruoyi.approve.service.KnowledgeBaseService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class KnowledgeBaseServiceImpl extends ServiceImpl<KnowledgeBaseMapper, KnowledgeBase> implements KnowledgeBaseService {
    @Autowired
    private KnowledgeBaseMapper knowledgeBaseMapper;
    @Override
    public IPage<KnowledgeBase> listpage(Page page, KnowledgeBase knowledgeBase) {
        return knowledgeBaseMapper.listpage(page,knowledgeBase);
    }
}
src/main/java/com/ruoyi/approve/service/impl/NotificationManagementServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,24 @@
package com.ruoyi.approve.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.approve.mapper.NotificationManagementMapper;
import com.ruoyi.approve.pojo.NotificationManagement;
import com.ruoyi.approve.service.NotificationManagementService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class NotificationManagementServiceImpl extends ServiceImpl<NotificationManagementMapper, NotificationManagement> implements NotificationManagementService {
    @Autowired
    private NotificationManagementMapper notificationManagementMapper;
    @Override
    public IPage<NotificationManagement> listpage(Page page, NotificationManagement notificationManagement) {
//        // 1. åˆ›å»º Page å®žä¾‹ï¼ˆIPage å®žçŽ°ç±»ï¼‰ï¼ŒæŒ‡å®šé¡µç å’Œæ¯é¡µæ¡æ•°
//        IPage<NotificationManagement> page1 = new Page<>(page.getCurrent(), page.getSize());
        return notificationManagementMapper.listpage(page,notificationManagement);
    }
}
src/main/java/com/ruoyi/approve/service/impl/RpaProcessAutomationServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,21 @@
package com.ruoyi.approve.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
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.approve.mapper.RpaProcessAutomationMapper;
import com.ruoyi.approve.pojo.RpaProcessAutomation;
import com.ruoyi.approve.service.RpaProcessAutomationService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class RpaProcessAutomationServiceImpl extends ServiceImpl<RpaProcessAutomationMapper, RpaProcessAutomation> implements RpaProcessAutomationService {
    @Autowired
    private RpaProcessAutomationMapper rpaProcessAutomationMapper;
    @Override
    public IPage<RpaProcessAutomation> listpage(Page page, RpaProcessAutomation rpaProcessAutomation) {
        return rpaProcessAutomationMapper.listpage(page,rpaProcessAutomation);
    }
}
src/main/java/com/ruoyi/approve/utils/ListToStringTypeHandler.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,52 @@
package com.ruoyi.approve.utils;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedJdbcTypes;
import org.apache.ibatis.type.MappedTypes;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
@MappedTypes(List.class)
@MappedJdbcTypes(JdbcType.VARCHAR)
public class ListToStringTypeHandler extends BaseTypeHandler<List<String>> {
    private static final String SEPARATOR = ",";
    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, List<String> parameter, JdbcType jdbcType) throws SQLException {
        // å­˜å‚¨æ—¶ï¼šList è½¬é€—号分隔字符串
        if (parameter == null) {
            ps.setString(i, null);
        } else {
            ps.setString(i, String.join(SEPARATOR, parameter));
        }
//        String value = parameter.stream().collect(Collectors.joining(","));
//        ps.setString(i, value);
    }
    @Override
    public List<String> getNullableResult(ResultSet rs, String columnName) throws SQLException {
        // æŸ¥è¯¢æ—¶ï¼šå­—符串转 List
        String value = rs.getString(columnName);
        return value != null && !value.isEmpty() ? Arrays.asList(value.split(SEPARATOR)) : new ArrayList<>();
    }
    @Override
    public List<String> getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        String value = rs.getString(columnIndex);
        return value != null && !value.isEmpty() ? Arrays.asList(value.split(SEPARATOR)) : new ArrayList<>();
    }
    @Override
    public List<String> getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        String value = cs.getString(columnIndex);
        return value != null && !value.isEmpty() ? Arrays.asList(value.split(SEPARATOR)) : new ArrayList<>();
    }
}
src/main/java/com/ruoyi/approve/utils/StartAndEndDateDto.java
@@ -1,5 +1,6 @@
package com.ruoyi.approve.utils;
import com.baomidou.mybatisplus.annotation.TableField;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@@ -13,9 +14,24 @@
public class StartAndEndDateDto {
    @ApiModelProperty("开始时间")
    @TableField(exist = false)
    private String startDate;
    @ApiModelProperty("结束时间")
    @TableField(exist = false)
    private String endDate;
    @ApiModelProperty("开始月份")
    @TableField(exist = false)
    private Integer startMonth;
    @ApiModelProperty("结束月份")
    @TableField(exist = false)
    private Integer endMonth;
    @ApiModelProperty("年份")
    @TableField(exist = false)
    private Integer year;
}
src/main/java/com/ruoyi/approve/vo/ApproveGetAndUpdateVo.java
@@ -1,11 +1,15 @@
package com.ruoyi.approve.vo;
import com.ruoyi.sales.pojo.CommonFile;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import java.util.List;
@Data
public class ApproveGetAndUpdateVo {
    private List<String> tempFileIds;
    //审批id
    @NotBlank(message = "流程编号不能为空")
    private String id;
@@ -20,4 +24,8 @@
    private String approveTime;
    private Integer approveStatus;
    /**
     * å®¡æ‰¹ç±»åž‹
     */
    private Integer approveType;
}
src/main/java/com/ruoyi/approve/vo/ApproveProcessVO.java
@@ -1,11 +1,15 @@
package com.ruoyi.approve.vo;
import com.ruoyi.sales.pojo.CommonFile;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import java.util.List;
@Data
public class ApproveProcessVO {
    private List<String> tempFileIds;
    private Long id;
@@ -21,4 +25,9 @@
    private String approveUserIds;
    private String approveReason;
    /**
     * å®¡æ‰¹ç±»åž‹
     */
    private Integer approveType;
}
src/main/java/com/ruoyi/basic/controller/CustomerController.java
@@ -53,6 +53,13 @@
        util.exportExcel(response, list, "客户档案数据");
    }
    @PostMapping("/downloadTemplate")
    @Log(title = "客户档案-下载模板", businessType = BusinessType.EXPORT)
    public void downloadTemplate(HttpServletResponse response) {
        ExcelUtil<Customer> util = new ExcelUtil<Customer>(Customer.class);
        util.importTemplateExcel(response, "客户档案模板");
    }
    /**
     * å¯¼å…¥å®¢æˆ·æ¡£æ¡ˆ
src/main/java/com/ruoyi/basic/controller/SupplierManageController.java
@@ -2,8 +2,10 @@
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.basic.dto.SupplierManageDto;
import com.ruoyi.basic.pojo.Customer;
import com.ruoyi.basic.pojo.SupplierManage;
import com.ruoyi.basic.service.ISupplierService;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.domain.AjaxResult;
@@ -89,6 +91,13 @@
        supplierService.supplierExport(response, supplierManageDto);
    }
    @PostMapping("/downloadTemplate")
    @Log(title = "供应商-下载模板", businessType = BusinessType.EXPORT)
    public void downloadTemplate(HttpServletResponse response) {
        ExcelUtil<SupplierManage> util = new ExcelUtil<SupplierManage>(SupplierManage.class);
        util.importTemplateExcel(response, "供应商档案模板");
    }
    /**
     * ä¾›åº”商导入
     */
src/main/java/com/ruoyi/basic/dto/StorageBlobDTO.java
@@ -6,4 +6,6 @@
@Data
public class StorageBlobDTO extends StorageBlob {
    private String url;
    private String downloadUrl;
}
src/main/java/com/ruoyi/basic/mapper/StorageAttachmentMapper.java
@@ -2,7 +2,6 @@
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.basic.pojo.StorageAttachment;
import org.apache.ibatis.annotations.Mapper;
/**
 * <p>
@@ -12,7 +11,6 @@
 * @author ruoyi
 * @since 2025-05-29
 */
@Mapper
public interface StorageAttachmentMapper extends BaseMapper<StorageAttachment> {
}
src/main/java/com/ruoyi/basic/pojo/StorageAttachment.java
@@ -36,6 +36,9 @@
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Date updateTime;
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
    /**
     * é€»è¾‘删除
     */
@@ -62,6 +65,7 @@
    @TableField(value = "storage_blob_id")
    private Long storageBlobId;
    @TableField(exist = false)
    private StorageBlobDTO storageBlobDTO;
    public StorageAttachment(String fileType, Long recordType, Long recordId) {
src/main/java/com/ruoyi/basic/pojo/StorageBlob.java
@@ -1,13 +1,13 @@
package com.ruoyi.basic.pojo;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Date;
/**
@@ -28,16 +28,11 @@
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    /** åˆ›å»ºæ—¶é—´ */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
//    @TableField(fill = FieldFill.INSERT)
    private Date createTime;
    /**
     * èµ„源id
     */
    @TableField(value = "key")
    private String key;
    @TableField(value = "resource_key")
    private String resourceKey;
    /**
     * èµ„源类型,例如JPG图片的资源类型为image/jpg
     */
@@ -64,4 +59,34 @@
     */
    @TableField(value = "byte_size")
    private Long byteSize;
    /**
     * 0生产前 1生产后 2生产问题
     */
    @TableField(value = "type")
    private Long type;
    /**
     * ç§Ÿæˆ·ID
     */
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
    @ApiModelProperty(value = "创建该记录的用户")
    @TableField(fill = com.baomidou.mybatisplus.annotation.FieldFill.INSERT)
    private Integer createUser;
    @ApiModelProperty(value = "记录创建时间")
    @TableField(fill = com.baomidou.mybatisplus.annotation.FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    @ApiModelProperty(value = "最后修改该记录的用户")
    @TableField(fill = com.baomidou.mybatisplus.annotation.FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    @ApiModelProperty(value = "记录最后更新时间")
    @TableField(fill = com.baomidou.mybatisplus.annotation.FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
}
src/main/java/com/ruoyi/basic/pojo/SupplierManage.java
@@ -2,6 +2,7 @@
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@@ -16,35 +17,44 @@
    private Integer id;
    @ApiModelProperty(value = "供应商名称")
    @Excel(name = "供应商名称")
    private String supplierName;
    @ApiModelProperty(value = "纳税人识别号")
    @Excel(name = "纳税人识别号")
    private String taxpayerIdentificationNum;
    @ApiModelProperty(value = "公司地址")
    @Excel(name = "公司地址")
    private String companyAddress;
    @ApiModelProperty(value = "公司电话")
    @Excel(name = "公司电话")
    private String companyPhone;
    @ApiModelProperty(value = "开户行")
    @Excel(name = "开户行")
    private String bankAccountName;
    @ApiModelProperty(value = "账号")
    @Excel(name = "账号")
    private String bankAccountNum;
    @ApiModelProperty(value = "联系人")
    @Excel(name = "联系人")
    private String contactUserName;
    @ApiModelProperty(value = "联系电话")
    @Excel(name = "联系电话")
    private String contactUserPhone;
    @ApiModelProperty(value = "维护人ID")
    @Excel(name = "维护人")
    private Integer maintainUserId;
    @ApiModelProperty(value = "维护时间")
    @JsonFormat(pattern = "yyyy-MM-dd")
//    @Excel(name = "维护时间", width = 30, dateFormat = "yyyy-MM-dd")
    private LocalDate maintainTime;
    @ApiModelProperty(value = "创建时间")
src/main/java/com/ruoyi/basic/service/StorageAttachmentService.java
@@ -34,6 +34,9 @@
     */
    public void saveStorageAttachment(List<StorageAttachment> attachments, Long recordId, StorageAttachmentRecordType recordType, StorageAttachmentConstants fileType);
    public void saveStorageAttachment(List<StorageAttachment> attachments, Long recordId, StorageAttachmentRecordType recordType, String fileType);
    /**
     * åˆ é™¤é€šç”¨æ–‡ä»¶ä¸Šä¼ çš„附件信息
     * @param storageAttachment æ–‡ä»¶ä¿¡æ¯
src/main/java/com/ruoyi/basic/service/StorageBlobService.java
@@ -26,6 +26,9 @@
     */
    List<StorageBlobDTO> updateStorageBlobs(List<MultipartFile> files, String bucketName);
    List<StorageBlobDTO> updateStorageBlobs(List<MultipartFile> files, String bucketName,Long type);
    /**
     * æ‰¹é‡åˆ é™¤æ–‡ä»¶
     * @param attachment
src/main/java/com/ruoyi/basic/service/impl/StorageAttachmentServiceImpl.java
@@ -78,6 +78,22 @@
    }
    @Override
    public void saveStorageAttachment(List<StorageAttachment> attachments, Long recordId, StorageAttachmentRecordType recordType, String fileType) {
        // åˆ é™¤æ—§å›¾
        deleteStorageAttachment(new StorageAttachment(fileType, (long) recordType.ordinal(), recordId));
        for (StorageAttachment attachment : attachments) {
            // èŽ·å–å…³è”è®°å½•
            StorageBlob storageBlob = attachment.getStorageBlobDTO();
            attachment.setName(fileType);
            attachment.setRecordType((long) recordType.ordinal());
            attachment.setRecordId(recordId);
            attachment.setStorageBlobId(storageBlob.getId());
            storageAttachmentMapper.insert(attachment);
        }
    }
    @Override
    public int deleteStorageAttachment(StorageAttachment storageAttachment) {
        // å…ˆåˆ é™¤æ˜Žç»†è¡¨
        storageBlobService.deleteStorageBlobs(storageAttachment);
src/main/java/com/ruoyi/basic/service/impl/StorageBlobServiceImpl.java
@@ -9,6 +9,7 @@
import com.ruoyi.basic.pojo.StorageAttachment;
import com.ruoyi.basic.pojo.StorageBlob;
import com.ruoyi.basic.service.StorageBlobService;
import com.ruoyi.common.exception.base.BaseException;
import com.ruoyi.common.exception.file.InvalidExtensionException;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.MinioUtils;
@@ -16,11 +17,15 @@
import com.ruoyi.common.utils.uuid.IdUtils;
import com.ruoyi.framework.web.domain.MinioResult;
import lombok.RequiredArgsConstructor;
import org.apache.commons.io.FilenameUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.web.multipart.MultipartFile;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
@@ -61,9 +66,8 @@
                dto.setBucketFilename(res.getBucketFileName());
                dto.setOriginalFilename(res.getOriginalName());
                dto.setByteSize(file.getSize());
                dto.setKey(IdUtils.simpleUUID());
                dto.setResourceKey(IdUtils.simpleUUID());
                dto.setBucketName(bucketName);
                dto.setCreateTime(DateUtils.getNowDate());
                dto.setUrl(minioUtils.getPreviewUrl(res.getBucketFileName(), bucketName, false));
                // æ’入数据库
                storageBlobMapper.insert(dto);
@@ -79,12 +83,95 @@
    }
    @Override
    public List<StorageBlobDTO> updateStorageBlobs(List<MultipartFile> files, String bucketName, Long type) {
        // è‹¥æ²¡ä¼ å…¥bucketName,则使用默认bucketName
        if (StringUtils.isEmpty(bucketName)) {
            bucketName = minioUtils.getDefaultBucket();
        }
        List<StorageBlobDTO> storageBlobDTOs = new ArrayList<>();
        for (MultipartFile file : files) {
            try {
                validateFileExtension(file);
                MinioResult res = minioUtils.upload(bucketName, file, false);
                StorageBlobDTO dto = buildStorageBlobDTO(file, res, bucketName, type);
                storageBlobMapper.insert(dto);
                storageBlobDTOs.add(dto);
            } catch (InvalidExtensionException e) {
                throw new RuntimeException("不支持的文件类型:" + file.getOriginalFilename(), e);
            } catch (Exception e) {
                throw new RuntimeException("上传文件失败:" + file.getOriginalFilename(), e);
            }
        }
        return storageBlobDTOs;
    }
    private StorageBlobDTO buildStorageBlobDTO(MultipartFile file, MinioResult res, String bucketName, Long type) {
        StorageBlobDTO dto = new StorageBlobDTO();
        dto.setContentType(file.getContentType());
        dto.setBucketFilename(res.getBucketFileName());
        dto.setOriginalFilename(res.getOriginalName());
        dto.setByteSize(file.getSize());
        dto.setResourceKey(IdUtils.simpleUUID());
        dto.setBucketName(bucketName);
        dto.setUrl(minioUtils.getPreviewUrl(res.getBucketFileName(), bucketName, false));
        dto.setDownloadUrl(minioUtils.getDownloadUrl(res.getBucketFileName(), bucketName));
        if (type != null) {
            dto.setType(type);
        }
        return dto;
    }
    private void validateFileExtension(MultipartFile file) throws InvalidExtensionException {
        String filename = file.getOriginalFilename();
        String extension = FilenameUtils.getExtension(filename).toLowerCase();
        List<String> allowedExtensions = Arrays.asList(
                // å›¾ç‰‡
                "jpg", "jpeg", "png", "gif", "bmp", "webp", "tiff", "ico", "svg",
                // æ–‡æ¡£
                "pdf", "doc", "docx", "xls", "xlsx", "ppt", "pptx", "txt", "rtf", "md", "csv", "odt",
                // è§†é¢‘
                "mp4", "mov", "avi", "wmv", "flv", "mkv", "webm", "mpeg", "3gp", "MOV",
                // éŸ³é¢‘
                "mp3", "wav", "ogg", "aac", "flac", "m4a", "wma", "amr",
                // åŽ‹ç¼©åŒ…
                "zip", "rar", "7z", "tar", "gz", "bz2", "xz",
                // ç¼–程代码文件
                "java", "py", "js", "ts", "html", "css", "cpp", "c", "cs", "json", "xml", "sql", "yaml", "yml", "sh", "bat",
                // å®‰è£…程序 & äºŒè¿›åˆ¶
                "exe", "apk", "dmg", "msi", "bin", "iso",
                // è®¾è®¡ç±»
                "psd", "ai", "xd", "sketch", "fig"
        );
        if (!allowedExtensions.contains(extension)) {
            throw new BaseException("文件类型不被允许:" + extension);
        }
    }
    @Override
    public int deleteStorageBlobs(StorageAttachment attachment) {
        List<StorageAttachment> attachments = storageAttachmentMapper.selectList(new LambdaQueryWrapper<StorageAttachment>()
                .eq(StorageAttachment::getRecordId, attachment.getRecordId())
                .eq(StorageAttachment::getRecordType, attachment.getRecordType())
                .eq(StorageAttachment::getName, attachment.getName()));
        List<Long> ids = attachments.stream().map(StorageAttachment::getStorageBlobId).collect(Collectors.toList());
        if(CollectionUtils.isEmpty(ids)){
            return 0;
        }
        List<StorageBlob> storageBlobs = storageBlobMapper.selectList(new LambdaQueryWrapper<StorageBlob>()
                .in(StorageBlob::getId, ids));
        if (!storageBlobs.isEmpty()) {
src/main/java/com/ruoyi/collaborativeApproval/controller/DutyPlanController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,63 @@
package com.ruoyi.collaborativeApproval.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.collaborativeApproval.dto.DutyPlanDTO;
import com.ruoyi.collaborativeApproval.mapper.DutyPlanMapper;
import com.ruoyi.collaborativeApproval.pojo.DutyPlan;
import com.ruoyi.collaborativeApproval.pojo.RulesRegulationsManagement;
import com.ruoyi.collaborativeApproval.service.DutyPlanService;
import com.ruoyi.common.utils.excel.ExcelUtils;
import com.ruoyi.framework.web.domain.AjaxResult;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
@RestController
@RequestMapping("/dutyPlan")
@AllArgsConstructor
public class DutyPlanController {
    @Autowired
    private DutyPlanService dutyPlanService;
    @GetMapping("/getList")
    @ApiOperation("分页查询")
    public AjaxResult listPage(Page page, DutyPlanDTO dutyPlanDTO){
        return AjaxResult.success(dutyPlanService.listPage(page, dutyPlanDTO));
    }
    @GetMapping("/getNum")
    @ApiOperation("获取等级数据")
    public AjaxResult getNum(){
        return AjaxResult.success(dutyPlanService.getNum());
    }
    @PostMapping("/add")
    @ApiOperation("新增")
    public AjaxResult add(@RequestBody DutyPlan dutyPlan){
        return AjaxResult.success(dutyPlanService.save(dutyPlan));
    }
    @PostMapping("/update")
    @ApiOperation("修改")
    public AjaxResult update(@RequestBody DutyPlan dutyPlan){
        return AjaxResult.success(dutyPlanService.updateById(dutyPlan));
    }
    @DeleteMapping("/delete")
    @ApiOperation("删除")
    public AjaxResult delete(@RequestBody List<Long> ids){
        if (CollectionUtils.isEmpty(ids)) {
            throw new RuntimeException("请传入要删除的ID");
        }
        return AjaxResult.success(dutyPlanService.removeBatchByIds(ids));
    }
    @PostMapping("/export")
    @ApiOperation("导出")
    public void exportData(HttpServletResponse response, DutyPlanDTO dutyPlanDTO){
        dutyPlanService.exportData(response, dutyPlanDTO);
    }
}
src/main/java/com/ruoyi/collaborativeApproval/controller/MeetingController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,148 @@
package com.ruoyi.collaborativeApproval.controller;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.ruoyi.approve.pojo.ApproveProcess;
import com.ruoyi.collaborativeApproval.mapper.MeetDraftMapper;
import com.ruoyi.collaborativeApproval.pojo.MeetApplication;
import com.ruoyi.collaborativeApproval.pojo.MeetDraft;
import com.ruoyi.collaborativeApproval.pojo.MeetingMinutes;
import com.ruoyi.collaborativeApproval.pojo.MeetingRoom;
import com.ruoyi.collaborativeApproval.service.MeetingService;
import com.ruoyi.collaborativeApproval.vo.SearchMeetingApplicationVo;
import com.ruoyi.collaborativeApproval.vo.SearchMeetingDraftVo;
import com.ruoyi.collaborativeApproval.vo.SearchMeetingRoomVo;
import com.ruoyi.collaborativeApproval.vo.SearchMeetingUseVo;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.framework.web.domain.R;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
/**
 * å…³äºŽä¼šè®®controller
 *
 * @author buhuazhen
 * @date 2025/9/15
 * @email 3038525872@qq.com
 */
@RestController
@RequestMapping("/meeting")
@RequiredArgsConstructor
@Api(tags = "会议")
public class MeetingController {
    private final MeetingService meetingService;
    @PostMapping("/roomList")
    public R getMeetingRoomList(@RequestBody SearchMeetingRoomVo vo) {
        return R.ok(meetingService.getMeetingRoomList(vo));
    }
    @PostMapping("/saveRoom")
    public R saveRoom(@RequestBody MeetingRoom meetingRoom) {
        meetingService.saveMeetRoom(meetingRoom);
        return R.ok();
    }
    @GetMapping("/room/{id}")
    public R getRoomById(@PathVariable Long id) {
        return R.ok(meetingService.findMeetRoomById(id));
    }
    @DeleteMapping("/delRoom/{id}")
    public R deleteRoom(@PathVariable Long id) {
        meetingService.deleteMeetingRoom(id);
        return R.ok();
    }
    @GetMapping("/roomEnum")
    public R getRoomEnum() {
        return R.ok(meetingService.getRoomEnum());
    }
    @PostMapping("/draftList")
    public R getMeetingDraftList(@RequestBody SearchMeetingDraftVo vo) {
        return R.ok(meetingService.getMeetingDraftList(vo));
    }
    @PostMapping("/saveDraft")
    public R saveMeetingDraft(@RequestBody MeetDraft meetDraft) {
        meetingService.saveMeetDraft(meetDraft);
        return R.ok();
    }
    @DeleteMapping("/delDraft/{id}")
    public R deleteMeetingDraft(@PathVariable Long id) {
        meetingService.deleteMeetingDraft(id);
        return R.ok();
    }
    @PostMapping("/saveMeetingApplication")
    public R saveMeetApplication(@RequestBody MeetApplication meetApplication) {
        meetingService.saveMeetApplication(meetApplication);
        return R.ok();
    }
    @PostMapping("/applicationList")
    public R getMeetingApplicationList(@RequestBody SearchMeetingApplicationVo vo) {
        return R.ok(meetingService.getMeetingApplicationList(vo));
    }
    @PostMapping("/meetingUseList")
    public R meetingUseList(@RequestBody SearchMeetingUseVo vo) {
        return R.ok(meetingService.meetingUseList(vo));
    }
    @PostMapping("/meetingPublishList")
    public R meetingPublishList(@RequestBody SearchMeetingApplicationVo vo) {
        return R.ok(meetingService.getMeetingPublishList(vo));
    }
    @GetMapping("/getMeetingMinutesByMeetingId/{id}")
    public R getMeetingMinutes(@PathVariable Long id) {
        return R.ok(meetingService.getMeetingMinutesById(id));
    }
    @PostMapping("/saveMeetingMinutes")
    public R saveMeetingMinutes(@RequestBody MeetingMinutes meetingMinutes) {
        meetingService.saveMeetingMinutes(meetingMinutes);
        return R.ok();
    }
    @GetMapping("/getMeetSummary")
    public R getMeetSummary() {
        return R.ok(meetingService.getMeetSummary());
    }
    @GetMapping("/getMeetSummaryItems")
    public R getMeetSummaryItems() {
        return R.ok(meetingService.getMeetSummaryItems());
    }
    @ApiOperation(value = "会议室设置导出")
    @PostMapping("/export")
    public void export(HttpServletResponse response) {
        List<MeetingRoom> accountExpenses = meetingService.list();
        ExcelUtil<MeetingRoom> util = new ExcelUtil<MeetingRoom>(MeetingRoom.class);
        util.exportExcel(response, accountExpenses, "会议室设置导出");
    }
    private final MeetDraftMapper meetDraftMapper;
    @ApiOperation(value = "会议草稿导出")
    @PostMapping("/exportOne")
    public void exportOne(HttpServletResponse response) {
        List<MeetDraft> accountExpenses = meetDraftMapper.selectList(new LambdaQueryWrapper<MeetDraft>());
        ExcelUtil<MeetDraft> util = new ExcelUtil<MeetDraft>(MeetDraft.class);
        util.exportExcel(response, accountExpenses, "会议草稿导出");
    }
}
src/main/java/com/ruoyi/collaborativeApproval/controller/NoticeController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,63 @@
package com.ruoyi.collaborativeApproval.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.collaborativeApproval.dto.NoticeDTO;
import com.ruoyi.collaborativeApproval.service.NoticeService;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.controller.BaseController;
import com.ruoyi.framework.web.domain.AjaxResult;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@AllArgsConstructor
@Api(tags = "通知公告")
@RequestMapping("/collaborativeApproval/notice")
public class NoticeController extends BaseController {
    private final NoticeService noticeService;
    @GetMapping("/page")
    @Log(title = "分页查询", businessType = BusinessType.OTHER)
    @ApiOperation("分页查询")
    public AjaxResult listPage(Page page, NoticeDTO noticeDTO){
        return AjaxResult.success(noticeService.listPage(page, noticeDTO));
    }
    @PostMapping("/add")
    @Log(title = "新增", businessType = BusinessType.INSERT)
    @ApiOperation("新增")
    public AjaxResult add(@RequestBody NoticeDTO noticeDTO){
        return AjaxResult.success(noticeService.save(noticeDTO));
    }
    @PutMapping("/update")
    @Log(title = "修改", businessType = BusinessType.UPDATE)
    @ApiOperation("修改")
    public AjaxResult update(@RequestBody NoticeDTO noticeDTO){
        return AjaxResult.success(noticeService.updateById(noticeDTO));
    }
    @DeleteMapping("/{ids}")
    @Log(title = "删除", businessType = BusinessType.DELETE)
    @ApiOperation("删除")
    public AjaxResult delete(@PathVariable("ids") List<Long> ids){
        if (CollectionUtils.isEmpty(ids)) {
            throw new RuntimeException("请传入要删除的ID");
        }
        return AjaxResult.success(noticeService.removeBatchByIds(ids));
    }
    @GetMapping("/count")
    @Log(title = "获取公告数量", businessType = BusinessType.OTHER)
    @ApiOperation("获取公告数量")
    public AjaxResult count(){
        return AjaxResult.success(noticeService.selectCount());
    }
}
src/main/java/com/ruoyi/collaborativeApproval/controller/RulesRegulationsManagementController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,87 @@
package com.ruoyi.collaborativeApproval.controller;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.collaborativeApproval.mapper.ReadingStatusMapper;
import com.ruoyi.collaborativeApproval.pojo.ReadingStatus;
import com.ruoyi.collaborativeApproval.pojo.RulesRegulationsManagement;
import com.ruoyi.collaborativeApproval.pojo.SealApplicationManagement;
import com.ruoyi.collaborativeApproval.service.RulesRegulationsManagementService;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.framework.web.domain.AjaxResult;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
@RestController
@RequestMapping("/rulesRegulationsManagement")
@AllArgsConstructor
@Api(tags = "制度管理")
public class RulesRegulationsManagementController {
    @Autowired
    private RulesRegulationsManagementService rulesRegulationsManagementService;
    @Autowired
    private ReadingStatusMapper readingStatusMapper;
    @GetMapping("/getList")
    @ApiOperation("分页查询")
    public AjaxResult listPage(Page page, RulesRegulationsManagement rulesRegulationsManagement){
        return AjaxResult.success(rulesRegulationsManagementService.listPage(page, rulesRegulationsManagement));
    }
    @PostMapping("/add")
    @ApiOperation("新增")
    public AjaxResult add(@RequestBody RulesRegulationsManagement rulesRegulationsManagement){
        return AjaxResult.success(rulesRegulationsManagementService.save(rulesRegulationsManagement));
    }
    @PostMapping("/update")
    @ApiOperation("修改")
    public AjaxResult update(@RequestBody RulesRegulationsManagement rulesRegulationsManagement){
        return AjaxResult.success(rulesRegulationsManagementService.updateById(rulesRegulationsManagement));
    }
    @DeleteMapping("/delete")
    @ApiOperation("删除")
    public AjaxResult delete(@PathVariable("ids") List<Long> ids){
        if (CollectionUtils.isEmpty(ids)) {
            throw new RuntimeException("请传入要删除的ID");
        }
        return AjaxResult.success(rulesRegulationsManagementService.removeBatchByIds(ids));
    }
    //规则查看时新增阅读状态
    @PostMapping("/addReadingStatus")
    @ApiOperation("新增阅读状态")
    public AjaxResult addReadingStatus(@RequestBody ReadingStatus readingStatus){
        return AjaxResult.success(readingStatusMapper.insert(readingStatus));
    }
    @PostMapping("/updateReadingStatus")
    @ApiOperation("修改阅读状态")
    public AjaxResult updateReadingStatus(@RequestBody ReadingStatus readingStatus){
        return AjaxResult.success(readingStatusMapper.updateById(readingStatus));
    }
    @GetMapping("/getReadingStatusList")
    @ApiOperation("分页查询阅读状态")
    public AjaxResult listPage(Page page, ReadingStatus readingStatus){
        return AjaxResult.success(readingStatusMapper.selectPage(page,new QueryWrapper<ReadingStatus>(readingStatus)));
    }
    @GetMapping("/getReadingStatusByRuleId/{ruleId}")
    @ApiOperation("根据制度id查询阅读状态")
    public AjaxResult getReadingStatusByRuleId(@PathVariable Long ruleId){
        return AjaxResult.success(readingStatusMapper.selectList(new QueryWrapper<ReadingStatus>().eq("rule_id", ruleId)));
    }
    @ApiOperation(value = "规章制度管理导出")
    @PostMapping("/export")
    public void export(HttpServletResponse response) {
        List<RulesRegulationsManagement> accountExpenses = rulesRegulationsManagementService.list();
        ExcelUtil<RulesRegulationsManagement> util = new ExcelUtil<RulesRegulationsManagement>(RulesRegulationsManagement.class);
        util.exportExcel(response, accountExpenses, "规章制度管理导出");
    }
}
src/main/java/com/ruoyi/collaborativeApproval/controller/SealApplicationManagementController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,63 @@
package com.ruoyi.collaborativeApproval.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.approve.pojo.KnowledgeBase;
import com.ruoyi.collaborativeApproval.pojo.SealApplicationManagement;
import com.ruoyi.collaborativeApproval.service.SealApplicationManagementService;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.domain.AjaxResult;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
@AllArgsConstructor
@RestController
@RequestMapping("/sealApplicationManagement")
@Api(tags = "用印申请管理")
public class SealApplicationManagementController {
    @Autowired
    private SealApplicationManagementService sealApplicationManagementService;
    @GetMapping("/getList")
    @ApiOperation("分页查询")
    public AjaxResult listPage(Page page, SealApplicationManagement sealApplicationManagement){
        return AjaxResult.success(sealApplicationManagementService.listPage(page,sealApplicationManagement));
    }
    @PostMapping("/add")
    @ApiOperation("新增")
    public AjaxResult add(@RequestBody SealApplicationManagement sealApplicationManagement){
        return AjaxResult.success(sealApplicationManagementService.save(sealApplicationManagement));
    }
    @PostMapping("/update")
    @ApiOperation("修改")
    public AjaxResult update(@RequestBody SealApplicationManagement sealApplicationManagement){
        return AjaxResult.success(sealApplicationManagementService.updateById(sealApplicationManagement));
    }
    @DeleteMapping("/delete")
    @ApiOperation("删除")
    public AjaxResult delete(@PathVariable("ids") List<Long> ids){
        if (CollectionUtils.isEmpty(ids)) {
            throw new RuntimeException("请传入要删除的ID");
        }
        return AjaxResult.success(sealApplicationManagementService.removeBatchByIds(ids));
    }
    @ApiOperation(value = "用印申请管理导出")
    @PostMapping("/export")
    public void export(HttpServletResponse response) {
        List<SealApplicationManagement> accountExpenses = sealApplicationManagementService.list();
        ExcelUtil<SealApplicationManagement> util = new ExcelUtil<SealApplicationManagement>(SealApplicationManagement.class);
        util.exportExcel(response, accountExpenses, "用印申请管理导出");
    }
}
src/main/java/com/ruoyi/collaborativeApproval/controller/StaffContactsPersonalController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,42 @@
package com.ruoyi.collaborativeApproval.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.collaborativeApproval.dto.StaffContactsPersonalDTO;
import com.ruoyi.collaborativeApproval.pojo.StaffContactsPersonal;
import com.ruoyi.collaborativeApproval.service.StaffContactsPersonalService;
import com.ruoyi.framework.web.domain.AjaxResult;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/staffContactsPersonal")
@AllArgsConstructor
public class StaffContactsPersonalController {
    @Autowired
    private StaffContactsPersonalService staffContactsPersonalService;
    @GetMapping("/getList")
    @ApiOperation("分页查询")
    public AjaxResult listPage(Page page, StaffContactsPersonalDTO staffContactsPersonalDTO ){
        return AjaxResult.success(staffContactsPersonalService.listPage(page, staffContactsPersonalDTO));
    }
    @PostMapping("/add")
    @ApiOperation("新增")
    public AjaxResult add(@RequestBody StaffContactsPersonal staffContactsPersonal){
        return AjaxResult.success(staffContactsPersonalService.save(staffContactsPersonal));
    }
    @DeleteMapping("/delete/{id}")
    @ApiOperation("删除")
    public AjaxResult delete(@PathVariable("id") Long id){
//        if (CollectionUtils.isEmpty(id)) {
//            throw new RuntimeException("请传入要删除的ID");
//        }
        return AjaxResult.success(staffContactsPersonalService.removeById(id));
    }
}
src/main/java/com/ruoyi/collaborativeApproval/dto/DutyPlanDTO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,22 @@
package com.ruoyi.collaborativeApproval.dto;
import org.springframework.format.annotation.DateTimeFormat;
import com.baomidou.mybatisplus.annotation.TableField;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.collaborativeApproval.pojo.DutyPlan;
import lombok.Data;
import java.time.LocalDate;
import java.util.List;
@Data
public class DutyPlanDTO extends DutyPlan {
    private List<String> tags;
    /**
     * æŸ¥è¯¢æ—¥æœŸ
     */
    @JsonFormat(pattern = "yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private LocalDate queryDate;
}
src/main/java/com/ruoyi/collaborativeApproval/dto/MeetSummaryDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,24 @@
package com.ruoyi.collaborativeApproval.dto;
import io.swagger.models.auth.In;
import lombok.Data;
import java.io.Serializable;
/**
 * @author buhuazhen
 * @date 2025/9/17
 * @email 3038525872@qq.com
 */
@Data
public class MeetSummaryDto implements Serializable {
    // æ€»ä¼šè®®
    private Integer total;
    // è¿›è¡Œä¸­
    private Integer underWay;
    // å·²å®Œæˆ
    private Integer completed;
    // å³å°†å¼€å§‹
    private Integer toStart;
}
src/main/java/com/ruoyi/collaborativeApproval/dto/MeetUseDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,21 @@
package com.ruoyi.collaborativeApproval.dto;
import lombok.Data;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
/**
 * @author buhuazhen
 * @date 2025/9/16
 * @email 3038525872@qq.com
 */
@Data
public class MeetUseDto implements Serializable {
    private Long id;
    private String name;
    private List<MeetingItem> meetings = new ArrayList<>();
}
src/main/java/com/ruoyi/collaborativeApproval/dto/MeetingItem.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,24 @@
package com.ruoyi.collaborativeApproval.dto;
import lombok.Data;
/**
 * @author buhuazhen
 * @date 2025/9/16
 * @email 3038525872@qq.com
 */
@Data
public class MeetingItem {
    private Long id;
    private String title;
    private String startTime;
    private String endTime;
    private String time;
    private String host;
    private Integer participants = 0;
    private Integer status;
    private String description;
    private String room;
}
src/main/java/com/ruoyi/collaborativeApproval/dto/MeetingSimpleDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
package com.ruoyi.collaborativeApproval.dto;
import lombok.Data;
import java.time.LocalDateTime;
/**
 * @author buhuazhen
 * @date 2025/9/17
 * @email 3038525872@qq.com
 */
@Data
public class MeetingSimpleDto {
    private Long id;
    private String title;
    private Integer status;
    private LocalDateTime startTime;
    private LocalDateTime endTime;
    private String location;
    private String host;
    private String participants;
    private String content;
}
src/main/java/com/ruoyi/collaborativeApproval/dto/NoticeDTO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,13 @@
package com.ruoyi.collaborativeApproval.dto;
import com.ruoyi.collaborativeApproval.pojo.Notice;
import lombok.Data;
@Data
public class NoticeDTO extends Notice {
    private String CreateUserName;
    private Long count;
    private String statusName;
}
src/main/java/com/ruoyi/collaborativeApproval/dto/RulesRegulationsManagementDTO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,16 @@
package com.ruoyi.collaborativeApproval.dto;
import com.ruoyi.collaborativeApproval.pojo.RulesRegulationsManagement;
import lombok.Data;
import java.util.List;
@Data
public class RulesRegulationsManagementDTO extends RulesRegulationsManagement {
    /**
     * å‘布人姓名
     */
    private String createUserName;
    private List<String> scope;
}
src/main/java/com/ruoyi/collaborativeApproval/dto/SealApplicationManagementDTO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,11 @@
package com.ruoyi.collaborativeApproval.dto;
import com.ruoyi.collaborativeApproval.pojo.SealApplicationManagement;
import lombok.Data;
@Data
public class SealApplicationManagementDTO extends SealApplicationManagement {
    private String createUserName;
    //所属部门
    private String department;
}
src/main/java/com/ruoyi/collaborativeApproval/dto/StaffContactsPersonalDTO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,17 @@
package com.ruoyi.collaborativeApproval.dto;
import com.ruoyi.collaborativeApproval.pojo.StaffContactsPersonal;
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
import lombok.Data;
@Data
public class StaffContactsPersonalDTO extends StaffContactsPersonal {
    private String staffNo;
    private String staffName;
    private String sex;
    private String postJob;
    private String adress;
    private String profession;
    private String identityCard;
    private String phone;
}
src/main/java/com/ruoyi/collaborativeApproval/mapper/DutyPlanMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
package com.ruoyi.collaborativeApproval.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.collaborativeApproval.dto.DutyPlanDTO;
import com.ruoyi.collaborativeApproval.pojo.DutyPlan;
import io.lettuce.core.dynamic.annotation.Param;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
import java.util.Map;
@Mapper
public interface DutyPlanMapper extends BaseMapper<DutyPlan> {
    IPage<DutyPlanDTO> listPage(Page page, @Param("dutyPlan") DutyPlanDTO dutyPlan);
    List<Map<String, Object>> getNum();
}
src/main/java/com/ruoyi/collaborativeApproval/mapper/MeetApplicationMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,26 @@
package com.ruoyi.collaborativeApproval.mapper;
import com.ruoyi.collaborativeApproval.dto.MeetSummaryDto;
import com.ruoyi.collaborativeApproval.dto.MeetingSimpleDto;
import com.ruoyi.collaborativeApproval.pojo.MeetApplication;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import java.util.List;
/**
* @author buhuazhen
* @description é’ˆå¯¹è¡¨ã€meet_application(会议申请表)】的数据库操作Mapper
* @createDate 2025-09-15 15:54:20
* @Entity com.ruoyi.collaborativeApproval.pojo.MeetApplication
*/
public interface MeetApplicationMapper extends BaseMapper<MeetApplication> {
    MeetSummaryDto getMeetSummary();
    List<MeetingSimpleDto> getMeetSummaryItems();
}
src/main/java/com/ruoyi/collaborativeApproval/mapper/MeetDraftMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,18 @@
package com.ruoyi.collaborativeApproval.mapper;
import com.ruoyi.collaborativeApproval.pojo.MeetDraft;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* @author buhuazhen
* @description é’ˆå¯¹è¡¨ã€meet_draft(会议草稿表)】的数据库操作Mapper
* @createDate 2025-09-15 14:10:49
* @Entity com.ruoyi.collaborativeApproval.pojo.MeetDraft
*/
public interface MeetDraftMapper extends BaseMapper<MeetDraft> {
}
src/main/java/com/ruoyi/collaborativeApproval/mapper/MeetingMinutesMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,18 @@
package com.ruoyi.collaborativeApproval.mapper;
import com.ruoyi.collaborativeApproval.pojo.MeetingMinutes;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* @author buhuazhen
* @description é’ˆå¯¹è¡¨ã€meeting_minutes(会议纪要表)】的数据库操作Mapper
* @createDate 2025-09-17 10:25:20
* @Entity com.ruoyi.collaborativeApproval.pojo.MeetingMinutes
*/
public interface MeetingMinutesMapper extends BaseMapper<MeetingMinutes> {
}
src/main/java/com/ruoyi/collaborativeApproval/mapper/MeetingRoomMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,18 @@
package com.ruoyi.collaborativeApproval.mapper;
import com.ruoyi.collaborativeApproval.pojo.MeetingRoom;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* @author buhuazhen
* @description é’ˆå¯¹è¡¨ã€meeting_room(会议室表)】的数据库操作Mapper
* @createDate 2025-09-15 10:32:50
* @Entity com.ruoyi.collaborativeApproval.pojo.MeetingRoom
*/
public interface MeetingRoomMapper extends BaseMapper<MeetingRoom> {
}
src/main/java/com/ruoyi/collaborativeApproval/mapper/NoticeMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
package com.ruoyi.collaborativeApproval.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.collaborativeApproval.dto.NoticeDTO;
import com.ruoyi.collaborativeApproval.pojo.Notice;
import org.apache.ibatis.annotations.Param;
public interface NoticeMapper extends BaseMapper<Notice> {
    /**
     * åˆ†é¡µæŸ¥è¯¢
     *
     * @param page
     * @param noticeDTO
     * @return
     */
    IPage<NoticeDTO> listPage(Page page, @Param("ew") NoticeDTO noticeDTO);
}
src/main/java/com/ruoyi/collaborativeApproval/mapper/ReadingStatusMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,9 @@
package com.ruoyi.collaborativeApproval.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.collaborativeApproval.pojo.ReadingStatus;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface ReadingStatusMapper extends BaseMapper<ReadingStatus> {
}
src/main/java/com/ruoyi/collaborativeApproval/mapper/RulesRegulationsManagementMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,14 @@
package com.ruoyi.collaborativeApproval.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.collaborativeApproval.dto.RulesRegulationsManagementDTO;
import com.ruoyi.collaborativeApproval.pojo.RulesRegulationsManagement;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@Mapper
public interface RulesRegulationsManagementMapper extends BaseMapper<RulesRegulationsManagement> {
    IPage<RulesRegulationsManagementDTO> listPage(Page page,@Param("ew") RulesRegulationsManagement rulesRegulationsManagement);
}
src/main/java/com/ruoyi/collaborativeApproval/mapper/SealApplicationManagementMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,14 @@
package com.ruoyi.collaborativeApproval.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.collaborativeApproval.dto.SealApplicationManagementDTO;
import com.ruoyi.collaborativeApproval.pojo.SealApplicationManagement;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@Mapper
public interface SealApplicationManagementMapper extends BaseMapper<SealApplicationManagement> {
    IPage<SealApplicationManagementDTO> listPage(Page page, @Param("ew") SealApplicationManagement sealApplicationManagement);
}
src/main/java/com/ruoyi/collaborativeApproval/mapper/StaffContactsPersonalMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,14 @@
package com.ruoyi.collaborativeApproval.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.collaborativeApproval.dto.StaffContactsPersonalDTO;
import com.ruoyi.collaborativeApproval.pojo.StaffContactsPersonal;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@Mapper
public interface StaffContactsPersonalMapper extends BaseMapper<StaffContactsPersonal> {
    IPage listPage(Page page,@Param("staffContactsPersonalDTO") StaffContactsPersonalDTO staffContactsPersonalDTO);
}
src/main/java/com/ruoyi/collaborativeApproval/pojo/DutyPlan.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,125 @@
package com.ruoyi.collaborativeApproval.pojo;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.approve.utils.ListToStringTypeHandler;
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.apache.ibatis.type.JdbcType;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;
@Data
@TableName("duty_plan")
public class DutyPlan{
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    /**
     * è®¡åˆ’标题
     */
    @Excel(name = "计划标题")
    @ApiModelProperty("计划标题")
    private String title;
    /**
     * è®¡åˆ’描述
     */
    @Excel(name = "计划描述")
    @ApiModelProperty("计划描述")
    private String description;
    /**
     * è®¡åˆ’级别
     */
    @Excel(name = "计划级别")
    @ApiModelProperty("计划级别")
    private String level;
    /**
     * æ—¶é—´å‘¨æœŸ
     */
    @Excel(name = "时间周期")
    @ApiModelProperty("时间周期")
    private String period;
    /**
     * å¼€å§‹æ—¶é—´
     */
    @Excel(name = "开始时间")
    @JsonFormat(pattern = "yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private LocalDate startDate;
    /**
     * ç»“束时间
     */
    @Excel(name = "结束时间")
    @JsonFormat(pattern = "yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private LocalDate endDate;
    /**
     * è´Ÿè´£äºº
     */
    @Excel(name = "负责人")
    @ApiModelProperty("负责人")
    private String assignee;
    /**
     * çŠ¶æ€
     */
    @Excel(name = "状态")
    @ApiModelProperty("状态")
    private String status;
    /**
     * ä¼˜å…ˆçº§
     */
    @Excel(name = "优先级")
    @ApiModelProperty("优先级")
    private String priority;
    /**
     * å®Œæˆåº¦
     */
    @Excel(name = "完成度")
    @ApiModelProperty("完成度")
    private Integer progress;
    /**
     * æ ‡ç­¾
     */
    @Excel(name = "标签")
    @ApiModelProperty("标签")
    @TableField(value = "tags",typeHandler = ListToStringTypeHandler.class,jdbcType = JdbcType.VARCHAR)
    private List<String> tags;
    /**
     * åˆ›å»ºè€…
     */
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    /**
     * åˆ›å»ºæ—¶é—´
     */
    @TableField(fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    /**
     * ä¿®æ”¹äºº
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    /**
     * ä¿®æ”¹æ—¶é—´
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;
    /**
     * ç§Ÿæˆ·ID
     */
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
}
src/main/java/com/ruoyi/collaborativeApproval/pojo/MeetApplication.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,140 @@
package com.ruoyi.collaborativeApproval.pojo;
import com.baomidou.mybatisplus.annotation.*;
import java.io.Serializable;
import java.time.LocalDate;
import java.time.LocalDateTime;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.models.auth.In;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
/**
 * ä¼šè®®ç”³è¯·è¡¨
 * @TableName meet_application
 */
@TableName(value ="meet_application")
@Data
public class MeetApplication implements Serializable {
    /**
     * ç”³è¯·ID
     */
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    /**
     * ä¼šè®®ä¸»é¢˜
     */
    @TableField(value = "title")
    private String title;
    /**
     * ä¼šè®®å®¤ID
     */
    @TableField(value = "room_id")
    private Long roomId;
    /**
     * ä¸»æŒäºº
     */
    @TableField(value = "host")
    private String host;
    /**
     * ä¼šè®®æ—¥æœŸ
     */
    @TableField(value = "meeting_date")
    @JsonFormat(pattern = "yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private LocalDate meetingDate;
    /**
     * å¼€å§‹æ—¶é—´
     */
    @TableField(value = "start_time")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime startTime;
    /**
     * ç»“束时间
     */
    @TableField(value = "end_time")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime endTime;
    /**
     * å‚会人员(JSON格式存储ID数组)
     */
    @TableField(value = "participants")
    private String participants;
    /**
     * ä¼šè®®è¯´æ˜Ž
     */
    @TableField(value = "description")
    private String description;
    /**
     * ç”³è¯·ç±»åž‹ï¼ˆapproval:审批流程, department:部门级, notification:通知发布)
     */
    @TableField(value = "application_type")
    private String applicationType;
    /**
     * çŠ¶æ€ï¼ˆ0:待审批, 1:已通过, 2:已拒绝, 3:已取消)
     */
    @TableField(value = "status")
    private Integer status;
    /**
     * ç”³è¯·äºº
     */
    @TableField(value = "applicant")
    private String applicant;
    /**
     * åˆ›å»ºè€…
     */
    @TableField(value = "create_user" ,fill = FieldFill.INSERT)
    private Integer createUser;
    /**
     * åˆ›å»ºæ—¶é—´
     */
    @TableField(value = "create_time",fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    /**
     * æ›´æ–°è€…
     */
    @TableField(value = "update_user",fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    /**
     * æ›´æ–°æ—¶é—´
     */
    @TableField(value = "update_time",fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
    /**
     * ç§Ÿæˆ·ID
     */
    @TableField(value = "tenant_id",fill = FieldFill.INSERT)
    private Long tenantId;
    @TableField(value = "publish_status")
    private Integer publishStatus;
    @TableField(value = "publish_comment")
    private String publishComment;
    @TableField(exist = false)
    private static final long serialVersionUID = 1L;
}
src/main/java/com/ruoyi/collaborativeApproval/pojo/MeetDraft.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,132 @@
package com.ruoyi.collaborativeApproval.pojo;
import com.baomidou.mybatisplus.annotation.*;
import java.io.Serializable;
import java.time.LocalDate;
import java.time.LocalDateTime;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
/**
 * ä¼šè®®è‰ç¨¿è¡¨
 * @TableName meet_draft
 */
@TableName(value ="meet_draft")
@Data
public class MeetDraft implements Serializable {
    /**
     * è‰ç¨¿ID
     */
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    /**
     * ä¼šè®®ç¼–号
     */
    @TableField(value = "room_id")
    private Long roomId;
    /**
     * ä¼šè®®ä¸»é¢˜
     */
    @TableField(value = "title")
    @Excel(name = "会议主题")
    private String title;
    /**
     * ä¸»æŒäºº
     */
    @TableField(value = "host")
    @Excel(name = "主持人")
    private String host;
    /**
     * ä¼šè®®æ—¥æœŸ
     */
    @TableField(value = "meeting_date")
    @JsonFormat(pattern = "yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private LocalDate meetingDate;
    /**
     * å¼€å§‹æ—¶é—´
     */
    @TableField(value = "start_time")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime startTime;
    /**
     * ç»“束时间
     */
    @TableField(value = "end_time")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime endTime;
    /**
     * å‚会人数
     */
    @TableField(value = "participants")
    @Excel(name = "参会人数")
    private Integer participants;
    /**
     * å‚会人员列表
     */
    @TableField(value = "participant_list")
    private String participantList;
    /**
     * ä¼šè®®è¯´æ˜Ž
     */
    @TableField(value = "description")
    private String description;
    /**
     * åˆ›å»ºäºº
     */
    @TableField(value = "creator")
    private String creator;
    /**
     * åˆ›å»ºè€…
     */
    @TableField(value = "create_user" ,fill = FieldFill.INSERT)
    private Integer createUser;
    /**
     * åˆ›å»ºæ—¶é—´
     */
    @TableField(value = "create_time",fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    /**
     * æ›´æ–°è€…
     */
    @TableField(value = "update_user",fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    /**
     * æ›´æ–°æ—¶é—´
     */
    @TableField(value = "update_time",fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
    /**
     * ç§Ÿæˆ·ID
     */
    @TableField(value = "tenant_id",fill = FieldFill.INSERT)
    private Long tenantId;
    @TableField(exist = false)
    private static final long serialVersionUID = 1L;
}
src/main/java/com/ruoyi/collaborativeApproval/pojo/MeetingMinutes.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,79 @@
package com.ruoyi.collaborativeApproval.pojo;
import com.baomidou.mybatisplus.annotation.*;
import java.io.Serializable;
import java.time.LocalDateTime;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
/**
 * ä¼šè®®çºªè¦è¡¨
 * @TableName meeting_minutes
 */
@TableName(value ="meeting_minutes")
@Data
public class MeetingMinutes implements Serializable {
    /**
     * çºªè¦ID
     */
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    /**
     * å…³è”的会议ID
     */
    @TableField(value = "meeting_id")
    private Long meetingId;
    /**
     * çºªè¦æ ‡é¢˜
     */
    @TableField(value = "title")
    private String title;
    /**
     * çºªè¦å†…容(富文本)
     */
    @TableField(value = "content")
    private String content;
    /**
     * åˆ›å»ºè€…
     */
    @TableField(value = "create_user" ,fill = FieldFill.INSERT)
    private Integer createUser;
    /**
     * åˆ›å»ºæ—¶é—´
     */
    @TableField(value = "create_time",fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    /**
     * æ›´æ–°è€…
     */
    @TableField(value = "update_user",fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    /**
     * æ›´æ–°æ—¶é—´
     */
    @TableField(value = "update_time",fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
    /**
     * ç§Ÿæˆ·ID
     */
    @TableField(value = "tenant_id",fill = FieldFill.INSERT)
    private Long tenantId;
    @TableField(exist = false)
    private static final long serialVersionUID = 1L;
}
src/main/java/com/ruoyi/collaborativeApproval/pojo/MeetingRoom.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,98 @@
package com.ruoyi.collaborativeApproval.pojo;
import com.baomidou.mybatisplus.annotation.*;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Date;
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
import lombok.Data;
/**
 * ä¼šè®®å®¤è¡¨
 * @TableName meeting_room
 */
@TableName(value ="meeting_room")
@Data
public class MeetingRoom implements Serializable {
    /**
     * ä¼šè®®å®¤ID
     */
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    /**
     * ä¼šè®®å®¤åç§°
     */
    @TableField(value = "name")
    @Excel(name = "会议室名称")
    private String name;
    /**
     * ä½ç½®
     */
    @TableField(value = "location")
    @Excel(name = "位置")
    private String location;
    /**
     * å®¹çº³äººæ•°
     */
    @TableField(value = "capacity")
    @Excel(name = "容纳人数")
    private Integer capacity;
    /**
     * è®¾å¤‡é…ç½®ï¼ˆé€—号分隔)
     */
    @TableField(value = "equipment")
    @Excel(name = "设备配置")
    private String equipment;
    /**
     * çŠ¶æ€ï¼ˆ1:启用 0:禁用)
     */
    @TableField(value = "status")
    @Excel(name = "状态", readConverterExp = "1=启用,0=禁用")
    private Integer status;
    /**
     * å¤‡æ³¨
     */
    @TableField(value = "remark")
    private String remark;
    /**
     * åˆ›å»ºè€…
     */
    @TableField(value = "create_user" ,fill = FieldFill.INSERT)
    private Integer createUser;
    /**
     * åˆ›å»ºæ—¶é—´
     */
    @TableField(value = "create_time",fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    /**
     * æ›´æ–°è€…
     */
    @TableField(value = "update_user",fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    /**
     * æ›´æ–°æ—¶é—´
     */
    @TableField(value = "update_time",fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
    /**
     * ç§Ÿæˆ·ID
     */
    @TableField(value = "tenant_id",fill = FieldFill.INSERT)
    private Long tenantId;
    @TableField(exist = false)
    private static final long serialVersionUID = 1L;
}
src/main/java/com/ruoyi/collaborativeApproval/pojo/Notice.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,88 @@
package com.ruoyi.collaborativeApproval.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.time.LocalDateTime;
import java.util.Date;
/**
 * å…¬å‘Šè¡¨
 *
 */
@Data
@TableName("notice")
@ApiModel
public class Notice {
    private static final long serialVersionUID = 1L;
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    /**
     * å…¬å‘Šæ ‡é¢˜
     */
    @ApiModelProperty("公告标题")
    private String title;
    /**
     * å…¬å‘Šç±»åž‹ï¼ˆ1放假通知 2设备维修通知)
     */
    @ApiModelProperty("公告类型(1放假通知 2设备维修通知)")
        private Integer type;
    /**
     * çŠ¶æ€ï¼ˆ0草稿 1发布 2已下线)
     */
    @ApiModelProperty("状态(0草稿 1发布 2已下线)")
    private Integer status;
    /**
     * å…¬å‘Šå†…容
     */
    @ApiModelProperty("公告内容")
    private String content;
    /**
     * ä¼˜å…ˆçº§(1普通 2重要 3紧急)
     */
    @ApiModelProperty("优先级(1普通 2重要 3紧急)")
    private Integer priority;
    /**
     * è¿‡æœŸæ—¶é—´
     */
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date expirationDate;
    /**
     * åˆ›å»ºè€…
     */
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    /**
     * åˆ›å»ºæ—¶é—´
     */
    @TableField(fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    /**
     * ç§Ÿæˆ·ID
     */
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
    /**
     * å¤‡æ³¨
     */
    @ApiModelProperty("备注")
    private String remark;
}
src/main/java/com/ruoyi/collaborativeApproval/pojo/ReadingStatus.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,70 @@
package com.ruoyi.collaborativeApproval.pojo;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.time.LocalDateTime;
@Data
@TableName("reading_status")
public class ReadingStatus implements Serializable {
    /**
     * ä¸»é”®
     */
    @TableId(type = IdType.AUTO)
    private Long id;
    /**
     * åˆ¶åº¦id
     */
    private Long ruleId;
    /**
     * å‘˜å·¥å§“名
     */
    private String employee;
    /**
     * éƒ¨é—¨
     */
    private String department;
    /**
     * ç¡®è®¤æ—¶é—´
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime confirmTime;
    /**
     * é˜…读状态
     */
    private String status;
    /**
     * åˆ›å»ºè€…
     */
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    /**
     * åˆ›å»ºæ—¶é—´
     */
    @TableField(fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    /**
     * ä¿®æ”¹äºº
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    /**
     * ä¿®æ”¹æ—¶é—´
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;
    /**
     * ç§Ÿæˆ·ID
     */
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
}
src/main/java/com/ruoyi/collaborativeApproval/pojo/RulesRegulationsManagement.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,111 @@
package com.ruoyi.collaborativeApproval.pojo;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.approve.utils.ListToStringTypeHandler;
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.apache.ibatis.type.JdbcType;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import java.util.List;
@Data
@TableName(value = "rules_regulations_management")
public class RulesRegulationsManagement {
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    /**
     * åˆ¶åº¦ç¼–号
     */
    @ApiModelProperty("制度编号")
    @Excel(name = "制度编号")
    private String regulationNum;
    /**
     * æ ‡é¢˜
     */
    @ApiModelProperty("标题")
    @Excel(name = "标题")
    private String title;
    /**
     * åˆ¶åº¦åˆ†ç±»
     */
    @ApiModelProperty("制度分类")
    @Excel(name = "制度分类", readConverterExp = "finance=财务制度,hr=人事制度,safety=安全制度,tech=技术制度")
    private String category;
    /**
     * åˆ¶åº¦å†…容
     */
    @ApiModelProperty("制度内容")
    private String content;
    /**
     * ç”Ÿæ•ˆæ—¶é—´
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime effectiveTime;
    /**
     * é€‚用范围
     */
    @ApiModelProperty("适用范围")
    @TableField(value = "scope",typeHandler = ListToStringTypeHandler.class,jdbcType = JdbcType.VARCHAR)
    private List<String> scope;
    /**
     * æ˜¯å¦éœ€è¦ç¡®è®¤
     */
    @ApiModelProperty("是否需要确认")
    private Boolean requireConfirm;
    /**
     * ç‰ˆæœ¬
     */
    @ApiModelProperty("版本")
    @Excel(name = "版本")
    private String version;
    /**
     * çŠ¶æ€
     */
    @ApiModelProperty("状态")
    @Excel(name = "状态", readConverterExp = "repealed=已废止,active=生效中")
    private String status;
    /**
     * å·²è¯»äººæ•°
     */
    @ApiModelProperty("已读人数")
    @Excel(name = "已读人数")
    private Integer readCount;
    /**
     * åˆ›å»ºè€…
     */
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    /**
     * åˆ›å»ºæ—¶é—´
     */
    @TableField(fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @Excel(name = "创建时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    /**
     * ä¿®æ”¹äºº
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    /**
     * ä¿®æ”¹æ—¶é—´
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;
    /**
     * ç§Ÿæˆ·ID
     */
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
}
src/main/java/com/ruoyi/collaborativeApproval/pojo/SealApplicationManagement.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,72 @@
package com.ruoyi.collaborativeApproval.pojo;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
@Data
@TableName("seal_application_management")
public class SealApplicationManagement {
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    /**
     * ç”³è¯·ç¼–号
     */
    @ApiModelProperty("申请编号")
    @Excel(name = "申请编号")
    private String applicationNum;
    /**
     * å…¬å‘Šæ ‡é¢˜
     */
    @ApiModelProperty("公告标题")
    @Excel(name = "申请标题")
    private String title;
    /**
     * ç”¨å°ç±»åž‹
     */
    @ApiModelProperty("用印类型")
    @Excel(name = "用印类型", readConverterExp = "official=公章,contract=合同专用章,finance=财务专用章,legal=未知")
    private String sealType;
    /**
     * ç”³è¯·ç”¨å°åŽŸå› 
     */
    @ApiModelProperty("申请用印原因")
    private String reason;
    /**
     * ç´§æ€¥ç¨‹åº¦
     */
    @ApiModelProperty("紧急程度")
    private String urgency;
    /**
     * çŠ¶æ€
     */
    @ApiModelProperty("状态")
    @Excel(name = "状态", readConverterExp = "pending=待审批,approved=已通过,rejected=已拒绝")
    private String status;
    /**
     * åˆ›å»ºè€…
     */
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    /**
     * åˆ›å»ºæ—¶é—´
     */
    @TableField(fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    /**
     * ç§Ÿæˆ·ID
     */
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
}
src/main/java/com/ruoyi/collaborativeApproval/pojo/StaffContactsPersonal.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,43 @@
package com.ruoyi.collaborativeApproval.pojo;
import com.baomidou.mybatisplus.annotation.*;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.time.LocalDateTime;
@TableName("staff_contacts_personal")
@Data
public class StaffContactsPersonal {
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
//    /**
//     * ç”¨æˆ·ID(所属者)
//     */
//    @ApiModelProperty("用户ID(所属者)")
//    private Integer userId;
    /**
     * å‘˜å·¥ID
     */
    @ApiModelProperty("员工ID")
    private Integer contactId;
    /**
     * åˆ›å»ºè€…
     */
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    /**
     * åˆ›å»ºæ—¶é—´
     */
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    /**
     * ç§Ÿæˆ·ID
     */
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
}
src/main/java/com/ruoyi/collaborativeApproval/service/DutyPlanService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,19 @@
package com.ruoyi.collaborativeApproval.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.collaborativeApproval.dto.DutyPlanDTO;
import com.ruoyi.collaborativeApproval.pojo.DutyPlan;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
import java.util.Map;
public interface DutyPlanService extends IService<DutyPlan> {
    IPage listPage(Page page, DutyPlanDTO dutyPlanDTO);
    List<Map<String, Object>> getNum();
    void exportData(HttpServletResponse response, DutyPlanDTO dutyPlan);
}
src/main/java/com/ruoyi/collaborativeApproval/service/MeetingService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,73 @@
package com.ruoyi.collaborativeApproval.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.collaborativeApproval.dto.MeetSummaryDto;
import com.ruoyi.collaborativeApproval.dto.MeetUseDto;
import com.ruoyi.collaborativeApproval.dto.MeetingSimpleDto;
import com.ruoyi.collaborativeApproval.pojo.MeetApplication;
import com.ruoyi.collaborativeApproval.pojo.MeetDraft;
import com.ruoyi.collaborativeApproval.pojo.MeetingMinutes;
import com.ruoyi.collaborativeApproval.pojo.MeetingRoom;
import com.ruoyi.collaborativeApproval.vo.SearchMeetingApplicationVo;
import com.ruoyi.collaborativeApproval.vo.SearchMeetingDraftVo;
import com.ruoyi.collaborativeApproval.vo.SearchMeetingRoomVo;
import com.ruoyi.collaborativeApproval.vo.SearchMeetingUseVo;
import java.util.List;
public interface MeetingService extends IService<MeetingRoom> {
//****************会议室********************************
    IPage<MeetingRoom> getMeetingRoomList(SearchMeetingRoomVo vo);
    void saveMeetRoom(MeetingRoom meetingRoom);
    MeetingRoom findMeetRoomById(Long id);
    void deleteMeetingRoom(Long id);
    List<MeetingRoom> getRoomEnum();
//***************草稿********************************
    IPage<MeetDraft> getMeetingDraftList(SearchMeetingDraftVo vo);
    void saveMeetDraft(MeetDraft meetDraft);
    void deleteMeetingDraft(Long id);
// ************申请会议************
    void saveMeetApplication(MeetApplication meetApplication);
// ************申请审批************
    IPage<MeetApplication> getMeetingApplicationList(SearchMeetingApplicationVo vo);
    // ****************会议使用查询********************************
    /**
     * ä¼šè®®ä½¿ç”¨æ¸…单
     */
    List<MeetUseDto> meetingUseList(SearchMeetingUseVo vo);
    // ****************会议发布********************************
    IPage<MeetApplication> getMeetingPublishList(SearchMeetingApplicationVo vo);
    // ****************会议纪要********************************
    MeetingMinutes getMeetingMinutesById(Long id);
    void saveMeetingMinutes(MeetingMinutes meetingMinutes);
    MeetSummaryDto getMeetSummary();
    List<MeetingSimpleDto> getMeetSummaryItems();
}
src/main/java/com/ruoyi/collaborativeApproval/service/NoticeService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,17 @@
package com.ruoyi.collaborativeApproval.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.collaborativeApproval.dto.NoticeDTO;
import com.ruoyi.collaborativeApproval.pojo.Notice;
import java.util.List;
public interface NoticeService extends IService<Notice> {
    IPage<NoticeDTO> listPage(Page page, NoticeDTO noticeDTO);
    List<NoticeDTO> selectCount();
}
src/main/java/com/ruoyi/collaborativeApproval/service/RulesRegulationsManagementService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,11 @@
package com.ruoyi.collaborativeApproval.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.collaborativeApproval.dto.RulesRegulationsManagementDTO;
import com.ruoyi.collaborativeApproval.pojo.RulesRegulationsManagement;
public interface RulesRegulationsManagementService extends IService<RulesRegulationsManagement> {
    IPage<RulesRegulationsManagementDTO> listPage(Page page, RulesRegulationsManagement rulesRegulationsManagement);
}
src/main/java/com/ruoyi/collaborativeApproval/service/SealApplicationManagementService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,10 @@
package com.ruoyi.collaborativeApproval.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.collaborativeApproval.pojo.SealApplicationManagement;
public interface SealApplicationManagementService extends IService<SealApplicationManagement> {
    IPage listPage(Page page, SealApplicationManagement sealApplicationManagement);
}
src/main/java/com/ruoyi/collaborativeApproval/service/StaffContactsPersonalService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,11 @@
package com.ruoyi.collaborativeApproval.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.collaborativeApproval.dto.StaffContactsPersonalDTO;
import com.ruoyi.collaborativeApproval.pojo.StaffContactsPersonal;
public interface StaffContactsPersonalService extends IService<StaffContactsPersonal> {
    IPage listPage(Page page, StaffContactsPersonalDTO staffContactsPersonalDTO);
}
src/main/java/com/ruoyi/collaborativeApproval/service/impl/DutyPlanServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,41 @@
package com.ruoyi.collaborativeApproval.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.collaborativeApproval.dto.DutyPlanDTO;
import com.ruoyi.collaborativeApproval.mapper.DutyPlanMapper;
import com.ruoyi.collaborativeApproval.pojo.DutyPlan;
import com.ruoyi.collaborativeApproval.service.DutyPlanService;
import com.ruoyi.common.utils.poi.ExcelUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
import java.util.Map;
@Service
public class DutyPlanServiceImpl extends ServiceImpl<DutyPlanMapper, DutyPlan> implements DutyPlanService {
    @Autowired
    private DutyPlanMapper dutyPlanMapper;
    @Override
    public IPage listPage(Page page, DutyPlanDTO dutyPlanDTO) {
        return dutyPlanMapper.listPage(page, dutyPlanDTO);
    }
    @Override
    public List<Map<String, Object>> getNum() {
        return dutyPlanMapper.getNum();
    }
    @Override
    public void exportData(HttpServletResponse response, DutyPlanDTO dutyPlanDTO) {
        IPage<DutyPlanDTO> dutyPlans = dutyPlanMapper.listPage(new Page<>(-1, -1), dutyPlanDTO);
        List<DutyPlanDTO> records = dutyPlans.getRecords();
        ExcelUtil<DutyPlanDTO> util = new ExcelUtil<>(DutyPlanDTO.class);
        util.exportExcel(response, records, "计划导出");
    }
}
src/main/java/com/ruoyi/collaborativeApproval/service/impl/MeetingServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,244 @@
package com.ruoyi.collaborativeApproval.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.github.xiaoymin.knife4j.core.util.StrUtil;
import com.ruoyi.collaborativeApproval.dto.MeetSummaryDto;
import com.ruoyi.collaborativeApproval.dto.MeetUseDto;
import com.ruoyi.collaborativeApproval.dto.MeetingItem;
import com.ruoyi.collaborativeApproval.dto.MeetingSimpleDto;
import com.ruoyi.collaborativeApproval.mapper.MeetApplicationMapper;
import com.ruoyi.collaborativeApproval.mapper.MeetDraftMapper;
import com.ruoyi.collaborativeApproval.mapper.MeetingMinutesMapper;
import com.ruoyi.collaborativeApproval.mapper.MeetingRoomMapper;
import com.ruoyi.collaborativeApproval.pojo.MeetApplication;
import com.ruoyi.collaborativeApproval.pojo.MeetDraft;
import com.ruoyi.collaborativeApproval.pojo.MeetingMinutes;
import com.ruoyi.collaborativeApproval.pojo.MeetingRoom;
import com.ruoyi.collaborativeApproval.service.MeetingService;
import com.ruoyi.collaborativeApproval.vo.SearchMeetingApplicationVo;
import com.ruoyi.collaborativeApproval.vo.SearchMeetingDraftVo;
import com.ruoyi.collaborativeApproval.vo.SearchMeetingRoomVo;
import com.ruoyi.collaborativeApproval.vo.SearchMeetingUseVo;
import com.ruoyi.common.utils.SecurityUtils;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.stream.Collectors;
@Service
@RequiredArgsConstructor
public class MeetingServiceImpl extends ServiceImpl<MeetingRoomMapper, MeetingRoom> implements MeetingService {
    private final MeetingRoomMapper meetingRoomMapper;
    private final MeetDraftMapper meetDraftMapper;
    private final MeetApplicationMapper meetApplicationMapper;
    private final MeetingMinutesMapper meetingMinutesMapper;
    @Override
    public IPage<MeetingRoom> getMeetingRoomList(SearchMeetingRoomVo vo) {
        LambdaQueryWrapper<MeetingRoom> queryWrapper = new LambdaQueryWrapper<>();
        if (StrUtil.isNotBlank(vo.getName())) {
            queryWrapper.like(MeetingRoom::getName, vo.getName());
        }
        if (StrUtil.isNotBlank(vo.getLocation())) {
            queryWrapper.like(MeetingRoom::getLocation, vo.getLocation());
        }
        queryWrapper.orderByDesc(MeetingRoom::getId);
        return meetingRoomMapper.selectPage(new Page<MeetingRoom>(vo.getCurrent(), vo.getSize()), queryWrapper);
    }
    @Override
    public void saveMeetRoom(MeetingRoom meetingRoom) {
        if (meetingRoom.getId() != null) {
            meetingRoomMapper.updateById(meetingRoom);
        } else {
            meetingRoomMapper.insert(meetingRoom);
        }
    }
    @Override
    public MeetingRoom findMeetRoomById(Long id) {
        return meetingRoomMapper.selectById(id);
    }
    @Override
    public void deleteMeetingRoom(Long id) {
        meetingRoomMapper.deleteById(id);
    }
    @Override
    public List<MeetingRoom> getRoomEnum() {
        LambdaQueryWrapper<MeetingRoom> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.select(MeetingRoom::getName, MeetingRoom::getId, MeetingRoom::getLocation);
        queryWrapper.eq(MeetingRoom::getStatus, 1);
        queryWrapper.orderByDesc(MeetingRoom::getId);
        return meetingRoomMapper.selectList(queryWrapper);
    }
    @Override
    public IPage<MeetDraft> getMeetingDraftList(SearchMeetingDraftVo vo) {
        LambdaQueryWrapper<MeetDraft> queryWrapper = new LambdaQueryWrapper<>();
        if (StrUtil.isNotBlank(vo.getTitle())) {
            queryWrapper.like(MeetDraft::getTitle, vo.getTitle());
        }
        if (Objects.nonNull(vo.getMeetingDate())) {
            queryWrapper.eq(MeetDraft::getMeetingDate, vo.getMeetingDate());
        }
        queryWrapper.orderByDesc(MeetDraft::getId);
        return meetDraftMapper.selectPage(new Page<>(vo.getCurrent(), vo.getSize()), queryWrapper);
    }
    @Override
    public void saveMeetDraft(MeetDraft meetDraft) {
        if (meetDraft.getId() != null) {
            meetDraftMapper.updateById(meetDraft);
        } else {
            meetDraftMapper.insert(meetDraft);
        }
    }
    @Override
    public void deleteMeetingDraft(Long id) {
        meetDraftMapper.deleteById(id);
    }
    @Override
    public void saveMeetApplication(MeetApplication meetApplication) {
        meetApplication.setApplicant(SecurityUtils.getUsername());
        if (meetApplication.getId() != null) {
            meetApplicationMapper.updateById(meetApplication);
        } else {
            meetApplicationMapper.insert(meetApplication);
        }
    }
    @Override
    public IPage<MeetApplication> getMeetingApplicationList(SearchMeetingApplicationVo vo) {
        LambdaQueryWrapper<MeetApplication> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.in(MeetApplication::getApplicationType, "approval", "department");
        if (StrUtil.isNotBlank(vo.getTitle())) {
            queryWrapper.like(MeetApplication::getTitle, vo.getTitle());
        }
        if (StrUtil.isNotBlank(vo.getApplicant())) {
            queryWrapper.like(MeetApplication::getApplicant, vo.getApplicant());
        }
        if (StrUtil.isNotBlank(vo.getStatus())) {
            queryWrapper.eq(MeetApplication::getStatus, vo.getStatus());
        }
        queryWrapper.orderByDesc(MeetApplication::getId);
        return meetApplicationMapper.selectPage(new Page<>(vo.getCurrent(), vo.getSize()), queryWrapper);
    }
    @Override
    public List<MeetUseDto> meetingUseList(SearchMeetingUseVo vo) {
        // æŸ¥è¯¢ä¼šè®®åˆ—表
        LambdaQueryWrapper<MeetApplication> alWrapper = new LambdaQueryWrapper<>();
        alWrapper.and(wrapper -> {
            wrapper.eq(MeetApplication::getStatus, 1)
                    .or()
                    .eq(MeetApplication::getApplicationType, "notification");
        });
        if (Objects.nonNull(vo.getMeetingDate())) {
            alWrapper.and(wrapper -> {
                wrapper.eq(MeetApplication::getMeetingDate, vo.getMeetingDate());
            });
        }
        alWrapper.orderByAsc(MeetApplication::getStartTime);
        List<MeetApplication> meetApplicationList = meetApplicationMapper.selectList(alWrapper);
        // æ ¹æ® roomId è¿›è¡Œåˆ†ç»„
        Map<Long, List<MeetApplication>> roomGroup = meetApplicationList.stream().collect(Collectors.groupingBy(MeetApplication::getRoomId));
        // æŸ¥è¯¢room信息
        List<MeetingRoom> roomList = meetingRoomMapper.selectList(new LambdaUpdateWrapper<MeetingRoom>().orderByAsc(MeetingRoom::getId));
        List<MeetUseDto> meetUseDtoList = new ArrayList<>();
        roomList.forEach(r -> {
            MeetUseDto dto = new MeetUseDto();
            MeetingRoom meetingRoom = roomList.stream().filter(room -> room.getId().equals(r.getId())).findFirst().orElse(new MeetingRoom());
            dto.setId(meetingRoom.getId());
            dto.setName(meetingRoom.getName());
            List<MeetingItem> collect = roomGroup.getOrDefault(r.getId(), new ArrayList<>()).stream().map(it -> {
                MeetingItem item = new MeetingItem();
                item.setId(it.getId());
                item.setHost(it.getHost());
                item.setStatus(1);
                item.setTitle(it.getTitle());
                item.setStartTime(it.getStartTime().format(DateTimeFormatter.ofPattern("HH:mm")));
                item.setEndTime(it.getEndTime().format(DateTimeFormatter.ofPattern("HH:mm")));
                item.setTime(item.getStartTime() + "~" + item.getEndTime());
                item.setParticipants(it.getParticipants().split(",").length);
                item.setDescription(it.getDescription());
                item.setRoom(meetingRoom.getName() + "(" + meetingRoom.getLocation() + ")");
                return item;
            }).collect(Collectors.toList());
            dto.setMeetings(collect);
            meetUseDtoList.add(dto);
        });
        return meetUseDtoList;
    }
    @Override
    public IPage<MeetApplication> getMeetingPublishList(SearchMeetingApplicationVo vo) {
        LambdaQueryWrapper<MeetApplication> queryWrapper = new LambdaQueryWrapper<>();
        if (StrUtil.isNotBlank(vo.getTitle())) {
            queryWrapper.like(MeetApplication::getTitle, vo.getTitle());
        }
        if (StrUtil.isNotBlank(vo.getApplicant())) {
            queryWrapper.like(MeetApplication::getApplicant, vo.getApplicant());
        }
        if (StrUtil.isNotBlank(vo.getStatus())) {
            queryWrapper.eq(MeetApplication::getPublishStatus, vo.getStatus());
        }
        queryWrapper.and(wrapper -> {
            wrapper.eq(MeetApplication::getStatus, 1)
                    .or()
                    .eq(MeetApplication::getApplicationType, "notification");
        });
        queryWrapper.orderByDesc(MeetApplication::getId);
        return meetApplicationMapper.selectPage(new Page<>(vo.getCurrent(), vo.getSize()), queryWrapper);
    }
    @Override
    public MeetingMinutes getMeetingMinutesById(Long id) {
        return meetingMinutesMapper.selectOne(new LambdaUpdateWrapper<MeetingMinutes>().eq(MeetingMinutes::getMeetingId,id));
    }
    @Override
    public void saveMeetingMinutes(MeetingMinutes meetingMinutes) {
        if (meetingMinutes.getId() != null){
            meetingMinutesMapper.updateById(meetingMinutes);
        }else {
            meetingMinutesMapper.insert(meetingMinutes);
        }
    }
    @Override
    public MeetSummaryDto getMeetSummary() {
       return meetApplicationMapper.getMeetSummary();
    }
    @Override
    public List<MeetingSimpleDto> getMeetSummaryItems() {
        return meetApplicationMapper.getMeetSummaryItems();
    }
}
src/main/java/com/ruoyi/collaborativeApproval/service/impl/NoticeServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,56 @@
package com.ruoyi.collaborativeApproval.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.collaborativeApproval.dto.NoticeDTO;
import com.ruoyi.collaborativeApproval.mapper.NoticeMapper;
import com.ruoyi.collaborativeApproval.pojo.Notice;
import com.ruoyi.collaborativeApproval.service.NoticeService;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
@Service
@Slf4j
@AllArgsConstructor
public class NoticeServiceImpl extends ServiceImpl<NoticeMapper, Notice> implements NoticeService {
    private final NoticeMapper noticeMapper;
    @Override
    public IPage<NoticeDTO> listPage(Page page, NoticeDTO noticeDTO) {
        IPage<NoticeDTO> noticeDTOIPage = noticeMapper.listPage(page, noticeDTO);
        noticeDTOIPage.getRecords().forEach(item -> {
            // æ ¹æ®è¿‡æœŸæ—¶é—´åˆ¤æ–­statusName
            if (item.getExpirationDate() == null) {
                item.setStatusName("未知");
            }else if(item.getExpirationDate().getTime() < System.currentTimeMillis()){
                item.setStatusName("已过期");
            } else{
                item.setStatusName("正常");
            }
        });
        return noticeDTOIPage;
    }
    @Override
    public List<NoticeDTO> selectCount() {
        List<NoticeDTO> result = new ArrayList<>();
        NoticeDTO notice = new NoticeDTO();
        notice.setType(1);
        notice.setCount(noticeMapper.selectCount(new LambdaQueryWrapper<Notice>().eq(Notice::getType, 1)));
        result.add(notice);
        NoticeDTO notice1 = new NoticeDTO();
        notice1.setType(2);
        notice1.setCount(noticeMapper.selectCount(new LambdaQueryWrapper<Notice>().eq(Notice::getType, 2)));
        result.add(notice1);
        return result;
    }
}
src/main/java/com/ruoyi/collaborativeApproval/service/impl/RulesRegulationsManagementServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,21 @@
package com.ruoyi.collaborativeApproval.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.collaborativeApproval.dto.RulesRegulationsManagementDTO;
import com.ruoyi.collaborativeApproval.mapper.RulesRegulationsManagementMapper;
import com.ruoyi.collaborativeApproval.pojo.RulesRegulationsManagement;
import com.ruoyi.collaborativeApproval.service.RulesRegulationsManagementService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class RulesRegulationsManagementServiceImpl extends ServiceImpl<RulesRegulationsManagementMapper, RulesRegulationsManagement> implements RulesRegulationsManagementService {
    @Autowired
    private RulesRegulationsManagementMapper rulesRegulationsManagementMapper;
    @Override
    public IPage<RulesRegulationsManagementDTO> listPage(Page page, RulesRegulationsManagement rulesRegulationsManagement) {
        return rulesRegulationsManagementMapper.listPage(page, rulesRegulationsManagement);
    }
}
src/main/java/com/ruoyi/collaborativeApproval/service/impl/SealApplicationManagementServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,22 @@
package com.ruoyi.collaborativeApproval.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.collaborativeApproval.dto.SealApplicationManagementDTO;
import com.ruoyi.collaborativeApproval.mapper.SealApplicationManagementMapper;
import com.ruoyi.collaborativeApproval.pojo.SealApplicationManagement;
import com.ruoyi.collaborativeApproval.service.SealApplicationManagementService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class SealApplicationManagementServiceImpl extends ServiceImpl<SealApplicationManagementMapper, SealApplicationManagement> implements SealApplicationManagementService {
    @Autowired
    private SealApplicationManagementMapper sealApplicationManagementMapper;
    @Override
    public IPage<SealApplicationManagementDTO> listPage(Page page, SealApplicationManagement sealApplicationManagement) {
        return sealApplicationManagementMapper.listPage(page, sealApplicationManagement);
    }
}
src/main/java/com/ruoyi/collaborativeApproval/service/impl/StaffContactsPersonalServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,22 @@
package com.ruoyi.collaborativeApproval.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
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.collaborativeApproval.dto.StaffContactsPersonalDTO;
import com.ruoyi.collaborativeApproval.mapper.StaffContactsPersonalMapper;
import com.ruoyi.collaborativeApproval.pojo.StaffContactsPersonal;
import com.ruoyi.collaborativeApproval.service.StaffContactsPersonalService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class StaffContactsPersonalServiceImpl extends ServiceImpl<StaffContactsPersonalMapper, StaffContactsPersonal> implements StaffContactsPersonalService {
    @Autowired
    private StaffContactsPersonalMapper staffContactsPersonalMapper;
    @Override
    public IPage listPage(Page page, StaffContactsPersonalDTO staffContactsPersonalDTO) {
        return staffContactsPersonalMapper.listPage(page, staffContactsPersonalDTO);
    }
}
src/main/java/com/ruoyi/collaborativeApproval/vo/SearchMeetingApplicationVo.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,16 @@
package com.ruoyi.collaborativeApproval.vo;
import com.ruoyi.dto.PageDto;
import lombok.Data;
/**
 * @author buhuazhen
 * @date 2025/9/16
 * @email 3038525872@qq.com
 */
@Data
public class SearchMeetingApplicationVo extends PageDto {
    private String title;
    private String applicant;
    private String status;
}
src/main/java/com/ruoyi/collaborativeApproval/vo/SearchMeetingDraftVo.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
package com.ruoyi.collaborativeApproval.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.dto.PageDto;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import java.util.Date;
/**
 * @author buhuazhen
 * @date 2025/9/15
 * @email 3038525872@qq.com
 */
@Data
public class SearchMeetingDraftVo extends PageDto {
    private String title;
    @JsonFormat(pattern = "yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private Date meetingDate;
}
src/main/java/com/ruoyi/collaborativeApproval/vo/SearchMeetingRoomVo.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
package com.ruoyi.collaborativeApproval.vo;
import com.ruoyi.dto.PageDto;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
/**
 * @author buhuazhen
 * @date 2025/9/15
 * @email 3038525872@qq.com
 */
@EqualsAndHashCode(callSuper = true)
@Data
@AllArgsConstructor
@NoArgsConstructor
public class SearchMeetingRoomVo extends PageDto {
    private String name;
    private String location;
}
src/main/java/com/ruoyi/collaborativeApproval/vo/SearchMeetingUseVo.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,19 @@
package com.ruoyi.collaborativeApproval.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
/**
 * @author buhuazhen
 * @date 2025/9/16
 * @email 3038525872@qq.com
 */
@Data
public class SearchMeetingUseVo {
    @JsonFormat(pattern = "yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private Date meetingDate;
}
src/main/java/com/ruoyi/common/enums/FileNameType.java
@@ -1,5 +1,7 @@
package com.ruoyi.common.enums;
import com.ruoyi.approve.pojo.ApproveProcess;
public enum FileNameType {
    SALE(1),      // é”€å”®
@@ -8,7 +10,8 @@
    PURCHASELEDGER(4),
    MEASURING(5),  //计量器具台账
    MEASURINGRecord(6),//计量器具台账记录
    ApproveNode(7);  //协同审批审核
    ApproveNode(7),  //协同审批节点审核
    ApproveProcess(8);  //协同审批主数据
    private final int value;
src/main/java/com/ruoyi/common/enums/StorageAttachmentRecordType.java
@@ -9,7 +9,10 @@
@AllArgsConstructor
public enum StorageAttachmentRecordType {
    // ä¾‹å­ å®žé™…开发请删除
    Template("Template","范例");
    Template("Template","范例"),
    Archives("Archives","文档管理"),
    InspectionTasks("InspectionTasks","生产巡检"),
    QrCodeScanRecords("QrCodeScanRecords","二维码扫码记录文件");
    private final String code;
src/main/java/com/ruoyi/common/utils/MinioUtils.java
@@ -21,12 +21,10 @@
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.InputStream;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
@@ -306,4 +304,130 @@
        return null;
    }
    /**
     * ç”Ÿæˆé¢„览URL
     * @param bucketFilename æ–‡ä»¶åœ¨MinIO中的唯一标识
     * @param bucketName å­˜å‚¨æ¡¶åç§°
     * @param useDefaultExpiry æ˜¯å¦ä½¿ç”¨é»˜è®¤è¿‡æœŸæ—¶é—´ï¼ˆtrue=使用默认过期时间,false=永久有效)
     * @return é¢„览URL
     */
    public String getPreviewUrls(String bucketFilename, String bucketName, boolean useDefaultExpiry) {
        if (StringUtils.isBlank(bucketFilename)) {
            return null;
        }
        try {
            // éªŒè¯æ–‡ä»¶å­˜åœ¨æ€§
            minioClient.statObject(StatObjectArgs.builder()
                    .bucket(bucketName)
                    .object(bucketFilename)
                    .build());
            GetPresignedObjectUrlArgs.Builder builder = GetPresignedObjectUrlArgs.builder()
                    .method(Method.GET)
                    .bucket(bucketName)
                    .object(bucketFilename);
            // è®¾ç½®è¿‡æœŸæ—¶é—´ï¼šuseDefaultExpiry=true ä½¿ç”¨é…ç½®çš„过期时间
            if (useDefaultExpiry) {
                builder.expiry(previewExpiry, TimeUnit.HOURS);
            }
            return minioClient.getPresignedObjectUrl(builder.build());
        } catch (Exception e) {
            throw new UtilException("生成预览URL失败: " + e.getMessage(), e);
        }
    }
    /**
     * ç”Ÿæˆä¸‹è½½URL(强制浏览器下载)
     * @param bucketFilename æ–‡ä»¶åœ¨MinIO中的唯一标识
     * @param bucketName å­˜å‚¨æ¡¶åç§°
     * @param originalFileName åŽŸå§‹æ–‡ä»¶åï¼ˆç”¨äºŽä¸‹è½½æ—¶æ˜¾ç¤ºï¼‰
     * @param useDefaultExpiry æ˜¯å¦ä½¿ç”¨é»˜è®¤è¿‡æœŸæ—¶é—´ï¼ˆtrue=使用默认,false=无过期时间)
     * @return ä¸‹è½½URL
     */
    public String getDownloadUrls(String bucketFilename, String bucketName, String originalFileName, boolean useDefaultExpiry) {
        if (StringUtils.isBlank(bucketFilename)) {
            return null;
        }
        try {
            // éªŒè¯æ–‡ä»¶å­˜åœ¨æ€§
            minioClient.statObject(StatObjectArgs.builder()
                    .bucket(bucketName)
                    .object(bucketFilename)
                    .build());
            // æ­£ç¡®ç¼–码文件名:替换 + ä¸º %20
            String encodedFileName = URLEncoder.encode(originalFileName, String.valueOf(StandardCharsets.UTF_8))
                    .replace("+", "%20");
            Map<String, String> reqParams = new HashMap<>();
            reqParams.put("response-content-disposition",
                    "attachment; filename=\"" + encodedFileName + "\"");
            GetPresignedObjectUrlArgs.Builder builder = GetPresignedObjectUrlArgs.builder()
                    .method(Method.GET)
                    .bucket(bucketName)
                    .object(bucketFilename)
                    .extraQueryParams(reqParams);
            // æ ¹æ®å‚数决定是否设置过期时间
            if (useDefaultExpiry) {
                // ä½¿ç”¨é»˜è®¤è¿‡æœŸæ—¶é—´ï¼ˆä»Žé…ç½®è¯»å–)
                builder.expiry(previewExpiry, TimeUnit.HOURS);
            } else {
                // ä¸è®¾ç½®è¿‡æœŸæ—¶é—´ï¼ˆMinIO é»˜è®¤7天)
            }
            return minioClient.getPresignedObjectUrl(builder.build());
        } catch (Exception e) {
            throw new UtilException("生成下载URL失败: " + e.getMessage(), e);
        }
    }
    public String getDownloadUrl(String bucketFileName, String bucketName) {
        if (StringUtils.isNotBlank(bucketFileName)) {
            try {
                // æ£€æŸ¥æ–‡ä»¶æ˜¯å¦å­˜åœ¨
                minioClient.statObject(StatObjectArgs.builder()
                        .bucket(bucketName)
                        .object(bucketFileName)
                        .build());
                // è®¾ç½®å“åº”头
                Map<String, String> reqParams = new HashMap<>();
                // æå–原始文件名(如果存储时保留了原始名称)
                String originalFileName = extractOriginalFileName(bucketFileName);
                reqParams.put("response-content-disposition",
                        "attachment; filename=\"" + URLEncoder.encode(originalFileName, String.valueOf(StandardCharsets.UTF_8)) + "\"");
                // æž„建预签名URL参数
                GetPresignedObjectUrlArgs args = GetPresignedObjectUrlArgs.builder()
                        .method(Method.GET)
                        .bucket(bucketName)
                        .object(bucketFileName)
                        .expiry(previewExpiry, TimeUnit.HOURS)
                        .extraQueryParams(reqParams)
                        .build();
                return minioClient.getPresignedObjectUrl(args);
            } catch (Exception e) {
                throw new UtilException("MinioUtils:生成下载链接异常", e);
            }
        }
        return null;
    }
    private String extractOriginalFileName(String bucketFileName) {
        // ç¤ºä¾‹ï¼šå¦‚果存储格式为 "原始文件名_UUID"
        int underscoreIndex = bucketFileName.lastIndexOf("_");
        if (underscoreIndex > 0) {
            return bucketFileName.substring(0, underscoreIndex);
        }
        // å¦‚果没有特殊格式,直接返回完整文件名
        return bucketFileName;
    }
}
src/main/java/com/ruoyi/common/utils/OrderUtils.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,55 @@
package com.ruoyi.common.utils;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.poi.ss.formula.functions.T;
import org.springframework.stereotype.Component;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
/**
 * @author :yys
 * @date : 2025/9/15 15:31
 */
public class OrderUtils {
    /**
     * æŸ¥è¯¢å½“天(基于createTime字段)的记录数量
     * @param mapper å®žä½“类对应的BaseMapper
     * @param <T> å®žä½“类泛型
     * @return å½“天记录数量
     */
    public static <T> String countTodayByCreateTime(BaseMapper<T> mapper,String preFix) {
        // èŽ·å–å½“å¤©å¼€å§‹æ—¶é—´ï¼ˆ00:00:00)
        LocalDateTime todayStart = LocalDateTime.of(
                LocalDateTime.now().toLocalDate(),
                LocalTime.MIN
        );
        // èŽ·å–å½“å¤©ç»“æŸæ—¶é—´ï¼ˆ23:59:59.999)
        LocalDateTime todayEnd = LocalDateTime.of(
                LocalDateTime.now().toLocalDate(),
                LocalTime.MAX
        );
        // è½¬æ¢ä¸ºDate类型(如果实体类中createTime是LocalDateTime可直接使用)
        Date startDate = Date.from(todayStart.atZone(ZoneId.systemDefault()).toInstant());
        Date endDate = Date.from(todayEnd.atZone(ZoneId.systemDefault()).toInstant());
        // æž„建查询条件
        QueryWrapper<T> queryWrapper = new QueryWrapper<>();
        queryWrapper.ge("create_time", startDate)  // å¤§äºŽç­‰äºŽå½“天开始
                .lt("create_time", endDate);   // å°äºŽå½“天结束(避免毫秒精度问题)
        // æ‰§è¡ŒæŸ¥è¯¢
        Long aLong = mapper.selectCount(queryWrapper);
        // æ‹¼æŽ¥è®¢å•编号 preFix + æ—¶é—´ï¼ˆyyyyMMdd) + è®¢å•数量(001)
        return preFix + LocalDate.now().format(DateTimeFormatter.ISO_LOCAL_DATE).replaceAll("-", "") + String.format("%03d", (aLong + 1));}
}
src/main/java/com/ruoyi/common/utils/excel/ConfigurableMergeStrategy.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,29 @@
package com.ruoyi.common.utils.excel;
import com.alibaba.excel.metadata.Head;
import com.alibaba.excel.write.merge.AbstractMergeStrategy;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.util.CellRangeAddress;
import java.util.List;
public class ConfigurableMergeStrategy extends AbstractMergeStrategy {
    private final List<CellRangeAddress> mergeRegions;
    public ConfigurableMergeStrategy(List<CellRangeAddress> mergeRegions) {
        this.mergeRegions = mergeRegions;
    }
    @Override
    protected void merge(Sheet sheet, Cell cell, Head head, Integer relativeRowIndex) {
        // æ£€æŸ¥å½“前单元格是否在任何一个合并区域内
        for (CellRangeAddress region : mergeRegions) {
            if (cell.getRowIndex() == region.getFirstRow() &&
                    cell.getColumnIndex() == region.getFirstColumn()) {
                sheet.addMergedRegion(region); // æ‰§è¡Œåˆå¹¶
                break;
            }
        }
    }
}
src/main/java/com/ruoyi/common/utils/excel/CustomCellStyleHandler.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,43 @@
package com.ruoyi.common.utils.excel;
import com.alibaba.excel.metadata.Head;
import com.alibaba.excel.metadata.data.WriteCellData;
import com.alibaba.excel.write.handler.CellWriteHandler;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.metadata.holder.WriteTableHolder;
import org.apache.poi.ss.usermodel.*;
import java.util.List;
public class CustomCellStyleHandler implements CellWriteHandler {
    @Override
    public void beforeCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Head head, Integer integer, Integer integer1, Boolean aBoolean) {
    }
    @Override
    public void afterCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Cell cell, Head head, Integer integer, Boolean aBoolean) {
    }
    @Override
    public void afterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, List<WriteCellData<?>> list, Cell cell, Head head, Integer integer, Boolean aBoolean) {
        int row = cell.getRowIndex();
        int col = cell.getColumnIndex();
        // éœ€è¦æŽ’除的单元格
        if ((row == 2 && col == 0) || (row == 10 && col == 0)) {
            return;
        }
        // ä¸ºå…¶ä»–单元格设置样式(居中+自动换行)
        Workbook workbook = writeSheetHolder.getSheet().getWorkbook();
        CellStyle style = workbook.createCellStyle();
        style.setAlignment(HorizontalAlignment.CENTER);
        style.setVerticalAlignment(VerticalAlignment.CENTER);
        style.setWrapText(true);
        cell.setCellStyle(style);
    }
}
src/main/java/com/ruoyi/common/utils/excel/ExcelClassField.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,77 @@
package com.ruoyi.common.utils.excel;
import java.util.LinkedHashMap;
/**
 * @author sunnyzyq
 * @date 2021/12/17
 */
public class ExcelClassField {
    /** å­—段名称 */
    private String fieldName;
    /** è¡¨å¤´åç§° */
    private String name;
    /** æ˜ å°„关系 */
    private LinkedHashMap<String, String> kvMap;
    /** ç¤ºä¾‹å€¼ */
    private Object example;
    /** æŽ’序 */
    private int sort;
    /** æ˜¯å¦ä¸ºæ³¨è§£å­—段:0-否,1-是 */
    private int hasAnnotation;
    public String getFieldName() {
        return fieldName;
    }
    public void setFieldName(String fieldName) {
        this.fieldName = fieldName;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public LinkedHashMap<String, String> getKvMap() {
        return kvMap;
    }
    public void setKvMap(LinkedHashMap<String, String> kvMap) {
        this.kvMap = kvMap;
    }
    public Object getExample() {
        return example;
    }
    public void setExample(Object example) {
        this.example = example;
    }
    public int getSort() {
        return sort;
    }
    public void setSort(int sort) {
        this.sort = sort;
    }
    public int getHasAnnotation() {
        return hasAnnotation;
    }
    public void setHasAnnotation(int hasAnnotation) {
        this.hasAnnotation = hasAnnotation;
    }
}
src/main/java/com/ruoyi/common/utils/excel/ExcelExport.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,28 @@
package com.ruoyi.common.utils.excel;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
 * @author sunnyzyq
 * @date 2021/12/17
 */
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ExcelExport {
    /** å­—段名称 */
    String value();
    /** å¯¼å‡ºæŽ’序先后: æ•°å­—越小越靠前(默认按Java类字段顺序导出) */
    int sort() default 0;
    /** å¯¼å‡ºæ˜ å°„,格式如:0-未知;1-男;2-女 */
    String kv() default "";
    /** å¯¼å‡ºæ¨¡æ¿ç¤ºä¾‹å€¼ï¼ˆæœ‰å€¼çš„话,直接取该值,不做映射) */
    String example() default "";
}
src/main/java/com/ruoyi/common/utils/excel/ExcelImport.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,31 @@
package com.ruoyi.common.utils.excel;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
 * @author sunnyzyq
 * @date 2021/12/17
 */
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ExcelImport {
    /** å­—段名称 */
    String value();
    /** å¯¼å‡ºæ˜ å°„,格式如:0-未知;1-男;2-女 */
    String kv() default "";
    /** æ˜¯å¦ä¸ºå¿…填字段(默认为非必填) */
    boolean required() default false;
    /** æœ€å¤§é•¿åº¦ï¼ˆé»˜è®¤255) */
    int maxLength() default 255;
    /** å¯¼å…¥å”¯ä¸€æ€§éªŒè¯ï¼ˆå¤šä¸ªå­—段则取联合验证) */
    boolean unique() default false;
}
src/main/java/com/ruoyi/common/utils/excel/ExcelUtils.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,1039 @@
package com.ruoyi.common.utils.excel;
import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
import com.ruoyi.common.utils.StringUtils;
import org.apache.poi.hssf.usermodel.HSSFDataValidation;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.usermodel.ClientAnchor.AnchorType;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.ss.util.CellRangeAddressList;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFClientAnchor;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.lang.reflect.Field;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.net.URL;
import java.text.NumberFormat;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.Map.Entry;
import java.util.regex.Pattern;
/**
 * Excel导入导出工具类
 * åŽŸæ–‡é“¾æŽ¥ï¼ˆä¸å®šæ—¶å¢žåŠ æ–°åŠŸèƒ½ï¼‰: https://zyqok.blog.csdn.net/article/details/121994504
 *
 * @author sunnyzyq
 * @date 2021/12/17
 */
@SuppressWarnings("unused")
public class ExcelUtils {
    private static final String XLSX = ".xlsx";
    private static final String XLS = ".xls";
    public static final String ROW_MERGE = "row_merge";
    public static final String COLUMN_MERGE = "column_merge";
    private static final String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";
    private static final String ROW_NUM = "rowNum";
    private static final String ROW_DATA = "rowData";
    private static final String ROW_TIPS = "rowTips";
    private static final int CELL_OTHER = 0;
    private static final int CELL_ROW_MERGE = 1;
    private static final int CELL_COLUMN_MERGE = 2;
    private static final int IMG_HEIGHT = 30;
    private static final int IMG_WIDTH = 30;
    private static final char LEAN_LINE = '/';
    private static final int BYTES_DEFAULT_LENGTH = 10240;
    private static final NumberFormat NUMBER_FORMAT = NumberFormat.getNumberInstance();
    public static <T> List<T> readFile(File file, Class<T> clazz) throws Exception {
        JSONArray array = readFile(file);
        return getBeanList(array, clazz);
    }
    public static <T> List<T> readMultipartFile(MultipartFile mFile, Class<T> clazz) throws Exception {
        JSONArray array = readMultipartFile(mFile);
        return getBeanList(array, clazz);
    }
    public static JSONArray readFile(File file) throws Exception {
        return readExcel(null, file);
    }
    public static JSONArray readMultipartFile(MultipartFile mFile) throws Exception {
        return readExcel(mFile, null);
    }
    public static Map<String, JSONArray> readFileManySheet(File file) throws Exception {
        return readExcelManySheet(null, file);
    }
    public static Map<String, JSONArray> readFileManySheet(MultipartFile file) throws Exception {
        return readExcelManySheet(file, null);
    }
    private static <T> List<T> getBeanList(JSONArray array, Class<T> clazz) throws Exception {
        List<T> list = new ArrayList<>();
        Map<Integer, String> uniqueMap = new HashMap<>(16);
        for (int i = 0; i < array.size(); i++) {
            list.add(getBean(clazz, array.getJSONObject(i), uniqueMap));
        }
        return list;
    }
    /**
     * èŽ·å–æ¯ä¸ªå¯¹è±¡çš„æ•°æ®
     */
    private static <T> T getBean(Class<T> c, JSONObject obj, Map<Integer, String> uniqueMap) throws Exception {
        T t = c.newInstance();
        Field[] fields = c.getDeclaredFields();
        List<String> errMsgList = new ArrayList<>();
        boolean hasRowTipsField = false;
        StringBuilder uniqueBuilder = new StringBuilder();
        int rowNum = 0;
        for (Field field : fields) {
            // è¡Œå·
            if (field.getName().equals(ROW_NUM)) {
                rowNum = obj.getInteger(ROW_NUM);
                field.setAccessible(true);
                field.set(t, rowNum);
                continue;
            }
            // æ˜¯å¦éœ€è¦è®¾ç½®å¼‚常信息
            if (field.getName().equals(ROW_TIPS)) {
                hasRowTipsField = true;
                continue;
            }
            // åŽŸå§‹æ•°æ®
            if (field.getName().equals(ROW_DATA)) {
                field.setAccessible(true);
                field.set(t, obj.toString());
                continue;
            }
            // è®¾ç½®å¯¹åº”属性值
            setFieldValue(t, field, obj, uniqueBuilder, errMsgList);
        }
        // æ•°æ®å”¯ä¸€æ€§æ ¡éªŒ
        if (uniqueBuilder.length() > 0) {
            if (uniqueMap.containsValue(uniqueBuilder.toString())) {
                Set<Integer> rowNumKeys = uniqueMap.keySet();
                for (Integer num : rowNumKeys) {
                    if (uniqueMap.get(num).equals(uniqueBuilder.toString())) {
                        errMsgList.add(String.format("数据唯一性校验失败,(%s)与第%s行重复)", uniqueBuilder, num));
                    }
                }
            } else {
                uniqueMap.put(rowNum, uniqueBuilder.toString());
            }
        }
        // å¤±è´¥å¤„理
        if (errMsgList.isEmpty() && !hasRowTipsField) {
            return t;
        }
        StringBuilder sb = new StringBuilder();
        int size = errMsgList.size();
        for (int i = 0; i < size; i++) {
            if (i == size - 1) {
                sb.append(errMsgList.get(i));
            } else {
                sb.append(errMsgList.get(i)).append(";");
            }
        }
        // è®¾ç½®é”™è¯¯ä¿¡æ¯
        for (Field field : fields) {
            if (field.getName().equals(ROW_TIPS)) {
                field.setAccessible(true);
                field.set(t, sb.toString());
            }
        }
        return t;
    }
    private static <T> void setFieldValue(T t, Field field, JSONObject obj, StringBuilder uniqueBuilder, List<String> errMsgList) {
        // èŽ·å– ExcelImport æ³¨è§£å±žæ€§
        ExcelImport annotation = field.getAnnotation(ExcelImport.class);
        if (annotation == null) {
            return;
        }
        String cname = annotation.value();
        if (cname.trim().length() == 0) {
            return;
        }
        // èŽ·å–å…·ä½“å€¼
        String val = null;
        if (obj.containsKey(cname)) {
            val = getString(obj.getString(cname));
        }
        if (val == null) {
            return;
        }
        field.setAccessible(true);
        // åˆ¤æ–­æ˜¯å¦å¿…å¡«
        boolean require = annotation.required();
        if (require && val.isEmpty()) {
            errMsgList.add(String.format("[%s]不能为空", cname));
            return;
        }
        // æ•°æ®å”¯ä¸€æ€§èŽ·å–
        boolean unique = annotation.unique();
        if (unique) {
            if (uniqueBuilder.length() > 0) {
                uniqueBuilder.append("--").append(val);
            } else {
                uniqueBuilder.append(val);
            }
        }
        // åˆ¤æ–­æ˜¯å¦è¶…过最大长度
        int maxLength = annotation.maxLength();
        if (maxLength > 0 && val.length() > maxLength) {
            errMsgList.add(String.format("[%s]长度不能超过%s个字符(当前%s个字符)", cname, maxLength, val.length()));
        }
        // åˆ¤æ–­å½“前属性是否有映射关系
        LinkedHashMap<String, String> kvMap = getKvMap(annotation.kv());
        if (!kvMap.isEmpty()) {
            boolean isMatch = false;
            for (String key : kvMap.keySet()) {
                if (kvMap.get(key).equals(val)) {
                    val = key;
                    isMatch = true;
                    break;
                }
            }
            if (!isMatch) {
                errMsgList.add(String.format("[%s]的值不正确(当前值为%s)", cname, val));
                return;
            }
        }
        // å…¶ä½™æƒ…况根据类型赋值
        String fieldClassName = field.getType().getSimpleName();
        try {
            if ("String".equalsIgnoreCase(fieldClassName)) {
                field.set(t, val);
            } else if ("boolean".equalsIgnoreCase(fieldClassName)) {
                field.set(t, Boolean.valueOf(val));
            } else if ("int".equalsIgnoreCase(fieldClassName) || "Integer".equals(fieldClassName)) {
                try {
                    field.set(t, Integer.valueOf(val));
                } catch (NumberFormatException e) {
                    errMsgList.add(String.format("[%s]的值格式不正确(当前值为%s)", cname, val));
                }
            } else if ("double".equalsIgnoreCase(fieldClassName)) {
                field.set(t, Double.valueOf(val));
            } else if ("long".equalsIgnoreCase(fieldClassName)) {
                field.set(t, Long.valueOf(val));
            } else if ("BigDecimal".equalsIgnoreCase(fieldClassName)) {
                field.set(t, new BigDecimal(val));
            } else if ("Date".equalsIgnoreCase(fieldClassName)) {
                try {
                    field.set(t, new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(val));
                } catch (Exception e) {
                    field.set(t, new SimpleDateFormat("yyyy-MM-dd").parse(val));
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    private static Map<String, JSONArray> readExcelManySheet(MultipartFile mFile, File file) throws IOException {
        Workbook book = getWorkbook(mFile, file);
        if (book == null) {
            return Collections.emptyMap();
        }
        Map<String, JSONArray> map = new LinkedHashMap<>();
        for (int i = 0; i < book.getNumberOfSheets(); i++) {
            Sheet sheet = book.getSheetAt(i);
            JSONArray arr = readSheet(sheet);
            map.put(sheet.getSheetName(), arr);
        }
        book.close();
        return map;
    }
    private static JSONArray readExcel(MultipartFile mFile, File file) throws IOException {
        Workbook book = getWorkbook(mFile, file);
        if (book == null) {
            return new JSONArray();
        }
        JSONArray array = readSheet(book.getSheetAt(0));
        book.close();
        return array;
    }
    private static Workbook getWorkbook(MultipartFile mFile, File file) throws IOException {
        boolean fileNotExist = (file == null || !file.exists());
        if (mFile == null && fileNotExist) {
            return null;
        }
        // è§£æžè¡¨æ ¼æ•°æ®
        InputStream in;
        String fileName;
        if (mFile != null) {
            // ä¸Šä¼ æ–‡ä»¶è§£æž
            in = mFile.getInputStream();
            fileName = getString(mFile.getOriginalFilename()).toLowerCase();
        } else {
            // æœ¬åœ°æ–‡ä»¶è§£æž
            in = new FileInputStream(file);
            fileName = file.getName().toLowerCase();
        }
        Workbook book;
        if (fileName.endsWith(XLSX)) {
            book = new XSSFWorkbook(in);
        } else if (fileName.endsWith(XLS)) {
            POIFSFileSystem poifsFileSystem = new POIFSFileSystem(in);
            book = new HSSFWorkbook(poifsFileSystem);
        } else {
            return null;
        }
        in.close();
        return book;
    }
    private static JSONArray readSheet(Sheet sheet) {
        // é¦–行下标
        int rowStart = sheet.getFirstRowNum();
        // å°¾è¡Œä¸‹æ ‡
        int rowEnd = sheet.getLastRowNum();
        // èŽ·å–è¡¨å¤´è¡Œ
        Row headRow = sheet.getRow(rowStart);
        if (headRow == null) {
            return new JSONArray();
        }
        int cellStart = headRow.getFirstCellNum();
        int cellEnd = headRow.getLastCellNum();
        Map<Integer, String> keyMap = new HashMap<>();
        for (int j = cellStart; j < cellEnd; j++) {
            // èŽ·å–è¡¨å¤´æ•°æ®
            String val = getCellValue(headRow.getCell(j));
            if (val != null && val.trim().length() != 0) {
                keyMap.put(j, val);
            }
        }
        // å¦‚果表头没有数据则不进行解析
        if (keyMap.isEmpty()) {
            return (JSONArray) Collections.emptyList();
        }
        // èŽ·å–æ¯è¡ŒJSON对象的值
        JSONArray array = new JSONArray();
        // å¦‚果首行与尾行相同,表明只有一行,返回表头数据
        if (rowStart == rowEnd) {
            JSONObject obj = new JSONObject();
            // æ·»åŠ è¡Œå·
            obj.put(ROW_NUM, 1);
            for (int i : keyMap.keySet()) {
                obj.put(keyMap.get(i), "");
            }
            array.add(obj);
            return array;
        }
        for (int i = rowStart + 1; i <= rowEnd; i++) {
            Row eachRow = sheet.getRow(i);
            JSONObject obj = new JSONObject();
            // æ·»åŠ è¡Œå·
            obj.put(ROW_NUM, i + 1);
            StringBuilder sb = new StringBuilder();
            for (int k = cellStart; k < cellEnd; k++) {
                if (eachRow != null) {
                    String val = getCellValue(eachRow.getCell(k));
                    // æ‰€æœ‰æ•°æ®æ·»åŠ åˆ°é‡Œé¢ï¼Œç”¨äºŽåˆ¤æ–­è¯¥è¡Œæ˜¯å¦ä¸ºç©º
                    sb.append(val);
                    obj.put(keyMap.get(k), val);
                }
            }
            if (sb.length() > 0) {
                array.add(obj);
            }
        }
        return array;
    }
    private static String getCellValue(Cell cell) {
        // ç©ºç™½æˆ–空
        if (cell == null || cell.getCellType() == CellType.BLANK) {
            return "";
        }
        // String类型
        if (cell.getCellType() == CellType.STRING) {
            String val = cell.getStringCellValue();
            if (val == null || val.trim().length() == 0) {
                return "";
            }
            return val.trim();
        }
        // æ•°å­—类型
        if (cell.getCellType() == CellType.NUMERIC) {
            String s = cell.getNumericCellValue() + "";
            // åŽ»æŽ‰å°¾å·´ä¸Šçš„å°æ•°ç‚¹0
            if (Pattern.matches(".*\\.0*", s)) {
                return s.split("\\.")[0];
            } else {
                return s;
            }
        }
        // å¸ƒå°”值类型
        if (cell.getCellType() == CellType.BOOLEAN) {
            return cell.getBooleanCellValue() + "";
        }
        // é”™è¯¯ç±»åž‹
        return cell.getCellFormula();
    }
    public static <T> void exportTemplate(HttpServletResponse response, String fileName, Class<T> clazz) {
        exportTemplate(response, fileName, fileName, clazz, false);
    }
    public static <T> void exportTemplate(HttpServletResponse response, String fileName, String sheetName,
                                          Class<T> clazz) {
        exportTemplate(response, fileName, sheetName, clazz, false);
    }
    public static <T> void exportTemplate(HttpServletResponse response, String fileName, Class<T> clazz,
                                          boolean isContainExample) {
        exportTemplate(response, fileName, fileName, clazz, isContainExample);
    }
    public static <T> void exportTemplate(HttpServletResponse response, String fileName, String sheetName,
                                          Class<T> clazz, boolean isContainExample) {
        // èŽ·å–è¡¨å¤´å­—æ®µ
        List<ExcelClassField> headFieldList = getExcelClassFieldList(clazz);
        // èŽ·å–è¡¨å¤´æ•°æ®å’Œç¤ºä¾‹æ•°æ®
        List<List<Object>> sheetDataList = new ArrayList<>();
        List<Object> headList = new ArrayList<>();
        List<Object> exampleList = new ArrayList<>();
        Map<Integer, List<String>> selectMap = new LinkedHashMap<>();
        for (int i = 0; i < headFieldList.size(); i++) {
            ExcelClassField each = headFieldList.get(i);
            headList.add(each.getName());
            exampleList.add(each.getExample());
            LinkedHashMap<String, String> kvMap = each.getKvMap();
            if (kvMap != null && kvMap.size() > 0) {
                selectMap.put(i, new ArrayList<>(kvMap.values()));
            }
        }
        sheetDataList.add(headList);
        if (isContainExample) {
            sheetDataList.add(exampleList);
        }
        // å¯¼å‡ºæ•°æ®
        export(response, fileName, sheetName, sheetDataList, selectMap);
    }
    private static <T> List<ExcelClassField> getExcelClassFieldList(Class<T> clazz) {
        // è§£æžæ‰€æœ‰å­—段
        Field[] fields = clazz.getDeclaredFields();
        boolean hasExportAnnotation = false;
        Map<Integer, List<ExcelClassField>> map = new LinkedHashMap<>();
        List<Integer> sortList = new ArrayList<>();
        for (Field field : fields) {
            ExcelClassField cf = getExcelClassField(field);
            if (cf.getHasAnnotation() == 1) {
                hasExportAnnotation = true;
            }
            int sort = cf.getSort();
            if (map.containsKey(sort)) {
                map.get(sort).add(cf);
            } else {
                List<ExcelClassField> list = new ArrayList<>();
                list.add(cf);
                sortList.add(sort);
                map.put(sort, list);
            }
        }
        Collections.sort(sortList);
        // èŽ·å–è¡¨å¤´
        List<ExcelClassField> headFieldList = new ArrayList<>();
        if (hasExportAnnotation) {
            for (Integer sort : sortList) {
                for (ExcelClassField cf : map.get(sort)) {
                    if (cf.getHasAnnotation() == 1) {
                        headFieldList.add(cf);
                    }
                }
            }
        } else {
            headFieldList.addAll(map.get(0));
        }
        return headFieldList;
    }
    private static ExcelClassField getExcelClassField(Field field) {
        ExcelClassField cf = new ExcelClassField();
        String fieldName = field.getName();
        cf.setFieldName(fieldName);
        ExcelExport annotation = field.getAnnotation(ExcelExport.class);
        // æ—  ExcelExport æ³¨è§£æƒ…况
        if (annotation == null) {
            cf.setHasAnnotation(0);
            cf.setName(fieldName);
            cf.setSort(0);
            return cf;
        }
        // æœ‰ ExcelExport æ³¨è§£æƒ…况
        cf.setHasAnnotation(1);
        cf.setName(annotation.value());
        String example = getString(annotation.example());
        if (!example.isEmpty()) {
            if (isNumeric(example) && example.length() < 8) {
                cf.setExample(Double.valueOf(example));
            } else {
                cf.setExample(example);
            }
        } else {
            cf.setExample("");
        }
        cf.setSort(annotation.sort());
        // è§£æžæ˜ å°„
        String kv = getString(annotation.kv());
        cf.setKvMap(getKvMap(kv));
        return cf;
    }
    private static LinkedHashMap<String, String> getKvMap(String kv) {
        LinkedHashMap<String, String> kvMap = new LinkedHashMap<>();
        if (kv.isEmpty()) {
            return kvMap;
        }
        String[] kvs = kv.split(";");
        if (kvs.length == 0) {
            return kvMap;
        }
        for (String each : kvs) {
            String[] eachKv = getString(each).split("-");
            if (eachKv.length != 2) {
                continue;
            }
            String k = eachKv[0];
            String v = eachKv[1];
            if (k.isEmpty() || v.isEmpty()) {
                continue;
            }
            kvMap.put(k, v);
        }
        return kvMap;
    }
    /**
     * å¯¼å‡ºè¡¨æ ¼åˆ°æœ¬åœ°
     *
     * @param file      æœ¬åœ°æ–‡ä»¶å¯¹è±¡
     * @param sheetData å¯¼å‡ºæ•°æ®
     */
    public static void exportFile(File file, List<List<Object>> sheetData) {
        if (file == null) {
            System.out.println("文件创建失败");
            return;
        }
        if (sheetData == null) {
            sheetData = new ArrayList<>();
        }
        Map<String, List<List<Object>>> map = new HashMap<>();
        map.put(file.getName(), sheetData);
        export(null, file, file.getName(), map, null);
    }
    /**
     * å¯¼å‡ºè¡¨æ ¼åˆ°æœ¬åœ°
     *
     * @param <T>      å¯¼å‡ºæ•°æ®ç±»ä¼¼ï¼Œå’ŒK类型保持一致
     * @param filePath æ–‡ä»¶çˆ¶è·¯å¾„(如:D:/doc/excel/)
     * @param fileName æ–‡ä»¶åç§°ï¼ˆä¸å¸¦å°¾ç¼€ï¼Œå¦‚:学生表)
     * @param list     å¯¼å‡ºæ•°æ®
     * @throws IOException IO异常
     */
    public static <T> File exportFile(String filePath, String fileName, List<T> list) throws IOException {
        File file = getFile(filePath, fileName);
        List<List<Object>> sheetData = getSheetData(list);
        exportFile(file, sheetData);
        return file;
    }
    /**
     * èŽ·å–æ–‡ä»¶
     *
     * @param filePath filePath æ–‡ä»¶çˆ¶è·¯å¾„(如:D:/doc/excel/)
     * @param fileName æ–‡ä»¶åç§°ï¼ˆä¸å¸¦å°¾ç¼€ï¼Œå¦‚:用户表)
     * @return æœ¬åœ°File文件对象
     */
    private static File getFile(String filePath, String fileName) throws IOException {
        String dirPath = getString(filePath);
        String fileFullPath;
        if (dirPath.isEmpty()) {
            fileFullPath = fileName;
        } else {
            // åˆ¤å®šæ–‡ä»¶å¤¹æ˜¯å¦å­˜åœ¨ï¼Œå¦‚果不存在,则级联创建
            File dirFile = new File(dirPath);
            if (!dirFile.exists()) {
                boolean mkdirs = dirFile.mkdirs();
                if (!mkdirs) {
                    return null;
                }
            }
            // èŽ·å–æ–‡ä»¶å¤¹å…¨å
            if (dirPath.endsWith(String.valueOf(LEAN_LINE))) {
                fileFullPath = dirPath + fileName + XLSX;
            } else {
                fileFullPath = dirPath + LEAN_LINE + fileName + XLSX;
            }
        }
        System.out.println(fileFullPath);
        File file = new File(fileFullPath);
        if (!file.exists()) {
            boolean result = file.createNewFile();
            if (!result) {
                return null;
            }
        }
        return file;
    }
    private static <T> List<List<Object>> getSheetData(List<T> list) {
        // èŽ·å–è¡¨å¤´å­—æ®µ
        List<ExcelClassField> excelClassFieldList = getExcelClassFieldList(list.get(0).getClass());
        List<String> headFieldList = new ArrayList<>();
        List<Object> headList = new ArrayList<>();
        Map<String, ExcelClassField> headFieldMap = new HashMap<>();
        for (ExcelClassField each : excelClassFieldList) {
            String fieldName = each.getFieldName();
            headFieldList.add(fieldName);
            headFieldMap.put(fieldName, each);
            headList.add(each.getName());
        }
        // æ·»åŠ è¡¨å¤´åç§°
        List<List<Object>> sheetDataList = new ArrayList<>();
        sheetDataList.add(headList);
        // èŽ·å–è¡¨æ•°æ®
        for (T t : list) {
            Map<String, Object> fieldDataMap = getFieldDataMap(t);
            Set<String> fieldDataKeys = fieldDataMap.keySet();
            List<Object> rowList = new ArrayList<>();
            for (String headField : headFieldList) {
                if (!fieldDataKeys.contains(headField)) {
                    continue;
                }
                Object data = fieldDataMap.get(headField);
                if (data == null) {
                    rowList.add("");
                    continue;
                }
                ExcelClassField cf = headFieldMap.get(headField);
                // åˆ¤æ–­æ˜¯å¦æœ‰æ˜ å°„关系
                LinkedHashMap<String, String> kvMap = cf.getKvMap();
                if (kvMap == null || kvMap.isEmpty()) {
                    rowList.add(data);
                    continue;
                }
                String val = kvMap.get(data.toString());
                if (isNumeric(val)) {
                    rowList.add(Double.valueOf(val));
                } else {
                    rowList.add(val);
                }
            }
            sheetDataList.add(rowList);
        }
        return sheetDataList;
    }
    private static <T> Map<String, Object> getFieldDataMap(T t) {
        Map<String, Object> map = new HashMap<>();
        Field[] fields = t.getClass().getDeclaredFields();
        try {
            for (Field field : fields) {
                String fieldName = field.getName();
                field.setAccessible(true);
                Object object = field.get(t);
                map.put(fieldName, object);
            }
        } catch (IllegalArgumentException | IllegalAccessException e) {
            e.printStackTrace();
        }
        return map;
    }
    public static void exportEmpty(HttpServletResponse response, String fileName) {
        List<List<Object>> sheetDataList = new ArrayList<>();
        List<Object> headList = new ArrayList<>();
        headList.add("导出无数据");
        sheetDataList.add(headList);
        export(response, fileName, sheetDataList);
    }
    public static void export(HttpServletResponse response, String fileName, List<List<Object>> sheetDataList) {
        export(response, fileName, fileName, sheetDataList, null);
    }
    public static void exportManySheet(HttpServletResponse response, String fileName, Map<String, List<List<Object>>> sheetMap) {
        export(response, null, fileName, sheetMap, null);
    }
    public static void export(HttpServletResponse response, String fileName, String sheetName,
                              List<List<Object>> sheetDataList) {
        export(response, fileName, sheetName, sheetDataList, null);
    }
    public static void export(HttpServletResponse response, String fileName, String sheetName,
                              List<List<Object>> sheetDataList, Map<Integer, List<String>> selectMap) {
        Map<String, List<List<Object>>> map = new HashMap<>();
        map.put(sheetName, sheetDataList);
        export(response, null, fileName, map, selectMap);
    }
    public static <T, K> void export(HttpServletResponse response, String fileName, List<T> list, Class<K> template) {
        // list æ˜¯å¦ä¸ºç©º
        boolean lisIsEmpty = list == null || list.isEmpty();
        // å¦‚果模板数据为空,且导入的数据为空,则导出空文件
        if (template == null && lisIsEmpty) {
            exportEmpty(response, fileName);
            return;
        }
        // å¦‚æžœ list æ•°æ®ï¼Œåˆ™å¯¼å‡ºæ¨¡æ¿æ•°æ®
        if (lisIsEmpty) {
            exportTemplate(response, fileName, template);
            return;
        }
        // å¯¼å‡ºæ•°æ®
        List<List<Object>> sheetDataList = getSheetData(list);
        export(response, fileName, sheetDataList);
    }
    public static void export(HttpServletResponse response, String fileName, List<List<Object>> sheetDataList, Map<Integer, List<String>> selectMap) {
        export(response, fileName, fileName, sheetDataList, selectMap);
    }
    private static void export(HttpServletResponse response, File file, String fileName,
                               Map<String, List<List<Object>>> sheetMap, Map<Integer, List<String>> selectMap) {
        // æ•´ä¸ª Excel è¡¨æ ¼ book å¯¹è±¡
        SXSSFWorkbook book = new SXSSFWorkbook();
        // æ¯ä¸ª Sheet é¡µ
        Set<Entry<String, List<List<Object>>>> entries = sheetMap.entrySet();
        for (Entry<String, List<List<Object>>> entry : entries) {
            List<List<Object>> sheetDataList = entry.getValue();
            Sheet sheet = book.createSheet(entry.getKey());
            Drawing<?> patriarch = sheet.createDrawingPatriarch();
            // è®¾ç½®è¡¨å¤´èƒŒæ™¯è‰²ï¼ˆç°è‰²ï¼‰
            CellStyle headStyle = book.createCellStyle();
            headStyle.setFillForegroundColor(IndexedColors.GREY_80_PERCENT.index);
            headStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
            headStyle.setAlignment(HorizontalAlignment.CENTER);
            headStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.index);
            // è®¾ç½®è¡¨èº«èƒŒæ™¯è‰²ï¼ˆé»˜è®¤è‰²ï¼‰
            CellStyle rowStyle = book.createCellStyle();
            rowStyle.setAlignment(HorizontalAlignment.CENTER);
            rowStyle.setVerticalAlignment(VerticalAlignment.CENTER);
            // è®¾ç½®è¡¨æ ¼åˆ—宽度(默认为15个字节)
            sheet.setDefaultColumnWidth(15);
            // åˆ›å»ºåˆå¹¶ç®—法数组
            int rowLength = sheetDataList.size();
            int columnLength = sheetDataList.get(0).size();
            int[][] mergeArray = new int[rowLength][columnLength];
            for (int i = 0; i < sheetDataList.size(); i++) {
                // æ¯ä¸ª Sheet é¡µä¸­çš„行数据
                Row row = sheet.createRow(i);
                List<Object> rowList = sheetDataList.get(i);
                for (int j = 0; j < rowList.size(); j++) {
                    // æ¯ä¸ªè¡Œæ•°æ®ä¸­çš„单元格数据
                    Object o = rowList.get(j);
                    int v = 0;
                    if (o instanceof URL) {
                        // å¦‚果要导出图片的话, é“¾æŽ¥éœ€è¦ä¼ é€’ URL å¯¹è±¡
                        setCellPicture(book, row, patriarch, i, j, (URL) o);
                    } else {
                        Cell cell = row.createCell(j);
                        if (i == 0) {
                            // ç¬¬ä¸€è¡Œä¸ºè¡¨å¤´è¡Œï¼Œé‡‡ç”¨ç°è‰²åº•背景
                            v = setCellValue(cell, o, headStyle);
                        } else {
                            // å…¶ä»–行为数据行,默认白底色
                            v = setCellValue(cell, o, rowStyle);
                        }
                    }
                    mergeArray[i][j] = v;
                }
            }
            // åˆå¹¶å•元格
            mergeCells(sheet, mergeArray);
            // è®¾ç½®ä¸‹æ‹‰åˆ—表
            setSelect(sheet, selectMap);
        }
        // å†™æ•°æ®
        if (response != null) {
            // å‰ç«¯å¯¼å‡º
            try {
                write(response, book, fileName);
            } catch (IOException e) {
                e.printStackTrace();
            }
        } else {
            // æœ¬åœ°å¯¼å‡º
            FileOutputStream fos;
            try {
                fos = new FileOutputStream(file);
                ByteArrayOutputStream ops = new ByteArrayOutputStream();
                book.write(ops);
                fos.write(ops.toByteArray());
                fos.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    /**
     * åˆå¹¶å½“前Sheet页的单元格
     *
     * @param sheet      å½“前 sheet é¡µ
     * @param mergeArray åˆå¹¶å•元格算法
     */
    private static void mergeCells(Sheet sheet, int[][] mergeArray) {
        // æ¨ªå‘合并
        for (int x = 0; x < mergeArray.length; x++) {
            int[] arr = mergeArray[x];
            boolean merge = false;
            int y1 = 0;
            int y2 = 0;
            for (int y = 0; y < arr.length; y++) {
                int value = arr[y];
                if (value == CELL_COLUMN_MERGE) {
                    if (!merge) {
                        y1 = y;
                    }
                    y2 = y;
                    merge = true;
                } else {
                    merge = false;
                    if (y1 > 0) {
                        sheet.addMergedRegion(new CellRangeAddress(x, x, (y1 - 1), y2));
                    }
                    y1 = 0;
                    y2 = 0;
                }
            }
            if (y1 > 0) {
                sheet.addMergedRegion(new CellRangeAddress(x, x, (y1 - 1), y2));
            }
        }
        // çºµå‘合并
        int xLen = mergeArray.length;
        int yLen = mergeArray[0].length;
        for (int y = 0; y < yLen; y++) {
            boolean merge = false;
            int x1 = 0;
            int x2 = 0;
            for (int x = 0; x < xLen; x++) {
                int value = mergeArray[x][y];
                if (value == CELL_ROW_MERGE) {
                    if (!merge) {
                        x1 = x;
                    }
                    x2 = x;
                    merge = true;
                } else {
                    merge = false;
                    if (x1 > 0) {
                        // æ£€æŸ¥æ˜¯å¦ä¸ŽçŽ°æœ‰åˆå¹¶åŒºåŸŸé‡å ï¼Œå¦‚æžœæœ‰åˆ™åˆ é™¤æ—§åŒºåŸŸï¼Œå†åˆå¹¶æ–°åŒºåŸŸ
                        CellRangeAddress newRegion = new CellRangeAddress((x1 - 1), x2, y, y);
                        handleOverlappingRegions(sheet, newRegion);
                    }
                    x1 = 0;
                    x2 = 0;
                }
            }
            if (x1 > 0) {
                // æ£€æŸ¥æ˜¯å¦ä¸ŽçŽ°æœ‰åˆå¹¶åŒºåŸŸé‡å ï¼Œå¦‚æžœæœ‰åˆ™åˆ é™¤æ—§åŒºåŸŸï¼Œå†åˆå¹¶æ–°åŒºåŸŸ
                CellRangeAddress newRegion = new CellRangeAddress((x1 - 1), x2, y, y);
                handleOverlappingRegions(sheet, newRegion);
            }
        }
    }
    /**
     * æ£€æŸ¥æ˜¯å¦ä¸ŽçŽ°æœ‰åˆå¹¶åŒºåŸŸé‡å ï¼Œå¦‚æžœæœ‰åˆ™åˆ é™¤æ—§åŒºåŸŸï¼Œå†åˆå¹¶æ–°åŒºåŸŸ
     * @param sheet Excel工作表
     * @param newRegion æ–°çš„合并区域
     */
    private static void handleOverlappingRegions(Sheet sheet, CellRangeAddress newRegion) {
        // ç§»é™¤é‡å çš„现有区域
        List<CellRangeAddress> overlappingRegions = new ArrayList<>();
        for (int i = sheet.getNumMergedRegions() - 1; i >= 0; i--) {
            CellRangeAddress existingRegion = sheet.getMergedRegion(i);
            if (newRegion.intersects(existingRegion)) {
                overlappingRegions.add(existingRegion);
                sheet.removeMergedRegion(i);
            }
        }
        // åˆå¹¶åˆ°æ–°åŒºåŸŸï¼ˆè¿™é‡Œç®€å•地将它们添加到新的合并区域列表中,实际应用中可能需要更复杂的逻辑来真正“合并”区域)
        // æ³¨æ„ï¼šPOI的CellRangeAddress没有提供直接合并两个区域的方法,所以这里只是示例
        // å¦‚果需要真正的合并,可能需要自定义逻辑来计算新的边界
        for (CellRangeAddress overlappingRegion : overlappingRegions) {
            sheet.addMergedRegion(overlappingRegion);
        }
        sheet.addMergedRegion(newRegion);
    }
    private static void write(HttpServletResponse response, SXSSFWorkbook book, String fileName) throws IOException {
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        response.setCharacterEncoding("utf-8");
        String name = new String(fileName.getBytes("GBK"), "ISO8859_1") + XLSX;
        response.addHeader("Content-Disposition", "attachment;filename=" + name);
        ServletOutputStream out = response.getOutputStream();
        book.write(out);
        out.flush();
        out.close();
    }
    private static int setCellValue(Cell cell, Object o, CellStyle style) {
        // è®¾ç½®æ ·å¼
        cell.setCellStyle(style);
        // æ•°æ®ä¸ºç©ºæ—¶
        if (o == null) {
            cell.setCellType(CellType.STRING);
            cell.setCellValue("");
            return CELL_OTHER;
        }
        // æ˜¯å¦ä¸ºå­—符串
        if (o instanceof String) {
            String s = o.toString();
            // å½“数字类型长度超过8位时,改为字符串类型显示(Excel数字超过一定长度会显示为科学计数法)
            if (isNumeric(s) && s.length() < 8) {
                cell.setCellType(CellType.NUMERIC);
                cell.setCellValue(Double.parseDouble(s));
                return CELL_OTHER;
            } else {
                cell.setCellType(CellType.STRING);
                cell.setCellValue(s);
            }
            if (s.equals(ROW_MERGE)) {
                return CELL_ROW_MERGE;
            } else if (s.equals(COLUMN_MERGE)) {
                return CELL_COLUMN_MERGE;
            } else {
                return CELL_OTHER;
            }
        }
        // æ˜¯å¦ä¸ºå­—符串
        if (o instanceof Integer || o instanceof Long || o instanceof Double || o instanceof Float) {
            cell.setCellType(CellType.NUMERIC);
            cell.setCellValue(Double.parseDouble(o.toString()));
            return CELL_OTHER;
        }
        // æ˜¯å¦ä¸ºBoolean
        if (o instanceof Boolean) {
            cell.setCellType(CellType.BOOLEAN);
            cell.setCellValue((Boolean) o);
            return CELL_OTHER;
        }
        // å¦‚果是BigDecimal,则默认3位小数
        if (o instanceof BigDecimal) {
            cell.setCellType(CellType.NUMERIC);
            cell.setCellValue(((BigDecimal) o).setScale(3, RoundingMode.HALF_UP).doubleValue());
            return CELL_OTHER;
        }
        // å¦‚果是Date数据,则显示格式化数据
        if (o instanceof Date) {
            cell.setCellType(CellType.STRING);
            cell.setCellValue(formatDate((Date) o));
            return CELL_OTHER;
        }
        // å¦‚果是其他,则默认字符串类型
        cell.setCellType(CellType.STRING);
        cell.setCellValue(o.toString());
        return CELL_OTHER;
    }
    private static void setCellPicture(SXSSFWorkbook wb, Row sr, Drawing<?> patriarch, int x, int y, URL url) {
        // è®¾ç½®å›¾ç‰‡å®½é«˜
        sr.setHeight((short) (IMG_WIDTH * IMG_HEIGHT));
        // ï¼ˆjdk1.7版本try中定义流可自动关闭)
        try (InputStream is = url.openStream(); ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) {
            byte[] buff = new byte[BYTES_DEFAULT_LENGTH];
            int rc;
            while ((rc = is.read(buff, 0, BYTES_DEFAULT_LENGTH)) > 0) {
                outputStream.write(buff, 0, rc);
            }
            // è®¾ç½®å›¾ç‰‡ä½ç½®
            XSSFClientAnchor anchor = new XSSFClientAnchor(0, 0, 0, 0, y, x, y + 1, x + 1);
            // è®¾ç½®è¿™ä¸ªï¼Œå›¾ç‰‡ä¼šè‡ªåŠ¨å¡«æ»¡å•å…ƒæ ¼çš„é•¿å®½
            anchor.setAnchorType(AnchorType.MOVE_AND_RESIZE);
            patriarch.createPicture(anchor, wb.addPicture(outputStream.toByteArray(), HSSFWorkbook.PICTURE_TYPE_JPEG));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    private static String formatDate(Date date) {
        if (date == null) {
            return "";
        }
        SimpleDateFormat format = new SimpleDateFormat(DATE_FORMAT);
        return format.format(date);
    }
    private static void setSelect(Sheet sheet, Map<Integer, List<String>> selectMap) {
        if (selectMap == null || selectMap.isEmpty()) {
            return;
        }
        Set<Entry<Integer, List<String>>> entrySet = selectMap.entrySet();
        for (Entry<Integer, List<String>> entry : entrySet) {
            int y = entry.getKey();
            List<String> list = entry.getValue();
            if (list == null || list.isEmpty()) {
                continue;
            }
            String[] arr = new String[list.size()];
            for (int i = 0; i < list.size(); i++) {
                arr[i] = list.get(i);
            }
            DataValidationHelper helper = sheet.getDataValidationHelper();
            CellRangeAddressList addressList = new CellRangeAddressList(1, 65000, y, y);
            DataValidationConstraint dvc = helper.createExplicitListConstraint(arr);
            DataValidation dv = helper.createValidation(dvc, addressList);
            if (dv instanceof HSSFDataValidation) {
                dv.setSuppressDropDownArrow(false);
            } else {
                dv.setSuppressDropDownArrow(true);
                dv.setShowErrorBox(true);
            }
            sheet.addValidationData(dv);
        }
    }
    private static boolean isNumeric(String str) {
        if(StringUtils.isEmpty(str)){
            return false;
        }
        if (Objects.nonNull(str) && "0.0".equals(str)) {
            return true;
        }
        for (int i = str.length(); --i >= 0; ) {
            if (!Character.isDigit(str.charAt(i))) {
                return false;
            }
        }
        return true;
    }
    private static String getString(String s) {
        if (s == null) {
            return "";
        }
        if (s.isEmpty()) {
            return s;
        }
        return s.trim();
    }
}
src/main/java/com/ruoyi/compensationperformance/controller/CompensationPerformanceController.java
@@ -2,12 +2,14 @@
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.compensationperformance.pojo.CompensationPerformance;
import com.ruoyi.compensationperformance.service.CompensationPerformanceService;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.controller.BaseController;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.purchase.dto.PaymentRegistrationDto;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
@@ -15,6 +17,7 @@
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
/**
@@ -65,5 +68,13 @@
        return delete ? AjaxResult.success("删除成功") : AjaxResult.error("删除失败");
    }
    @Log(title = "导出薪资管理列表", businessType = BusinessType.EXPORT)
    @PostMapping("/export")
    public void export(HttpServletResponse response ) {
        List<CompensationPerformance> list = compensationPerformanceService.list();
        ExcelUtil<CompensationPerformance> util = new ExcelUtil<CompensationPerformance>(CompensationPerformance.class);
        util.exportExcel(response, list, "导出薪资管理列表");
    }
}
src/main/java/com/ruoyi/compensationperformance/pojo/CompensationPerformance.java
@@ -31,7 +31,6 @@
     * å‘˜å·¥id
     */
    @ApiModelProperty("员工id")
    @Excel(name = "员工id")
    private Long staffId;
    /**
src/main/java/com/ruoyi/customervisits/controller/CustomerVisitsController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,50 @@
package com.ruoyi.customervisits.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.compensationperformance.pojo.CompensationPerformance;
import com.ruoyi.customervisits.pojo.CustomerVisits;
import com.ruoyi.customervisits.service.impl.CustomerVisitsServiceImpl;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.controller.BaseController;
import com.ruoyi.framework.web.domain.AjaxResult;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
/**
 * @author :yys
 * @date : 2025/8/29 10:28
 */
@RestController
@Api(tags = "客户拜访")
@RequestMapping("/customerVisits")
public class CustomerVisitsController extends BaseController {
    @Autowired
    private CustomerVisitsServiceImpl customerVisitsService;
    @GetMapping("/listPage")
    @Log(title = "客户拜访-分页查询", businessType = BusinessType.OTHER)
    @ApiOperation("客户拜访-分页查询")
    public AjaxResult listPage(Page page, CustomerVisits customerVisits){
        IPage<CustomerVisits> listPage = customerVisitsService.listPage(page, customerVisits);
        return AjaxResult.success(listPage);
    }
    @Log(title = "客户拜访-添加", businessType = BusinessType.INSERT)
    @ApiOperation("客户拜访-添加")
    @PostMapping("/add")
    @Transactional(rollbackFor = Exception.class)
    public AjaxResult add(@RequestBody CustomerVisits customerVisits){
        boolean save = customerVisitsService.save(customerVisits);
        if (save){
            return AjaxResult.success("添加成功");
        }
        return AjaxResult.error("添加失败");
    }
}
src/main/java/com/ruoyi/customervisits/mapper/CustomerVisitsMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,11 @@
package com.ruoyi.customervisits.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.customervisits.pojo.CustomerVisits;
/**
 * @author :yys
 * @date : 2025/8/29 10:24
 */
public interface CustomerVisitsMapper extends BaseMapper<CustomerVisits> {
}
src/main/java/com/ruoyi/customervisits/pojo/CustomerVisits.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,115 @@
package com.ruoyi.customervisits.pojo;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Builder;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.Date;
/**
 * @author :yys
 * @date : 2025/8/29 10:17
 */
@TableName("customer_visits")
@Data
@Builder
@ApiModel
public class CustomerVisits {
    private static final long serialVersionUID = 1L;
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    /**
     * å®¢æˆ·åç§°
     */
    @ApiModelProperty("客户名称")
    private String customerName;
    /**
     * è”系人
     */
    @ApiModelProperty("联系人")
    private String contact;
    /**
     * è”系电话
     */
    @ApiModelProperty("联系电话")
    private String contactPhone;
    /**
     * ä½ç½®
     */
    @ApiModelProperty("位置")
    private String location;
    /**
     * æ‹œè®¿äºº
     */
    @ApiModelProperty("拜访人")
    private String visitingPeople;
    /**
     * æ‹œè®¿ç›®çš„
     */
    @ApiModelProperty("拜访目的")
    private String purposeVisit;
    /**
     * æ‹œè®¿æ—¶é—´
     */
    @ApiModelProperty("拜访时间")
    private String purposeDate;
    /**
     * æ‹œè®¿åœ°å€
     */
    @ApiModelProperty("拜访地址")
    private String visitAddress;
    /**
     * å¤‡æ³¨
     */
    @ApiModelProperty("备注")
    private String remark;
    /**
     * åˆ›å»ºè€…
     */
    @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;
    /**
     * ç§Ÿæˆ·ID
     */
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
}
src/main/java/com/ruoyi/customervisits/service/CustomerVisitsService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,14 @@
package com.ruoyi.customervisits.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.customervisits.pojo.CustomerVisits;
/**
 * @author :yys
 * @date : 2025/8/29 10:26
 */
public interface CustomerVisitsService extends IService<CustomerVisits> {
    IPage<CustomerVisits> listPage(Page page, CustomerVisits customerVisits);
}
src/main/java/com/ruoyi/customervisits/service/impl/CustomerVisitsServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,35 @@
package com.ruoyi.customervisits.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.customervisits.mapper.CustomerVisitsMapper;
import com.ruoyi.customervisits.pojo.CustomerVisits;
import com.ruoyi.customervisits.service.CustomerVisitsService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
 * @author :yys
 * @date : 2025/8/29 10:27
 */
@Service
@Slf4j
public class CustomerVisitsServiceImpl extends ServiceImpl<CustomerVisitsMapper, CustomerVisits> implements CustomerVisitsService {
    @Autowired
    private CustomerVisitsMapper customerVisitsMapper;
    @Override
    public IPage<CustomerVisits> listPage(Page page, CustomerVisits customerVisits) {
        LambdaQueryWrapper<CustomerVisits> customerVisitsLambdaQueryWrapper = new LambdaQueryWrapper<>();
        if(customerVisits != null && !StringUtils.isEmpty(customerVisits.getCustomerName())){
            customerVisitsLambdaQueryWrapper.like(CustomerVisits::getCustomerName, customerVisits.getCustomerName());
        }
        Page page1 = customerVisitsMapper.selectPage(page, customerVisitsLambdaQueryWrapper);
        return page1;
    }
}
src/main/java/com/ruoyi/device/controller/DeviceDefectRecordController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,51 @@
package com.ruoyi.device.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.device.dto.DeviceDefectRecordDto;
import com.ruoyi.device.dto.DeviceRepairDto;
import com.ruoyi.device.pojo.DeviceDefectRecord;
import com.ruoyi.device.pojo.DeviceLedger;
import com.ruoyi.device.pojo.DeviceRepair;
import com.ruoyi.device.service.DeviceDefectRecordService;
import com.ruoyi.framework.web.domain.AjaxResult;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiModelProperty;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@Api(tags = "设备缺陷记录管理")
@RequestMapping("/defect")
@RestController
public class DeviceDefectRecordController {
    @Autowired
    private DeviceDefectRecordService deviceDefectRecordService;
    @ApiModelProperty("设备缺陷记录列表")
    @GetMapping("/page")
    public AjaxResult page(Page page , DeviceDefectRecordDto deviceDefectRecordDto) {
        return AjaxResult.success(deviceDefectRecordService.listPage(page,deviceDefectRecordDto));
    }
    @ApiModelProperty("设备id查询设备缺陷记录列表")
    @GetMapping("/find/{deviceLedgerId}")
    public AjaxResult find(@PathVariable Long deviceLedgerId) {
        DeviceDefectRecordDto deviceDefectRecordDto = new DeviceDefectRecordDto();
        deviceDefectRecordDto.setDeviceLedgerId(deviceLedgerId);
        return AjaxResult.success(deviceDefectRecordService.listPage(new Page<>(1,-1),deviceDefectRecordDto));
    }
    @PostMapping("/add")
    @ApiModelProperty("添加设备缺陷记录")
    public AjaxResult add(@RequestBody DeviceDefectRecord deviceDefectRecord) {
        return AjaxResult.success(deviceDefectRecordService.add(deviceDefectRecord));
    }
    @PostMapping("/update")
    @ApiModelProperty("修改设备缺陷记录")
    public AjaxResult update(@RequestBody DeviceDefectRecord deviceDefectRecord) {
        return AjaxResult.success(deviceDefectRecordService.updateByDDR(deviceDefectRecord));
    }
    @DeleteMapping("/delete")
    @ApiModelProperty("删除设备缺陷记录")
    public AjaxResult delete(@PathVariable Long id) {
        return AjaxResult.success(deviceDefectRecordService.removeById(id));
    }
}
src/main/java/com/ruoyi/device/controller/DeviceLedgerController.java
@@ -2,14 +2,22 @@
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.device.dto.DeviceLedgerDto;
import com.ruoyi.device.mapper.DeviceLedgerMapper;
import com.ruoyi.device.mapper.DeviceMaintenanceMapper;
import com.ruoyi.device.pojo.DeviceLedger;
import com.ruoyi.device.pojo.DeviceMaintenance;
import com.ruoyi.device.service.IDeviceLedgerService;
import com.ruoyi.device.service.IDeviceMaintenanceService;
import com.ruoyi.framework.aspectj.lang.annotation.Anonymous;
import com.ruoyi.framework.web.domain.AjaxResult;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.annotations.ApiOperation;
import org.apache.commons.lang3.ArrayUtils;
import org.ehcache.spi.service.MaintainableService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
@@ -18,6 +26,7 @@
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
@Api(tags = "设备台账管理")
@RequestMapping("/device/ledger")
@@ -26,6 +35,14 @@
    @Autowired
    private IDeviceLedgerService deviceLedgerService;
    @Autowired
    private DeviceLedgerMapper deviceLedgerMapper;
    @Autowired
    private DeviceMaintenanceMapper deviceMaintenanceMapper;
    @ApiModelProperty("设备台账列表")
    @GetMapping("/page")
@@ -85,4 +102,17 @@
        return AjaxResult.success(deviceLedgerService.list(new QueryWrapper<DeviceLedger>().lambda()
                .select(DeviceLedger::getId, DeviceLedger::getDeviceName,DeviceLedger::getDeviceModel)));
    }
    @GetMapping("scanDevice")
    @ApiOperation("获取设备台账")
    @Anonymous
    public AjaxResult scanDevice(Long id) {
        List<DeviceMaintenance> list = deviceMaintenanceMapper.list1(id);
        DeviceLedger deviceLedger = deviceLedgerMapper.selectById1(id);
        if (list.size()>0){
            deviceLedger.setUpdateTime(list.get(0).getMaintenanceActuallyTime());//最后维护时间
        }
        deviceLedger.setCreateTime(deviceLedger.getUpdateTime().plusMonths(1));//下次维护时间
        return AjaxResult.success(deviceLedger);
    }
}
src/main/java/com/ruoyi/device/controller/DeviceRepairController.java
@@ -37,9 +37,6 @@
    @PostMapping()
    @ApiModelProperty("添加设备报修")
    public AjaxResult add( @RequestBody DeviceRepair deviceRepair) {
        DeviceLedger byId = deviceLedgerService.getById(deviceRepair.getDeviceLedgerId());
        deviceRepair.setDeviceName(byId.getDeviceName());
        deviceRepair.setDeviceModel(byId.getDeviceModel());
        return deviceRepairService.saveDeviceRepair(deviceRepair);
    }
src/main/java/com/ruoyi/device/dto/DeviceDefectRecordDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,14 @@
package com.ruoyi.device.dto;
import com.ruoyi.device.pojo.DeviceDefectRecord;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
public class DeviceDefectRecordDto extends DeviceDefectRecord {
    @ApiModelProperty("设备名称")
    private String deviceName;
    @ApiModelProperty("设备型号")
    private String deviceModel;
}
src/main/java/com/ruoyi/device/dto/DeviceLedgerDto.java
@@ -5,10 +5,12 @@
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.dto.DateQueryDto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
/**
@@ -99,4 +101,25 @@
     * ç§Ÿæˆ·ID
     */
    private Long tenantId;
    @ApiModelProperty("状态")
    private String status;
    @ApiModelProperty("计划运行时间")
    @JsonFormat(pattern = "yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private LocalDate planRuntimeTime;
    @ApiModelProperty("开始运行时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime startRuntimeTime;
    @ApiModelProperty("结束运行时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime endRuntimeTime;
    @ApiModelProperty("运行时长")
    private String runtimeDuration;
}
src/main/java/com/ruoyi/device/execl/DeviceMaintenanceExeclDto.java
@@ -21,7 +21,7 @@
    @ApiModelProperty("规格型号")
    private String deviceModel;
    @Excel(name = "计划保养日期")
    @Excel(name = "计划保养日期", dateFormat = "yyyy-MM-dd HH:mm:ss", width = 30)
    @ApiModelProperty("计划保养日期")
    private Date maintenancePlanTime;
@@ -30,7 +30,7 @@
    private String maintenanceActuallyName;
    @ApiModelProperty("实际保养日期")
    @Excel(name = "实际保养日期")
    @Excel(name = "实际保养日期", dateFormat = "yyyy-MM-dd HH:mm:ss", width = 30)
    private LocalDateTime maintenanceActuallyTime;
    @ApiModelProperty("保养结果 0 ç»´ä¿® 1 å®Œå¥½")
@@ -42,11 +42,11 @@
    private String status;
    @ApiModelProperty("创建时间")
    @Excel(name = "录入时间")
    @Excel(name = "录入时间", dateFormat = "yyyy-MM-dd HH:mm:ss", width = 30)
    private Date createTime;
    @ApiModelProperty("创建人")
    @Excel(name = "录入人")
//    @Excel(name = "录入人")
    private String createUser;
}
src/main/java/com/ruoyi/device/execl/DeviceRepairExeclDto.java
@@ -22,7 +22,7 @@
    private String deviceModel;
    @ApiModelProperty("报修时间")
    @Excel(name = "报修时间")
    @Excel(name = "报修时间", width = 30, dateFormat = "yyyy-MM-dd")
    private Date repairTime;
    @ApiModelProperty("报修人")
@@ -38,7 +38,7 @@
    private String maintenanceName;
    @ApiModelProperty("维修时间")
    @Excel(name = "维修时间")
    @Excel(name = "维修时间", width = 30, dateFormat = "yyyy-MM-dd")
    private Date maintenanceTime;
    @ApiModelProperty("维修结果")
@@ -50,10 +50,10 @@
    private String statusStr;
    @ApiModelProperty("创建时间")
    @Excel(name = "录入时间")
    @Excel(name = "录入时间", width = 30, dateFormat = "yyyy-MM-dd")
    private LocalDateTime createTime;
    @Excel(name = "录入人")
//    @Excel(name = "录入人")
    @ApiModelProperty("创建人")
    private String createUser;
src/main/java/com/ruoyi/device/mapper/DeviceDefectRecordMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,14 @@
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.DeviceDefectRecordDto;
import com.ruoyi.device.pojo.DeviceDefectRecord;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@Mapper
public interface DeviceDefectRecordMapper extends BaseMapper<DeviceDefectRecord> {
    IPage<DeviceDefectRecordDto> listPage(Page page,@Param("deviceDefectRecordDto") DeviceDefectRecordDto deviceDefectRecordDto);
}
src/main/java/com/ruoyi/device/mapper/DeviceLedgerMapper.java
@@ -1,5 +1,6 @@
package com.ruoyi.device.mapper;
import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -17,4 +18,7 @@
    IPage<DeviceLedgerDto> queryPage(Page page, @Param("deviceLedger") DeviceLedgerDto deviceLedgerDto);
    List<DeviceLedgerExeclDto> deviceLedgerExportList(DeviceLedger deviceLedger);
    @InterceptorIgnore(tenantLine = "true")
    DeviceLedger selectById1(Long id);
}
src/main/java/com/ruoyi/device/mapper/DeviceMaintenanceMapper.java
@@ -1,6 +1,7 @@
package com.ruoyi.device.mapper;
import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -9,10 +10,15 @@
import com.ruoyi.device.pojo.DeviceMaintenance;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
@Mapper
public interface DeviceMaintenanceMapper extends BaseMapper<DeviceMaintenance> {
    IPage<DeviceMaintenanceDto> queryPage(Page page, DeviceMaintenanceDto deviceMaintenanceDto);
    DeviceMaintenanceDto detailById(Long id);
    @InterceptorIgnore(tenantLine = "true")
    List<DeviceMaintenance> list1(Long id);
}
src/main/java/com/ruoyi/device/pojo/DeviceDefectRecord.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,51 @@
package com.ruoyi.device.pojo;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
@Data
@TableName("device_defect_record")
public class DeviceDefectRecord {
    @ApiModelProperty("设备缺陷记录id")
    private Long id;
    @ApiModelProperty("设备台账id")
    private Long deviceLedgerId;
    @ApiModelProperty("缺陷描述")
    private String defectDescription;
    @ApiModelProperty("状态")
    private String status;
    @ApiModelProperty("消除时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime eliminateTime;
    @ApiModelProperty("创建时间")
    @TableField(fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    @ApiModelProperty("更新时间")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;
    @ApiModelProperty("创建人")
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    @ApiModelProperty("更新人")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    @ApiModelProperty("租户id")
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
}
src/main/java/com/ruoyi/device/pojo/DeviceLedger.java
@@ -108,4 +108,27 @@
     */
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
    /* ***************************     è¿è¡Œç®¡ç†        ***************************   */
    @ApiModelProperty("状态")
    private String status;
    @ApiModelProperty("计划运行时间")
    @JsonFormat(pattern = "yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private LocalDate planRuntimeTime;
    @ApiModelProperty("开始运行时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime startRuntimeTime;
    @ApiModelProperty("结束运行时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime endRuntimeTime;
    @ApiModelProperty("运行时长")
    private String runtimeDuration;
}
src/main/java/com/ruoyi/device/service/DeviceDefectRecordService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,15 @@
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.DeviceDefectRecordDto;
import com.ruoyi.device.pojo.DeviceDefectRecord;
public interface DeviceDefectRecordService extends IService<DeviceDefectRecord> {
    IPage<DeviceDefectRecordDto> listPage(Page page, DeviceDefectRecordDto deviceDefectRecordDto);
    boolean updateByDDR(DeviceDefectRecord deviceDefectRecord);
    boolean add(DeviceDefectRecord deviceDefectRecord);
}
src/main/java/com/ruoyi/device/service/impl/DeviceDefectRecordServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,67 @@
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.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.device.dto.DeviceDefectRecordDto;
import com.ruoyi.device.mapper.DeviceDefectRecordMapper;
import com.ruoyi.device.mapper.DeviceRepairMapper;
import com.ruoyi.device.pojo.DeviceDefectRecord;
import com.ruoyi.device.pojo.DeviceRepair;
import com.ruoyi.device.service.DeviceDefectRecordService;
import com.ruoyi.device.service.IDeviceRepairService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDateTime;
import java.util.Date;
@Service
@Transactional(rollbackFor = Exception.class)
public class DeviceDefectRecordServiceImpl extends ServiceImpl<DeviceDefectRecordMapper, DeviceDefectRecord> implements DeviceDefectRecordService {
    @Autowired
    private DeviceDefectRecordMapper deviceDefectRecordMapper;
    @Autowired
    private DeviceRepairMapper deviceRepairMapper;
    @Override
    public IPage<DeviceDefectRecordDto> listPage(Page page, DeviceDefectRecordDto deviceDefectRecordDto) {
        return deviceDefectRecordMapper.listPage(page, deviceDefectRecordDto);
    }
    @Override
    public boolean add(DeviceDefectRecord deviceDefectRecord) {
        String status = deviceDefectRecord.getStatus();
        if (status.equals("严重缺陷")) {
            DeviceRepair deviceRepair = new DeviceRepair();
            deviceRepair.setDeviceLedgerId(deviceDefectRecord.getDeviceLedgerId());
            deviceRepair.setRemark(deviceDefectRecord.getDefectDescription());
            //获取当前登录用户
            deviceRepair.setRepairName(SecurityUtils.getUsername());
            deviceRepair.setRepairTime(new Date());
            deviceRepairMapper.insert(deviceRepair);
            return deviceDefectRecordMapper.insert(deviceDefectRecord) > 0;
        } else if (status.equals("一般缺陷")) {
            return deviceDefectRecordMapper.insert(deviceDefectRecord) > 0;
        }
        return false;
    }
    @Override
    public boolean updateByDDR(DeviceDefectRecord deviceDefectRecord) {
        String status = deviceDefectRecord.getStatus();
        if (status.equals("严重缺陷")) {
//            deviceDefectRecord.setStatus("正常");
//            deviceDefectRecord.setEliminateTime(LocalDateTime.now());
            throw new RuntimeException("严重缺陷-设备维修后更新为正常状态");
        } else if (status.equals("一般缺陷")) {
            deviceDefectRecord.setStatus("正常");
        }
        deviceDefectRecord.setEliminateTime(LocalDateTime.now());
        return updateById(deviceDefectRecord);
    }
}
src/main/java/com/ruoyi/device/service/impl/DeviceLedgerServiceImpl.java
@@ -2,6 +2,7 @@
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.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.utils.SecurityUtils;
@@ -23,6 +24,7 @@
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.time.ZoneOffset;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
src/main/java/com/ruoyi/device/service/impl/DeviceMaintenanceServiceImpl.java
@@ -54,17 +54,13 @@
    @Override
    public void export(HttpServletResponse response, Long[] ids) {
        ArrayList<Long> arrayList = new ArrayList<>();
        Arrays.stream(ids).map(id -> {
            return arrayList.add( id);
        });
        List<DeviceMaintenance> supplierManageList = deviceMaintenanceMapper.selectBatchIds(arrayList);
        List<DeviceMaintenance> supplierManageList = deviceMaintenanceMapper.selectList(null);
        ArrayList<DeviceMaintenanceExeclDto> deviceLedgerExeclDtos = new ArrayList<>();
        supplierManageList.stream().forEach(deviceMaintenance -> {
        supplierManageList.forEach(deviceMaintenance -> {
            DeviceMaintenanceExeclDto deviceRepairExeclDto = new DeviceMaintenanceExeclDto();
            BeanUtils.copyProperties(deviceMaintenance,deviceRepairExeclDto);
            deviceRepairExeclDto.setStatus(deviceMaintenance.getStatus() == 0 ? "待维修" : "完结");
            deviceRepairExeclDto.setMaintenanceResult(deviceMaintenance.getMaintenanceResult() == 0 ? "ç»´ä¿®" : "完好");
            deviceRepairExeclDto.setMaintenanceResult(deviceMaintenance.getMaintenanceResult() != null && deviceMaintenance.getMaintenanceResult() == 0 ? "ç»´ä¿®" : "完好");
            deviceLedgerExeclDtos.add(deviceRepairExeclDto);
        });
src/main/java/com/ruoyi/device/service/impl/DeviceRepairServiceImpl.java
@@ -5,10 +5,16 @@
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.utils.bean.BeanUtils;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.device.dto.DeviceDefectRecordDto;
import com.ruoyi.device.dto.DeviceRepairDto;
import com.ruoyi.device.execl.DeviceRepairExeclDto;
import com.ruoyi.device.mapper.DeviceDefectRecordMapper;
import com.ruoyi.device.mapper.DeviceRepairMapper;
import com.ruoyi.device.pojo.DeviceDefectRecord;
import com.ruoyi.device.pojo.DeviceLedger;
import com.ruoyi.device.pojo.DeviceRepair;
import com.ruoyi.device.service.DeviceDefectRecordService;
import com.ruoyi.device.service.IDeviceLedgerService;
import com.ruoyi.device.service.IDeviceRepairService;
import com.ruoyi.framework.web.domain.AjaxResult;
import lombok.AllArgsConstructor;
@@ -26,10 +32,12 @@
@Slf4j
public class DeviceRepairServiceImpl extends ServiceImpl<DeviceRepairMapper, DeviceRepair> implements IDeviceRepairService {
    @Autowired
    private DeviceDefectRecordService deviceDefectRecordService;
    @Autowired
    private DeviceRepairMapper deviceRepairMapper;
    @Autowired
    private IDeviceLedgerService deviceLedgerService;
    @Override
    public IPage<DeviceRepairDto> queryPage(Page page, DeviceRepairDto deviceRepairDto) {
@@ -38,6 +46,9 @@
    @Override
    public AjaxResult saveDeviceRepair(DeviceRepair deviceRepair) {
        DeviceLedger byId = deviceLedgerService.getById(deviceRepair.getDeviceLedgerId());
        deviceRepair.setDeviceName(byId.getDeviceName());
        deviceRepair.setDeviceModel(byId.getDeviceModel());
        boolean save = this.save(deviceRepair);
        if (save){
            return AjaxResult.success();
@@ -48,6 +59,18 @@
    @Override
    public AjaxResult updateDeviceRepair(DeviceRepair deviceRepair) {
        if (this.updateById(deviceRepair)) {
            Long id = deviceRepair.getId();
            //
            DeviceDefectRecordDto deviceDefectRecordDto = new DeviceDefectRecordDto();
            deviceDefectRecordDto.setDeviceLedgerId(id);
            deviceDefectRecordDto.setStatus("严重缺陷");
            List<DeviceDefectRecordDto> records = deviceDefectRecordService.listPage(new Page<>(1, -1), deviceDefectRecordDto).getRecords();
            if (!records.isEmpty()){
                records.forEach(deviceDefectRecord -> {
                    deviceDefectRecord.setStatus("正常");
                    deviceDefectRecordService.updateByDDR(deviceDefectRecord);
                });
            }
            return AjaxResult.success();
        }
        return AjaxResult.error();
src/main/java/com/ruoyi/dto/PageDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,18 @@
package com.ruoyi.dto;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
/**
 * @author buhuazhen
 * @date 2025/9/3
 * @email 3038525872@qq.com
 */
@Getter
@Setter
public class PageDto implements Serializable {
    private Integer current = 1;
    private Integer size = 100;
}
src/main/java/com/ruoyi/equipmentenergyconsumption/controller/ElectricityConsumptionAreaController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,66 @@
package com.ruoyi.equipmentenergyconsumption.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.basic.dto.ProductDto;
import com.ruoyi.basic.dto.ProductTreeDto;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.device.pojo.DeviceLedger;
import com.ruoyi.equipmentenergyconsumption.dto.ElectricityConsumptionAreaTreeDto;
import com.ruoyi.equipmentenergyconsumption.pojo.ElectricityConsumptionArea;
import com.ruoyi.equipmentenergyconsumption.service.ElectricityConsumptionAreaService;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.controller.BaseController;
import com.ruoyi.framework.web.domain.AjaxResult;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
@RestController
@Api(tags = "用电区域")
@RequestMapping("/electricityConsumptionArea")
public class ElectricityConsumptionAreaController extends BaseController {
    @Autowired
    private ElectricityConsumptionAreaService electricityConsumptionAreaService;
    /**
     * æŸ¥è¯¢æ ‘结构
     */
    @GetMapping("/list")
    public List<ElectricityConsumptionAreaTreeDto> selectElectricityConsumptionAreaList() {
        return electricityConsumptionAreaService.selectElectricityConsumptionAreaList();
    }
    @GetMapping("/listPage")
    @ApiOperation("用电区域-分页查询")
    @Log(title = "用电区域-分页查询", businessType = BusinessType.OTHER)
    public AjaxResult listPage(Page page, ElectricityConsumptionArea electricityConsumptionArea) {
        IPage<ElectricityConsumptionArea> listPage = electricityConsumptionAreaService.listPage(page, electricityConsumptionArea);
        return AjaxResult.success(listPage);
    }
    @PostMapping("/add")
    @ApiOperation("用电区域-新增")
    @Log(title = "用电区域-新增", businessType = BusinessType.INSERT)
    public AjaxResult add(@RequestBody ElectricityConsumptionArea electricityConsumptionArea) {
        boolean save = electricityConsumptionAreaService.saveOrUpdate(electricityConsumptionArea);
        return save ? AjaxResult.success() : AjaxResult.error();
    }
    @DeleteMapping("/delete")
    @ApiOperation("用电区域-删除")
    @Log(title = "用电区域-删除", businessType = BusinessType.DELETE)
    public AjaxResult delete(@RequestBody List<Long> ids) {
        if(CollectionUtils.isEmpty(ids)) return AjaxResult.error("请选择至少一条数据");
        boolean remove = electricityConsumptionAreaService.removeBatchByIds(ids);
        return remove ? AjaxResult.success() : AjaxResult.error();
    }
}
src/main/java/com/ruoyi/equipmentenergyconsumption/controller/EnergyPeriodController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,84 @@
package com.ruoyi.equipmentenergyconsumption.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.equipmentenergyconsumption.pojo.ElectricityConsumptionArea;
import com.ruoyi.equipmentenergyconsumption.pojo.EnergyPeriod;
import com.ruoyi.equipmentenergyconsumption.service.EnergyPeriodService;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.controller.BaseController;
import com.ruoyi.framework.web.domain.AjaxResult;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
@RestController
@RequestMapping("/energyPeriod")
@Api(tags = "用电时段")
public class EnergyPeriodController extends BaseController {
    @Autowired
    private EnergyPeriodService energyPeriodService;
    @GetMapping("/listPage")
    @ApiOperation("用电时段-分页查询")
    @Log(title = "用电时段-分页查询", businessType = BusinessType.OTHER)
    public AjaxResult listPage(Page page, EnergyPeriod energyPeriod) {
        IPage<EnergyPeriod> listPage = energyPeriodService.listPage(page, energyPeriod);
        return AjaxResult.success(listPage);
    }
    @PostMapping("/add")
    @ApiOperation("用电时段-新增")
    @Log(title = "用电时段-新增", businessType = BusinessType.INSERT)
    public AjaxResult add(@RequestBody EnergyPeriod energyPeriod) {
        boolean save = energyPeriodService.save(energyPeriod);
        return save ? AjaxResult.success() : AjaxResult.error();
    }
    @PostMapping("/addBatch")
    @ApiOperation("用电时段-批量新增")
    @Log(title = "用电时段-批量新增", businessType = BusinessType.INSERT)
    public AjaxResult addBatch(@RequestBody List<EnergyPeriod> energyPeriods) {
        boolean save = energyPeriodService.saveBatch(energyPeriods);
        return save ? AjaxResult.success() : AjaxResult.error();
    }
    @PostMapping("/update")
    @ApiOperation("用电时段-修改")
    @Log(title = "用电时段-修改", businessType = BusinessType.UPDATE)
    public AjaxResult update(@RequestBody EnergyPeriod energyPeriod) {
        boolean update = energyPeriodService.updateById(energyPeriod);
        return update ? AjaxResult.success() : AjaxResult.error();
    }
    @DeleteMapping("/delete")
    @ApiOperation("用电时段-删除")
    @Log(title = "用电时段-删除", businessType = BusinessType.DELETE)
    public AjaxResult delete(@RequestBody List<Long> ids) {
        if(CollectionUtils.isEmpty(ids)) return AjaxResult.error("请选择至少一条数据");
        boolean remove = energyPeriodService.removeBatchByIds(ids);
        return remove ? AjaxResult.success() : AjaxResult.error("删除失败");
    }
    /**
     * å¯¼å‡ºç”¨ç”µæ—¶æ®µ
     */
    @Log(title = "导出用电时段", businessType = BusinessType.EXPORT)
    @PostMapping("/export")
    @ApiOperation("导出用电时段")
    public void export(HttpServletResponse response) {
        Page page = new Page(-1,-1);
        EnergyPeriod energyPeriod = new EnergyPeriod();
        IPage<EnergyPeriod> listPage = energyPeriodService.listPage(page, energyPeriod);
        ExcelUtil<EnergyPeriod> util = new ExcelUtil<EnergyPeriod>(EnergyPeriod.class);
        util.exportExcel(response, listPage.getRecords() , "用电时段数据");
    }
}
src/main/java/com/ruoyi/equipmentenergyconsumption/controller/EquipmentEnergyConsumptionController.java
@@ -6,6 +6,7 @@
import com.ruoyi.basic.pojo.Customer;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.device.pojo.DeviceLedger;
import com.ruoyi.equipmentenergyconsumption.dto.EquipmentEnergyConsumptionDto;
import com.ruoyi.equipmentenergyconsumption.pojo.EquipmentEnergyConsumption;
import com.ruoyi.equipmentenergyconsumption.service.EquipmentEnergyConsumptionService;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
@@ -14,12 +15,14 @@
import com.ruoyi.framework.web.domain.AjaxResult;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.List;
/**
@@ -59,6 +62,14 @@
        return save ? AjaxResult.success() : AjaxResult.error();
    }
    @PostMapping("/addBatch")
    @ApiOperation("设备能耗-批量新增")
    @Log(title = "设备能耗-批量新增", businessType = BusinessType.INSERT)
    public AjaxResult addBatch(@RequestBody List<EquipmentEnergyConsumption> list) {
        boolean save = equipmentEnergyConsumptionService.saveBatch(list);
        return save ? AjaxResult.success() : AjaxResult.error();
    }
    @PostMapping("/update")
    @ApiOperation("设备能耗-修改")
    @Log(title = "设备能耗-修改", businessType = BusinessType.UPDATE)
@@ -93,8 +104,11 @@
    @PostMapping("/export")
    @ApiOperation("导出设备能耗")
    public void export(HttpServletResponse response) {
        Page page = new Page<>(-1,-1);
        EquipmentEnergyConsumption equipmentEnergyConsumption = new EquipmentEnergyConsumption();
        IPage<EquipmentEnergyConsumption> listPage = equipmentEnergyConsumptionService.listPage(page, equipmentEnergyConsumption);
        ExcelUtil<EquipmentEnergyConsumption> util = new ExcelUtil<EquipmentEnergyConsumption>(EquipmentEnergyConsumption.class);
        util.exportExcel(response, null , "客户档案数据");
        util.exportExcel(response, listPage.getRecords() , "导出设备能耗");
    }
    @GetMapping("/listPageByTrend")
@@ -105,6 +119,26 @@
        return AjaxResult.success(listPage);
    }
    /**
     * å¯¼å‡ºèƒ½æºè¶‹åŠ¿
     */
    @Log(title = "导出能源趋势", businessType = BusinessType.EXPORT)
    @PostMapping("/exportTwo")
    @ApiOperation("导出能源趋势")
    public void exportTwo(HttpServletResponse response) {
        Page page = new Page<>(-1,-1);
        EquipmentEnergyConsumption equipmentEnergyConsumption = new EquipmentEnergyConsumption();
        IPage<EquipmentEnergyConsumption> listPage = equipmentEnergyConsumptionService.listPageByTrend(page, equipmentEnergyConsumption);
        List<EquipmentEnergyConsumptionDto> list = new ArrayList<>();
        listPage.getRecords().forEach(item -> {
            EquipmentEnergyConsumptionDto dto = new EquipmentEnergyConsumptionDto();
            BeanUtils.copyProperties(item, dto);
            list.add(dto);
        });
        ExcelUtil<EquipmentEnergyConsumptionDto> util = new ExcelUtil<EquipmentEnergyConsumptionDto>(EquipmentEnergyConsumptionDto.class);
        util.exportExcel(response, list , "导出能源趋势");
    }
}
src/main/java/com/ruoyi/equipmentenergyconsumption/dto/ElectricityConsumptionAreaTreeDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,22 @@
package com.ruoyi.equipmentenergyconsumption.dto;
import com.baomidou.mybatisplus.annotation.*;
import com.ruoyi.basic.dto.ProductTreeDto;
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
@Data
public class ElectricityConsumptionAreaTreeDto {
        private Long id;
        private Long parentId;
        private String productName;
        private String label; // ç”¨äºŽæ ‘形结构的显示名称
        private List<ElectricityConsumptionAreaTreeDto> children;
}
src/main/java/com/ruoyi/equipmentenergyconsumption/dto/EquipmentEnergyConsumptionDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,111 @@
package com.ruoyi.equipmentenergyconsumption.dto;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.Date;
/**
 * @author :yys
 * @date : 2025/11/3 15:22
 */
@Data
public class EquipmentEnergyConsumptionDto {
    private static final long serialVersionUID = 1L;
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    /**
     * è®¾å¤‡ç¼–号
     */
    @ApiModelProperty("设备编号")
    @Excel(name = "规格型号")
    private String code;
    /**
     * è®¾å¤‡åç§°
     */
    @ApiModelProperty("设备名称")
    @Excel(name = "设备名称")
    private String name;
    /**
     * é¢å®šåŠŸçŽ‡
     */
    @ApiModelProperty("额定功率")
//    @Excel(name = "额定功率")
    private String powerRating;
    /**
     * å®žé™…功率
     */
    @ApiModelProperty("实际功率")
//    @Excel(name = "实际功率")
    private String powerActual;
    /**
     * å½“日用电量
     */
    @ApiModelProperty("当日用电量")
//    @Excel(name = "当日用电量")
    private BigDecimal dayNum;
    /**
     * æ˜¨ç”¨ç”µé‡
     */
    @ApiModelProperty("昨用电量")
    @TableField(exist = false)
    @Excel(name = "昨用电量")
    private BigDecimal toDayNum;
    /**
     * æœ¬æœˆå¹³å‡ç”µé‡ï¼ˆ30天计算)
     */
    @ApiModelProperty("本月平均电量(30天计算)")
    @TableField(exist = false)
    @Excel(name = "本月平均电量")
    private BigDecimal avgNum;
    /**
     * è¶‹åŠ¿
     */
    @ApiModelProperty("趋势")
    @TableField(exist = false)
    @Excel(name = "趋势")
    private String trend;
    /**
     * ç´¯è®¡ç”¨ç”µé‡
     */
    @ApiModelProperty("累计用电量")
//    @Excel(name = "累计用电量")
    private BigDecimal sumNum;
    /**
     * è¿è¡Œæ—¶é—´
     */
    @ApiModelProperty("运行时间")
    @Excel(name = "运行时间" , width = 30, dateFormat = "yyyy-MM-dd")
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date runDate;
    /**
     * æ¯æ—¥é™åˆ¶ç”µé‡
     */
    @ApiModelProperty("每日限制电量")
//    @Excel(name = "每日限制电量")
    private BigDecimal everyNum;
}
src/main/java/com/ruoyi/equipmentenergyconsumption/mapper/ElectricityConsumptionAreaMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,15 @@
package com.ruoyi.equipmentenergyconsumption.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.equipmentenergyconsumption.pojo.ElectricityConsumptionArea;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
@Mapper
public interface ElectricityConsumptionAreaMapper extends BaseMapper<ElectricityConsumptionArea> {
    IPage<ElectricityConsumptionArea> listPage(Page page, @Param("electricityConsumptionArea") ElectricityConsumptionArea electricityConsumptionArea);
}
src/main/java/com/ruoyi/equipmentenergyconsumption/mapper/EnergyPeriodMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,12 @@
package com.ruoyi.equipmentenergyconsumption.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.equipmentenergyconsumption.pojo.EnergyPeriod;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface EnergyPeriodMapper extends BaseMapper<EnergyPeriod> {
    IPage<EnergyPeriod> listPage(Page page, EnergyPeriod energyPeriod);
}
src/main/java/com/ruoyi/equipmentenergyconsumption/pojo/ElectricityConsumptionArea.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,43 @@
package com.ruoyi.equipmentenergyconsumption.pojo;
import com.baomidou.mybatisplus.annotation.*;
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
@TableName("electricity_consumption_area")
@ApiModel
public class ElectricityConsumptionArea {
        @TableId(value = "id", type = IdType.AUTO)
        private Long id;
        /**
         * åŒºåŸŸåç§°
         */
        @ApiModelProperty("区域名称")
        private String areaName;
        /**
         * åŒºåŸŸç±»åž‹
         */
        @ApiModelProperty("区域类型")
        private String areaType;
        /**
         * æŽ’序
         */
        private Long sort;
        /**
         * çˆ¶ç±»id
         */
        private Long fuId;
        /**
         * ç§Ÿæˆ·id
         */
        @TableField(fill = FieldFill.INSERT)
        private Long tenantId;
}
src/main/java/com/ruoyi/equipmentenergyconsumption/pojo/EnergyPeriod.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,59 @@
package com.ruoyi.equipmentenergyconsumption.pojo;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
@Data
@TableName("energy_period")
@ApiModel
public class EnergyPeriod {
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    /**
     * æ—¥æœŸ
     */
    @ApiModelProperty("日期")
    @Excel(name = "日期", width = 30, dateFormat = "yyyy-MM-dd")
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date date;
    /**
     * å•ä»·
     */
    @ApiModelProperty("单价")
    @Excel(name = "单价")
    private Double price;
    /**
     * ç§Ÿæˆ·id
     */
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
    /**
     * å³°æ®µ
     */
    @ApiModelProperty("峰段")
    @Excel(name = "峰段")
    private Double peak;
    /**
     * è°·æ®µ
     */
    @ApiModelProperty("谷段")
    @Excel(name = "谷段")
    private Double valley;
    /**
     * å¹³æ®µ
     */
    @ApiModelProperty("平段")
    @Excel(name = "平段")
    private Double flat;
    /**
     * å°–段
     */
    @ApiModelProperty("尖段")
    @Excel(name = "尖段")
    private Double sharp;
}
src/main/java/com/ruoyi/equipmentenergyconsumption/pojo/EquipmentEnergyConsumption.java
@@ -135,5 +135,8 @@
     */
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
    /**
     *所属用电区域id
     */
    private Long electricityConsumptionAreaId;
}
src/main/java/com/ruoyi/equipmentenergyconsumption/service/ElectricityConsumptionAreaService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,16 @@
package com.ruoyi.equipmentenergyconsumption.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.basic.dto.ProductTreeDto;
import com.ruoyi.equipmentenergyconsumption.dto.ElectricityConsumptionAreaTreeDto;
import com.ruoyi.equipmentenergyconsumption.pojo.ElectricityConsumptionArea;
import java.util.List;
public interface ElectricityConsumptionAreaService extends IService<ElectricityConsumptionArea> {
    IPage<ElectricityConsumptionArea> listPage(Page page, ElectricityConsumptionArea electricityConsumptionArea);
    List<ElectricityConsumptionAreaTreeDto> selectElectricityConsumptionAreaList();
}
src/main/java/com/ruoyi/equipmentenergyconsumption/service/EnergyPeriodService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,10 @@
package com.ruoyi.equipmentenergyconsumption.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.equipmentenergyconsumption.pojo.EnergyPeriod;
public interface EnergyPeriodService extends IService<EnergyPeriod> {
    IPage<EnergyPeriod> listPage(Page page, EnergyPeriod energyPeriod);
}
src/main/java/com/ruoyi/equipmentenergyconsumption/service/impl/ElectricityConsumptionAreaServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,80 @@
package com.ruoyi.equipmentenergyconsumption.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.basic.dto.ProductTreeDto;
import com.ruoyi.basic.pojo.Product;
import com.ruoyi.common.utils.bean.BeanUtils;
import com.ruoyi.equipmentenergyconsumption.dto.ElectricityConsumptionAreaTreeDto;
import com.ruoyi.equipmentenergyconsumption.mapper.ElectricityConsumptionAreaMapper;
import com.ruoyi.equipmentenergyconsumption.pojo.ElectricityConsumptionArea;
import com.ruoyi.equipmentenergyconsumption.service.ElectricityConsumptionAreaService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
@Service
@Slf4j
public class ElectricityConsumptionAreaServiceImpl extends ServiceImpl<ElectricityConsumptionAreaMapper, ElectricityConsumptionArea> implements ElectricityConsumptionAreaService {
    @Autowired
    private ElectricityConsumptionAreaMapper electricityConsumptionAreaMapper;
    @Override
    public IPage<ElectricityConsumptionArea> listPage(Page page, ElectricityConsumptionArea electricityConsumptionArea) {
        return electricityConsumptionAreaMapper.listPage(page,electricityConsumptionArea);
    }
    //左侧树结构
    @Override
    public List<ElectricityConsumptionAreaTreeDto> selectElectricityConsumptionAreaList() {
        // æŸ¥è¯¢æ ¹èŠ‚ç‚¹ï¼ˆparentId ä¸º null)
        LambdaQueryWrapper<ElectricityConsumptionArea> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.isNull(ElectricityConsumptionArea::getFuId);
        // æŸ¥è¯¢æ ¹èŠ‚ç‚¹åˆ—è¡¨
        List<ElectricityConsumptionArea> rootProducts = electricityConsumptionAreaMapper.selectList(queryWrapper);
        // è½¬æ¢ä¸ºæ ‘节点并递归构建子树
        List<ElectricityConsumptionAreaTreeDto> tree = new ArrayList<>();
        for (ElectricityConsumptionArea electricityConsumptionArea : rootProducts) {
            ElectricityConsumptionAreaTreeDto node = convertToTreeDto(electricityConsumptionArea);
            node.setChildren(buildChildrenNodes(electricityConsumptionArea.getId()));
            tree.add(node);
        }
        return tree;
    }
    // å°† Product è½¬æ¢ä¸º ProductTreeDto
    private ElectricityConsumptionAreaTreeDto convertToTreeDto(ElectricityConsumptionArea electricityConsumptionArea) {
        ElectricityConsumptionAreaTreeDto dto = new ElectricityConsumptionAreaTreeDto();
        BeanUtils.copyProperties(electricityConsumptionArea, dto);
        dto.setLabel(electricityConsumptionArea.getAreaName()); // è®¾ç½® label ä¸ºäº§å“åç§°
        dto.setChildren(new ArrayList<>());
        return dto;
    }
    // é€’归构建子节点
    private List<ElectricityConsumptionAreaTreeDto> buildChildrenNodes(Long parentId) {
        // æŸ¥è¯¢å½“前父节点的子节点
        LambdaQueryWrapper<ElectricityConsumptionArea> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(ElectricityConsumptionArea::getFuId, parentId);
        List<ElectricityConsumptionArea> childProducts = electricityConsumptionAreaMapper.selectList(queryWrapper);
        // è½¬æ¢å­èŠ‚ç‚¹å¹¶é€’å½’æž„å»ºå®ƒä»¬çš„å­æ ‘
        List<ElectricityConsumptionAreaTreeDto> children = new ArrayList<>();
        for (ElectricityConsumptionArea child : childProducts) {
            ElectricityConsumptionAreaTreeDto childNode = convertToTreeDto(child);
            childNode.setChildren(buildChildrenNodes(child.getId()));
            children.add(childNode);
        }
        return children;
    }
}
src/main/java/com/ruoyi/equipmentenergyconsumption/service/impl/EnergyPeriodServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,24 @@
package com.ruoyi.equipmentenergyconsumption.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.equipmentenergyconsumption.mapper.EnergyPeriodMapper;
import com.ruoyi.equipmentenergyconsumption.pojo.EnergyPeriod;
import com.ruoyi.equipmentenergyconsumption.service.EnergyPeriodService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
@Slf4j
public class EnergyPeriodServiceImpl extends ServiceImpl<EnergyPeriodMapper, EnergyPeriod> implements EnergyPeriodService {
    @Autowired
    private EnergyPeriodMapper energyPeriodMapper;
    @Override
    public IPage<EnergyPeriod> listPage(Page page, EnergyPeriod energyPeriod) {
        IPage<EnergyPeriod> listPage = energyPeriodMapper.listPage(page, energyPeriod);
        return listPage;
    }
}
src/main/java/com/ruoyi/framework/config/SwaggerConfig.java
@@ -63,8 +63,8 @@
                .build()
                /* è®¾ç½®å®‰å…¨æ¨¡å¼ï¼Œswagger可以设置访问token */
                .securitySchemes(securitySchemes())
                .securityContexts(securityContexts())
                .pathMapping(pathMapping);
                .securityContexts(securityContexts());
//                .pathMapping(pathMapping);
    }
    /**
src/main/java/com/ruoyi/home/controller/HomeController.java
@@ -21,6 +21,7 @@
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.text.ParseException;
import java.util.List;
/**
@@ -63,7 +64,7 @@
    @GetMapping("/todos")
    @Log(title = "待办事项", businessType = BusinessType.OTHER)
    @ApiOperation("待办事项")
    public AjaxResult todos(ApproveProcess req) {
    public AjaxResult todos(ApproveProcess req) throws ParseException {
        List<ApproveProcess> approveProcessList = homeService.todos();
        return AjaxResult.success(approveProcessList);
    }
src/main/java/com/ruoyi/home/service/HomeService.java
@@ -6,6 +6,7 @@
import com.ruoyi.home.dto.QualityStatisticsDto;
import com.ruoyi.home.dto.StatisticsReceivablePayableDto;
import java.text.ParseException;
import java.util.List;
/**
@@ -22,7 +23,7 @@
    QualityStatisticsDto qualityStatistics();
    List<ApproveProcess> todos();
    List<ApproveProcess> todos() throws ParseException;
    StatisticsReceivablePayableDto statisticsReceivablePayable(Integer type);
}
src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java
@@ -8,6 +8,8 @@
import com.ruoyi.framework.security.LoginUser;
import com.ruoyi.home.dto.*;
import com.ruoyi.home.service.HomeService;
import com.ruoyi.lavorissue.mapper.LavorIssueMapper;
import com.ruoyi.lavorissue.pojo.LaborIssue;
import com.ruoyi.procurementrecord.mapper.ProcurementRecordMapper;
import com.ruoyi.procurementrecord.mapper.ProcurementRecordOutMapper;
import com.ruoyi.procurementrecord.pojo.ProcurementRecordOut;
@@ -33,6 +35,8 @@
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.*;
import java.time.temporal.TemporalAdjusters;
import java.util.*;
@@ -73,6 +77,9 @@
    @Autowired
    private PaymentRegistrationMapper paymentRegistrationMapper;
    @Autowired
    private LavorIssueMapper lavorIssueMapper;
    @Autowired
    private SysDeptMapper sysDeptMapper;
@@ -302,14 +309,35 @@
    }
    @Override
    public List<ApproveProcess> todos() {
    public List<ApproveProcess> todos() throws ParseException {
        LoginUser loginUser = SecurityUtils.getLoginUser();
        LambdaQueryWrapper<ApproveProcess> approveProcessLambdaQueryWrapper = new LambdaQueryWrapper<>();
        approveProcessLambdaQueryWrapper.eq(ApproveProcess::getApproveDelete, 0)
                .eq(ApproveProcess::getApproveUserCurrentId, loginUser.getUserId())
                .ne(ApproveProcess::getApproveStatus, 2)
                .eq(ApproveProcess::getTenantId, loginUser.getTenantId());
        return approveProcessMapper.selectList(approveProcessLambdaQueryWrapper);
        List<ApproveProcess> approveProcesses = approveProcessMapper.selectList(approveProcessLambdaQueryWrapper);
        if(CollectionUtils.isEmpty(approveProcesses)){
            approveProcesses = new ArrayList<>();
        }
        // æŸ¥è¯¢æœªé¢†ç”¨åŠ³ä¿è®°å½•
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        LaborIssue laborIssue1 = new LaborIssue();
        laborIssue1.setAdoptedDate(new Date());
        laborIssue1.setIssueDate(sdf.parse(sdf.format(new Date())));
        List<LaborIssue> laborIssues = lavorIssueMapper.list(laborIssue1);
        if(!CollectionUtils.isEmpty(laborIssues)){
            for (LaborIssue laborIssue : laborIssues) {
                ApproveProcess approveProcess = new ApproveProcess();
                approveProcess.setApproveId(laborIssue.getOrderNo());
                approveProcess.setApproveDeptName(sysDeptMapper.selectDeptById(loginUser.getTenantId()).getDeptName());
                approveProcess.setApproveTime(laborIssue.getIssueDate());
                approveProcess.setApproveReason(laborIssue.getDictTypeName() + "-" + laborIssue.getDictName() + "超时未领取");
                approveProcesses.add(approveProcess);
            }
        }
        return approveProcesses;
    }
    /**
@@ -346,29 +374,31 @@
        }
        // åº”æ”¶
        List<SalesLedger> salesLedgers = salesLedgerMapper.selectList(new LambdaQueryWrapper<SalesLedger>()
                .ge(SalesLedger::getEntryDate, startDate)
                .lt(SalesLedger::getEntryDate, endDate)
//                .ge(SalesLedger::getEntryDate, startDate)
//                .lt(SalesLedger::getEntryDate, endDate)
        );
        BigDecimal receivableMoney = salesLedgers.stream().map(SalesLedger::getContractAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
        // åº”付
        List<PurchaseLedger> procurementRecords = purchaseLedgerMapper.selectList(new LambdaQueryWrapper<PurchaseLedger>()
                .ge(PurchaseLedger::getEntryDate, startDate)
                .lt(PurchaseLedger::getEntryDate, endDate)
//                .ge(PurchaseLedger::getEntryDate, startDate)
//                .lt(PurchaseLedger::getEntryDate, endDate)
        );
        BigDecimal payableMoney = procurementRecords.stream().map(PurchaseLedger::getContractAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
        // é¢„æ”¶
        List<ReceiptPayment> receiptPayments = receiptPaymentMapper.selectList(new LambdaQueryWrapper<ReceiptPayment>()
                .ge(ReceiptPayment::getReceiptPaymentDate, startDate)
                .lt(ReceiptPayment::getReceiptPaymentDate, endDate));
//                .ge(ReceiptPayment::getReceiptPaymentDate, startDate)
//                .lt(ReceiptPayment::getReceiptPaymentDate, endDate)
        );
        BigDecimal advanceMoney = receiptPayments.stream().map(ReceiptPayment::getReceiptPaymentAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
        // é¢„付
        List<PaymentRegistration> paymentRegistrations = paymentRegistrationMapper.selectList(new LambdaQueryWrapper<PaymentRegistration>()
                .ge(PaymentRegistration::getPaymentDate, startDate)
                .lt(PaymentRegistration::getPaymentDate, endDate));
//                .ge(PaymentRegistration::getPaymentDate, startDate)
//                .lt(PaymentRegistration::getPaymentDate, endDate)
        );
        BigDecimal prepayMoney = paymentRegistrations.stream().map(PaymentRegistration::getCurrentPaymentAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
        StatisticsReceivablePayableDto statisticsReceivablePayableDto = new StatisticsReceivablePayableDto();
        statisticsReceivablePayableDto.setPayableMoney(payableMoney);
        statisticsReceivablePayableDto.setReceivableMoney(receivableMoney);
        statisticsReceivablePayableDto.setPayableMoney(payableMoney.subtract(prepayMoney));
        statisticsReceivablePayableDto.setReceivableMoney(receivableMoney.subtract(advanceMoney));
        statisticsReceivablePayableDto.setAdvanceMoney(advanceMoney);
        statisticsReceivablePayableDto.setPrepayMoney(prepayMoney);
src/main/java/com/ruoyi/inspectiontask/StorageAttachmentRecordType.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
package com.ruoyi.inspectiontask;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
 * é™„件记录类型枚举
 *
 */
@Getter
@AllArgsConstructor
public enum StorageAttachmentRecordType {
    // ä¾‹å­ å®žé™…开发请删除
    Template("Template","范例"),
    Archives("Archives","文档管理"),
    InspectionTasks("InspectionTasks","生产巡检"),
    QrCodeScanRecords("QrCodeScanRecords","二维码扫码记录文件");
    private final String code;
    private final String info;
}
src/main/java/com/ruoyi/inspectiontask/controller/InspectionTaskController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,77 @@
package com.ruoyi.inspectiontask.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.framework.web.controller.BaseController;
import com.ruoyi.framework.web.domain.R;
import com.ruoyi.inspectiontask.dto.InspectionTaskDto;
import com.ruoyi.inspectiontask.dto.TimingTaskDto;
import com.ruoyi.inspectiontask.pojo.InspectionTask;
import com.ruoyi.inspectiontask.service.InspectionTaskService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
/**
 * @author :yys
 * @date : 2025/9/19 10:52
 */
@RestController
@Api(tags = "巡检任务管理")
@RequestMapping("/inspectionTask")
public class InspectionTaskController extends BaseController {
    @Autowired
    private InspectionTaskService inspectionTaskService;
    /**
     * å·¡æ£€ä»»åŠ¡è¡¨è¡¨æŸ¥è¯¢
     */
    @GetMapping("/list")
    @ApiOperation("巡检任务表表查询")
    public R<IPage<InspectionTaskDto>> list(Page<InspectionTask> page, InspectionTaskDto inspectionTaskDto) {
        IPage<InspectionTaskDto> list = inspectionTaskService.selectInspectionTaskList(page,inspectionTaskDto);
        return R.ok(list);
    }
    /**
     * å¯¼å‡º
     */
    @PostMapping("/export")
    @ApiOperation(value = "导出定时任务记录")
    public void export(HttpServletResponse response) {
        Page page = new Page<>(-1,-1);
        InspectionTaskDto timingTask = new InspectionTaskDto();
        IPage<InspectionTaskDto> list = inspectionTaskService.selectInspectionTaskList(page,timingTask);
        ExcelUtil<InspectionTaskDto> util = new ExcelUtil<>(InspectionTaskDto.class);
        util.exportExcel(response, list.getRecords(), "导出定时任务记录");
    }
    /**
     * å·¡æ£€ä»»åŠ¡è¡¨æ–°å¢žä¿®æ”¹
     */
    @PostMapping("/addOrEditInspectionTask")
    @ApiOperation("巡检任务表新增修改")
    @Transactional(rollbackFor = Exception.class)
    public R addOrEditInspectionTask(@RequestBody InspectionTaskDto inspectionTaskDto) {
        return R.ok(inspectionTaskService.addOrEditInspectionTask(inspectionTaskDto));
    }
    /**
     * å·¡æ£€ä»»åŠ¡è¡¨åˆ é™¤
     */
    @DeleteMapping("/delInspectionTask")
    @ApiOperation("巡检任务表删除")
    @Transactional(rollbackFor = Exception.class)
    public R remove(@RequestBody Long[] ids) {
        return R.ok(inspectionTaskService.delByIds(ids));
    }
}
src/main/java/com/ruoyi/inspectiontask/controller/QrCodeController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,56 @@
package com.ruoyi.inspectiontask.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.framework.web.controller.BaseController;
import com.ruoyi.framework.web.domain.R;
import com.ruoyi.inspectiontask.dto.QrCodeDto;
import com.ruoyi.inspectiontask.pojo.QrCode;
import com.ruoyi.inspectiontask.service.QrCodeService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
/**
 * @author :yys
 * @date : 2025/9/19 10:52
 */
@RestController
@Api(tags = "二维码管理")
@RequestMapping("/qrCode")
public class QrCodeController extends BaseController {
    @Autowired
    private QrCodeService qrCodeService;
    /**
     * äºŒç»´ç ç®¡ç†è¡¨æŸ¥è¯¢
     */
    @GetMapping("/list")
    @ApiOperation("二维码管理表查询")
    public R<IPage<QrCode>> list(Page page, QrCodeDto qrCodeDto) {
        IPage<QrCode> list = qrCodeService.selectQrCodeList(page, qrCodeDto);
        return R.ok(list);
    }
    /**
     * äºŒç»´ç ç®¡ç†è¡¨æ–°å¢žä¿®æ”¹
     */
    @PostMapping("/addOrEditQrCode")
    @ApiOperation("二维码管理表新增修改")
    public R<Long> addOrEditQrCode(@RequestBody QrCodeDto qrCodeDto) {
        return R.ok(qrCodeService.addOrEditQrCode(qrCodeDto));
    }
    /**
     * äºŒç»´ç ç®¡ç†è¡¨åˆ é™¤
     */
    @DeleteMapping("/delQrCode")
    @ApiOperation("二维码管理表删除")
    public R remove(@RequestBody Long[] ids) {
        return R.ok(qrCodeService.delByIds(ids));
    }
}
src/main/java/com/ruoyi/inspectiontask/controller/QrCodeScanRecordController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,56 @@
package com.ruoyi.inspectiontask.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.framework.web.controller.BaseController;
import com.ruoyi.framework.web.domain.R;
import com.ruoyi.inspectiontask.dto.QrCodeScanRecordDto;
import com.ruoyi.inspectiontask.pojo.QrCodeScanRecord;
import com.ruoyi.inspectiontask.service.QrCodeScanRecordService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
/**
 * @author :yys
 * @date : 2025/9/19 10:53
 */
@RestController
@Api(tags = "二维码扫描记录管理")
@RequestMapping("/qrCodeScanRecord")
public class QrCodeScanRecordController extends BaseController {
    @Autowired
    private QrCodeScanRecordService qrCodeScanRecordService;
    /**
     * äºŒç»´ç æ‰«ç è®°å½•表查询
     */
    @GetMapping("/list")
    @ApiOperation("二维码扫码记录表查询")
    public R<IPage<QrCodeScanRecordDto>> list(Page<QrCodeScanRecord> page, QrCodeScanRecordDto qrCodeScanRecordDto) {
        IPage<QrCodeScanRecordDto> list = qrCodeScanRecordService.selectQrCodeScanRecordList(page, qrCodeScanRecordDto);
        return R.ok(list);
    }
    /**
     * äºŒç»´ç æ‰«ç è®°å½•表新增修改
     */
    @PostMapping("/addOrEditQrCodeRecord")
    @ApiOperation("二维码扫码记录表新增修改")
    public R addOrEditQrCodeRecord(@RequestBody QrCodeScanRecordDto qrCodeScanRecordDto) {
        return R.ok(qrCodeScanRecordService.addOrEditQrCodeRecord(qrCodeScanRecordDto));
    }
    /**
     * äºŒç»´ç æ‰«ç è®°å½•表删除
     */
    @DeleteMapping("/delSalesRecord")
    @ApiOperation("二维码扫码记录表删除")
    public R remove(@RequestBody Long[] ids) {
        return R.ok(qrCodeScanRecordService.delByIds(ids));
    }
}
src/main/java/com/ruoyi/inspectiontask/controller/TimingTaskController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,74 @@
package com.ruoyi.inspectiontask.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.framework.web.controller.BaseController;
import com.ruoyi.framework.web.domain.R;
import com.ruoyi.inspectiontask.dto.TimingTaskDto;
import com.ruoyi.inspectiontask.pojo.TimingTask;
import com.ruoyi.inspectiontask.service.TimingTaskService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import org.quartz.SchedulerException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
/**
 * @author :yys
 * @date : 2025/9/19 10:53
 */
@RestController
@Api(tags = "定时任务管理")
@RequestMapping("/timingTask")
public class TimingTaskController extends BaseController {
    @Autowired
    private TimingTaskService timingTaskService;
    /**
     * å®šæ—¶å·¡æ£€ä»»åŠ¡è¡¨æŸ¥è¯¢
     */
    @GetMapping("/list")
    @ApiOperation(value = "定时任务列表")
    public R<IPage<TimingTaskDto>> list(Page<TimingTask> page, TimingTask timingTask) {
        IPage<TimingTaskDto> list = timingTaskService.selectTimingTaskList(page,timingTask);
        return R.ok(list);
    }
    /**
     * å¯¼å‡º
     */
    @PostMapping("/export")
    @ApiOperation(value = "导出定时任务")
    public void export(HttpServletResponse response) {
        Page page = new Page<>(-1,-1);
        TimingTaskDto timingTask = new TimingTaskDto();
        IPage<TimingTaskDto> list = timingTaskService.selectTimingTaskList(page,timingTask);
        ExcelUtil<TimingTaskDto> util = new ExcelUtil<>(TimingTaskDto.class);
        util.exportExcel(response, list.getRecords(), "导出定时任务");
    }
    /**
     * å®šæ—¶å·¡æ£€ä»»åŠ¡è¡¨æ–°å¢žä¿®æ”¹
     */
    @PostMapping("/addOrEditTimingTask")
    @ApiOperation(value = "新增修改定时任务")
    public R addOrEditTimingTask(@RequestBody TimingTaskDto timingTaskDto) throws SchedulerException {
        return R.ok(timingTaskService.addOrEditTimingTask(timingTaskDto));
    }
    /**
     * å®šæ—¶å·¡æ£€ä»»åŠ¡è¡¨åˆ é™¤
     */
    @DeleteMapping("/delTimingTask")
    @ApiOperation(value = "删除定时任务")
    public R remove(@RequestBody Long[] ids) {
        return R.ok(timingTaskService.delByIds(ids));
    }
}
src/main/java/com/ruoyi/inspectiontask/dto/InspectionTaskDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
package com.ruoyi.inspectiontask.dto;
import com.ruoyi.basic.dto.StorageBlobDTO;
import com.ruoyi.basic.pojo.StorageAttachment;
import com.ruoyi.inspectiontask.pojo.InspectionTask;
import lombok.Data;
import java.util.List;
@Data
public class InspectionTaskDto extends InspectionTask {
    private List<StorageBlobDTO> storageBlobDTO;
    private List<StorageBlobDTO> beforeProduction;
    private List<StorageBlobDTO> afterProduction;
    private List<StorageBlobDTO> productionIssues;
    private List<StorageAttachment> attachments;
}
src/main/java/com/ruoyi/inspectiontask/dto/QrCodeDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,8 @@
package com.ruoyi.inspectiontask.dto;
import com.ruoyi.inspectiontask.pojo.QrCode;
import lombok.Data;
@Data
public class QrCodeDto extends QrCode {
}
src/main/java/com/ruoyi/inspectiontask/dto/QrCodeScanRecordDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
package com.ruoyi.inspectiontask.dto;
import com.ruoyi.basic.dto.StorageBlobDTO;
import com.ruoyi.inspectiontask.pojo.QrCode;
import com.ruoyi.inspectiontask.pojo.QrCodeScanRecord;
import lombok.Data;
import java.util.List;
@Data
public class QrCodeScanRecordDto extends QrCodeScanRecord {
    private QrCode qrCode;
    private String scanner;
    private List<StorageBlobDTO> storageBlobDTO;
}
src/main/java/com/ruoyi/inspectiontask/dto/TimingTaskDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,12 @@
package com.ruoyi.inspectiontask.dto;
import com.ruoyi.inspectiontask.pojo.TimingTask;
import lombok.Data;
import java.util.List;
@Data
public class TimingTaskDto extends TimingTask {
    private List<String> inspector;
}
src/main/java/com/ruoyi/inspectiontask/mapper/InspectionTaskMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,11 @@
package com.ruoyi.inspectiontask.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.inspectiontask.pojo.InspectionTask;
/**
 * @author :yys
 * @date : 2025/9/19 10:46
 */
public interface InspectionTaskMapper extends BaseMapper<InspectionTask> {
}
src/main/java/com/ruoyi/inspectiontask/mapper/QrCodeMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,11 @@
package com.ruoyi.inspectiontask.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.inspectiontask.pojo.QrCode;
/**
 * @author :yys
 * @date : 2025/9/19 10:46
 */
public interface QrCodeMapper extends BaseMapper<QrCode> {
}
src/main/java/com/ruoyi/inspectiontask/mapper/QrCodeScanRecordMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,11 @@
package com.ruoyi.inspectiontask.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.inspectiontask.pojo.QrCodeScanRecord;
/**
 * @author :yys
 * @date : 2025/9/19 10:46
 */
public interface QrCodeScanRecordMapper extends BaseMapper<QrCodeScanRecord> {
}
src/main/java/com/ruoyi/inspectiontask/mapper/TimingTaskMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,17 @@
package com.ruoyi.inspectiontask.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.inspectiontask.pojo.TimingTask;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
/**
 * @author :yys
 * @date : 2025/9/19 10:47
 */
@Mapper
public interface TimingTaskMapper extends BaseMapper<TimingTask> {
    TimingTask getTaskById(@Param("id") Long id);
}
src/main/java/com/ruoyi/inspectiontask/pojo/InspectionTask.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,92 @@
package com.ruoyi.inspectiontask.pojo;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
/**
 * @author :yys
 * @date : 2025/9/19 10:25
 */
@Data
@ApiModel
@TableName("inspection_task")
public class InspectionTask {
    private static final long serialVersionUID = 1L;
    /**
     * å·¡æ£€ä»»åŠ¡å”¯ä¸€æ ‡è¯†
     */
    @TableId(type = IdType.AUTO)
    private Long id;
    @ApiModelProperty(value = "设备名称")
    @Excel(name = "巡检任务名称")
    private String taskName;
    @ApiModelProperty(value = "设备id")
    private Integer taskId;
    @ApiModelProperty(value = "巡检人ID")
    private String inspectorId;
    @ApiModelProperty(value = "执行巡检的人员姓名")
    @Excel(name = "执行巡检人员")
    private String inspector;
    @ApiModelProperty(value = "任务附加说明或特殊情况记录")
    @Excel(name = "备注")
    private String remarks;
    @ApiModelProperty(value = "任务登记人ID")
    private Long registrantId;
    @ApiModelProperty(value = "任务登记人姓名")
    @Excel(name = "登记人")
    private String registrant;
    @ApiModelProperty(value = "频次")
    @Excel(name = "频次")
    private String frequencyType;
    @ApiModelProperty(value = "时间细节")
    @Excel(name = "开始日期与时间")
    private String frequencyDetail;
    @ApiModelProperty(value = "巡检地点详细描述")
    private String inspectionLocation;
    @ApiModelProperty(value = "软删除标志,0=未删除,1=已删除")
    private Integer deleted;
    @ApiModelProperty(value = "创建该记录的用户")
    @TableField(fill = com.baomidou.mybatisplus.annotation.FieldFill.INSERT)
    private Integer createUser;
    @ApiModelProperty(value = "记录创建时间")
    @TableField(fill = com.baomidou.mybatisplus.annotation.FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @Excel(name = "登记日期", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    @ApiModelProperty(value = "最后修改该记录的用户")
    @TableField(fill = com.baomidou.mybatisplus.annotation.FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    @ApiModelProperty(value = "记录最后更新时间")
    @TableField(fill = com.baomidou.mybatisplus.annotation.FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
    @ApiModelProperty(value = "租户")
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
}
src/main/java/com/ruoyi/inspectiontask/pojo/QrCode.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,63 @@
package com.ruoyi.inspectiontask.pojo;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
/**
 * @author :yys
 * @date : 2025/9/19 10:29
 */
@Data
@ApiModel
@TableName("qr_code")
public class QrCode {
    private static final long serialVersionUID = 1L;
    /**
     * äºŒç»´ç å”¯ä¸€æ ‡è¯†
     */
    @TableId(type = IdType.AUTO)
    private Long id;
    @ApiModelProperty(value = "设备名称")
    private String deviceName;
    @ApiModelProperty(value = "所在位置描述")
    private String location;
    @ApiModelProperty(value = "租户ID,用于多租户隔离")
    @TableField(fill = com.baomidou.mybatisplus.annotation.FieldFill.INSERT)
    private Long tenantId;
    @ApiModelProperty(value = "软删除标志,0=未删除,1=已删除")
    private Integer deleted;
    @ApiModelProperty(value = "创建该记录的用户")
    @TableField(fill = com.baomidou.mybatisplus.annotation.FieldFill.INSERT)
    private Integer createUser;
    @ApiModelProperty(value = "记录创建时间")
    @TableField(fill = com.baomidou.mybatisplus.annotation.FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    @ApiModelProperty(value = "最后修改该记录的用户")
    @TableField(fill = com.baomidou.mybatisplus.annotation.FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    @ApiModelProperty(value = "记录最后更新时间")
    @TableField(fill = com.baomidou.mybatisplus.annotation.FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
}
src/main/java/com/ruoyi/inspectiontask/pojo/QrCodeScanRecord.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,73 @@
package com.ruoyi.inspectiontask.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 org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
/**
 * @author :yys
 * @date : 2025/9/19 10:29
 */
@Data
@TableName("qr_code_scan_record")
@ApiModel
public class QrCodeScanRecord {
    private static final long serialVersionUID = 1L;
    /**
     * æ‰«ç è®°å½•唯一标识
     */
    @TableId(type = IdType.AUTO)
    private Long id;
    @ApiModelProperty(value = "关联的二维码ID")
    private Long qrCodeId;
    @ApiModelProperty(value = "扫码人用户ID")
    private Long scannerId;
    @ApiModelProperty(value = "设备名称")
    private String deviceName;
    @ApiModelProperty(value = "设备id")
    private Integer deviceId;
    @ApiModelProperty(value = "实际扫码时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime scanTime;
    /**
     * ç§Ÿæˆ·ID
     */
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
    @ApiModelProperty(value = "软删除标志,0=未删除,1=已删除")
    private Integer deleted;
    @ApiModelProperty(value = "创建该记录的用户")
    @TableField(fill = com.baomidou.mybatisplus.annotation.FieldFill.INSERT)
    private Integer createUser;
    @ApiModelProperty(value = "记录创建时间")
    @TableField(fill = com.baomidou.mybatisplus.annotation.FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    @ApiModelProperty(value = "最后修改该记录的用户")
    @TableField(fill = com.baomidou.mybatisplus.annotation.FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    @ApiModelProperty(value = "记录最后更新时间")
    @TableField(fill = com.baomidou.mybatisplus.annotation.FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
}
src/main/java/com/ruoyi/inspectiontask/pojo/TimingTask.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,108 @@
package com.ruoyi.inspectiontask.pojo;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
/**
 * @author :yys
 * @date : 2025/9/19 10:27
 */
@Data
@ApiModel
@TableName("timing_task")
public class TimingTask {
    private static final long serialVersionUID = 1L;
    /**
     * ä¸»é”®ID
     */
    @TableId(type = IdType.AUTO)
    private Long id;
    @ApiModelProperty(value = "设备名称")
    @Excel(name = "巡检任务名称")
    private String taskName;
    @ApiModelProperty(value = "设备id")
    private Integer taskId;
    @ApiModelProperty(value = "巡检人")
    @Excel(name = "执行巡检人")
    private String inspectorIds;
    @ApiModelProperty(value = "巡检地点")
    private String inspectionLocation;
    @ApiModelProperty(value = "频次")
    @Excel(name = "频次")
    private String frequencyType;
    @ApiModelProperty(value = "频次详情")
    @Excel(name = "开始日期与时间")
    private String frequencyDetail;
    @ApiModelProperty(value = "下次执行时间")
    private LocalDateTime nextExecutionTime;
    @ApiModelProperty(value = "最后执行时间")
    private LocalDateTime lastExecutionTime;
    @ApiModelProperty(value = "是否激活")
    private boolean isActive;
    @ApiModelProperty(value = "备注")
    @Excel(name = "备注")
    private String remarks;
    @ApiModelProperty(value = "登记人id")
    private Long registrantId;
    @ApiModelProperty(value = "登记人")
    @Excel(name = "登记人")
    private String registrant;
    @ApiModelProperty(value = "登记日期")
    @Excel(name = "登记日期", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
    private LocalDate registrationDate;
    @ApiModelProperty(value = "状态")
    private String status;
    @ApiModelProperty(value = "软删除标志,0=未删除,1=已删除")
    private Integer deleted;
    @ApiModelProperty(value = "创建该记录的用户")
    @TableField(fill = com.baomidou.mybatisplus.annotation.FieldFill.INSERT)
    private Integer createUser;
    @ApiModelProperty(value = "记录创建时间")
    @TableField(fill = com.baomidou.mybatisplus.annotation.FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    @ApiModelProperty(value = "最后修改该记录的用户")
    @TableField(fill = com.baomidou.mybatisplus.annotation.FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    @ApiModelProperty(value = "记录最后更新时间")
    @TableField(fill = com.baomidou.mybatisplus.annotation.FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
    @ApiModelProperty(value = "租户ID")
    @TableField(fill = com.baomidou.mybatisplus.annotation.FieldFill.INSERT)
    private Long tenantId;
}
src/main/java/com/ruoyi/inspectiontask/service/InspectionTaskService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
package com.ruoyi.inspectiontask.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.inspectiontask.dto.InspectionTaskDto;
import com.ruoyi.inspectiontask.pojo.InspectionTask;
/**
 * @author :yys
 * @date : 2025/9/19 10:49
 */
public interface InspectionTaskService extends IService<InspectionTask> {
    IPage<InspectionTaskDto> selectInspectionTaskList(Page<InspectionTask> page, InspectionTaskDto inspectionTaskDto);
    int addOrEditInspectionTask(InspectionTaskDto inspectionTaskDto);
    int delByIds(Long[] ids);
}
src/main/java/com/ruoyi/inspectiontask/service/QrCodeScanRecordService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
package com.ruoyi.inspectiontask.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.inspectiontask.dto.QrCodeScanRecordDto;
import com.ruoyi.inspectiontask.pojo.QrCodeScanRecord;
/**
 * @author :yys
 * @date : 2025/9/19 10:50
 */
public interface QrCodeScanRecordService extends IService<QrCodeScanRecord> {
    IPage<QrCodeScanRecordDto> selectQrCodeScanRecordList(Page<QrCodeScanRecord> page, QrCodeScanRecordDto qrCodeScanRecordDto);
    int addOrEditQrCodeRecord(QrCodeScanRecordDto qrCodeScanRecordDto);
    int delByIds(Long[] ids);
}
src/main/java/com/ruoyi/inspectiontask/service/QrCodeService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,19 @@
package com.ruoyi.inspectiontask.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.inspectiontask.dto.QrCodeDto;
import com.ruoyi.inspectiontask.pojo.QrCode;
/**
 * @author :yys
 * @date : 2025/9/19 10:50
 */
public interface QrCodeService extends IService<QrCode>{
    IPage<QrCode> selectQrCodeList(Page page, QrCodeDto qrCodeDto);
    Long addOrEditQrCode(QrCodeDto qrCodeDto);
    int delByIds(Long[] ids);
}
src/main/java/com/ruoyi/inspectiontask/service/TimingTaskService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
package com.ruoyi.inspectiontask.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.inspectiontask.dto.TimingTaskDto;
import com.ruoyi.inspectiontask.pojo.TimingTask;
import org.quartz.SchedulerException;
/**
 * @author :yys
 * @date : 2025/9/19 10:51
 */
public interface TimingTaskService extends IService<TimingTask> {
    IPage<TimingTaskDto> selectTimingTaskList(Page<TimingTask> page, TimingTask timingTask);
    int addOrEditTimingTask(TimingTaskDto timingTaskDto) throws SchedulerException;
    int delByIds(Long[] ids);
    void updateTaskExecutionTime(Long taskId);
}
src/main/java/com/ruoyi/inspectiontask/service/impl/InspectionTaskServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,257 @@
package com.ruoyi.inspectiontask.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.basic.dto.StorageBlobDTO;
import com.ruoyi.basic.mapper.StorageAttachmentMapper;
import com.ruoyi.basic.mapper.StorageBlobMapper;
import com.ruoyi.basic.pojo.StorageAttachment;
import com.ruoyi.basic.pojo.StorageBlob;
import com.ruoyi.basic.service.StorageAttachmentService;
import com.ruoyi.common.utils.MinioUtils;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.bean.BeanUtils;
import com.ruoyi.inspectiontask.dto.InspectionTaskDto;
import com.ruoyi.inspectiontask.mapper.InspectionTaskMapper;
import com.ruoyi.inspectiontask.pojo.InspectionTask;
import com.ruoyi.inspectiontask.service.InspectionTaskService;
import com.ruoyi.project.system.domain.SysUser;
import com.ruoyi.project.system.mapper.SysUserMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
import static com.ruoyi.common.constant.StorageAttachmentConstants.StorageAttachmentFile;
import static com.ruoyi.common.enums.StorageAttachmentRecordType.InspectionTasks;
/**
 * @author :yys
 * @date : 2025/9/19 10:54
 */
@Service
@Slf4j
public class InspectionTaskServiceImpl extends ServiceImpl<InspectionTaskMapper, InspectionTask> implements InspectionTaskService {
    @Autowired
    private InspectionTaskMapper inspectionTaskMapper;
    @Autowired
    private StorageAttachmentService storageAttachmentService;
    @Autowired
    private StorageBlobMapper storageBlobMapper;
    @Autowired
    private StorageAttachmentMapper storageAttachmentMapper;
    @Autowired
    private MinioUtils minioUtils;
    @Autowired
    private SysUserMapper sysUserMapper;
    @Override
    public IPage<InspectionTaskDto> selectInspectionTaskList(Page<InspectionTask> page, InspectionTaskDto inspectionTaskDto) {
        LambdaQueryWrapper<InspectionTask> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.orderByDesc(InspectionTask::getCreateTime);
        IPage<InspectionTask> entityPage = inspectionTaskMapper.selectPage(page, queryWrapper);
        //  æ— æ•°æ®æå‰è¿”回
        if (CollectionUtils.isEmpty(entityPage.getRecords())) {
            return new Page<>(entityPage.getCurrent(), entityPage.getSize(), entityPage.getTotal());
        }
        // èŽ·å–id集合
        List<Long> ids = entityPage.getRecords().stream().map(InspectionTask::getId).collect(Collectors.toList());
        //登记人ids
        List<Long> registrantIds = entityPage.getRecords().stream().map(InspectionTask::getRegistrantId).collect(Collectors.toList());
        // æ‰¹é‡æŸ¥è¯¢ç™»è®°äºº
        Map<Long, SysUser> sysUserMap;
        if (!registrantIds.isEmpty()) {
            List<SysUser> sysUsers = sysUserMapper.selectList(registrantIds);
            sysUserMap = sysUsers.stream().collect(Collectors.toMap(SysUser::getUserId, Function.identity()));
        } else {
            sysUserMap = new HashMap<>();
        }
        //巡检人ids
        List<String> inspectorIds = entityPage.getRecords().stream().map(InspectionTask::getInspectorId).collect(Collectors.toList());
        //获取所有不重复的用户ID
        Set<Long> allUserIds = entityPage.getRecords().stream()
                .map(InspectionTask::getInspectorId) // èŽ·å–"2,3"这样的字符串
                .filter(StringUtils::isNotBlank)
                .flatMap(idsStr -> Arrays.stream(idsStr.split(",")))
                .map(idStr -> {
                    try {
                        return Long.parseLong(idStr.trim());
                    } catch (NumberFormatException e) {
                        return null;
                    }
                })
                .filter(Objects::nonNull)
                .collect(Collectors.toSet());
        // ä½¿ç”¨SQL批量查询用户信息
        Map<Long, String> userIdToNameMap = allUserIds.isEmpty()
                ? Collections.emptyMap()
                : sysUserMapper.selectUsersByIds(new ArrayList<>(allUserIds))
                .stream()
                .collect(Collectors.toMap(
                        SysUser::getUserId,
                        SysUser::getNickName,
                        (existing, replacement) -> existing));
        //处理附件
        Map<Long, List<StorageAttachment>> attachmentsMap = storageAttachmentMapper.selectList(new LambdaQueryWrapper<StorageAttachment>().in(StorageAttachment::getRecordId, ids)
                        .eq(StorageAttachment::getRecordType, InspectionTasks.ordinal()))
                .stream()
                .collect(Collectors.groupingBy(StorageAttachment::getRecordId));
        //  æ‰¹é‡æŸ¥è¯¢æ‰€æœ‰éœ€è¦çš„æ–‡ä»¶æ•°æ®
        Set<Long> blobIds = attachmentsMap.values()
                .stream()
                .flatMap(List::stream)
                .map(StorageAttachment::getStorageBlobId)
                .collect(Collectors.toSet());
        Map<Long, StorageBlob> blobMap = blobIds.isEmpty()
                ? Collections.emptyMap()
                : storageBlobMapper.selectList(new LambdaQueryWrapper<StorageBlob>().in(StorageBlob::getId, blobIds))
                .stream()
                .collect(Collectors.toMap(StorageBlob::getId, Function.identity()));
        List<InspectionTaskDto> dtoList = entityPage.getRecords().stream().map(inspectionTask -> {
            InspectionTaskDto dto = new InspectionTaskDto();
            BeanUtils.copyProperties(inspectionTask, dto);  // å¤åˆ¶ä¸»å¯¹è±¡å±žæ€§
            // è®¾ç½®ç™»è®°äºº
            SysUser sysUser = sysUserMap.get(inspectionTask.getRegistrantId());
            if (sysUser != null) {
                dto.setRegistrant(sysUser.getNickName());
            }
            // å¤„理巡检人名称
            if (StringUtils.isNotBlank(inspectionTask.getInspectorId())) {
                String inspectorNames = Arrays.stream(inspectionTask.getInspectorId().split(","))
                        .map(String::trim)
                        .map(idStr -> {
                            try {
                                Long userId = Long.parseLong(idStr);
                                return userIdToNameMap.getOrDefault(userId, "未知用户(" + idStr + ")");
                            } catch (NumberFormatException e) {
                                return "无效ID(" + idStr + ")";
                            }
                        })
                        .collect(Collectors.joining(","));
                dto.setInspector(inspectorNames);
            }
            // åˆå§‹åŒ–三个附件列表
            dto.setBeforeProduction(new ArrayList<>());
            dto.setAfterProduction(new ArrayList<>());
            dto.setProductionIssues(new ArrayList<>());
            // å¤„理附件分类
            Optional.ofNullable(attachmentsMap.get(inspectionTask.getId()))
                    .orElse(Collections.emptyList())
                    .forEach(attachment -> {
                        StorageBlob blob = blobMap.get(attachment.getStorageBlobId());
                        if (blob != null) {
                            // åˆ›å»ºé™„ä»¶DTO
                            StorageBlobDTO blobDto = createBlobDto(blob);
                            // æ ¹æ®type分类
                            switch ((int) blob.getType().longValue()) {
                                case 0:
                                    dto.getBeforeProduction().add(blobDto);
                                    break;
                                case 1:
                                    dto.getAfterProduction().add(blobDto);
                                    break;
                                case 2:
                                    dto.getProductionIssues().add(blobDto);
                                    break;
                                default:
                                    // å¯é€‰ï¼šè®°å½•未分类类型
                                    break;
                            }
                        }
                    });
            return dto;
        }).collect(Collectors.toList());
        // 7. æž„建返回分页对象
        IPage<InspectionTaskDto> resultPage = new Page<>();
        BeanUtils.copyProperties(entityPage, resultPage);
        resultPage.setRecords(dtoList);
        return resultPage;
    }
    // æå–创建BlobDTO的公共方法
    private StorageBlobDTO createBlobDto(StorageBlob blob) {
        StorageBlobDTO dto = new StorageBlobDTO();
        BeanUtils.copyProperties(blob, dto);
        // è®¾ç½®URL
        dto.setUrl(minioUtils.getPreviewUrls(
                blob.getBucketFilename(),
                blob.getBucketName(),
                true
        ));
        // è®¾ç½®ä¸‹è½½URL
        dto.setDownloadUrl(minioUtils.getDownloadUrls(
                blob.getBucketFilename(),
                blob.getBucketName(),
                blob.getOriginalFilename(),
                true
        ));
        return dto;
    }
    @Override
    public int addOrEditInspectionTask(InspectionTaskDto inspectionTaskDto) {
        InspectionTask inspectionTask = new InspectionTask();
        BeanUtils.copyProperties(inspectionTaskDto, inspectionTask);
        inspectionTask.setRegistrantId(SecurityUtils.getLoginUser().getUserId());
        inspectionTask.setRegistrant(SecurityUtils.getLoginUser().getUsername());
        int i;
        if (Objects.isNull(inspectionTaskDto.getId())) {
            i = inspectionTaskMapper.insert(inspectionTask);
        } else {
            i = inspectionTaskMapper.updateById(inspectionTask);
        }
        if (inspectionTaskDto.getStorageBlobDTO() != null && !inspectionTaskDto.getStorageBlobDTO().isEmpty()) {
            List<StorageAttachment> attachments = new ArrayList<>();
            for (StorageBlobDTO storageBlobDTO : inspectionTaskDto.getStorageBlobDTO()) {
                StorageAttachment storageAttachment = new StorageAttachment(
                        StorageAttachmentFile,
                        (long) InspectionTasks.ordinal(),
                        inspectionTask.getId()
                );
                storageAttachment.setStorageBlobDTO(storageBlobDTO);
                attachments.add(storageAttachment);
            }
            storageAttachmentService.saveStorageAttachment(attachments, inspectionTask.getId(), InspectionTasks, StorageAttachmentFile);
        }
        return i;
    }
    @Override
    public int delByIds(Long[] ids) {
        // æ£€æŸ¥å‚æ•°
        if (ids == null || ids.length == 0) {
            return 0;
        }
        return inspectionTaskMapper.deleteBatchIds(Arrays.asList(ids));
    }
}
src/main/java/com/ruoyi/inspectiontask/service/impl/QrCodeScanRecordServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,194 @@
package com.ruoyi.inspectiontask.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.basic.dto.StorageBlobDTO;
import com.ruoyi.basic.mapper.StorageAttachmentMapper;
import com.ruoyi.basic.mapper.StorageBlobMapper;
import com.ruoyi.basic.pojo.StorageAttachment;
import com.ruoyi.basic.pojo.StorageBlob;
import com.ruoyi.basic.service.StorageAttachmentService;
import com.ruoyi.common.constant.StorageAttachmentConstants;
import com.ruoyi.common.utils.MinioUtils;
import com.ruoyi.common.utils.bean.BeanUtils;
import com.ruoyi.inspectiontask.dto.QrCodeScanRecordDto;
import com.ruoyi.inspectiontask.mapper.QrCodeMapper;
import com.ruoyi.inspectiontask.mapper.QrCodeScanRecordMapper;
import com.ruoyi.inspectiontask.pojo.QrCode;
import com.ruoyi.inspectiontask.pojo.QrCodeScanRecord;
import com.ruoyi.inspectiontask.service.QrCodeScanRecordService;
import com.ruoyi.project.system.domain.SysUser;
import com.ruoyi.project.system.mapper.SysUserMapper;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
import static com.ruoyi.common.constant.StorageAttachmentConstants.StorageAttachmentFile;
import static com.ruoyi.common.enums.StorageAttachmentRecordType.QrCodeScanRecords;
/**
 * @author :yys
 * @date : 2025/9/19 10:54
 */
@Service
@Slf4j
public class QrCodeScanRecordServiceImpl extends ServiceImpl<QrCodeScanRecordMapper, QrCodeScanRecord> implements QrCodeScanRecordService {
    @Autowired
    private QrCodeScanRecordMapper qrCodeScanRecordMapper;
    @Autowired
    private QrCodeMapper qrCodeMapper;
    @Autowired
    private StorageAttachmentService storageAttachmentService;
    @Autowired
    private StorageBlobMapper storageBlobMapper;
    @Autowired
    private StorageAttachmentMapper storageAttachmentMapper;
    @Autowired
    private MinioUtils minioUtils;
    @Autowired
    private SysUserMapper sysUserMapper;
    @Override
    public IPage<QrCodeScanRecordDto> selectQrCodeScanRecordList(Page<QrCodeScanRecord> page, QrCodeScanRecordDto qrCodeScanRecordDto) {
        // 1. æž„建基础查询条件
        LambdaQueryWrapper<QrCodeScanRecord> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.orderByDesc(QrCodeScanRecord::getCreateTime);
        // 2. æ‰§è¡Œåˆ†é¡µæŸ¥è¯¢
        IPage<QrCodeScanRecord> scanRecordIPage = qrCodeScanRecordMapper.selectPage(page, queryWrapper);
        // 3. æ— æ•°æ®æå‰è¿”回
        if (CollectionUtils.isEmpty(scanRecordIPage.getRecords())) {
            return new Page<>(scanRecordIPage.getCurrent(), scanRecordIPage.getSize(), scanRecordIPage.getTotal());
        }
        // 4. æ‰¹é‡èŽ·å–æ‰€æœ‰è®°å½•ID和二维码ID
        List<Long> recordIds = scanRecordIPage.getRecords().stream()
                .map(QrCodeScanRecord::getId)
                .collect(Collectors.toList());
        Set<Long> qrCodeIds = scanRecordIPage.getRecords().stream()
                .map(QrCodeScanRecord::getQrCodeId)
                .filter(Objects::nonNull)
                .collect(Collectors.toSet());
        // 5. æ‰¹é‡æŸ¥è¯¢å…³è”数据(使用最新API)
        // 5.1 æŸ¥è¯¢äºŒç»´ç ä¿¡æ¯ï¼ˆæ›¿æ¢selectBatchIds为selectByIds)
        Map<Long, QrCode> qrCodeMap = qrCodeIds.isEmpty()
                ? Collections.emptyMap()
                : qrCodeMapper.selectBatchIds(qrCodeIds).stream()
                .collect(Collectors.toMap(QrCode::getId, Function.identity()));
        // 5.2 æŸ¥è¯¢é™„件关联关系
        Map<Long, List<StorageAttachment>> attachmentsMap = storageAttachmentMapper
                .selectList(new LambdaQueryWrapper<StorageAttachment>()
                        .in(StorageAttachment::getRecordId, recordIds)
                        .eq(StorageAttachment::getRecordType, QrCodeScanRecords.ordinal()))
                .stream()
                .collect(Collectors.groupingBy(StorageAttachment::getRecordId));
        // 5.3 æŸ¥è¯¢æ–‡ä»¶æ•°æ®ï¼ˆä½¿ç”¨selectByIds)
        Set<Long> blobIds = attachmentsMap.values().stream()
                .flatMap(List::stream)
                .map(StorageAttachment::getStorageBlobId)
                .collect(Collectors.toSet());
        Map<Long, StorageBlob> blobMap = blobIds.isEmpty()
                ? Collections.emptyMap()
                : storageBlobMapper.selectBatchIds(blobIds).stream()
                .collect(Collectors.toMap(StorageBlob::getId, Function.identity()));
        // 6. ç»„装DTO数据
        List<QrCodeScanRecordDto> dtoList = scanRecordIPage.getRecords().stream().map(record -> {
            QrCodeScanRecordDto dto = new QrCodeScanRecordDto();
            BeanUtils.copyProperties(record, dto);
            SysUser sysUser = sysUserMapper.selectUserById(record.getScannerId());
            dto.setScanner(sysUser.getNickName());
            // 6.1 è®¾ç½®äºŒç»´ç ä¿¡æ¯
            Optional.ofNullable(qrCodeMap.get(record.getQrCodeId()))
                    .ifPresent(qrCode -> {
                        BeanUtils.copyProperties(qrCode, dto); // å¤åˆ¶åˆ°çˆ¶ç±»
                        dto.setQrCode(qrCode); // è®¾ç½®å®Œæ•´å¯¹è±¡
                    });
            // 6.2 è®¾ç½®é™„件信息
            dto.setStorageBlobDTO(
                    Optional.ofNullable(attachmentsMap.get(record.getId()))
                            .orElse(Collections.emptyList())
                            .stream()
                            .map(att -> {
                                StorageBlobDTO blobDTO = new StorageBlobDTO();
                                Optional.ofNullable(blobMap.get(att.getStorageBlobId()))
                                        .ifPresent(blob -> {
                                            BeanUtils.copyProperties(blob, blobDTO);
                                            blobDTO.setUrl(minioUtils.getPreviewUrls(blob.getBucketFilename(), blob.getBucketName(), true));
                                            blobDTO.setDownloadUrl(minioUtils.getDownloadUrls(blob.getBucketFilename(),blob.getBucketName(),blob.getOriginalFilename(),true));
                                        });
                                return blobDTO;
                            })
                            .filter(blobDTO -> blobDTO.getId() != null) // è¿‡æ»¤æ— æ•ˆé™„ä»¶
                            .collect(Collectors.toList())
            );
            return dto;
        }).collect(Collectors.toList());
        // 7. æž„建返回分页对象
        IPage<QrCodeScanRecordDto> resultPage = new Page<>();
        BeanUtils.copyProperties(scanRecordIPage, resultPage);
        resultPage.setRecords(dtoList);
        return resultPage;
    }
    @Override
    public int addOrEditQrCodeRecord(QrCodeScanRecordDto qrCodeScanRecordDto) {
        QrCodeScanRecord qrCodeScanRecord = new QrCodeScanRecord();
        BeanUtils.copyProperties(qrCodeScanRecordDto, qrCodeScanRecord);
        int i;
        if (Objects.isNull(qrCodeScanRecordDto.getId())) {
            i = qrCodeScanRecordMapper.insert(qrCodeScanRecord);
        } else {
            i = qrCodeScanRecordMapper.updateById(qrCodeScanRecord);
        }
        if (qrCodeScanRecordDto.getStorageBlobDTO() != null && !qrCodeScanRecordDto.getStorageBlobDTO().isEmpty()) {
            List<StorageAttachment> attachments = new ArrayList<>();
            for (StorageBlobDTO storageBlobDTO : qrCodeScanRecordDto.getStorageBlobDTO()) {
                StorageAttachment storageAttachment = new StorageAttachment(
                        StorageAttachmentFile,
                        (long) QrCodeScanRecords.ordinal(),
                        qrCodeScanRecord.getId()
                );
                storageAttachment.setStorageBlobDTO(storageBlobDTO);
                attachments.add(storageAttachment);
            }
            storageAttachmentService.saveStorageAttachment(attachments, qrCodeScanRecord.getId(), QrCodeScanRecords, StorageAttachmentFile);
        }
        return i;
    }
    @Override
    public int delByIds(Long[] ids) {
        return qrCodeScanRecordMapper.deleteBatchIds(Arrays.asList(ids));
    }
}
src/main/java/com/ruoyi/inspectiontask/service/impl/QrCodeServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,54 @@
package com.ruoyi.inspectiontask.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.utils.bean.BeanUtils;
import com.ruoyi.inspectiontask.dto.QrCodeDto;
import com.ruoyi.inspectiontask.mapper.QrCodeMapper;
import com.ruoyi.inspectiontask.pojo.QrCode;
import com.ruoyi.inspectiontask.service.QrCodeService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Arrays;
import java.util.Objects;
/**
 * @author :yys
 * @date : 2025/9/19 10:55
 */
@Service
@Slf4j
public class QrCodeServiceImpl extends ServiceImpl<QrCodeMapper, QrCode> implements QrCodeService {
    @Autowired
    private QrCodeMapper qrCodeMapper;
    @Override
    public IPage<QrCode> selectQrCodeList(Page page, QrCodeDto qrCodeDto) {
        LambdaQueryWrapper<QrCode> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.orderByDesc(QrCode::getCreateTime);
        return qrCodeMapper.selectPage(page, queryWrapper);
    }
    @Override
    public Long addOrEditQrCode(QrCodeDto qrCodeDto) {
        QrCode qrCode = new QrCode();
        BeanUtils.copyProperties(qrCodeDto, qrCode);
        if (Objects.isNull(qrCodeDto.getId())) {
            qrCodeMapper.insert(qrCode);
        } else {
            qrCodeMapper.updateById(qrCode);
        }
        return qrCode.getId();
    }
    @Override
    public int delByIds(Long[] ids) {
        return qrCodeMapper.deleteBatchIds(Arrays.asList(ids));
    }
}
src/main/java/com/ruoyi/inspectiontask/service/impl/QuartzConfig.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,50 @@
package com.ruoyi.inspectiontask.service.impl;
import org.quartz.spi.TriggerFiredBundle;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;
import org.springframework.scheduling.quartz.SpringBeanJobFactory;
@Configuration
public class QuartzConfig {
    @Autowired
    private ApplicationContext applicationContext;
    @Bean
    public SchedulerFactoryBean schedulerFactoryBean() {
        SchedulerFactoryBean schedulerFactory = new SchedulerFactoryBean();
        // é…ç½®SpringBeanJobFactory,用于支持Job中的依赖注入
        AutowiringSpringBeanJobFactory jobFactory = new AutowiringSpringBeanJobFactory();
        jobFactory.setApplicationContext(applicationContext);
        schedulerFactory.setJobFactory(jobFactory);
        // å…¶ä»–配置...
        return schedulerFactory;
    }
    // è‡ªå®šä¹‰JobFactory,支持自动注入
    public static class AutowiringSpringBeanJobFactory extends SpringBeanJobFactory
            implements ApplicationContextAware {
        private transient AutowireCapableBeanFactory beanFactory;
        @Override
        public void setApplicationContext(ApplicationContext applicationContext) {
            this.beanFactory = applicationContext.getAutowireCapableBeanFactory();
        }
        @Override
        protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
            Object jobInstance = super.createJobInstance(bundle);
            // å°†Job实例交给Spring容器管理,使其能够进行依赖注入
            beanFactory.autowireBean(jobInstance);
            return jobInstance;
        }
    }
}
src/main/java/com/ruoyi/inspectiontask/service/impl/SpringContextHolder.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
package com.ruoyi.inspectiontask.service.impl;
import org.quartz.JobExecutionContext;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
@Component
public class SpringContextHolder implements ApplicationContextAware {
    private static ApplicationContext applicationContext;
    @Override
    public void setApplicationContext(ApplicationContext context) {
        applicationContext = context;
    }
    public static <T> T getBean(Class<T> clazz) {
        return applicationContext.getBean(clazz);
    }
}
src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskJob.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,259 @@
package com.ruoyi.inspectiontask.service.impl;
import com.ruoyi.inspectiontask.mapper.InspectionTaskMapper;
import com.ruoyi.inspectiontask.mapper.TimingTaskMapper;
import com.ruoyi.inspectiontask.pojo.InspectionTask;
import com.ruoyi.inspectiontask.pojo.TimingTask;
import com.ruoyi.inspectiontask.service.TimingTaskService;
import org.quartz.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import javax.sql.DataSource;
import java.time.DayOfWeek;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.YearMonth;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
@Component
@DisallowConcurrentExecution // ç¦æ­¢å¹¶å‘执行同一个Job
public class TimingTaskJob implements Job {
    @Autowired
    private TimingTaskMapper timingTaskMapper;
    @Autowired
    private TimingTaskService timingTaskService;
    @Autowired
    private InspectionTaskMapper inspectionTaskMapper;
    @Autowired
    private JdbcTemplate jdbcTemplate;
    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        JobDataMap jobDataMap = context.getJobDetail().getJobDataMap();
        // ä¿®å¤ç±»åž‹è½¬æ¢é”™è¯¯ï¼Œæ­£ç¡®èŽ·å–taskId
        Long taskId = jobDataMap.getLong("taskId");
        try {
            // 3. å°è¯•查询你的业务数据
            // é€šè¿‡JDBC模板查询定时任务信息,使用参数化查询防止SQL注入
            String yourSql = "SELECT * FROM timing_task where id = ?";
            List<TimingTask> tasks = jdbcTemplate.query(
                    yourSql,
                    new BeanPropertyRowMapper<>(TimingTask.class),
                    taskId
            );
            TimingTask timingTask = tasks.isEmpty() ? null : tasks.get(0);
            if (timingTask == null) {
                throw new JobExecutionException("找不到定时任务: " + taskId);
            }
//            if (!timingTask.isActive()) {
//                throw new JobExecutionException("定时任务已禁用: " + taskId);
//            }
            // 2. åˆ›å»ºå¹¶ä¿å­˜å·¡æ£€ä»»åŠ¡è®°å½• - è¿™å°±æ˜¯æ‚¨æä¾›çš„代码应该放的位置
            InspectionTask inspectionTask = createInspectionTask(timingTask);
            inspectionTaskMapper.insert(inspectionTask);
            // 3. æ›´æ–°å®šæ—¶ä»»åŠ¡çš„æ‰§è¡Œæ—¶é—´
            if (!tasks.isEmpty()) {
                TimingTask task = tasks.get(0);
                // æ›´æ–°æœ€åŽæ‰§è¡Œæ—¶é—´ä¸ºå½“前时间
                LocalDateTime lastExecutionTime = LocalDateTime.now();
                // è®¡ç®—下次执行时间
                LocalDateTime nextExecutionTime = calculateNextExecutionTime(
                        task.getFrequencyType(),
                        task.getFrequencyDetail(),
                        lastExecutionTime
                );
                // æ‰§è¡Œæ›´æ–°æ“ä½œ
                String updateSql = "UPDATE timing_task " +
                        "SET last_execution_time = ?, next_execution_time = ? " +
                        "WHERE id = ?";
                jdbcTemplate.update(
                        updateSql,
                        lastExecutionTime,
                        nextExecutionTime,
                        taskId
                );
            }
//            timingTaskService.updateTaskExecutionTime(taskId);
            // 4. è®°å½•执行日志
//            timingTaskService.recordExecutionLog(taskId, true, "任务执行成功,生成巡检任务ID: " + inspectionTask.getId());
        } catch (Exception e) {
//            timingTaskService.recordExecutionLog(taskId, false, "任务执行失败: " + e.getMessage());
            throw new JobExecutionException(e);
        }
    }
    // è¿™å°±æ˜¯æ‚¨æä¾›çš„代码封装成的方法
    private InspectionTask createInspectionTask(TimingTask timingTask) {
        InspectionTask inspectionTask = new InspectionTask();
        // å¤åˆ¶åŸºæœ¬å±žæ€§
        inspectionTask.setTaskName(timingTask.getTaskName());
        inspectionTask.setTaskId(timingTask.getTaskId());
        inspectionTask.setInspectorId(timingTask.getInspectorIds());
        inspectionTask.setInspectionLocation(timingTask.getInspectionLocation());
        inspectionTask.setRemarks("自动生成自定时任务ID: " + timingTask.getId());
        inspectionTask.setRegistrantId(timingTask.getRegistrantId());
        inspectionTask.setFrequencyType(timingTask.getFrequencyType());
        inspectionTask.setFrequencyDetail(timingTask.getFrequencyDetail());
        inspectionTask.setTenantId(timingTask.getTenantId());
        return inspectionTask;
    }
    /**
     * è®¡ç®—下次执行时间
     */
    private LocalDateTime calculateNextExecutionTime(String frequencyType,
                                                     String frequencyDetail,
                                                     LocalDateTime currentTime) {
        try {
            switch (frequencyType) {
                case "DAILY":
                    return calculateDailyNextTime(frequencyDetail, currentTime);
                case "WEEKLY":
                    return calculateWeeklyNextTime(frequencyDetail, currentTime);
                case "MONTHLY":
                    return calculateMonthlyNextTime(frequencyDetail, currentTime);
                case "QUARTERLY":
                    return calculateQuarterlyNextTime(frequencyDetail, currentTime);
                default:
                    throw new IllegalArgumentException("不支持的频率类型: " + frequencyType);
            }
        } catch (Exception e) {
            throw new RuntimeException("计算下次执行时间失败: " + e.getMessage(), e);
        }
    }
    /**
     * è®¡ç®—每日任务的下次执行时间
     */
    private LocalDateTime calculateDailyNextTime(String timeStr, LocalDateTime current) {
        LocalTime executionTime = LocalTime.parse(timeStr); // è§£æžæ ¼å¼ "HH:mm"
        LocalDateTime nextTime = LocalDateTime.of(current.toLocalDate(), executionTime);
        // å¦‚果今天的时间已过,则安排明天
        return current.isBefore(nextTime) ? nextTime : nextTime.plusDays(1);
    }
    /**
     * è®¡ç®—每周任务的下次执行时间
     */
    private LocalDateTime calculateWeeklyNextTime(String detail, LocalDateTime current) {
        String[] parts = detail.split(",");
        String dayOfWeekStr = parts[0];  // å¦‚ "MON" æˆ– "MON|WED|FRI"
        LocalTime time = LocalTime.parse(parts[1]); // æ—¶é—´éƒ¨åˆ†
        // è§£æžæ˜ŸæœŸå‡ (支持多个星期)
        Set<DayOfWeek> targetDays = parseDayOfWeeks(dayOfWeekStr);
        // ä»Žå½“前时间开始找下一个符合条件的星期几
        LocalDateTime nextTime = current;
        while (true) {
            nextTime = nextTime.plusDays(1);
            if (targetDays.contains(nextTime.getDayOfWeek())) {
                return LocalDateTime.of(nextTime.toLocalDate(), time);
            }
            // é˜²æ­¢æ— é™å¾ªçޝ(理论上不会发生)
            if (nextTime.isAfter(current.plusYears(1))) {
                throw new RuntimeException("无法找到下次执行时间");
            }
        }
    }
    /**
     * è®¡ç®—每月任务的下次执行时间
     */
    private LocalDateTime calculateMonthlyNextTime(String detail, LocalDateTime current) {
        String[] parts = detail.split(",");
        int dayOfMonth = Integer.parseInt(parts[0]);
        LocalTime time = LocalTime.parse(parts[1]);
        // ä»Žä¸‹ä¸ªæœˆå¼€å§‹è®¡ç®—
        LocalDateTime nextTime = current.plusMonths(1)
                .withDayOfMonth(Math.min(dayOfMonth, current.plusMonths(1).toLocalDate().lengthOfMonth()))
                .with(time);
        return nextTime;
    }
    /**
     * è®¡ç®—每季度任务的下次执行时间
     */
    private LocalDateTime calculateQuarterlyNextTime(String detail, LocalDateTime current) {
        String[] parts = detail.split(",");
        int quarterMonth = Integer.parseInt(parts[0]); // 1=第1个月,2=第2个月,3=第3个月
        int dayOfMonth = Integer.parseInt(parts[1]);
        LocalTime time = LocalTime.parse(parts[2]);
        // è®¡ç®—当前季度
        int currentQuarter = (current.getMonthValue() - 1) / 3 + 1;
        int currentMonthInQuarter = (current.getMonthValue() - 1) % 3 + 1;
        YearMonth targetYearMonth;
        if (currentMonthInQuarter < quarterMonth) {
            // æœ¬å­£åº¦å†…还有执行机会
            targetYearMonth = YearMonth.from(current)
                    .plusMonths(quarterMonth - currentMonthInQuarter);
        } else {
            // éœ€è¦åˆ°ä¸‹ä¸ªå­£åº¦
            targetYearMonth = YearMonth.from(current)
                    .plusMonths(3 - currentMonthInQuarter + quarterMonth);
        }
        // å¤„理月末日期
        int adjustedDay = Math.min(dayOfMonth, targetYearMonth.lengthOfMonth());
        return LocalDateTime.of(
                targetYearMonth.getYear(),
                targetYearMonth.getMonthValue(),
                adjustedDay,
                time.getHour(),
                time.getMinute()
        );
    }
    /**
     * è§£æžæ˜ŸæœŸå‡ å­—符串
     */
    private Set<DayOfWeek> parseDayOfWeeks(String dayOfWeekStr) {
        Set<DayOfWeek> days = new HashSet<>();
        String[] dayStrs = dayOfWeekStr.split("\\|");
        for (String dayStr : dayStrs) {
            switch (dayStr) {
                case "MON": days.add(DayOfWeek.MONDAY); break;
                case "TUE": days.add(DayOfWeek.TUESDAY); break;
                case "WED": days.add(DayOfWeek.WEDNESDAY); break;
                case "THU": days.add(DayOfWeek.THURSDAY); break;
                case "FRI": days.add(DayOfWeek.FRIDAY); break;
                case "SAT": days.add(DayOfWeek.SATURDAY); break;
                case "SUN": days.add(DayOfWeek.SUNDAY); break;
                default: throw new IllegalArgumentException("无效的星期几: " + dayStr);
            }
        }
        return days;
    }
}
src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskScheduler.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,239 @@
package com.ruoyi.inspectiontask.service.impl;
import com.ruoyi.inspectiontask.pojo.TimingTask;
import org.quartz.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.time.LocalTime;
import java.time.ZoneId;
import java.time.format.DateTimeParseException;
import java.util.Arrays;
import java.util.Date;
import java.util.stream.Collectors;
@Service
public class TimingTaskScheduler {
    @Autowired
    private Scheduler scheduler;
    /**
     * æ·»åŠ æ–°ä»»åŠ¡åˆ°è°ƒåº¦å™¨
     */
    public void scheduleTimingTask(TimingTask task) throws SchedulerException {
        JobDetail jobDetail = buildJobDetail(task);
        Trigger trigger = buildJobTrigger(task, jobDetail);
        scheduler.scheduleJob(jobDetail, trigger);
    }
    /**
     * æ›´æ–°å·²æœ‰ä»»åŠ¡
     */
    public void rescheduleTimingTask(TimingTask task) throws SchedulerException {
        TriggerKey triggerKey = new TriggerKey("trigger_" + task.getId());
        // èŽ·å–çŽ°æœ‰è§¦å‘å™¨å¹¶è½¬æ¢ä¸º CronTrigger
        Trigger oldTrigger = scheduler.getTrigger(triggerKey);
        if (!(oldTrigger instanceof CronTrigger)) {
            throw new SchedulerException("Existing trigger is not a CronTrigger");
        }
        // æž„建新触发器
        Trigger newTrigger = TriggerBuilder.newTrigger()
                .withIdentity(triggerKey)
                .withDescription(task.getTaskName())
                .withSchedule(CronScheduleBuilder.cronSchedule(convertToCronExpression(task)))
                .startAt(Date.from(task.getNextExecutionTime().atZone(ZoneId.systemDefault()).toInstant()))
                .forJob(oldTrigger.getJobKey())
                .build();
        scheduler.rescheduleJob(triggerKey, newTrigger);
    }
    /**
     * æš‚停任务
     */
    public void pauseTimingTask(Long taskId) throws SchedulerException {
        JobKey jobKey = new JobKey("timingTask_" + taskId);
        scheduler.pauseJob(jobKey);
    }
    /**
     * æ¢å¤ä»»åŠ¡
     */
    public void resumeTimingTask(Long taskId) throws SchedulerException {
        JobKey jobKey = new JobKey("timingTask_" + taskId);
        scheduler.resumeJob(jobKey);
    }
    /**
     * åˆ é™¤ä»»åŠ¡
     */
    public void unscheduleTimingTask(Long taskId) throws SchedulerException {
        JobKey jobKey = new JobKey("timingTask_" + taskId);
        scheduler.deleteJob(jobKey);
    }
    private JobDetail buildJobDetail(TimingTask task) {
        JobDataMap jobDataMap = new JobDataMap();
        jobDataMap.put("taskId", task.getId());
        return JobBuilder.newJob(TimingTaskJob.class)
                .withIdentity("timingTask_" + task.getId())
                .withDescription(task.getTaskName())
                .usingJobData(jobDataMap)
                .storeDurably()
                .build();
    }
    private Trigger buildJobTrigger(TimingTask task, JobDetail jobDetail) {
        String cronExpression = convertToCronExpression(task);
            TriggerBuilder<CronTrigger> triggerBuilder = TriggerBuilder.newTrigger()
                .withIdentity("trigger_" + task.getId())
                .withDescription(task.getTaskName())
                .withSchedule(CronScheduleBuilder.cronSchedule(cronExpression));
        if (jobDetail != null) {
            triggerBuilder.forJob(jobDetail);
        }
        if (task.getNextExecutionTime() != null) {
            triggerBuilder.startAt(Date.from(task.getNextExecutionTime().atZone(ZoneId.systemDefault()).toInstant()));
        }
        return triggerBuilder.build();
    }
    private String convertToCronExpression(TimingTask task) {
        // å‚数校验
        if (task == null || task.getFrequencyType() == null || task.getFrequencyDetail() == null) {
            throw new IllegalArgumentException("任务参数不能为空");
        }
        // ä½¿ç”¨switch确保条件互斥
        String frequencyType = task.getFrequencyType().toUpperCase(); // ç»Ÿä¸€è½¬ä¸ºå¤§å†™æ¯”较
        switch (frequencyType) {
            case "DAILY":
                return convertDailyToCron(task.getFrequencyDetail());
            case "WEEKLY":
                return convertWeeklyToCron(task.getFrequencyDetail());
            case "MONTHLY":
                return convertMonthlyToCron(task.getFrequencyDetail());
            case "QUARTERLY":
                return convertQuarterlyToCron(task.getFrequencyDetail());
            default:
                throw new IllegalArgumentException("不支持的频率类型: " + task.getFrequencyType());
        }
    }
    // æ¯æ—¥ä»»åŠ¡è½¬æ¢
    private String convertDailyToCron(String frequencyDetail) {
        LocalTime time = parseTime(frequencyDetail);
        return String.format("0 %d %d * * ?", time.getMinute(), time.getHour());
    }
    // æ¯å‘¨ä»»åŠ¡è½¬æ¢
    private String convertWeeklyToCron(String frequencyDetail) {
        String[] parts = validateAndSplit(frequencyDetail, ",", 2);
        String daysOfWeek = convertDayNamesToCron(parts[0]);
        LocalTime time = parseTime(parts[1]);
        return String.format("0 %d %d ? * %s", time.getMinute(), time.getHour(), daysOfWeek);
    }
    // æ¯æœˆä»»åŠ¡è½¬æ¢
    private String convertMonthlyToCron(String frequencyDetail) {
        String[] parts = validateAndSplit(frequencyDetail, ",", 2);
        int day = validateDayOfMonth(parts[0]);
        LocalTime time = parseTime(parts[1]);
        return String.format("0 %d %d %d * ?", time.getMinute(), time.getHour(), day);
    }
    // æ¯å­£åº¦ä»»åŠ¡è½¬æ¢
    private String convertQuarterlyToCron(String frequencyDetail) {
        String[] parts = validateAndSplit(frequencyDetail, ",", 3);
        int month = validateMonth(parts[0]);  // éªŒè¯æœˆä»½(1-12)
        int day = validateDayOfMonth(parts[1]);  // éªŒè¯æ—¥æœŸ
        LocalTime time = parseTime(parts[2]);  // è§£æžæ—¶é—´
        // è®¡ç®—季度起始月份(1月=1, 4月=4, 7月=7, 10月=10)
        int quarterStartMonth = ((month - 1) / 3) * 3 + 1;
        return String.format("0 %d %d %d %d/3 ?",
                time.getMinute(),
                time.getHour(),
                day,
                quarterStartMonth);
    }
    // æ–°å¢žéªŒè¯æœˆä»½çš„æ–¹æ³•(1-12)
    private int validateMonth(String monthStr) {
        try {
            int month = Integer.parseInt(monthStr);
            if (month < 1 || month > 12) {
                throw new IllegalArgumentException("月份必须在1-12之间");
            }
            return month;
        } catch (NumberFormatException e) {
            throw new IllegalArgumentException("无效的月份格式");
        }
    }
    // è¾…助方法:解析时间
    private LocalTime parseTime(String timeStr) {
        try {
            return LocalTime.parse(timeStr);
        } catch (DateTimeParseException e) {
            throw new IllegalArgumentException("时间格式必须为HH:mm", e);
        }
    }
    // è¾…助方法:验证并分割字符串
    private String[] validateAndSplit(String input, String delimiter, int expectedParts) {
        String[] parts = input.split(delimiter);
        if (parts.length != expectedParts) {
            throw new IllegalArgumentException(
                    String.format("格式错误,应为%d部分用'%s'分隔", expectedParts, delimiter));
        }
        return parts;
    }
    // è¾…助方法:验证月份中的日
    private int validateDayOfMonth(String dayStr) {
        int day = Integer.parseInt(dayStr);
        if (day < 1 || day > 31) {
            throw new IllegalArgumentException("日期必须在1-31之间");
        }
        return day;
    }
    // è¾…助方法:验证季度中的月
    private int validateMonthInQuarter(String monthStr) {
        int month = Integer.parseInt(monthStr);
        if (month < 1 || month > 3) {
            throw new IllegalArgumentException("季度月份必须是1、2或3");
        }
        return month;
    }
    // è½¬æ¢æ˜ŸæœŸå‡ åç§°
    private String convertDayNamesToCron(String dayNames) {
        return Arrays.stream(dayNames.split("\\|"))
                .map(this::convertSingleDayName)
                .collect(Collectors.joining(","));
    }
    // è½¬æ¢å•个星期几名称
    private String convertSingleDayName(String dayName) {
        switch (dayName.toUpperCase()) {
            case "MON": return "MON";
            case "TUE": return "TUE";
            case "WED": return "WED";
            case "THU": return "THU";
            case "FRI": return "FRI";
            case "SAT": return "SAT";
            case "SUN": return "SUN";
            default: throw new IllegalArgumentException("无效的星期几: " + dayName);
        }
    }
}
src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,450 @@
package com.ruoyi.inspectiontask.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.common.utils.StringUtils;
import com.ruoyi.common.utils.bean.BeanUtils;
import com.ruoyi.inspectiontask.dto.TimingTaskDto;
import com.ruoyi.inspectiontask.mapper.InspectionTaskMapper;
import com.ruoyi.inspectiontask.mapper.TimingTaskMapper;
import com.ruoyi.inspectiontask.pojo.TimingTask;
import com.ruoyi.inspectiontask.service.TimingTaskService;
import com.ruoyi.project.system.domain.SysUser;
import com.ruoyi.project.system.mapper.SysUserMapper;
import lombok.extern.slf4j.Slf4j;
import org.quartz.SchedulerException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.stream.Collectors;
/**
 * @author :yys
 * @date : 2025/9/19 10:55
 */
@Service
@Slf4j
public class TimingTaskServiceImpl extends ServiceImpl<TimingTaskMapper, TimingTask> implements TimingTaskService {
    @Autowired
    private TimingTaskMapper timingTaskMapper;
    @Autowired
    private InspectionTaskMapper inspectionTaskMapper;
    @Autowired
    private TimingTaskScheduler timingTaskScheduler;
    @Autowired
    private SysUserMapper sysUserMapper;
    @Override
    public IPage<TimingTaskDto> selectTimingTaskList(Page<TimingTask> page, TimingTask timingTask) {
        // 1. å…ˆåˆ†é¡µæŸ¥è¯¢å®šæ—¶ä»»åŠ¡æ•°æ®
        IPage<TimingTask> taskPage = timingTaskMapper.selectPage(page, null);
        // 2. å¦‚果没有数据,直接返回空分页
        if (taskPage.getRecords().isEmpty()) {
            return new Page<>(taskPage.getCurrent(), taskPage.getSize(), taskPage.getTotal());
        }
        // 3. æ”¶é›†æ‰€æœ‰éœ€è¦æŸ¥è¯¢çš„用户ID
        Set<Long> userIds = new HashSet<>();
        // æ”¶é›†ç™»è®°äººID
        taskPage.getRecords().forEach(task -> {
            if (task.getRegistrantId() != null) {
                userIds.add(task.getRegistrantId());
            }
        });
        // æ”¶é›†å·¡æ£€äººID(多个ID以逗号分隔)
        taskPage.getRecords().forEach(task -> {
            if (StringUtils.isNotBlank(task.getInspectorIds())) {
                Arrays.stream(task.getInspectorIds().split(","))
                        .filter(StringUtils::isNotBlank)
                        .map(Long::valueOf)
                        .forEach(userIds::add);
            }
        });
        // 4. æ‰¹é‡æŸ¥è¯¢ç”¨æˆ·ä¿¡æ¯
        Map<Long, String> userNickNameMap = new HashMap<>();
        if (!userIds.isEmpty()) {
            List<SysUser> users = sysUserMapper.selectUserByIds((new ArrayList<>(userIds)));
            users.forEach(user -> userNickNameMap.put(user.getUserId(), user.getNickName()));
        }
        // 5. è½¬æ¢ä¸ºDTO
        List<TimingTaskDto> dtoList = taskPage.getRecords().stream().map(task -> {
            TimingTaskDto dto = new TimingTaskDto();
            // å¤åˆ¶åŸºæœ¬å±žæ€§
            BeanUtils.copyProperties(task, dto);
            // è®¾ç½®ç™»è®°äººæ˜µç§°
            if (task.getRegistrantId() != null) {
                dto.setRegistrant(userNickNameMap.getOrDefault(task.getRegistrantId(), "未知用户"));
            }
            // è®¾ç½®å·¡æ£€äººæ˜µç§°åˆ—表
            if (StringUtils.isNotBlank(task.getInspectorIds())) {
                List<String> inspectorNickNames = new ArrayList<>();
                for (String idStr : task.getInspectorIds().split(",")) {
                    if (StringUtils.isNotBlank(idStr)) {
                        Long id = Long.valueOf(idStr);
                        inspectorNickNames.add(userNickNameMap.getOrDefault(id, "未知用户"));
                    }
                }
                dto.setInspector(inspectorNickNames);
            }
            return dto;
        }).collect(Collectors.toList());
        // 6. æž„建返回的分页对象
        Page<TimingTaskDto> resultPage = new Page<>(taskPage.getCurrent(), taskPage.getSize(), taskPage.getTotal());
        resultPage.setRecords(dtoList);
        return resultPage;
    }
    @Override
    @Transactional
    public int addOrEditTimingTask(TimingTaskDto timingTaskDto) throws SchedulerException {
        TimingTask timingTask = new TimingTask();
        BeanUtils.copyProperties(timingTaskDto, timingTask);
        // è®¾ç½®åˆ›å»ºäººä¿¡æ¯å’Œé»˜è®¤å€¼
        if (Objects.isNull(timingTaskDto.getId())) {
            timingTask.setRegistrationDate(LocalDate.now());
            timingTask.setActive(true);
            // è®¡ç®—首次执行时间
            LocalDateTime firstExecutionTime = calculateFirstExecutionTime(timingTask);
            timingTask.setNextExecutionTime(firstExecutionTime);
            int result = timingTaskMapper.insert(timingTask);
            if (result > 0) {
                // æ–°å¢žæˆåŠŸåŽæ·»åŠ åˆ°è°ƒåº¦å™¨
                timingTaskScheduler.scheduleTimingTask(timingTask);
            }
            return result;
        } else {
            int result = timingTaskMapper.updateById(timingTask);
            if (result > 0) {
                // æ›´æ–°æˆåŠŸåŽé‡æ–°è°ƒåº¦ä»»åŠ¡
                timingTaskScheduler.rescheduleTimingTask(timingTask);
            }
            return result;
        }
    }
    private LocalDateTime calculateFirstExecutionTime(TimingTask task) {
        // æ ¹æ®é¢‘率类型和详情计算首次执行时间
        String frequencyType = task.getFrequencyType();
        if ("DAILY".equals(frequencyType)) {
            // å¦‚果是每天执行,计算今天或明天的具体时间
            return calculateDailyFirstExecution(task.getFrequencyDetail());
        } else if ("WEEKLY".equals(frequencyType)) {
            // å¦‚果是每周执行,计算下周的具体星期几
            return calculateWeeklyFirstExecution(task.getFrequencyDetail());
        } else if ("MONTHLY".equals(frequencyType)) {
            // å¦‚果是每月执行,计算下个月的具体日期
            return calculateMonthlyFirstExecution(task.getFrequencyDetail());
        } else if ("QUARTERLY".equals(frequencyType)) {
            // è‡ªå®šä¹‰é¢‘率,如每小时、每30分钟等
            return calculateCustomFirstExecution(task.getFrequencyDetail());
        } else {
            throw new IllegalArgumentException("不支持的频率类型: " + task.getFrequencyType());
        }
    }
    private LocalDateTime calculateDailyFirstExecution(String frequencyDetail) {
        // frequencyDetail可能是具体时间,如 "14:30"
        LocalTime executionTime = LocalTime.parse(frequencyDetail);
        LocalDateTime now = LocalDateTime.now();
        LocalDateTime todayExecution = LocalDateTime.of(now.toLocalDate(), executionTime);
        // å¦‚果今天的时间已过,则安排明天执行
        return now.isBefore(todayExecution) ? todayExecution : todayExecution.plusDays(1);
    }
    // æ˜ å°„星期简写与DayOfWeek
    private static final Map<String, DayOfWeek> WEEK_DAY_MAP = new HashMap<>();
    static {
        WEEK_DAY_MAP.put("MON", DayOfWeek.MONDAY);
        WEEK_DAY_MAP.put("TUE", DayOfWeek.TUESDAY);
        WEEK_DAY_MAP.put("WED", DayOfWeek.WEDNESDAY);
        WEEK_DAY_MAP.put("THU", DayOfWeek.THURSDAY);
        WEEK_DAY_MAP.put("FRI", DayOfWeek.FRIDAY);
        WEEK_DAY_MAP.put("SAT", DayOfWeek.SATURDAY);
        WEEK_DAY_MAP.put("SUN", DayOfWeek.SUNDAY);
    }
    private LocalDateTime calculateWeeklyFirstExecution(String frequencyDetail) {
        // è§£æžè¾“入参数
        String[] parts = frequencyDetail.split(",");
        if (parts.length != 2) {
            throw new IllegalArgumentException("参数格式错误,应为'MON,13:43'格式");
        }
        String weekDayStr = parts[0].trim();
        String timeStr = parts[1].trim();
        // èŽ·å–å¯¹åº”çš„æ˜ŸæœŸå‡ 
        DayOfWeek targetDay = WEEK_DAY_MAP.get(weekDayStr);
        if (targetDay == null) {
            throw new IllegalArgumentException("无效的星期简写: " + weekDayStr);
        }
        // è§£æžæ—¶é—´
        LocalTime targetTime = LocalTime.parse(timeStr, DateTimeFormatter.ofPattern("HH:mm"));
        // èŽ·å–å½“å‰æ—¶é—´
        LocalDateTime now = LocalDateTime.now();
        LocalDateTime targetDateTime = now.with(targetDay).with(targetTime);
        // å¦‚果计算出的时间在当前时间之前,则加一周
        if (targetDateTime.isBefore(now)) {
            targetDateTime = targetDateTime.plusWeeks(1);
        }
        return targetDateTime;
    }
    private LocalDateTime calculateMonthlyFirstExecution(String frequencyDetail) {
        // è§£æžè¾“入参数
        String[] parts = frequencyDetail.split(",");
        if (parts.length != 2) {
            throw new IllegalArgumentException("参数格式错误,应为'03,17:00'格式");
        }
        String dayStr = parts[0].trim();
        String timeStr = parts[1].trim();
        // è§£æžæ—¥æœŸ
        int dayOfMonth;
        try {
            dayOfMonth = Integer.parseInt(dayStr);
        } catch (NumberFormatException e) {
            throw new IllegalArgumentException("无效的日期格式: " + dayStr, e);
        }
        // éªŒè¯æ—¥æœŸæœ‰æ•ˆæ€§ï¼ˆ1-31之间)
        if (dayOfMonth < 1 || dayOfMonth > 31) {
            throw new IllegalArgumentException("日期必须在1-31之间: " + dayOfMonth);
        }
        // è§£æžæ—¶é—´
        LocalTime targetTime;
        try {
            targetTime = LocalTime.parse(timeStr, DateTimeFormatter.ofPattern("HH:mm"));
        } catch (DateTimeException e) {
            throw new IllegalArgumentException("无效的时间格式: " + timeStr, e);
        }
        // èŽ·å–å½“å‰æ—¶é—´
        LocalDateTime now = LocalDateTime.now();
        LocalDateTime targetDateTime = now.withDayOfMonth(dayOfMonth).with(targetTime);
        // æ£€æŸ¥æ—¥æœŸæ˜¯å¦è¢«è‡ªåŠ¨è°ƒæ•´ï¼ˆå¦‚31日在小月会被调整)
        boolean isDateAdjusted = targetDateTime.getDayOfMonth() != dayOfMonth;
        // å¦‚果目标时间在当前时间之前,或者日期被系统自动调整了
        if (targetDateTime.isBefore(now) || isDateAdjusted) {
            // è®¡ç®—下个月的日期
            LocalDateTime nextMonth = now.plusMonths(1);
            // å°è¯•设置下个月的目标日期
            LocalDateTime nextMonthTarget = nextMonth.withDayOfMonth(dayOfMonth).with(targetTime);
            // å¦‚果下个月的日期也被调整了,就用下个月的最后一天
            if (nextMonthTarget.getDayOfMonth() != dayOfMonth) {
                // æ­£ç¡®èŽ·å–ä¸‹ä¸ªæœˆçš„æœ€åŽä¸€å¤©ï¼ˆä¿®å¤isLeapYear调用问题)
                int lastDayOfMonth = nextMonth.getMonth().length(
                        Year.of(nextMonth.getYear()).isLeap()
                );
                nextMonthTarget = nextMonth.withDayOfMonth(lastDayOfMonth).with(targetTime);
            }
            targetDateTime = nextMonthTarget;
        }
        return targetDateTime;
    }
    private LocalDateTime calculateCustomFirstExecution(String frequencyDetail) {
        return null;
    }
    @Override
    @Transactional
    public void updateTaskExecutionTime(Long taskId) {
        TimingTask task = timingTaskMapper.selectById(taskId);
        if (task == null) {
            throw new RuntimeException("定时任务不存在,ID: " + taskId);
        }
        // æ›´æ–°æœ€åŽæ‰§è¡Œæ—¶é—´ä¸ºå½“前时间
        task.setLastExecutionTime(LocalDateTime.now());
        // è®¡ç®—下次执行时间
        LocalDateTime nextExecutionTime = calculateNextExecutionTime(
                task.getFrequencyType(),
                task.getFrequencyDetail(),
                LocalDateTime.now()
        );
        task.setNextExecutionTime(nextExecutionTime);
        // æ›´æ–°æ•°æ®åº“
        timingTaskMapper.updateById(task);
    }
    /**
     * è®¡ç®—下次执行时间
     */
    private LocalDateTime calculateNextExecutionTime(String frequencyType,
                                                     String frequencyDetail,
                                                     LocalDateTime currentTime) {
        try {
            switch (frequencyType) {
                case "DAILY":
                    return calculateDailyNextTime(frequencyDetail, currentTime);
                case "WEEKLY":
                    return calculateWeeklyNextTime(frequencyDetail, currentTime);
                case "MONTHLY":
                    return calculateMonthlyNextTime(frequencyDetail, currentTime);
                case "QUARTERLY":
                    return calculateQuarterlyNextTime(frequencyDetail, currentTime);
                default:
                    throw new IllegalArgumentException("不支持的频率类型: " + frequencyType);
            }
        } catch (Exception e) {
            throw new RuntimeException("计算下次执行时间失败: " + e.getMessage(), e);
        }
    }
    /**
     * è®¡ç®—每日任务的下次执行时间
     */
    private LocalDateTime calculateDailyNextTime(String timeStr, LocalDateTime current) {
        LocalTime executionTime = LocalTime.parse(timeStr); // è§£æžæ ¼å¼ "HH:mm"
        LocalDateTime nextTime = LocalDateTime.of(current.toLocalDate(), executionTime);
        // å¦‚果今天的时间已过,则安排明天
        return current.isBefore(nextTime) ? nextTime : nextTime.plusDays(1);
    }
    /**
     * è®¡ç®—每周任务的下次执行时间
     */
    private LocalDateTime calculateWeeklyNextTime(String detail, LocalDateTime current) {
        String[] parts = detail.split(",");
        String dayOfWeekStr = parts[0];  // å¦‚ "MON" æˆ– "MON|WED|FRI"
        LocalTime time = LocalTime.parse(parts[1]); // æ—¶é—´éƒ¨åˆ†
        // è§£æžæ˜ŸæœŸå‡ (支持多个星期)
        Set<DayOfWeek> targetDays = parseDayOfWeeks(dayOfWeekStr);
        // ä»Žå½“前时间开始找下一个符合条件的星期几
        LocalDateTime nextTime = current;
        while (true) {
            nextTime = nextTime.plusDays(1);
            if (targetDays.contains(nextTime.getDayOfWeek())) {
                return LocalDateTime.of(nextTime.toLocalDate(), time);
            }
            // é˜²æ­¢æ— é™å¾ªçޝ(理论上不会发生)
            if (nextTime.isAfter(current.plusYears(1))) {
                throw new RuntimeException("无法找到下次执行时间");
            }
        }
    }
    /**
     * è®¡ç®—每月任务的下次执行时间
     */
    private LocalDateTime calculateMonthlyNextTime(String detail, LocalDateTime current) {
        String[] parts = detail.split(",");
        int dayOfMonth = Integer.parseInt(parts[0]);
        LocalTime time = LocalTime.parse(parts[1]);
        // ä»Žä¸‹ä¸ªæœˆå¼€å§‹è®¡ç®—
        LocalDateTime nextTime = current.plusMonths(1)
                .withDayOfMonth(Math.min(dayOfMonth, current.plusMonths(1).toLocalDate().lengthOfMonth()))
                .with(time);
        return nextTime;
    }
    /**
     * è®¡ç®—每季度任务的下次执行时间
     */
    private LocalDateTime calculateQuarterlyNextTime(String detail, LocalDateTime current) {
        String[] parts = detail.split(",");
        int quarterMonth = Integer.parseInt(parts[0]); // 1=第1个月,2=第2个月,3=第3个月
        int dayOfMonth = Integer.parseInt(parts[1]);
        LocalTime time = LocalTime.parse(parts[2]);
        // è®¡ç®—当前季度
        int currentQuarter = (current.getMonthValue() - 1) / 3 + 1;
        int currentMonthInQuarter = (current.getMonthValue() - 1) % 3 + 1;
        YearMonth targetYearMonth;
        if (currentMonthInQuarter < quarterMonth) {
            // æœ¬å­£åº¦å†…还有执行机会
            targetYearMonth = YearMonth.from(current)
                    .plusMonths(quarterMonth - currentMonthInQuarter);
        } else {
            // éœ€è¦åˆ°ä¸‹ä¸ªå­£åº¦
            targetYearMonth = YearMonth.from(current)
                    .plusMonths(3 - currentMonthInQuarter + quarterMonth);
        }
        // å¤„理月末日期
        int adjustedDay = Math.min(dayOfMonth, targetYearMonth.lengthOfMonth());
        return LocalDateTime.of(
                targetYearMonth.getYear(),
                targetYearMonth.getMonthValue(),
                adjustedDay,
                time.getHour(),
                time.getMinute()
        );
    }
    /**
     * è§£æžæ˜ŸæœŸå‡ å­—符串
     */
    private Set<DayOfWeek> parseDayOfWeeks(String dayOfWeekStr) {
        Set<DayOfWeek> days = new HashSet<>();
        String[] dayStrs = dayOfWeekStr.split("\\|");
        for (String dayStr : dayStrs) {
            switch (dayStr) {
                case "MON": days.add(DayOfWeek.MONDAY); break;
                case "TUE": days.add(DayOfWeek.TUESDAY); break;
                case "WED": days.add(DayOfWeek.WEDNESDAY); break;
                case "THU": days.add(DayOfWeek.THURSDAY); break;
                case "FRI": days.add(DayOfWeek.FRIDAY); break;
                case "SAT": days.add(DayOfWeek.SATURDAY); break;
                case "SUN": days.add(DayOfWeek.SUNDAY); break;
                default: throw new IllegalArgumentException("无效的星期几: " + dayStr);
            }
        }
        return days;
    }
    @Override
    public int delByIds(Long[] ids) {
        return timingTaskMapper.deleteBatchIds(Arrays.asList(ids));
    }
}
src/main/java/com/ruoyi/lavorissue/controller/LavorIssueController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,150 @@
package com.ruoyi.lavorissue.controller;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.approve.pojo.ApproveProcess;
import com.ruoyi.approve.utils.DailyRedisCounter;
import com.ruoyi.approve.utils.StartAndEndDateDto;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.controller.BaseController;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.lavorissue.dto.StatisticsLaborIssue;
import com.ruoyi.lavorissue.mapper.LavorIssueMapper;
import com.ruoyi.lavorissue.pojo.LaborIssue;
import com.ruoyi.lavorissue.service.LavorIssueService;
import com.ruoyi.project.system.domain.SysDept;
import com.ruoyi.project.system.mapper.SysDeptMapper;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.io.UnsupportedEncodingException;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
 * @author :yys
 * @date : 2025/8/13 11:19
 */
@RestController
@Api(tags = "劳保发放")
@RequestMapping("/lavorIssue")
public class LavorIssueController extends BaseController {
    @Autowired
    private LavorIssueService laborIssueService;
    @Autowired
    private LavorIssueMapper lavorIssueMapper;
    @Autowired
    private SysDeptMapper sysDeptMapper;
    @GetMapping("/listPage")
    @Log(title = "劳保发放-分页查询", businessType = BusinessType.OTHER)
    @ApiOperation("劳保发放-分页查询")
    public AjaxResult listPage(Page page, LaborIssue laborIssue){
        IPage<LaborIssue> listPage = laborIssueService.listPage(page, laborIssue);
        return AjaxResult.success(listPage);
    }
    @GetMapping("/statisticsList")
    @Log(title = "劳保发放-统计查询", businessType = BusinessType.OTHER)
    @ApiOperation("劳保发放-统计查询")
    public AjaxResult statisticsList(LaborIssue laborIssue){
        List<Map<String, Object>> listPage = laborIssueService.statisticsList(laborIssue);
        return AjaxResult.success(listPage);
    }
    @PostMapping("/add")
    @Log(title = "劳保发放-添加", businessType = BusinessType.INSERT)
    @ApiOperation("劳保发放-添加")
    @Transactional(rollbackFor = Exception.class)
    public AjaxResult add(@RequestBody LaborIssue laborIssue){
        String today = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
        StartAndEndDateDto dateTime = DailyRedisCounter.getDateTime();
        Long approveId = lavorIssueMapper.selectCount(new LambdaQueryWrapper<LaborIssue>()
                .gt(LaborIssue::getCreateTime, dateTime.getStartDate())
                .lt(LaborIssue::getCreateTime, dateTime.getEndDate()));
        String formattedCount = String.format("%03d", approveId + 1);
        laborIssue.setOrderNo(today + formattedCount);
        List<LaborIssue> laborIssues = lavorIssueMapper.selectList(new LambdaQueryWrapper<LaborIssue>()
                .like(LaborIssue::getOrderNo, today));
        if(!CollectionUtils.isEmpty(laborIssues)){
            long l = Long.parseLong(laborIssues.get(laborIssues.size() - 1).getOrderNo());
            laborIssue.setOrderNo(String.format("%03d", l + 1));
        }
        boolean save = laborIssueService.save(laborIssue);
        return save ? AjaxResult.success() : AjaxResult.error();
    }
    @PostMapping("/update")
    @Log(title = "劳保发放-修改", businessType = BusinessType.UPDATE)
    @ApiOperation("劳保发放-修改")
    @Transactional(rollbackFor = Exception.class)
    public AjaxResult update(@RequestBody LaborIssue laborIssue){
        boolean update = laborIssueService.updateById(laborIssue);
        return update ? AjaxResult.success() : AjaxResult.error();
    }
    @DeleteMapping("/delete")
    @Log(title = "劳保发放-删除", businessType = BusinessType.DELETE)
    @ApiOperation("劳保发放-删除")
    @Transactional(rollbackFor = Exception.class)
    public AjaxResult delete(@RequestBody List<Long> ids){
        boolean delete = laborIssueService.removeBatchByIds(ids);
        return delete ? AjaxResult.success() : AjaxResult.error();
    }
    @GetMapping("/statistics")
    @ApiOperation("劳保发放-统计")
    public AjaxResult statistics(StatisticsLaborIssue req) throws Exception {
        StatisticsLaborIssue statisticsLaborIssue = laborIssueService.statistics(req);
        return AjaxResult.success(statisticsLaborIssue);
    }
    /**
     * åŠ³ä¿å‘æ”¾-导出
     */
    @Log(title = "劳保发放-导出", businessType = BusinessType.EXPORT)
    @PostMapping("/export")
    @ApiOperation("劳保发放-导出")
    public void export(HttpServletResponse response) {
        Long tenantId = SecurityUtils.getLoginUser().getTenantId();
        ExcelUtil<LaborIssue> util = new ExcelUtil<LaborIssue>(LaborIssue.class);
        List<LaborIssue> list = lavorIssueMapper.list(new LaborIssue());
        SysDept sysDept = sysDeptMapper.selectDeptById(tenantId);
        if(sysDept == null){
            throw new RuntimeException("部门不存在!");
        }
        list.forEach(item -> {
            item.setDeptName(sysDept.getDeptName());
        });
        util.exportExcel(response, list , "劳保台账");
    }
    /**
     * åŠ³ä¿å‘æ”¾-导出
     */
    @Log(title = "劳保发放-导出", businessType = BusinessType.EXPORT)
    @PostMapping("/exportCopy")
    @ApiOperation("劳保发放-导出")
    public void exportCopy(HttpServletResponse response,LaborIssue laborIssue) throws UnsupportedEncodingException {
        laborIssueService.exportCopy(response,laborIssue);
    }
}
src/main/java/com/ruoyi/lavorissue/dto/StatisticsLaborIssue.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,30 @@
package com.ruoyi.lavorissue.dto;
import io.swagger.annotations.ApiModel;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
/**
 * @author :yys
 * @date : 2025/8/14 11:53
 */
@Data
@ApiModel
public class StatisticsLaborIssue {
    private Integer season;
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private Date issueDate;
    private Long ylqNum = 0L;
    private Long wlqNum = 0L;
    private Long csylqNum = 0L;
    private Long cswlqNum = 0L;
}
src/main/java/com/ruoyi/lavorissue/mapper/LavorIssueMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,27 @@
package com.ruoyi.lavorissue.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.lavorissue.pojo.LaborIssue;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
 * @author :yys
 * @date : 2025/8/13 11:17
 */
public interface LavorIssueMapper extends BaseMapper<LaborIssue> {
    /**
     * èŽ·å–åˆ—è¡¨
     *
     * @param page
     * @param laborIssue
     * @return
     */
    IPage<LaborIssue> listPage(Page page, @Param("req") LaborIssue laborIssue);
    List<LaborIssue> list(@Param("req") LaborIssue laborIssue);
}
src/main/java/com/ruoyi/lavorissue/pojo/LaborIssue.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,172 @@
package com.ruoyi.lavorissue.pojo;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.approve.utils.StartAndEndDateDto;
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import java.util.Date;
/**
 * @author :yys
 * @date : 2025/8/13 11:12
 */
@Data
@TableName("labor_issue")
@ApiModel
public class LaborIssue extends StartAndEndDateDto {
    private static final long serialVersionUID = 1L;
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    @TableField(exist = false)
    @ApiModelProperty("1-已领取劳保数量 2-未领取劳保数量 3-超时已领取劳保数量 4-超时未领取劳保数量")
    private Integer status;
    @TableField(exist = false)
    private Integer season;
    /**
     * éƒ¨é—¨åç§°
     */
    @ApiModelProperty("部门名称")
    @Excel(name = "部门名称")
    @TableField(exist = false)
    private String deptName;
    /**
     * åŠ³ä¿å•å·
     */
    @ApiModelProperty("劳保单号")
    @Excel(name = "劳保单号")
    private String orderNo;
    /**
     * å‘˜å·¥id
     */
    @ApiModelProperty("员工id")
    private Long staffId;
    /**
     * å‘˜å·¥åç§°
     */
    @ApiModelProperty("员工名称")
    @Excel(name = "员工名称")
    @TableField(exist = false)
    private String staffName;
    /**
     * å‘˜å·¥ç¼–号
     */
    @ApiModelProperty("员工编号")
    @Excel(name = "员工编号")
    @TableField(exist = false)
    private String staffNo;
    /**
     * åŠ³ä¿ç±»åž‹-字典
     */
    @ApiModelProperty("劳保类型-字典")
    private String dictType;
    /**
     * åŠ³ä¿ç±»åž‹
     */
    @ApiModelProperty("劳保类型")
    @Excel(name = "劳保类型")
    @TableField(exist = false)
    private String dictTypeName;
    /**
     * é˜²å…·åç§°-字典
     */
    @ApiModelProperty("防具名称-字典")
    private String dictId;
    /**
     * é˜²å…·åç§°
     */
    @ApiModelProperty("防具名称")
    @Excel(name = "防具名称")
    @TableField(exist = false)
    private String dictName;
    /**
     * é¢†ç”¨æ•°é‡
     */
    @ApiModelProperty("领用数量")
    @Excel(name = "领用数量")
    private Long num;
    /**
     * è¿›åŽ‚æ—¥æœŸ
     */
    @ApiModelProperty("进厂日期")
    @Excel(name = "进厂日期", width = 30, dateFormat = "yyyy-MM-dd")
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private Date factoryDate;
    /**
     * å‘放日期
     */
    @ApiModelProperty("发放日期")
    @Excel(name = "发放日期", width = 30, dateFormat = "yyyy-MM-dd")
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private Date issueDate;
    /**
     * é¢†ç”¨æ—¥æœŸ
     */
    @ApiModelProperty("领用日期")
    @Excel(name = "领用日期", width = 30, dateFormat = "yyyy-MM-dd")
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private Date adoptedDate;
    /**
     * ç­¾å
     */
    @Excel(name = "签名")
    @TableField(exist = false)
    private String sign;
    /**
     * åˆ›å»ºè€…
     */
    @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;
    /**
     * ç§Ÿæˆ·ID
     */
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
}
src/main/java/com/ruoyi/lavorissue/service/LavorIssueService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,34 @@
package com.ruoyi.lavorissue.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.lavorissue.dto.StatisticsLaborIssue;
import com.ruoyi.lavorissue.pojo.LaborIssue;
import javax.servlet.http.HttpServletResponse;
import java.io.UnsupportedEncodingException;
import java.util.List;
import java.util.Map;
/**
 * @author :yys
 * @date : 2025/8/13 11:18
 */
public interface LavorIssueService extends IService<LaborIssue> {
    /**
     * æŸ¥è¯¢åˆ—表
     *
     * @param page
     * @param laborIssue
     * @return
     */
    IPage<LaborIssue> listPage(Page page, LaborIssue laborIssue);
    StatisticsLaborIssue statistics(StatisticsLaborIssue req) throws  Exception;
    void exportCopy(HttpServletResponse response, LaborIssue laborIssue) throws UnsupportedEncodingException;
    List<Map<String, Object>> statisticsList(LaborIssue laborIssue);
}
src/main/java/com/ruoyi/lavorissue/service/impl/LavorIssueServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,365 @@
package com.ruoyi.lavorissue.service.impl;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.approve.utils.StartAndEndDateDto;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.excel.ConfigurableMergeStrategy;
import com.ruoyi.common.utils.excel.CustomCellStyleHandler;
import com.ruoyi.lavorissue.dto.StatisticsLaborIssue;
import com.ruoyi.lavorissue.mapper.LavorIssueMapper;
import com.ruoyi.lavorissue.pojo.LaborIssue;
import com.ruoyi.lavorissue.service.LavorIssueService;
import com.ruoyi.project.system.domain.SysDept;
import com.ruoyi.project.system.domain.SysDictData;
import com.ruoyi.project.system.mapper.SysDeptMapper;
import com.ruoyi.project.system.mapper.SysDictDataMapper;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.util.CellRangeAddress;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;
/**
 * @author :yys
 * @date : 2025/8/13 11:18
 */
@Service
@Slf4j
public class LavorIssueServiceImpl extends ServiceImpl<LavorIssueMapper, LaborIssue> implements LavorIssueService {
    @Autowired
    private LavorIssueMapper lavorIssueMapper;
    @Override
    public IPage<LaborIssue> listPage(Page page, LaborIssue laborIssue) {
        StartAndEndDateDto startAndEndDateDto = getStartAndEndDateDto(laborIssue.getSeason(), laborIssue.getIssueDate());
        laborIssue.setStartDate(startAndEndDateDto.getStartDate());
        laborIssue.setEndDate(startAndEndDateDto.getEndDate());
        return lavorIssueMapper.listPage(page, laborIssue);
    }
    @Override
    public List<Map<String, Object>> statisticsList(LaborIssue laborIssue){
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        StartAndEndDateDto startAndEndDateDto = getStartAndEndDateDto(laborIssue.getSeason(), laborIssue.getIssueDate());
        laborIssue.setStartDate(startAndEndDateDto.getStartDate());
        laborIssue.setEndDate(startAndEndDateDto.getEndDate());
        List<LaborIssue> laborIssueIPage = lavorIssueMapper.list(laborIssue);
        // ä½¿ç”¨å¯å˜çš„ArrayList替换默认的不可变列表
        List<Map<String, Object>> records = new ArrayList<>();
        Map<String, List<LaborIssue>> collect = laborIssueIPage.stream().collect(Collectors.groupingBy(LaborIssue::getStaffNo));
        collect.forEach((k, v) -> {
            HashMap<String, Object> hashMap = new HashMap<>();
            LaborIssue laborIssue1 = v.get(0);
            hashMap.put("id", v.stream().map(LaborIssue::getId));
            hashMap.put("deptName", laborIssue1.getDeptName());
            hashMap.put("orderNo", laborIssue1.getOrderNo());
            hashMap.put("staffId", laborIssue1.getStaffId());
            hashMap.put("staffName", laborIssue1.getStaffName());
            hashMap.put("staffNo", laborIssue1.getStaffNo());
            hashMap.put("dictType", laborIssue1.getDictType());
            hashMap.put("dictTypeName", laborIssue1.getDictTypeName());
            hashMap.put("factoryDate", laborIssue1.getFactoryDate() == null ? "" : sdf.format(laborIssue1.getFactoryDate()));
            hashMap.put("issueDate", laborIssue1.getIssueDate() == null ? "" : sdf.format(laborIssue1.getIssueDate()));
            hashMap.put("adoptedDate", laborIssue1.getAdoptedDate() == null ? "" : sdf.format(laborIssue1.getAdoptedDate()));
            hashMap.put("tenantId", laborIssue1.getTenantId());
            Map<String, List<LaborIssue>> collect1 = v.stream().collect(Collectors.groupingBy(LaborIssue::getDictId));
            collect1.forEach((k1, v1) -> {
                hashMap.put(k1, v1.stream()
                        .mapToLong(LaborIssue::getNum)
                        .sum());
            });
            records.add(hashMap);
        });
        return records;
    }
    public StartAndEndDateDto getStartAndEndDateDto(Integer season,Date payDate){
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        StartAndEndDateDto startAndEndDateDto = new StartAndEndDateDto();
        Calendar calendar = Calendar.getInstance();
        int currentYear = calendar.get(Calendar.YEAR);
        startAndEndDateDto.setYear(currentYear);
        if(season != null){
            switch (season){
                case 1:
                    startAndEndDateDto.setStartDate(currentYear + "-01-01");
                    startAndEndDateDto.setEndDate(currentYear + "-03-31");
                    startAndEndDateDto.setStartMonth(1);
                    startAndEndDateDto.setEndMonth(3);
                    break;
                case 2:
                    startAndEndDateDto.setStartDate(currentYear + "-04-01");
                    startAndEndDateDto.setEndDate(currentYear + "-06-30");
                    startAndEndDateDto.setStartMonth(4);
                    startAndEndDateDto.setEndMonth(6);
                    break;
                case 3:
                    startAndEndDateDto.setStartDate(currentYear + "-07-01");
                    startAndEndDateDto.setEndDate(currentYear + "-09-30");
                    startAndEndDateDto.setStartMonth(7);
                    startAndEndDateDto.setEndMonth(9);
                    break;
                case 4:
                    startAndEndDateDto.setStartDate(currentYear + "-10-01");
                    startAndEndDateDto.setEndDate(currentYear + "-12-31");
                    startAndEndDateDto.setStartMonth(10);
                    startAndEndDateDto.setEndMonth(12);
                    break;
            }
        }
        if(payDate != null){
            Date lastDayOfMonth = getLastDayOfMonth(payDate);
            Date firstDayOfMonth = getFirstDayOfMonth(payDate);
            startAndEndDateDto.setStartDate(sdf.format(firstDayOfMonth));
            startAndEndDateDto.setEndDate(sdf.format(lastDayOfMonth));
            startAndEndDateDto.setStartMonth(payDate.getMonth() + 1);
            startAndEndDateDto.setEndMonth(payDate.getMonth() + 1);
        }
        return startAndEndDateDto;
    }
    @Override
    public StatisticsLaborIssue statistics(StatisticsLaborIssue req) throws Exception{
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        StatisticsLaborIssue statisticsLaborIssue = new StatisticsLaborIssue();
        StartAndEndDateDto startAndEndDateDto = getStartAndEndDateDto(req.getSeason(), req.getIssueDate());
        LambdaQueryWrapper<LaborIssue> laborIssueLambdaQueryWrapper = new LambdaQueryWrapper<>();
        if(req.getSeason() != null || req.getIssueDate() != null){
            laborIssueLambdaQueryWrapper.ge(LaborIssue::getIssueDate, startAndEndDateDto.getStartDate())
                    .le(LaborIssue::getIssueDate, startAndEndDateDto.getEndDate());
        }
        List<LaborIssue> laborIssues = lavorIssueMapper.selectList(laborIssueLambdaQueryWrapper);
        if(!CollectionUtils.isEmpty(laborIssues)){
            Long sum = laborIssues.stream()
                    .filter(laborIssue -> laborIssue.getAdoptedDate() != null)
                    .mapToLong(LaborIssue::getNum)
                    .sum();
            statisticsLaborIssue.setYlqNum(sum);
            statisticsLaborIssue.setWlqNum(laborIssues.stream()
                    .filter(laborIssue -> laborIssue.getAdoptedDate() == null)
                    .mapToLong(LaborIssue::getNum)
                    .sum());
            Date currentDate = new Date();
            Date parse = sdf.parse(sdf.format(currentDate));
            statisticsLaborIssue.setCsylqNum(laborIssues.stream()
                    .filter(laborIssue -> laborIssue.getIssueDate() != null
                            && laborIssue.getAdoptedDate() != null
                            && (laborIssue.getIssueDate().before(laborIssue.getAdoptedDate())))
                    .mapToLong(LaborIssue::getNum)
                    .sum());
            statisticsLaborIssue.setCswlqNum(laborIssues.stream()
                    .filter(laborIssue -> laborIssue.getIssueDate() != null
                            && laborIssue.getIssueDate().before(parse)
                            && laborIssue.getAdoptedDate() == null)
                    .mapToLong(LaborIssue::getNum)
                    .sum());
        }
        return statisticsLaborIssue;
    }
    @Autowired
    private SysDictDataMapper sysDictDataMapper;
    @Override
    public void exportCopy(HttpServletResponse response, LaborIssue laborIssue) throws UnsupportedEncodingException {
        List<SysDictData> sys_lavor_issue = sysDictDataMapper.selectDictDataByType("sys_lavor_issue");
        if(CollectionUtils.isEmpty(sys_lavor_issue)){
            throw new RuntimeException("字典数据为空");
        }
        StartAndEndDateDto startAndEndDateDto = getStartAndEndDateDto(laborIssue.getSeason(), laborIssue.getIssueDate());
        BeanUtils.copyProperties(startAndEndDateDto, laborIssue);
        List<LaborIssue> laborIssues = lavorIssueMapper.list(laborIssue);
        if (CollectionUtils.isEmpty(laborIssues)) {
            throw new RuntimeException("数据为空");
        }
        Map<String, List<LaborIssue>> laborIssueMap = laborIssues.stream()
                .collect(Collectors.groupingBy(LaborIssue::getStaffNo));
        response.setContentType("application/vnd.ms-excel");
        response.setCharacterEncoding("UTF-8");
        // è¿™é‡ŒURLEncoder.encode可以防止中文乱码 å½“ç„¶å’Œeasyexcel没有关系
        String fileName = URLEncoder.encode("劳保台账", "UTF-8");
        response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
        try {
            //新建ExcelWriter
            ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream())
                    .registerWriteHandler(new CustomCellStyleHandler())
                    .registerWriteHandler(new ConfigurableMergeStrategy(exportExternalPackingListGetMerge(4,sys_lavor_issue.size(),laborIssueMap.size())))
                    .build();
            List<List<List<String>>> data = completeExternalPackingList(laborIssueMap, sys_lavor_issue,laborIssue);
            for (int i = 0; i < data.size(); i++) {
                List<List<String>> list = data.get(i);
                //获取sheet0对象
                WriteSheet mainSheet = EasyExcel.writerSheet(i, "劳保台账" + i).build();
                //向sheet0写入数据 ä¼ å…¥ç©ºlist这样只导出表头
                excelWriter.write(list, mainSheet);
            }
            //关闭流
            excelWriter.finish();
        } catch (IOException e) {
            throw new RuntimeException("导出失败");
        }
    }
    @Autowired
    private SysDeptMapper sysDeptMapper;
//     å¤„理外部装箱单数据
    private List<List<List<String>>> completeExternalPackingList(Map<String, List<LaborIssue>> listMap,List<SysDictData> sys_lavor_issue,LaborIssue obj) {
        List<List<List<String>>> data = new ArrayList<>();
        int num = sys_lavor_issue.size();
        List<List<String>> item = new ArrayList<>();
        List<String> list = new ArrayList<>();
        list.add("部门");
        list.add("");
        list.add("企业管理科");
        list.add("");
        list.add("企业管理科" + obj.getYear() + "å¹´" + obj.getStartMonth() + "月-" + obj.getYear() + "å¹´" + obj.getEndMonth() +"月劳保发放计划表");
        for (int i = 1; i <= num; i++){
            list.add("");
        }
        item.add(list);
        List<String> list1 = new ArrayList<>();
        list1.add("开始年/月");
        list1.add("");
        list1.add("结束年/月");
        list1.add("");
        for (int i = 0; i <= num; i++){
            list1.add("");
        }
        item.add(list1);
        List<String> list2 = new ArrayList<>();
        list2.add(obj.getYear().toString());
        list2.add(obj.getStartMonth().toString());
        list2.add(obj.getYear().toString());
        list2.add(obj.getEndMonth().toString());
        for (int i = 0; i <= num; i++){
            list.add("");
        }
        item.add(list2);
        List<String> list3 = new ArrayList<>();
        list3.add("部门名称");
        list3.add("");
        list3.add("姓名");
        list3.add("工号");
        for (SysDictData sysDictData : sys_lavor_issue) {
            list3.add(sysDictData.getDictLabel());
        }
        list3.add("签名");
        item.add(list3);
        // å¡«å€¼
        SysDept sysDept = sysDeptMapper.selectDeptById(SecurityUtils.getLoginUser().getTenantId());
        List<String> sumList = new ArrayList<>();
        AtomicInteger i = new AtomicInteger();
        listMap.forEach((key, value) -> {
            List<String> list4 = new ArrayList<>();
            list4.add(sysDept.getDeptName());
            list4.add("");
            list4.add(value.get(0).getStaffName());
            list4.add(value.get(0).getStaffNo());
            int j = 0;
            for (SysDictData sysDictData : sys_lavor_issue) {
                list4.add(value.stream().filter(laborIssue -> laborIssue.getDictId().equals(sysDictData.getDictValue()))
                        .mapToLong(LaborIssue::getNum)
                        .sum()
                        + "");
                if(i.get() == 0){
                    sumList.add(value.stream().filter(laborIssue -> laborIssue.getDictId().equals(sysDictData.getDictValue()))
                            .mapToLong(LaborIssue::getNum)
                            .sum()
                            + "");
                }else {
                    sumList.set(j,(Long.parseLong(sumList.get(j)) + value.stream().filter(laborIssue -> laborIssue.getDictId().equals(sysDictData.getDictValue()))
                            .mapToLong(LaborIssue::getNum)
                            .sum())
                            + "");
                }
                j++;
            }
            i.getAndIncrement();
            item.add(list4);
        });
        List<String> list5 = new ArrayList<>();
        list5.add("合计");
        list5.add("");
        list5.add("");
        list5.add("");
        for (int h = 0; h < sumList.size(); h++){
            list5.add(sumList.get(h));
        }
        item.add(list5);
        data.add(item);
        return data;
    }
    /**
     * å¤–部装箱单合并单元格
     *
     * @return
     */
    private List<CellRangeAddress> exportExternalPackingListGetMerge(Integer rowNum,Integer num,Integer listSize) {
        List<CellRangeAddress> mergeRegions = new ArrayList<>();
        mergeRegions.add(new CellRangeAddress(0, 0, 0, 1)); // åˆå¹¶A1:Q2
        mergeRegions.add(new CellRangeAddress(0, 0, 2, 3)); // åˆå¹¶A4:Q4
        mergeRegions.add(new CellRangeAddress(0, 2, rowNum, rowNum + num)); // åˆå¹¶A5:B6
        mergeRegions.add(new CellRangeAddress(1, 1, 0, 1)); // åˆå¹¶C5:E6
        mergeRegions.add(new CellRangeAddress(1, 1, 2, 3)); // åˆå¹¶F5:G6
        mergeRegions.add(new CellRangeAddress(3, 3, 0, 1)); // åˆå¹¶H5:I6
        for (int i = 1; i <= listSize; i++) {
            mergeRegions.add(new CellRangeAddress(3 + i, 3 + i, 0, 1));
        }
        mergeRegions.add(new CellRangeAddress(rowNum + listSize, rowNum + listSize, 0, 3));
        return mergeRegions;
    }
    public Date getLastDayOfMonth(Date date) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date); // è®¾ç½®ä¼ å…¥çš„Date
        calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMaximum(Calendar.DAY_OF_MONTH)); // è®¾ç½®ä¸ºå½“月最后一天
        return calendar.getTime(); // è¿”回Date对象
    }
    /**
     * èŽ·å–å½“æœˆç¬¬ä¸€å¤©
     * @param date
     * @return
     */
    public Date getFirstDayOfMonth(Date date) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date); // è®¾ç½®ä¼ å…¥çš„Date
        calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMinimum(Calendar.DAY_OF_MONTH)); // è®¾ç½®ä¸ºå½“月第一天
        return calendar.getTime(); // è¿”回Date对象
    }
}
src/main/java/com/ruoyi/measuringinstrumentledger/controller/SparePartsController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,62 @@
package com.ruoyi.measuringinstrumentledger.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.measuringinstrumentledger.dto.SparePartsDto;
import com.ruoyi.measuringinstrumentledger.pojo.MeasuringInstrumentLedgerRecord;
import com.ruoyi.measuringinstrumentledger.pojo.SpareParts;
import com.ruoyi.measuringinstrumentledger.service.SparePartsService;
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.util.List;
@RestController
@RequestMapping("/spareParts")
@Api(tags = "备件分类接口")
public class SparePartsController {
    @Autowired
    private SparePartsService sparePartsService;
    @GetMapping("/getTree")
    @ApiOperation("备件分类-树结构")
    public AjaxResult getTree(){
        List<SparePartsDto> tree = sparePartsService.getTree();
        return AjaxResult.success(tree);
    }
    @GetMapping("/listPage")
    @ApiOperation("备件分类-分页查询")
    public AjaxResult listPage(Page page, SpareParts spareParts){
        IPage<SparePartsDto> listPage = sparePartsService.listPage(page, spareParts);
        return AjaxResult.success(listPage);
    }
//    @GetMapping("/list")
//    @ApiOperation("备件分类-查询所有")
//    public AjaxResult list(){
//        return AjaxResult.success(sparePartsService.list());
//    }
    @PostMapping("/add")
    @ApiOperation("备件分类-添加")
    @Log(title = "备件分类-添加", businessType = BusinessType.INSERT)
    public AjaxResult add(@RequestBody SpareParts spareParts){
        return AjaxResult.success(sparePartsService.save(spareParts));
    }
    @PostMapping("/update")
    @ApiOperation("备件分类-更新")
    @Log(title = "备件分类-更新", businessType = BusinessType.UPDATE)
    public AjaxResult update(@RequestBody SpareParts spareParts){
        return AjaxResult.success(sparePartsService.updateById(spareParts));
    }
    @DeleteMapping("/delete/{id}")
    @ApiOperation("备件分类-删除")
    @Log(title = "备件分类-删除", businessType = BusinessType.DELETE)
    public AjaxResult delete(@PathVariable Long id){
        return AjaxResult.success(sparePartsService.removeById(id));
    }
}
src/main/java/com/ruoyi/measuringinstrumentledger/dto/SparePartsDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,15 @@
package com.ruoyi.measuringinstrumentledger.dto;
import com.ruoyi.measuringinstrumentledger.pojo.SpareParts;
import lombok.Data;
import java.util.List;
@Data
public class SparePartsDto extends SpareParts {
    /**
     * å¤‡ä»¶åˆ†ç±»çˆ¶åç§°
     */
    private String parentName;
    private List<SparePartsDto> children;
}
src/main/java/com/ruoyi/measuringinstrumentledger/mapper/SparePartsMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,14 @@
package com.ruoyi.measuringinstrumentledger.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.measuringinstrumentledger.dto.SparePartsDto;
import com.ruoyi.measuringinstrumentledger.pojo.SpareParts;
import io.lettuce.core.dynamic.annotation.Param;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface SparePartsMapper extends BaseMapper<SpareParts> {
    IPage<SparePartsDto> listPage(Page page,@Param("spareParts") SpareParts spareParts);
}
src/main/java/com/ruoyi/measuringinstrumentledger/pojo/SpareParts.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,59 @@
package com.ruoyi.measuringinstrumentledger.pojo;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
@Data
@TableName("spare_parts")
public class SpareParts {
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    /**
     * å¤‡ä»¶åˆ†ç±»åç§°
     */
    private String name;
    /**
     * å¤‡ä»¶åˆ†ç±»ç¼–号
     */
    private String sparePartsNo;
    /**
     * å¤‡ä»¶çˆ¶id
     */
    private Long parentId;
    /**
     * å¤‡ä»¶çŠ¶æ€
     */
    private String status;
    /**
     * å¤‡ä»¶åˆ†ç±»æè¿°
     */
    private String description;
    @ApiModelProperty("创建时间")
    @TableField(fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    @ApiModelProperty("更新时间")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;
    @ApiModelProperty("创建人")
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    @ApiModelProperty("更新人")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    @ApiModelProperty("租户id")
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
}
src/main/java/com/ruoyi/measuringinstrumentledger/service/SparePartsService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,16 @@
package com.ruoyi.measuringinstrumentledger.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.measuringinstrumentledger.dto.SparePartsDto;
import com.ruoyi.measuringinstrumentledger.pojo.SpareParts;
import java.util.List;
public interface SparePartsService extends IService<SpareParts> {
    IPage<SparePartsDto> listPage(Page page, SpareParts spareParts);
    List<SparePartsDto> getTree();
}
src/main/java/com/ruoyi/measuringinstrumentledger/service/impl/MeasuringInstrumentLedgerRecordServiceImpl.java
@@ -144,12 +144,15 @@
            try {
                // æ‰§è¡Œæ–‡ä»¶è¿ç§»ï¼ˆä½¿ç”¨åŽŸå­æ“ä½œç¡®ä¿å®‰å…¨æ€§ï¼‰
                Files.move(
                        Paths.get(tempFile.getTempPath()),
                        formalFilePath,
                        StandardCopyOption.REPLACE_EXISTING,
                        StandardCopyOption.ATOMIC_MOVE
                );
//                Files.move(
//                        Paths.get(tempFile.getTempPath()),
//                        formalFilePath,
//                        StandardCopyOption.REPLACE_EXISTING,
//                        StandardCopyOption.ATOMIC_MOVE
//                );
                // åŽŸå­ç§»åŠ¨å¤±è´¥ï¼Œä½¿ç”¨å¤åˆ¶+删除
                Files.copy(Paths.get(tempFile.getTempPath()), formalFilePath, StandardCopyOption.REPLACE_EXISTING);
                Files.deleteIfExists(Paths.get(tempFile.getTempPath()));
                log.info("文件迁移成功: {} -> {}", tempFile.getTempPath(), formalFilePath);
                // æ›´æ–°æ–‡ä»¶è®°å½•(关联到业务ID)
src/main/java/com/ruoyi/measuringinstrumentledger/service/impl/MeasuringInstrumentLedgerServiceImpl.java
@@ -189,12 +189,15 @@
            try {
                // æ‰§è¡Œæ–‡ä»¶è¿ç§»ï¼ˆä½¿ç”¨åŽŸå­æ“ä½œç¡®ä¿å®‰å…¨æ€§ï¼‰
                Files.move(
                        Paths.get(tempFile.getTempPath()),
                        formalFilePath,
                        StandardCopyOption.REPLACE_EXISTING,
                        StandardCopyOption.ATOMIC_MOVE
                );
//                Files.move(
//                        Paths.get(tempFile.getTempPath()),
//                        formalFilePath,
//                        StandardCopyOption.REPLACE_EXISTING,
//                        StandardCopyOption.ATOMIC_MOVE
//                );
                // åŽŸå­ç§»åŠ¨å¤±è´¥ï¼Œä½¿ç”¨å¤åˆ¶+删除
                Files.copy(Paths.get(tempFile.getTempPath()), formalFilePath, StandardCopyOption.REPLACE_EXISTING);
                Files.deleteIfExists(Paths.get(tempFile.getTempPath()));
                log.info("文件迁移成功: {} -> {}", tempFile.getTempPath(), formalFilePath);
                // æ›´æ–°æ–‡ä»¶è®°å½•(关联到业务ID)
src/main/java/com/ruoyi/measuringinstrumentledger/service/impl/SparePartsServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,73 @@
package com.ruoyi.measuringinstrumentledger.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.measuringinstrumentledger.dto.SparePartsDto;
import com.ruoyi.measuringinstrumentledger.mapper.SparePartsMapper;
import com.ruoyi.measuringinstrumentledger.pojo.SpareParts;
import com.ruoyi.measuringinstrumentledger.service.SparePartsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Service
public class SparePartsServiceImpl extends ServiceImpl<SparePartsMapper, SpareParts> implements SparePartsService {
    @Autowired
    private SparePartsMapper sparePartsMapper;
    @Override
    public IPage<SparePartsDto> listPage(Page page, SpareParts spareParts) {
        return sparePartsMapper.listPage(page,spareParts);
    }
    @Override
    public List<SparePartsDto> getTree() {
        SpareParts spareParts = new SpareParts();
        IPage<SparePartsDto> sparePartsDtoIPage = sparePartsMapper.listPage(new Page<>(1, -1), spareParts);
        List<SparePartsDto> records = sparePartsDtoIPage.getRecords();
        return buildTree(records);
    }
    /**
     * å°†æ‰å¹³ç»“构数据转换为树形结构
     * @param flatData æ‰å¹³èŠ‚ç‚¹åˆ—è¡¨
     * @return æ ‘形结构根节点列表
     */
    public static List<SparePartsDto> buildTree(List<SparePartsDto> flatData) {
        List<SparePartsDto> result = new ArrayList<>();
        if (flatData == null || flatData.isEmpty()) {
            return result;  // ç©ºè¾“入直接返回空列表
        }
        // 1. åˆ›å»ºèŠ‚ç‚¹æ˜ å°„è¡¨ï¼Œå­˜å‚¨æ‰€æœ‰èŠ‚ç‚¹å¹¶åˆå§‹åŒ–å­èŠ‚ç‚¹åˆ—è¡¨
        Map<Long, SparePartsDto> nodeMap = new HashMap<>();
        for (SparePartsDto node : flatData) {
            // ç¡®ä¿å­èŠ‚ç‚¹åˆ—è¡¨åˆå§‹åŒ–(避免空指针异常)
            if (node.getChildren() == null) {
                node.setChildren(new ArrayList<>());
            }
            nodeMap.put(node.getId(), node);
        }
        // 2. æž„建树形结构
        for (SparePartsDto node : flatData) {
            Long parentId = node.getParentId();
            if (parentId == null || !nodeMap.containsKey(parentId)) {
                // æ— çˆ¶èŠ‚ç‚¹æˆ–çˆ¶èŠ‚ç‚¹ä¸å­˜åœ¨ï¼Œä½œä¸ºæ ¹èŠ‚ç‚¹
                result.add(node);
            } else {
                // æœ‰çˆ¶èŠ‚ç‚¹ï¼Œæ·»åŠ åˆ°çˆ¶èŠ‚ç‚¹çš„å­èŠ‚ç‚¹åˆ—è¡¨
                SparePartsDto parentNode = nodeMap.get(parentId);
                parentNode.getChildren().add(node);
            }
        }
        return result;
    }
}
src/main/java/com/ruoyi/oA/controller/OaProjectController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,76 @@
package com.ruoyi.oA.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.measuringinstrumentledger.pojo.MeasuringInstrumentLedger;
import com.ruoyi.oA.dto.OaProjectDto;
import com.ruoyi.oA.pojo.OaProject;
import com.ruoyi.oA.service.OaProjectService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;
import java.util.List;
@Api(tags = "oA项目管理")
@RestController
@RequestMapping("/oA/project")
public class OaProjectController {
    @Autowired
    private OaProjectService oaProjectService;
    @ApiOperation("获取项目列表")
    @GetMapping("/listPage")
    public AjaxResult listPage(Page page, OaProjectDto oaProjectDto) {
        IPage<OaProjectDto> listPage = oaProjectService.listPage(page, oaProjectDto);
        return AjaxResult.success(listPage);
    }
    @ApiOperation("获取项目列表详情")
    @GetMapping("/getList")
    public AjaxResult getList(Page page, OaProjectDto oaProjectDto) {
        IPage<OaProjectDto> listPage = oaProjectService.listPage(page, oaProjectDto);
        HashMap<Object, Object> Map = new HashMap<>();
        listPage.getRecords().forEach(item -> {
            Map.put(item.getProjectId(), item);
        });
        return AjaxResult.success(Map);
    }
    @ApiOperation("增添项目")
    @PostMapping("/add")
    public AjaxResult add(@RequestBody OaProject oaProject) {
        boolean save = oaProjectService.save(oaProject);
        return AjaxResult.success(save);
    }
    @ApiOperation("删除项目")
    @DeleteMapping("/delete/{id}")
    public AjaxResult delete(@PathVariable Long id) {
        boolean remove = oaProjectService.deleteById(id);
        return AjaxResult.success(remove);
    }
    @ApiOperation("更新项目")
    @PostMapping("/update")
    public AjaxResult update(@RequestBody OaProject oaProject) {
        boolean update = oaProjectService.updateById(oaProject);
        return AjaxResult.success(update);
    }
//    @ApiOperation("根据ID获取项目详情")
//    @GetMapping("/getById")
//    public AjaxResult getById(Long id) {
//        OaProject oaProject = oaProjectService.getById(id);
//        return AjaxResult.success(oaProject);
//    }
    @ApiOperation("导出所选项目")
    @PostMapping("/export/{ids}")
    public void export(HttpServletResponse response,@PathVariable("ids") List<Long> ids) {
        if (CollectionUtils.isEmpty(ids)) {
            throw new IllegalArgumentException("导出项目列表不能为空");
        }
        oaProjectService.export(response, ids);
    }
}
src/main/java/com/ruoyi/oA/controller/OaProjectPhaseController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,41 @@
package com.ruoyi.oA.controller;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.oA.pojo.OaProjectPhase;
import com.ruoyi.oA.service.OaProjectPhaseService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@Api(tags = "oA项目阶段管理")
@RestController
@RequestMapping("/oA/projectPhase")
public class OaProjectPhaseController {
    @Autowired
    private OaProjectPhaseService oaProjectPhaseService;
    @ApiOperation("新增项目阶段")
    @PostMapping("/add")
    public AjaxResult add(@RequestBody OaProjectPhase oaProjectPhase) {
        return AjaxResult.success(oaProjectPhaseService.save(oaProjectPhase));
    }
    @ApiOperation("删除项目阶段")
    @DeleteMapping("/delete/{phaseId}")
    public AjaxResult delete(@PathVariable Integer phaseId) {
        return AjaxResult.success(oaProjectPhaseService.deleteById(phaseId));
    }
    @ApiOperation("更新项目阶段")
    @PostMapping("/update")
    public AjaxResult update(@RequestBody OaProjectPhase oaProjectPhase) {
        return AjaxResult.success(oaProjectPhaseService.updateById(oaProjectPhase));
    }
    @ApiOperation("根据项目id查询项目阶段列表")
    @GetMapping("/listByProjectId/{projectId}")
    public AjaxResult listByProjectId(@PathVariable Integer projectId) {
        return AjaxResult.success(oaProjectPhaseService.listByProjectId(projectId));
    }
}
src/main/java/com/ruoyi/oA/controller/OaProjectPhaseTaskController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,41 @@
package com.ruoyi.oA.controller;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.oA.pojo.OaProjectPhaseTask;
import com.ruoyi.oA.service.OaProjectPhaseTaskService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@Api(tags = "oA项目阶段任务管理")
@RestController
@RequestMapping("/oA/projectPhaseTask")
public class OaProjectPhaseTaskController {
    @Autowired
    private OaProjectPhaseTaskService oaProjectPhaseTaskService;
    @ApiOperation("新增项目阶段任务")
    @PostMapping("/add")
    public AjaxResult add(@RequestBody OaProjectPhaseTask oaProjectPhaseTask) {
        return AjaxResult.success(oaProjectPhaseTaskService.save(oaProjectPhaseTask));
    }
    @ApiOperation("根据项目阶段id查询项目阶段任务列表")
    @GetMapping("/listByPhaseId/{phaseId}")
    public AjaxResult listByPhaseId(@PathVariable Integer phaseId) {
        return AjaxResult.success(oaProjectPhaseTaskService.listByPhaseId(phaseId));
    }
    @ApiOperation("删除项目阶段任务")
    @DeleteMapping("/delete/{taskId}")
    public AjaxResult delete(@PathVariable Integer taskId) {
        return AjaxResult.success(oaProjectPhaseTaskService.removeById(taskId));
    }
    @ApiOperation("更新项目阶段任务")
    @PostMapping("/update")
    public AjaxResult update(@RequestBody OaProjectPhaseTask oaProjectPhaseTask) {
        return AjaxResult.success(oaProjectPhaseTaskService.updateById(oaProjectPhaseTask));
    }
}
src/main/java/com/ruoyi/oA/dto/OaProjectDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,26 @@
package com.ruoyi.oA.dto;
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
import com.ruoyi.oA.pojo.OaProject;
import com.ruoyi.oA.pojo.OaProjectPhase;
import com.ruoyi.oA.pojo.OaProjectPhaseTask;
import lombok.Data;
import java.util.List;
@Data
public class OaProjectDto extends OaProject {
    /**
     * è´Ÿè´£äººåç§°
     */
    @Excel(name = "负责人名称")
    private String managerName;
    /**
     * é¡¹ç›®é˜¶æ®µåˆ—表
     */
    private List<OaProjectPhaseDto> oaProjectPhasesDto;
//    /**
//     * é¡¹ç›®é˜¶æ®µä»»åŠ¡åˆ—è¡¨
//     */
//    private List<OaProjectPhaseTask> oaProjectPhaseTasks;
}
src/main/java/com/ruoyi/oA/dto/OaProjectPhaseDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,12 @@
package com.ruoyi.oA.dto;
import com.ruoyi.oA.pojo.OaProjectPhase;
import com.ruoyi.oA.pojo.OaProjectPhaseTask;
import lombok.Data;
import java.util.List;
@Data
public class OaProjectPhaseDto extends OaProjectPhase {
    private List<OaProjectPhaseTask> oaProjectPhaseTasks;
}
src/main/java/com/ruoyi/oA/mapper/OaProjectMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,27 @@
package com.ruoyi.oA.mapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.oA.dto.OaProjectDto;
import com.ruoyi.oA.pojo.OaProject;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* @author ywx
* @description é’ˆå¯¹è¡¨ã€oa_project(OA系统-项目任务协同-项目表)】的数据库操作Mapper
* @createDate 2025-09-24 09:18:46
* @Entity com.ruoyi.oA.pojo.OaProject
*/
public interface OaProjectMapper extends BaseMapper<OaProject> {
    IPage<OaProjectDto> listPage(Page page,@Param("req") OaProjectDto oaProjectDto);
    List<OaProjectDto> selectByIds(List<Long> ids);
}
src/main/java/com/ruoyi/oA/mapper/OaProjectPhaseMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,18 @@
package com.ruoyi.oA.mapper;
import com.ruoyi.oA.pojo.OaProjectPhase;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* @author ywx
* @description é’ˆå¯¹è¡¨ã€oa_project_phase(OA系统-项目阶段表)】的数据库操作Mapper
* @createDate 2025-09-24 09:18:46
* @Entity com.ruoyi.oA.pojo.OaProjectPhase
*/
public interface OaProjectPhaseMapper extends BaseMapper<OaProjectPhase> {
}
src/main/java/com/ruoyi/oA/mapper/OaProjectPhaseTaskMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,18 @@
package com.ruoyi.oA.mapper;
import com.ruoyi.oA.pojo.OaProjectPhaseTask;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* @author ywx
* @description é’ˆå¯¹è¡¨ã€oa_project_phase_task(OA系统-项目阶段-任务表)】的数据库操作Mapper
* @createDate 2025-09-24 09:18:46
* @Entity com.ruoyi.oA.pojo.OaProjectPhaseTask
*/
public interface OaProjectPhaseTaskMapper extends BaseMapper<OaProjectPhaseTask> {
}
src/main/java/com/ruoyi/oA/pojo/OaProject.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,107 @@
package com.ruoyi.oA.pojo;
import com.baomidou.mybatisplus.annotation.*;
import java.io.Serializable;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
/**
 * OA系统-项目任务协同-项目表
 * @TableName oa_project
 */
@TableName(value ="oa_project")
@Data
public class OaProject implements Serializable {
    /**
     *
     */
    @TableId(type = IdType.AUTO)
    private Integer projectId;
    /**
     * é¡¹ç›®åç§°
     */
    @Excel(name = "项目名称")
    private String projectName;
    /**
     * é¡¹ç›®æè¿°
     */
    @Excel(name = "项目描述")
    private String description;
    /**
     * å¼€å§‹æ—¶é—´
     */
    @Excel(name = "开始时间")
    @JsonFormat(pattern = "yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private LocalDate startDate;
    /**
     * ç»“束时间
     */
    @Excel(name = "结束时间")
    @JsonFormat(pattern = "yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private LocalDate endDate;
    /**
     * çŠ¶æ€
     */
    @Excel(name = "状态")
    private String status;
    /**
     * å®Œæˆåº¦
     */
    @Excel(name = "完成度")
    private Integer completionRate;
    /**
     * è´Ÿè´£äººid
     */
    private Long managerId;
    /**
     * åˆ›å»ºç”¨æˆ·
     */
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    /**
     * åˆ›å»ºæ—¶é—´
     */
    @TableField(fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    /**
     * ä¿®æ”¹ç”¨æˆ·
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    /**
     * ä¿®æ”¹æ—¶é—´
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;
    /**
     * ç§Ÿæˆ·ID
     */
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
}
src/main/java/com/ruoyi/oA/pojo/OaProjectPhase.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,92 @@
package com.ruoyi.oA.pojo;
import com.baomidou.mybatisplus.annotation.*;
import java.io.Serializable;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
/**
 * OA系统-项目阶段表
 * @TableName oa_project_phase
 */
@TableName(value ="oa_project_phase")
@Data
public class OaProjectPhase implements Serializable {
    /**
     *
     */
    @TableId(type = IdType.AUTO)
    private Integer phaseId;
    /**
     * é¡¹ç›®é˜¶æ®µåç§°
     */
    private String phaseName;
    /**
     * oa_project表id
     */
    private Integer oaProjectId;
    /**
     * å¼€å§‹æ—¶é—´
     */
    @JsonFormat(pattern = "yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private LocalDate startDate;
    /**
     * ç»“束时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private LocalDate endDate;
    /**
     * çŠ¶æ€
     */
    private String status;
    /**
     * åˆ›å»ºç”¨æˆ·
     */
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    /**
     * åˆ›å»ºæ—¶é—´
     */
    @TableField(fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    /**
     * ä¿®æ”¹ç”¨æˆ·
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    /**
     * ä¿®æ”¹æ—¶é—´
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;
    /**
     * ç§Ÿæˆ·ID
     */
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
}
src/main/java/com/ruoyi/oA/pojo/OaProjectPhaseTask.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,117 @@
package com.ruoyi.oA.pojo;
import com.baomidou.mybatisplus.annotation.*;
import java.io.Serializable;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
/**
 * OA系统-项目阶段-任务表
 * @TableName oa_project_phase_task
 */
@TableName(value ="oa_project_phase_task")
@Data
public class OaProjectPhaseTask implements Serializable {
    /**
     *
     */
    @TableId(type = IdType.AUTO)
    private Integer taskId;
    /**
     * é¡¹ç›®é˜¶æ®µä»»åŠ¡åç§°
     */
    private String taskName;
    /**
     * oa_project_phase表id
     */
    private Integer phaseId;
    /**
     * å¼€å§‹æ—¶é—´
     */
    @JsonFormat(pattern = "yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private LocalDate startDate;
    /**
     * ç»“束时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private LocalDate endDate;
    /**
     * ç›®æ ‡ä»»åŠ¡å®Œæˆæ—¥æœŸ
     */
    @JsonFormat(pattern = "yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private LocalDate targetDate;
    /**
     * ç›®æ ‡å€¼
     */
    private Integer targetValue;
    /**
     * å½“前值
     */
    private Integer currentValue;
    /**
     * å•位
     */
    private String unit;
    /**
     * çŠ¶æ€
     */
    private String status;
    /**
     * å®Œæˆåº¦
     */
    private Integer completionRate;
    /**
     * åˆ›å»ºç”¨æˆ·
     */
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    /**
     * åˆ›å»ºæ—¶é—´
     */
    @TableField(fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    /**
     * ä¿®æ”¹ç”¨æˆ·
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    /**
     * ä¿®æ”¹æ—¶é—´
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;
    /**
     * ç§Ÿæˆ·ID
     */
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
}
src/main/java/com/ruoyi/oA/service/OaProjectPhaseService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,21 @@
package com.ruoyi.oA.service;
import com.ruoyi.oA.dto.OaProjectPhaseDto;
import com.ruoyi.oA.pojo.OaProjectPhase;
import com.baomidou.mybatisplus.extension.service.IService;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import java.util.List;
/**
* @author ywx
* @description é’ˆå¯¹è¡¨ã€oa_project_phase(OA系统-项目阶段表)】的数据库操作Service
* @createDate 2025-09-24 09:18:46
*/
public interface OaProjectPhaseService extends IService<OaProjectPhase> {
    List<OaProjectPhaseDto> listByProjectId(Integer oaProjectId);
    boolean deleteById(Integer phaseId);
}
src/main/java/com/ruoyi/oA/service/OaProjectPhaseTaskService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,17 @@
package com.ruoyi.oA.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.oA.pojo.OaProjectPhaseTask;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
/**
* @author ywx
* @description é’ˆå¯¹è¡¨ã€oa_project_phase_task(OA系统-项目阶段-任务表)】的数据库操作Service
* @createDate 2025-09-24 09:18:46
*/
public interface OaProjectPhaseTaskService extends IService<OaProjectPhaseTask> {
    List<OaProjectPhaseTask> listByPhaseId(Integer phaseId);
}
src/main/java/com/ruoyi/oA/service/OaProjectService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,24 @@
package com.ruoyi.oA.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.oA.dto.OaProjectDto;
import com.ruoyi.oA.pojo.OaProject;
import com.baomidou.mybatisplus.extension.service.IService;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
/**
* @author ywx
* @description é’ˆå¯¹è¡¨ã€oa_project(OA系统-项目任务协同-项目表)】的数据库操作Service
* @createDate 2025-09-24 09:18:46
*/
public interface OaProjectService extends IService<OaProject> {
    IPage<OaProjectDto> listPage(Page page, OaProjectDto oaProjectDto);
    void export(HttpServletResponse response, List<Long> ids);
    boolean deleteById(Long id);
}
src/main/java/com/ruoyi/oA/service/impl/OaProjectPhaseServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,62 @@
package com.ruoyi.oA.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.utils.bean.BeanUtils;
import com.ruoyi.oA.dto.OaProjectPhaseDto;
import com.ruoyi.oA.pojo.OaProjectPhase;
import com.ruoyi.oA.pojo.OaProjectPhaseTask;
import com.ruoyi.oA.service.OaProjectPhaseService;
import com.ruoyi.oA.mapper.OaProjectPhaseMapper;
import com.ruoyi.oA.service.OaProjectPhaseTaskService;
import lombok.val;
import org.hibernate.validator.constraints.br.TituloEleitoral;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.stream.Collectors;
/**
* @author ywx
* @description é’ˆå¯¹è¡¨ã€oa_project_phase(OA系统-项目阶段表)】的数据库操作Service实现
* @createDate 2025-09-24 09:18:46
*/
@Service
@Transactional(rollbackFor = Exception.class)
public class OaProjectPhaseServiceImpl extends ServiceImpl<OaProjectPhaseMapper, OaProjectPhase>
    implements OaProjectPhaseService{
    @Autowired
    private OaProjectPhaseMapper oaProjectPhaseMapper;
    @Autowired
    private OaProjectPhaseTaskService oaProjectPhaseTaskService;
    @Override
    public List<OaProjectPhaseDto> listByProjectId(Integer oaProjectId) {
        List<OaProjectPhase> oaProjectPhases = oaProjectPhaseMapper.selectList(new LambdaQueryWrapper<OaProjectPhase>()
                .eq(OaProjectPhase::getOaProjectId, oaProjectId));
        List<OaProjectPhaseDto> collect = oaProjectPhases.stream().map(oaProjectPhase -> {
            OaProjectPhaseDto oaProjectPhaseDto = new OaProjectPhaseDto();
            BeanUtils.copyProperties(oaProjectPhase, oaProjectPhaseDto);
//            List<OaProjectPhaseTask> oaProjectPhaseTasks = oaProjectPhaseTaskService.listByPhaseId(oaProjectPhaseDto.getPhaseId());
            oaProjectPhaseDto.setOaProjectPhaseTasks(oaProjectPhaseTaskService.listByPhaseId(oaProjectPhaseDto.getPhaseId()));
            return oaProjectPhaseDto;
        }).collect(Collectors.toList());
        return collect;
    }
    @Override
    public boolean deleteById(Integer phaseId) {
        // å…ˆåˆ é™¤é¡¹ç›®é˜¶æ®µä¸‹çš„任务
        oaProjectPhaseTaskService.remove(new LambdaQueryWrapper<OaProjectPhaseTask>()
                .eq(OaProjectPhaseTask::getPhaseId, phaseId));
        return oaProjectPhaseMapper.deleteById(phaseId) > 0;
    }
}
src/main/java/com/ruoyi/oA/service/impl/OaProjectPhaseTaskServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,33 @@
package com.ruoyi.oA.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.oA.pojo.OaProjectPhaseTask;
import com.ruoyi.oA.service.OaProjectPhaseTaskService;
import com.ruoyi.oA.mapper.OaProjectPhaseTaskMapper;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* @author ywx
* @description é’ˆå¯¹è¡¨ã€oa_project_phase_task(OA系统-项目阶段-任务表)】的数据库操作Service实现
* @createDate 2025-09-24 09:18:46
*/
@Service
public class OaProjectPhaseTaskServiceImpl extends ServiceImpl<OaProjectPhaseTaskMapper, OaProjectPhaseTask>
    implements OaProjectPhaseTaskService{
    @Override
    public List<OaProjectPhaseTask> listByPhaseId(Integer phaseId) {
        return baseMapper.selectList(new LambdaQueryWrapper<OaProjectPhaseTask>()
                .eq(OaProjectPhaseTask::getPhaseId, phaseId));
    }
}
src/main/java/com/ruoyi/oA/service/impl/OaProjectServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,69 @@
package com.ruoyi.oA.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.measuringinstrumentledger.pojo.MeasuringInstrumentLedgerRecord;
import com.ruoyi.oA.dto.OaProjectDto;
import com.ruoyi.oA.pojo.OaProject;
import com.ruoyi.oA.pojo.OaProjectPhase;
import com.ruoyi.oA.service.OaProjectPhaseService;
import com.ruoyi.oA.service.OaProjectService;
import com.ruoyi.oA.mapper.OaProjectMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
/**
* @author ywx
* @description é’ˆå¯¹è¡¨ã€oa_project(OA系统-项目任务协同-项目表)】的数据库操作Service实现
* @createDate 2025-09-24 09:18:45
*/
@Service
@Transactional(rollbackFor = Exception.class)
public class OaProjectServiceImpl extends ServiceImpl<OaProjectMapper, OaProject>
    implements OaProjectService{
    @Autowired
    private OaProjectMapper oaProjectMapper;
    @Autowired
    private OaProjectPhaseService oaProjectPhaseService;
    @Override
    public IPage<OaProjectDto> listPage(Page page, OaProjectDto oaProjectDto) {
        IPage<OaProjectDto> iPage = oaProjectMapper.listPage(page, oaProjectDto);
        // é¡¹ç›®é˜¶æ®µåˆ—表
        for (OaProjectDto projectDto : iPage.getRecords()) {
            projectDto.setOaProjectPhasesDto(oaProjectPhaseService.listByProjectId(projectDto.getProjectId()));
        }
        return iPage;
    }
    @Override
    public void export(HttpServletResponse response, List<Long> ids) {
        List<OaProjectDto> list = oaProjectMapper.selectByIds(ids);
        ExcelUtil<OaProjectDto> util = new ExcelUtil<OaProjectDto>(OaProjectDto.class);
        util.exportExcel(response, list , "项目数据");
    }
    @Override
    public boolean deleteById(Long id) {
        // å…ˆåˆ é™¤é¡¹ç›®ä¸‹çš„阶段
        List<OaProjectPhase> oaProjectPhases = oaProjectPhaseService.list(new LambdaQueryWrapper<OaProjectPhase>()
                .eq(OaProjectPhase::getOaProjectId, id));
        if (!oaProjectPhases.isEmpty()) {
            oaProjectPhases.forEach(oaProjectPhase -> {
                oaProjectPhaseService.deleteById(oaProjectPhase.getPhaseId());
            });
        }
        return oaProjectMapper.deleteById(id) > 0;
    }
}
src/main/java/com/ruoyi/officesupplies/controller/OfficeSuppliesController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,87 @@
package com.ruoyi.officesupplies.controller;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.equipmentenergyconsumption.pojo.EquipmentEnergyConsumption;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.controller.BaseController;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.officesupplies.pojo.OfficeSupplies;
import com.ruoyi.officesupplies.service.OfficeSuppliesService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Date;
import java.util.List;
/**
 * @author :yys
 * @date : 2025/9/4 14:16
 */
@RestController
@Api(tags = "办公物资")
@RequestMapping("/officeSupplies")
public class OfficeSuppliesController extends BaseController {
    @Autowired
    private OfficeSuppliesService officeSuppliesService;
    @GetMapping("/listPage")
    @ApiOperation("办公物资-分页查询")
    public AjaxResult listPage(Page page, OfficeSupplies officeSupplies) {
        return officeSuppliesService.listPage(page, officeSupplies);
    }
    @PostMapping("/add")
    @ApiOperation("办公物资-添加")
    @Transactional(rollbackFor = Exception.class)
    public AjaxResult add(@RequestBody OfficeSupplies officeSupplies) {
        // æŒ‰ç…§å½“前时间yyyyMMdd + å½“天新增数量 + 1生成编号
        // èŽ·å–å½“å¤©æ–°å¢žæ•°é‡
        long count = officeSuppliesService.count(new LambdaQueryWrapper<OfficeSupplies>()
                .gt(OfficeSupplies::getCreateTime, LocalDate.now())
                .lt(OfficeSupplies::getCreateTime, LocalDate.now().plusDays(1)));
        String code = "WS" + LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd")) +  String.format("%03d", count + 1);
        officeSupplies.setCode(code);
        officeSupplies.setStatus(1);
        officeSupplies.setApplyTime(new Date());
        return officeSuppliesService.save(officeSupplies) ? success() : error();
    }
    @PostMapping("/update")
    @ApiOperation("办公物资-修改")
    @Transactional(rollbackFor = Exception.class)
    public AjaxResult update(@RequestBody OfficeSupplies officeSupplies) {
        return officeSuppliesService.updateById(officeSupplies) ? success() : error();
    }
    @DeleteMapping("/delete")
    @ApiOperation("办公物资-删除")
    @Transactional(rollbackFor = Exception.class)
    public AjaxResult delete(@RequestBody List<Long> ids) {
        if(CollectionUtils.isEmpty(ids)) return AjaxResult.error("请传入要删除的ID");
        return officeSuppliesService.removeBatchByIds(ids) ? success() : error();
    }
    /**
     * å¯¼å‡ºåŠžå…¬ç‰©èµ„
     */
    @Log(title = "导出办公物资", businessType = BusinessType.EXPORT)
    @PostMapping("/export")
    @ApiOperation("导出办公物资")
    public void export(HttpServletResponse response) {
        ExcelUtil<OfficeSupplies> util = new ExcelUtil<OfficeSupplies>(OfficeSupplies.class);
        List<OfficeSupplies> list = officeSuppliesService.list();
        util.exportExcel(response, list , "办公物资");
    }
}
src/main/java/com/ruoyi/officesupplies/mapper/OfficeSuppliesMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
package com.ruoyi.officesupplies.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.officesupplies.pojo.OfficeSupplies;
import org.apache.ibatis.annotations.Param;
/**
 * @author :yys
 * @date : 2025/9/4 14:13
 */
public interface OfficeSuppliesMapper extends BaseMapper<OfficeSupplies> {
    /**
     * åˆ—表分页查询
     *
     * @param page
     * @param officeSupplies
     * @return
     */
    IPage<OfficeSupplies> listPage(Page page,@Param("req") OfficeSupplies officeSupplies);
}
src/main/java/com/ruoyi/officesupplies/pojo/OfficeSupplies.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,160 @@
package com.ruoyi.officesupplies.pojo;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
import com.ruoyi.sales.pojo.CommonFile;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.List;
/**
 * @author :yys
 * @date : 2025/9/4 14:02
 */
@Data
@ApiModel
@TableName("office_supplies")
public class OfficeSupplies {
    private static final long serialVersionUID = 1L;
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    @ApiModelProperty("编号")
    @Excel(name = "编号")
    private String code;
    @ApiModelProperty("物品名称")
    private String itemName;
    @ApiModelProperty("申请人")
    @Excel(name = "申请人")
    private String applicant;
    /**
     * éƒ¨é—¨
     */
    @ApiModelProperty("部门")
    @Excel(name = "部门")
    private String dept;
    /**
     * ç‰©èµ„类型(1-其他 2-清洁用品 3-电子用品 4-电子设备)
     */
    @ApiModelProperty("物资类型(1-其他 2-清洁用品 3-电子用品 4-电子设备)")
    @Excel(name = "物资类型", readConverterExp = "1=其他,2=清洁用品,3=电子用品,4=电子设备")
    private Integer materialType;
    /**
     * ç”³è¯·æ•°é‡
     */
    @ApiModelProperty("申请数量")
    @Excel(name = "申请数量")
    private Integer applyNum;
    /**
     * å®¡æ‰¹æ„è§
     */
    @ApiModelProperty("审批意见")
//    @Excel(name = "审批意见")
    private String approvalOpinions;
    /**
     * ç”³è¯·åŽŸå› 
     */
    @ApiModelProperty("申请原因")
    @Excel(name = "申请原因")
    private String reason;
    /**
     * ç´§æ€¥ç¨‹åº¦ï¼ˆ1-普通 2-紧急 3-非常紧急)
     */
    @ApiModelProperty("紧急程度(1-普通 2-紧急 3-非常紧急)")
//    @Excel(name = "紧急程度", readConverterExp = "1=普通,2=紧急,3=非常紧急")
    private Integer urgency;
    /**
     * çŠ¶æ€ï¼ˆ1-待审批 2-已拒绝 3-已通过 4-已发放)
     */
    @ApiModelProperty("状态(1-待审批 2-已拒绝 3-已通过 4-已发放)")
    @Excel(name = "状态", readConverterExp = "1=待审批,2=已拒绝,3=已通过,4=已发放")
    private Integer status;
    /**
     * ç”³è¯·æ—¶é—´
     */
    @ApiModelProperty("申请时间")
    @Excel(name = "申请时间" , width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date applyTime;
    /**
     * å®¡æ‰¹äºº
     */
    @ApiModelProperty("审批人")
    @Excel(name = "审批人")
    private String approval;
    /**
     * å®¡æ‰¹æ—¶é—´
     */
    @ApiModelProperty("审批时间")
    @Excel(name = "审批时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date approvalTime;
    /**
     * å‘放时间
     */
    @ApiModelProperty("发放时间")
    @Excel(name = "发放时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date issueTime;
    @ApiModelProperty("发放人")
//    @Excel(name = "发放人")
    private String issueUser;
    /**
     * åˆ›å»ºè€…
     */
    @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;
    /**
     * ç§Ÿæˆ·ID
     */
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
}
src/main/java/com/ruoyi/officesupplies/service/OfficeSuppliesService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,22 @@
package com.ruoyi.officesupplies.service;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.officesupplies.pojo.OfficeSupplies;
/**
 * @author :yys
 * @date : 2025/9/4 14:14
 */
public interface OfficeSuppliesService extends IService<OfficeSupplies> {
    /**
     * åˆ†é¡µæŸ¥è¯¢
     *
     * @param page
     * @param officeSupplies
     * @return
     */
    AjaxResult listPage(Page page, OfficeSupplies officeSupplies);
}
src/main/java/com/ruoyi/officesupplies/service/impl/OfficeSuppliesServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,30 @@
package com.ruoyi.officesupplies.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.framework.web.domain.AjaxResult;
import com.ruoyi.officesupplies.mapper.OfficeSuppliesMapper;
import com.ruoyi.officesupplies.pojo.OfficeSupplies;
import com.ruoyi.officesupplies.service.OfficeSuppliesService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
 * @author :yys
 * @date : 2025/9/4 14:15
 */
@Service
@Slf4j
public class OfficeSuppliesServiceImpl extends ServiceImpl<OfficeSuppliesMapper, OfficeSupplies> implements OfficeSuppliesService {
    @Autowired
    private OfficeSuppliesMapper officeSuppliesMapper;
    @Override
    public AjaxResult listPage(Page page, OfficeSupplies officeSupplies) {
        IPage<OfficeSupplies> list = officeSuppliesMapper.listPage(page, officeSupplies);
        return AjaxResult.success(list);
    }
}
src/main/java/com/ruoyi/other/service/impl/TempFileServiceImpl.java
@@ -85,6 +85,7 @@
     *
     * @param businessId  ä¸šåŠ¡ID(销售台账ID)
     * @param tempFileIds ä¸´æ—¶æ–‡ä»¶ID列表
     * @param fileType     æ–‡ä»¶ç±»åž‹(来自FileNameType)
     * @throws IOException æ–‡ä»¶æ“ä½œå¼‚常
     */
    public void migrateTempFilesToFormal(Long businessId, List<String> tempFileIds, Integer fileType) throws IOException {
@@ -122,12 +123,15 @@
            try {
                // æ‰§è¡Œæ–‡ä»¶è¿ç§»ï¼ˆä½¿ç”¨åŽŸå­æ“ä½œç¡®ä¿å®‰å…¨æ€§ï¼‰
                Files.move(
                        Paths.get(tempFile.getTempPath()),
                        formalFilePath,
                        StandardCopyOption.REPLACE_EXISTING,
                        StandardCopyOption.ATOMIC_MOVE
                );
//                Files.move(
//                        Paths.get(tempFile.getTempPath()),
//                        formalFilePath,
//                        StandardCopyOption.REPLACE_EXISTING,
//                        StandardCopyOption.ATOMIC_MOVE
//                );
                // åŽŸå­ç§»åŠ¨å¤±è´¥ï¼Œä½¿ç”¨å¤åˆ¶+删除
                Files.copy(Paths.get(tempFile.getTempPath()), formalFilePath, StandardCopyOption.REPLACE_EXISTING);
                Files.deleteIfExists(Paths.get(tempFile.getTempPath()));
                log.info("文件迁移成功: {} -> {}", tempFile.getTempPath(), formalFilePath);
                // æ›´æ–°æ–‡ä»¶è®°å½•(关联到业务ID)
src/main/java/com/ruoyi/procurementrecord/controller/GasTankWarningController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,44 @@
package com.ruoyi.procurementrecord.controller;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.procurementrecord.pojo.GasTankWarning;
import com.ruoyi.procurementrecord.service.GasTankWarningService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
@RestController
@RequestMapping("/gasTankWarning")
public class GasTankWarningController {
    @Autowired
    private GasTankWarningService gasTankWarningService;
    @GetMapping("/listPage")
    public AjaxResult listPage(Page page, GasTankWarning gasTankWarning) {
        return AjaxResult.success(gasTankWarningService.listPage(page, gasTankWarning));
    }
    @PostMapping("/add")
    public AjaxResult add(@RequestBody GasTankWarning gasTankWarning) {
        return AjaxResult.success(gasTankWarningService.save(gasTankWarning));
    }
    @PostMapping("update")
    public AjaxResult update(@RequestBody GasTankWarning gasTankWarning) {
        return AjaxResult.success(gasTankWarningService.updateById(gasTankWarning));
    }
    @DeleteMapping("delete")
    public AjaxResult delete(@RequestBody List<Long> ids){
        if(CollectionUtils.isEmpty(ids)) return AjaxResult.error("请传入要删除的ID");
        return AjaxResult.success(gasTankWarningService.removeByIds(ids));
    }
    //导出
    @PostMapping("/export")
    public void export(HttpServletResponse response,@RequestParam(name = "ids", required = false) List<Long> ids){
        gasTankWarningService.export(response,ids);
    }
}
src/main/java/com/ruoyi/procurementrecord/controller/InboundManagementController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,64 @@
package com.ruoyi.procurementrecord.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.framework.web.controller.BaseController;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.procurementrecord.pojo.InboundManagement;
import com.ruoyi.procurementrecord.service.InboundManagementService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import java.util.Date;
import java.util.List;
/**
 * @author :yys
 * @date : 2025/9/16 16:38
 */
@RestController
@Api(tags = "到货管理")
@RequestMapping("/inboundManagement")
public class InboundManagementController extends BaseController {
    @Autowired
    private InboundManagementService inboundManagementService;
    @GetMapping("/listPage")
    @ApiOperation("到货管理-查询")
    public AjaxResult listPage(Page page, InboundManagement inboundManagement) {
        IPage<InboundManagement> result = inboundManagementService.listPage(page, inboundManagement);
        return AjaxResult.success(result);
    }
    @PostMapping("/add")
    @ApiOperation("到货管理-添加")
    @Transactional(rollbackFor = Exception.class)
    public AjaxResult add(@RequestBody InboundManagement inboundManagement) {
        inboundManagement.setArrivalTime(new Date());
        boolean result = inboundManagementService.save(inboundManagement);
        return result ? AjaxResult.success() : AjaxResult.error();
    }
    @PostMapping("/update")
    @ApiOperation("到货管理-修改")
    @Transactional(rollbackFor = Exception.class)
    public AjaxResult update(@RequestBody InboundManagement inboundManagement) {
        boolean result = inboundManagementService.updateById(inboundManagement);
        return result ? AjaxResult.success() : AjaxResult.error();
    }
    @DeleteMapping("/del")
    @ApiOperation("到货管理-删除")
    @Transactional(rollbackFor = Exception.class)
    public AjaxResult del(@RequestBody List<Long> ids) {
        if(CollectionUtils.isEmpty(ids)) return AjaxResult.error("请选择至少一条数据");
        boolean result = inboundManagementService.removeByIds(ids);
        return result ? AjaxResult.success() : AjaxResult.error();
    }
}
src/main/java/com/ruoyi/procurementrecord/controller/ProcurementPlanController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,67 @@
package com.ruoyi.procurementrecord.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.framework.web.controller.BaseController;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.procurementrecord.pojo.ProcurementPlan;
import com.ruoyi.procurementrecord.service.ProcurementPlanService;
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.util.List;
/**
 * @author :yys
 * @date : 2025/9/18 16:13
 */
@RestController
@Api(tags = "采购计划")
@RequestMapping("/procurementPlan")
public class ProcurementPlanController extends BaseController {
    @Autowired
    private ProcurementPlanService procurementPlanService;
    @RequestMapping("/listPage")
    @ApiOperation("采购计划-查询")
    public AjaxResult listPage(Page page, ProcurementPlan procurementPlan){
        IPage<ProcurementPlan> result = procurementPlanService.listPage(page, procurementPlan);
        return AjaxResult.success(result);
    }
    @PostMapping("/add")
    @ApiOperation("采购计划-添加")
    public AjaxResult add(@RequestBody ProcurementPlan procurementPlan){
        boolean result = procurementPlanService.save(procurementPlan);
        return result ? AjaxResult.success() : AjaxResult.error();
    }
    @PostMapping("/update")
    @ApiOperation("采购计划-修改")
    public AjaxResult update(@RequestBody ProcurementPlan procurementPlan){
        boolean result = procurementPlanService.updateById(procurementPlan);
        return result ? AjaxResult.success() : AjaxResult.error();
    }
    @DeleteMapping("/del")
    @ApiOperation("采购计划-删除")
    public AjaxResult del(@RequestBody List<Long> ids){
        boolean result = procurementPlanService.removeByIds(ids);
        return result ? AjaxResult.success() : AjaxResult.error();
    }
    /**
     * å¯¼å‡º
     * @param response
     */
    @PostMapping("/export")
    public void export(HttpServletResponse response) {
        procurementPlanService.export(response);
    }
}
src/main/java/com/ruoyi/procurementrecord/controller/ProcurementPriceManagementController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,73 @@
package com.ruoyi.procurementrecord.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.framework.web.controller.BaseController;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.procurementrecord.pojo.ProcurementPriceManagement;
import com.ruoyi.procurementrecord.service.ProcurementPriceManagementService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
/**
 * @author :yys
 * @date : 2025/9/17 15:08
 */
@RestController
@Api(tags = "采购价格管理")
@RequestMapping("/procurementPriceManagement")
public class ProcurementPriceManagementController extends BaseController {
    @Autowired
    private ProcurementPriceManagementService procurementPriceManagementService;
    @GetMapping("/listPage")
    @ApiOperation("采购价格管理-查询")
    public AjaxResult listPage(Page page, ProcurementPriceManagement procurementPriceManagement){
        IPage<ProcurementPriceManagement> result = procurementPriceManagementService.listPage(page, procurementPriceManagement);
        return AjaxResult.success(result);
    }
    @PostMapping("/add")
    @ApiOperation("采购价格管理-添加")
    @Transactional(rollbackFor = Exception.class)
    public AjaxResult add(@RequestBody ProcurementPriceManagement procurementPriceManagement){
        boolean result = procurementPriceManagementService.save(procurementPriceManagement);
        return result ? AjaxResult.success() : AjaxResult.error();
    }
    @PostMapping("/update")
    @ApiOperation("采购价格管理-修改")
    @Transactional(rollbackFor = Exception.class)
    public AjaxResult update(@RequestBody ProcurementPriceManagement procurementPriceManagement){
        boolean result = procurementPriceManagementService.updateById(procurementPriceManagement);
        return result ? AjaxResult.success() : AjaxResult.error();
    }
    @DeleteMapping("/del")
    @ApiOperation("采购价格管理-删除")
    @Transactional(rollbackFor = Exception.class)
    public AjaxResult delete(@RequestBody List<Long> ids){
        if (ids == null || ids.isEmpty()) {
            return AjaxResult.error("请传入要删除的ID");
        }
        boolean result = procurementPriceManagementService.removeByIds(ids);
        return result ? AjaxResult.success() : AjaxResult.error();
    }
    /**
     * å¯¼å‡º
     * @param response
     */
    @PostMapping("/export")
    public void export(HttpServletResponse response) {
        procurementPriceManagementService.export(response);
    }
}
src/main/java/com/ruoyi/procurementrecord/controller/ProcurementRecordController.java
@@ -6,12 +6,10 @@
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.controller.BaseController;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.framework.web.page.TableDataInfo;
import com.ruoyi.procurementrecord.dto.*;
import com.ruoyi.procurementrecord.service.ProcurementRecordService;
import com.ruoyi.purchase.dto.InvoicePurchaseReportDto;
import com.ruoyi.quality.pojo.QualityInspect;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
@@ -69,6 +67,7 @@
    @GetMapping("/listPage")
    @Log(title = "采购入库-入库管理-入库查询", businessType = BusinessType.OTHER)
    @ApiOperation(value = "入库查询")
    public AjaxResult listPage(Page page, ProcurementPageDto procurementDto) {
        IPage<ProcurementPageDto> result =procurementRecordService.listPage(page, procurementDto);
        return AjaxResult.success(result);
@@ -80,6 +79,11 @@
        IPage<ProcurementPageDtoCopy> result =procurementRecordService.listPageCopy(page, procurementDto);
        return AjaxResult.success(result);
    }
    @GetMapping("/getReportList")
    @Log(title = "库存报表查询", businessType = BusinessType.OTHER)
    public AjaxResult getReportList(Page page, ProcurementPageDto procurementDto) {
        return AjaxResult.success(procurementRecordService.getReportList(page, procurementDto));
    }
    /**
     * å¯¼å‡º
src/main/java/com/ruoyi/procurementrecord/controller/ReturnManagementController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,69 @@
package com.ruoyi.procurementrecord.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.utils.OrderUtils;
import com.ruoyi.framework.web.controller.BaseController;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.procurementrecord.mapper.ReturnManagementMapper;
import com.ruoyi.procurementrecord.pojo.ReturnManagement;
import com.ruoyi.procurementrecord.service.ReturnManagementService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
 * @author :yys
 * @date : 2025/9/17 10:34
 */
@RestController
@Api(tags = "到货管理")
@RequestMapping("/returnManagement")
public class ReturnManagementController extends BaseController {
    @Autowired
    private ReturnManagementService returnManagementService;
    @Autowired
    private ReturnManagementMapper returnManagementMapper;
    @GetMapping("/listPage")
    @ApiOperation("到货管理-查询")
    public AjaxResult listPage(Page page, ReturnManagement returnManagement) {
        IPage<ReturnManagement> result = returnManagementService.listPage(page, returnManagement);
        return AjaxResult.success(result);
    }
    @PostMapping("/add")
    @ApiOperation("到货管理-添加")
    @Transactional(rollbackFor = Exception.class)
    public AjaxResult add(@RequestBody ReturnManagement returnManagement) {
        String rt = OrderUtils.countTodayByCreateTime(returnManagementMapper, "RT");
        returnManagement.setReturnNo(rt);
        boolean result = returnManagementService.save(returnManagement);
        return result ? success() : error();
    }
    @PostMapping("/update")
    @ApiOperation("到货管理-修改")
    @Transactional(rollbackFor = Exception.class)
    public AjaxResult update(@RequestBody ReturnManagement returnManagement) {
        boolean result = returnManagementService.updateById(returnManagement);
        return result ? success() : error();
    }
    @DeleteMapping("/del")
    @ApiOperation("到货管理-删除")
    @Transactional(rollbackFor = Exception.class)
    public AjaxResult del(@RequestBody List<Long> ids) {
        if (CollectionUtils.isEmpty(ids)) return error("请选择至少一条数据");
        boolean result = returnManagementService.removeByIds(ids);
        return result ? success() : error();
    }
}
src/main/java/com/ruoyi/procurementrecord/dto/Details.java
@@ -1,24 +1,16 @@
package com.ruoyi.procurementrecord.dto;
import lombok.Data;
import java.math.BigDecimal;
/**
 * @author :yys
 * @date : 2025/7/7 16:17
 */
@Data
public class Details {
    private Integer id;
    private BigDecimal inboundQuantity;
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public BigDecimal getInboundQuantity() {
        return inboundQuantity;
    }
    public void setInboundQuantity(BigDecimal inboundQuantity) {
        this.inboundQuantity = inboundQuantity;
    }
    private BigDecimal warnNum;
}
src/main/java/com/ruoyi/procurementrecord/dto/ProcurementDto.java
@@ -20,6 +20,8 @@
    private Integer recordId;
    private BigDecimal warnNum;
    /**
     * å…¥åº“数量
     */
@@ -57,6 +59,11 @@
    private BigDecimal quantity;
    /**
     * æœ€ä½Žåº“存数量
     */
    @Excel(name = "最低库存数量")
    private BigDecimal minStock;
    /**
     * å¾…入库数量
     */
    @Excel(name = "待入库数量")
src/main/java/com/ruoyi/procurementrecord/dto/ProcurementManagementUpdateDto.java
@@ -15,6 +15,7 @@
public class ProcurementManagementUpdateDto {
    private String createBy;
    private BigDecimal minStock;
    private Long createUser;
@@ -23,5 +24,5 @@
    private String entryDate;
    private Integer id;
    private Integer salesLedgerProductId;
}
src/main/java/com/ruoyi/procurementrecord/dto/ProcurementPageDto.java
@@ -1,10 +1,13 @@
package com.ruoyi.procurementrecord.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
/**
@@ -37,6 +40,9 @@
    @Excel(name = "入库数量")
    private BigDecimal inboundNum;
    @Excel(name = "预警数量")
    private BigDecimal warnNum;
    /**
     * å¾…出库数量
     */
@@ -50,6 +56,8 @@
//    @Excel(name = "入库时间")
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    private LocalDateTime createTime;
    private String timeStr;
    /**
     * å‡ºå…¥åº“æ—¶é—´
@@ -112,5 +120,35 @@
     */
    @Excel(name = "不含税总价")
    private BigDecimal taxExclusiveTotalPrice;
    /**
     * æŠ¥è¡¨æ—¥æŠ¥
     */
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private LocalDate reportDate;
    /**
     * æŠ¥è¡¨æœˆæŠ¥
     */
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private LocalDate startMonth;
    /**
     * æŠ¥è¡¨æœˆæŠ¥
     */
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private LocalDate endMonth;
    /**
     * æŠ¥è¡¨æœˆæŠ¥
     */
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private LocalDate startDate;
    /**
     * æŠ¥è¡¨æœˆæŠ¥
     */
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private LocalDate endDate;
}
src/main/java/com/ruoyi/procurementrecord/dto/ProcurementPageDtoCopy.java
@@ -5,6 +5,7 @@
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
/**
@@ -24,6 +25,8 @@
    @Excel(name = "入库批次")
    private String inboundBatches;
    private BigDecimal warnNum;
    /**
     * åˆåŒå·
     */
@@ -42,8 +45,17 @@
     */
    @Excel(name = "待出库数量")
    private BigDecimal inboundNum0;
    /**
     * å‡ºåº“数量
     */
    @Excel(name = "出库数量")
    private BigDecimal totalInboundNum;
    /**
     * æœ€ä½Žåº“存数量
     */
    @Excel(name = "最低库存数量")
    private BigDecimal minStock;
    /**
     * å‡ºå…¥åº“æ—¶é—´
     */
@@ -124,5 +136,35 @@
     */
    @Excel(name = "不含税总价")
    private BigDecimal taxExclusiveTotalPrice;
    /**
     * æŠ¥è¡¨æ—¥æŠ¥
     */
    @Excel(name = "报表日报")
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    private LocalDate reportDate;
    /**
     * æŠ¥è¡¨æœˆæŠ¥
     */
    @Excel(name = "报表月报开始时间")
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    private LocalDate startMonth;
    /**
     * æŠ¥è¡¨æœˆæŠ¥
     */
    @Excel(name = "报表月报结束时间")
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    private LocalDate endMonth;
    /**
     * æŠ¥è¡¨æœˆæŠ¥
     */
    @Excel(name = "报表作业开始时间")
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    private LocalDate startDate;
    /**
     * æŠ¥è¡¨æœˆæŠ¥
     */
    @Excel(name = "报表作业结束时间")
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    private LocalDate endDate;
}
src/main/java/com/ruoyi/procurementrecord/dto/ProcurementRecordOutPageDto.java
@@ -14,7 +14,12 @@
@Data
public class ProcurementRecordOutPageDto {
    @Excel(name = "出库编号")
    private String code;
    private Integer id;
    private BigDecimal warnNum;
    /**
     * å‡ºå…¥åº“数量
@@ -29,6 +34,8 @@
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private LocalDateTime createTime;
    private String timeStr;
    @Excel(name = "出库时间")
    private String time;
src/main/java/com/ruoyi/procurementrecord/dto/ProcurementUpdateDto.java
@@ -14,6 +14,8 @@
    private Integer id;
    private BigDecimal warnNum;
    private BigDecimal quantityStock;
    private List<Integer> ids;
src/main/java/com/ruoyi/procurementrecord/mapper/GasTankWarningMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,13 @@
package com.ruoyi.procurementrecord.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.procurementrecord.pojo.GasTankWarning;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@Mapper
public interface GasTankWarningMapper extends BaseMapper<GasTankWarning> {
    IPage<GasTankWarning> listPage(Page page, @Param("gasTankWarning") GasTankWarning gasTankWarning);
}
src/main/java/com/ruoyi/procurementrecord/mapper/InboundManagementMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
package com.ruoyi.procurementrecord.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.procurementrecord.pojo.InboundManagement;
import org.apache.ibatis.annotations.Param;
/**
 * @author :yys
 * @date : 2025/9/16 16:33
 */
public interface InboundManagementMapper extends BaseMapper<InboundManagement> {
    /**
     * æŸ¥è¯¢é‡‡è´­å…¥åº“-到货管理列表
     *
     * @param page
     * @param inboundManagement
     * @return
     */
    IPage<InboundManagement> listPage(Page page,@Param("req") InboundManagement inboundManagement);
}
src/main/java/com/ruoyi/procurementrecord/mapper/ProcurementPlanMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,22 @@
package com.ruoyi.procurementrecord.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.procurementrecord.pojo.ProcurementPlan;
import org.apache.ibatis.annotations.Param;
/**
 * @author :yys
 * @date : 2025/9/18 16:10
 */
public interface ProcurementPlanMapper extends BaseMapper<ProcurementPlan> {
    /**
     * æŸ¥è¯¢é‡‡è´­è®¡åˆ’列表
     *
     * @param page
     * @param procurementPlan
     * @return
     */
    IPage<ProcurementPlan> listPage(Page page,@Param("req") ProcurementPlan procurementPlan);
}
src/main/java/com/ruoyi/procurementrecord/mapper/ProcurementPriceManagementMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
package com.ruoyi.procurementrecord.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.procurementrecord.pojo.ProcurementPriceManagement;
import org.apache.ibatis.annotations.Param;
/**
 * @author :yys
 * @date : 2025/9/17 15:05
 */
public interface ProcurementPriceManagementMapper extends BaseMapper<ProcurementPriceManagement> {
    /**
     * æŸ¥è¯¢é‡‡è´­ä»·æ ¼ç®¡ç†åˆ—表
     *
     * @param page
     * @param procurementPriceManagement
     * @return
     */
    IPage<ProcurementPriceManagement> listPage(Page page,@Param("req") ProcurementPriceManagement procurementPriceManagement);
}
src/main/java/com/ruoyi/procurementrecord/mapper/ReturnManagementMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,22 @@
package com.ruoyi.procurementrecord.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.procurementrecord.pojo.ReturnManagement;
import org.apache.ibatis.annotations.Param;
/**
 * @author :yys
 * @date : 2025/9/17 10:32
 */
public interface ReturnManagementMapper extends BaseMapper<ReturnManagement> {
    /**
     * æŸ¥è¯¢åˆ—表
     *
     * @param page
     * @return
     */
    IPage<ReturnManagement> listPage(Page page,@Param("req") ReturnManagement returnManagement);
}
src/main/java/com/ruoyi/procurementrecord/pojo/GasTankWarning.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,158 @@
package com.ruoyi.procurementrecord.pojo;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.time.LocalDateTime;
@Data
@TableName("gas_tank_warning")
public class GasTankWarning implements Serializable {
    @TableId(value = "id",type = IdType.AUTO)
    private Long id;
    /**
     * å‚¨æ°”罐编码
     */
    @Excel(name = "储气罐编码")
    private String tankCode;
    /**
     * å‚¨æ°”罐名称
     */
    @Excel(name = "储气罐名称")
    private String tankName;
    /**
     * å‚¨æ°”罐类型
     */
    @Excel(name = "储气罐类型")
    private String tankType;
    /**
     * è§„格型号
     */
    @Excel(name = "规格型号")
    private String specificationModel;
    /**
     * å®¹ç§¯(m³)
     */
    @Excel(name = "容积(m³)")
    private Long volume;
    /**
     * å½“前气体水平(m³)
     */
    @Excel(name = "当前气体水平(m³)")
    private Long currentGasLevel;
    /**
     * å®‰å…¨æ°”体水平(m³)
     */
    @Excel(name = "安全气体水平(m³)")
    private Long safetyGasLevel;
    /**
     * æœ€å°æ°”体水平(m³)
     */
    @Excel(name = "最小气体水平(m³)")
    private Long minGasLevel;
    /**
     * æœ€å¤§æ°”体水平(m³)
     */
    @Excel(name = "最大气体水平(m³)")
    private Long maxGasLevel;
    /**
     * å½“前压力(MPa)
     */
    @Excel(name = "当前压力(MPa)")
    private Double currentPressure;
    /**
     * é¢„警类型
     */
    @Excel(name = "预警类型")
    private String warningType;
    /**
     * é¢„警等级
     */
    @Excel(name = "预警等级")
    private String warningLevel;
    /**
     * é¢„警阈值
     */
    @Excel(name = "预警阈值")
    private Long warningThreshold;
    /**
     * æ˜¯å¦å¯ç”¨
     */
    @Excel(name = "是否启用")
    private Boolean isEnabled;
    /**
     * é¢„警规则-当???时触发预警
     */
    @Excel(name = "预警规则")
    private String warningRule;
    /**
     * é¢„警时间
     */
    @Excel(name = "预警时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime warningTime;
    /**
     * é¢„警持续天数
     */
    @Excel(name = "预警持续天数")
    private Long warningDuration;
    /**
     * æœ€åŽæ›´æ–°æ—¶é—´
     */
    @Excel(name = "最后更新时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime lastUpdateTime;
    /**
     * é¢„期充装时间
     */
    @Excel(name = "预期充装时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime expectedRefillTime;
    /**
     * é¢„期缺气时间
     */
    @Excel(name = "预期缺气时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime expectedShortageTime;
    /**
     * åˆ›å»ºæ—¶é—´
     */
    @TableField(fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    /**
     * æ›´æ–°æ—¶é—´
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;
    /**
     * åˆ›å»ºäºº
     */
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    /**
     * æ›´æ–°äºº
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    /**
     * ç§Ÿæˆ·ID
     */
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
}
src/main/java/com/ruoyi/procurementrecord/pojo/InboundManagement.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,73 @@
package com.ruoyi.procurementrecord.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 org.springframework.format.annotation.DateTimeFormat;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.Date;
/**
 * @author :yys
 * @date : 2025/9/16 16:29
 */
@Data
@TableName("inbound_management")
@ApiModel
public class InboundManagement {
    private static final long serialVersionUID = 1L;
    /**
     * åºå·
     */
    @TableId(type = IdType.AUTO)
    private Long id;
    @ApiModelProperty(value = "订单号")
    private String orderNo;
    @ApiModelProperty(value = "到货单号")
    private String arrivalNo;
    @ApiModelProperty(value = "供应商名称")
    private String supplierName;
    @ApiModelProperty(value = "到货状态")
    private String status;
    @ApiModelProperty(value = "到货时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date arrivalTime;
    @ApiModelProperty(value = "到货数量")
    private String arrivalQuantity;
    @ApiModelProperty(value = "备注")
    private String remark;
    @ApiModelProperty(value = "创建时间")
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    @ApiModelProperty(value = "创建用户")
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    @ApiModelProperty(value = "修改时间")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
    @ApiModelProperty(value = "修改用户")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    @ApiModelProperty(value = "租户ID")
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
}
src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementPlan.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,105 @@
package com.ruoyi.procurementrecord.pojo;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
/**
 * @author :yys
 * @date : 2025/9/18 16:00
 */
@Data
@TableName("procurement_plan")
@ApiModel
public class ProcurementPlan {
    private static final long serialVersionUID = 1L;
    /**
     * åºå·
     */
    @TableId(type = IdType.AUTO)
    private Long id;
    @ApiModelProperty(value = "编码")
    @Excel(name = "编码")
    private String code;
    @ApiModelProperty(value = "名称")
    @Excel(name = "名称")
    private String planName;
    @ApiModelProperty(value = "描述")
    @Excel(name = "描述")
    private String description;
    @ApiModelProperty(value = "状态")
    @Excel(name = "状态", readConverterExp = "disabled=禁用,active=启用")
    private String status;
    @ApiModelProperty(value = "是否系统预置")
    private Boolean isSystemPreset;
    @ApiModelProperty(value = "考虑现有库存")
    private Boolean considerExistingStock;
    @ApiModelProperty(value = "仓库运行MRP的控制")
    private Boolean warehouseControl;
    @ApiModelProperty(value = "计算总需求")
    private Boolean calculateTotalDemand;
    @ApiModelProperty(value = "考虑安全库存")
    private Boolean considerSafetyStock;
    @ApiModelProperty(value = "考虑锁库")
    private Boolean considerLockedStock;
    @ApiModelProperty(value = "不考虑物料辅助属性")
    private Boolean notConsiderMaterialAux;
    @ApiModelProperty(value = "负库存作为需求")
    private Boolean negativeStockAsDemand;
    @ApiModelProperty(value = "物料")
    private Boolean summaryMaterial;
    @ApiModelProperty(value = "辅助属性")
    private Boolean summaryAuxAttributes;
    @ApiModelProperty(value = "需求日期")
    private Boolean summaryDemandDate;
    @ApiModelProperty(value = "计算公式")
    @Excel(name = "计算公式")
    private String formula;
    @ApiModelProperty(value = "创建时间")
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    @ApiModelProperty(value = "创建用户")
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    @ApiModelProperty(value = "修改时间")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @Excel(name = "最后计算时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;
    @ApiModelProperty(value = "修改用户")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    @ApiModelProperty(value = "租户ID")
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
}
src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementPriceManagement.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,122 @@
package com.ruoyi.procurementrecord.pojo;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import java.util.Date;
/**
 * @author :yys
 * @date : 2025/9/17 14:58
 */
@Data
@TableName("procurement_price_management")
@ApiModel
public class ProcurementPriceManagement {
    private static final long serialVersionUID = 1L;
    /**
     * åºå·
     */
    @TableId(type = IdType.AUTO)
    private Long id;
    @ApiModelProperty(value = "商品名称")
    @Excel(name = "商品名称")
    private String productName;
    @ApiModelProperty(value = "商品编码")
    @Excel(name = "商品编码")
    private String productCode;
    @ApiModelProperty(value = "规格型号")
    @Excel(name = "规格型号")
    private String specification;
    @ApiModelProperty(value = "供应商名称")
    @Excel(name = "供应商名称")
    private String supplierName;
    @ApiModelProperty(value = "基础价格")
    @Excel(name = "基础价格")
    private String basePrice;
    @ApiModelProperty(value = "状态")
    @TableField(exist = false)
    @Excel(name = "状态")
    private String status;
    @ApiModelProperty(value = "单位")
    private String unit;
    @ApiModelProperty(value = "折扣类型")
    @Excel(name = "折扣类型", readConverterExp = "=无折扣,percentage=百分比折扣,fixed=固定金额")
    private String discountType;
    @ApiModelProperty(value = "折扣值")
    @Excel(name = "折扣值")
    private String discountValue;
    @ApiModelProperty(value = "折扣有效期")
    @JsonFormat(pattern = "yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private Date discountEndTime;
    @ApiModelProperty(value = "最低价格")
    @Excel(name = "最低价格")
    private String minPrice;
    @ApiModelProperty(value = "最高价格")
    @Excel(name = "最高价格")
    private String maxPrice;
    @ApiModelProperty(value = "预警阈值(%)")
    private String warningThreshold;
    @ApiModelProperty(value = "生效时间")
    @JsonFormat(pattern = "yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @Excel(name = "生效时间", width = 30, dateFormat = "yyyy-MM-dd")
    private Date effectiveTime;
    @ApiModelProperty(value = "失效时间")
    @JsonFormat(pattern = "yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private Date expireTime;
    @ApiModelProperty(value = "调价原因")
    private String reason;
    @ApiModelProperty(value = "备注")
    private String remark;
    @ApiModelProperty(value = "创建时间")
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    @ApiModelProperty(value = "创建用户")
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    @ApiModelProperty(value = "修改时间")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @Excel(name = "更新时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;
    @ApiModelProperty(value = "修改用户")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    @ApiModelProperty(value = "租户ID")
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
}
src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecordOut.java
@@ -31,6 +31,12 @@
     */
    private Integer procurementRecordStorageId;
    /**
     * ç¼–号
     */
    private String code;
    /**
     * å‡ºåº“批次
     */
src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecordStorage.java
@@ -37,10 +37,20 @@
    private BigDecimal inboundNum;
    /**
     * é¢„警数量
     */
    private BigDecimal warnNum;
//    /**
//     * æœ€ä½Žåº“存数量
//     */
//    private BigDecimal minStock;
    /**
     * å…¥åº“用户
     */
    private String createBy;
    /**
     * å…¥åº“用户id
     */
src/main/java/com/ruoyi/procurementrecord/pojo/ReturnManagement.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,72 @@
package com.ruoyi.procurementrecord.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 org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import java.util.Date;
/**
 * @author :yys
 * @date : 2025/9/17 10:28
 */
@Data
@TableName("return_management")
@ApiModel
public class ReturnManagement {
    private static final long serialVersionUID = 1L;
    /**
     * åºå·
     */
    @TableId(type = IdType.AUTO)
    private Long id;
    @ApiModelProperty(value = "退货单号")
    private String returnNo;
    @ApiModelProperty(value = "关联单号")
    private String relatedNo;
    @ApiModelProperty(value = "退货类型")
    private String returnType;
    @ApiModelProperty(value = "供应商名称")
    private String supplierName;
    @ApiModelProperty(value = "退货原因")
    private String returnReason;
    @ApiModelProperty(value = "退货状态")
    private String status;
    @ApiModelProperty(value = "备注")
    private String remark;
    @ApiModelProperty(value = "创建时间")
    @TableField(fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    @ApiModelProperty(value = "创建用户")
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    @ApiModelProperty(value = "修改时间")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
    @ApiModelProperty(value = "修改用户")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    @ApiModelProperty(value = "租户ID")
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
}
src/main/java/com/ruoyi/procurementrecord/service/GasTankWarningService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,15 @@
package com.ruoyi.procurementrecord.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.procurementrecord.pojo.GasTankWarning;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
public interface GasTankWarningService extends IService<GasTankWarning> {
    IPage listPage(Page page, GasTankWarning gasTankWarning);
    void export(HttpServletResponse response, List<Long> ids);
}
src/main/java/com/ruoyi/procurementrecord/service/InboundManagementService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,22 @@
package com.ruoyi.procurementrecord.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.procurementrecord.pojo.InboundManagement;
/**
 * @author :yys
 * @date : 2025/9/16 16:36
 */
public interface InboundManagementService extends IService<InboundManagement> {
    /**
     * èŽ·å–åˆ—è¡¨
     *
     * @param page
     * @param inboundManagement
     * @return
     */
    IPage<InboundManagement> listPage(Page page, InboundManagement inboundManagement);
}
src/main/java/com/ruoyi/procurementrecord/service/ProcurementPlanService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,25 @@
package com.ruoyi.procurementrecord.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.procurementrecord.pojo.ProcurementPlan;
import javax.servlet.http.HttpServletResponse;
/**
 * @author :yys
 * @date : 2025/9/18 16:11
 */
public interface ProcurementPlanService extends IService<ProcurementPlan> {
    /**
     * æŸ¥è¯¢
     * @param page
     * @param procurementPlan
     * @return
     */
    IPage<ProcurementPlan> listPage(Page page, ProcurementPlan procurementPlan);
    void export(HttpServletResponse response);
}
src/main/java/com/ruoyi/procurementrecord/service/ProcurementPriceManagementService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,26 @@
package com.ruoyi.procurementrecord.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.procurementrecord.pojo.ProcurementPriceManagement;
import javax.servlet.http.HttpServletResponse;
/**
 * @author :yys
 * @date : 2025/9/17 15:06
 */
public interface ProcurementPriceManagementService extends IService<ProcurementPriceManagement> {
    /**
     * é‡‡è´­ä»·æ ¼ç®¡ç†-查询
     *
     * @param page
     * @param procurementPriceManagement
     * @return
     */
    IPage<ProcurementPriceManagement> listPage(Page page, ProcurementPriceManagement procurementPriceManagement);
    void export(HttpServletResponse response);
}
src/main/java/com/ruoyi/procurementrecord/service/ProcurementRecordService.java
@@ -8,6 +8,7 @@
import javax.servlet.http.HttpServletResponse;
import java.util.List;
import java.util.Map;
/**
 * @author :yys
@@ -31,4 +32,6 @@
    int updateManagement(ProcurementManagementUpdateDto procurementDto);
    void exportCopy(HttpServletResponse response);
    Map<String, Object> getReportList(Page page, ProcurementPageDto procurementDto);
}
src/main/java/com/ruoyi/procurementrecord/service/ReturnManagementService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,22 @@
package com.ruoyi.procurementrecord.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.procurementrecord.pojo.ReturnManagement;
/**
 * @author :yys
 * @date : 2025/9/17 10:33
 */
public interface ReturnManagementService extends IService<ReturnManagement> {
    /**
     * æŸ¥è¯¢åˆ—表
     *
     * @param page
     * @param returnManagement
     * @return
     */
    IPage<ReturnManagement> listPage(Page page, ReturnManagement returnManagement);
}
src/main/java/com/ruoyi/procurementrecord/service/impl/GasTankWarningServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,40 @@
package com.ruoyi.procurementrecord.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.procurementrecord.dto.ProcurementPageDto;
import com.ruoyi.procurementrecord.mapper.GasTankWarningMapper;
import com.ruoyi.procurementrecord.pojo.GasTankWarning;
import com.ruoyi.procurementrecord.service.GasTankWarningService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.List;
@Service
public class GasTankWarningServiceImpl extends ServiceImpl<GasTankWarningMapper, GasTankWarning> implements GasTankWarningService {
    @Autowired
    private GasTankWarningMapper gasTankWarningMapper;
    @Override
    public IPage listPage(Page page, GasTankWarning gasTankWarning) {
        return gasTankWarningMapper.listPage(page,gasTankWarning);
    }
    @Override
    public void export(HttpServletResponse response, List<Long> ids) {
        List<GasTankWarning> list = new ArrayList<>();
        if(CollectionUtils.isEmpty(ids)){
            list = gasTankWarningMapper.selectList(null);
        }else {
            list = gasTankWarningMapper.selectBatchIds(ids);
        }
        ExcelUtil<GasTankWarning> util = new ExcelUtil<>(GasTankWarning.class);
        util.exportExcel(response, list, "储气罐预警.xlsx");
    }
}
src/main/java/com/ruoyi/procurementrecord/service/impl/InboundManagementServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,29 @@
package com.ruoyi.procurementrecord.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.procurementrecord.mapper.InboundManagementMapper;
import com.ruoyi.procurementrecord.pojo.InboundManagement;
import com.ruoyi.procurementrecord.service.InboundManagementService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
 * @author :yys
 * @date : 2025/9/16 16:37
 */
@Service
@Slf4j
public class InboundManagementServiceImpl extends ServiceImpl<InboundManagementMapper, InboundManagement> implements InboundManagementService {
    @Autowired
    private InboundManagementMapper inboundManagementMapper;
    @Override
    public IPage<InboundManagement> listPage(Page page, InboundManagement inboundManagement) {
        IPage<InboundManagement> result = inboundManagementMapper.listPage(page, inboundManagement);
        return result;
    }
}
src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementPlanServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,41 @@
package com.ruoyi.procurementrecord.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.common.utils.poi.ExcelUtil;
import com.ruoyi.procurementrecord.mapper.ProcurementPlanMapper;
import com.ruoyi.procurementrecord.pojo.ProcurementPlan;
import com.ruoyi.procurementrecord.pojo.ProcurementPriceManagement;
import com.ruoyi.procurementrecord.service.ProcurementPlanService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
/**
 * @author :yys
 * @date : 2025/9/18 16:12
 */
@Service
@Slf4j
public class ProcurementPlanServiceImpl extends ServiceImpl<ProcurementPlanMapper, ProcurementPlan> implements ProcurementPlanService {
    @Autowired
    private ProcurementPlanMapper procurementPlanMapper;
    @Override
    public IPage<ProcurementPlan> listPage(Page page, ProcurementPlan procurementPlan) {
        IPage<ProcurementPlan> result = procurementPlanMapper.listPage(page, procurementPlan);
        return result;
    }
    @Override
    public void export(HttpServletResponse response) {
        List<ProcurementPlan> procurementPriceManagements = procurementPlanMapper.selectList(null);
        ExcelUtil<ProcurementPlan> util = new ExcelUtil<ProcurementPlan>(ProcurementPlan.class);
        util.exportExcel(response, procurementPriceManagements, "采购计划");
    }
}
src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementPriceManagementServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,78 @@
package com.ruoyi.procurementrecord.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.common.utils.excel.ExcelUtils;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.procurementrecord.dto.ProcurementPageDto;
import com.ruoyi.procurementrecord.mapper.ProcurementPriceManagementMapper;
import com.ruoyi.procurementrecord.pojo.ProcurementPriceManagement;
import com.ruoyi.procurementrecord.service.ProcurementPriceManagementService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
/**
 * @author :yys
 * @date : 2025/9/17 15:07
 */
@Service
@Slf4j
public class ProcurementPriceManagementServiceImpl extends ServiceImpl<ProcurementPriceManagementMapper, ProcurementPriceManagement> implements ProcurementPriceManagementService {
    @Autowired
    private ProcurementPriceManagementMapper procurementPriceManagementMapper;
    @Override
    public IPage<ProcurementPriceManagement> listPage(Page page, ProcurementPriceManagement procurementPriceManagement) {
        IPage<ProcurementPriceManagement> result = procurementPriceManagementMapper.listPage(page, procurementPriceManagement);
        // æ ¹æ®ç”Ÿæ•ˆæ—¶é—´ï¼Œå¤±æ•ˆæ—¶é—´åˆ¤æ–­çŠ¶æ€ æœ‰æ•ˆï¼Œå¾…生效,已过期
        for (ProcurementPriceManagement record : result.getRecords()) {
            if (record.getEffectiveTime() != null) {
                if (record.getEffectiveTime().getTime() <= System.currentTimeMillis()) {
                    record.setStatus("active");
                }
            }
            if (record.getEffectiveTime() != null) {
                if (record.getEffectiveTime().getTime() > System.currentTimeMillis()) {
                    record.setStatus("pending");
                }
            }
            if (record.getExpireTime() != null) {
                if (record.getExpireTime().getTime() <= System.currentTimeMillis()) {
                    record.setStatus("expired");
                }
            }
        }
        return result;
    }
    @Override
    public void export(HttpServletResponse response) {
        List<ProcurementPriceManagement> procurementPriceManagements = procurementPriceManagementMapper.selectList(null);
        for (ProcurementPriceManagement procurementPriceManagement : procurementPriceManagements) {
            if (procurementPriceManagement.getEffectiveTime() != null) {
                if (procurementPriceManagement.getEffectiveTime().getTime() <= System.currentTimeMillis()) {
                    procurementPriceManagement.setStatus("有效");
                }
            }
            if (procurementPriceManagement.getEffectiveTime() != null) {
                if (procurementPriceManagement.getEffectiveTime().getTime() > System.currentTimeMillis()) {
                    procurementPriceManagement.setStatus("待生效");
                }
            }
            if (procurementPriceManagement.getExpireTime() != null) {
                if (procurementPriceManagement.getExpireTime().getTime() <= System.currentTimeMillis()) {
                    procurementPriceManagement.setStatus("已过期");
                }
            }
        }
        ExcelUtil<ProcurementPriceManagement> util = new ExcelUtil<ProcurementPriceManagement>(ProcurementPriceManagement.class);
        util.exportExcel(response, procurementPriceManagements, "采购价格管理");}
}
src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordOutServiceImpl.java
@@ -10,6 +10,7 @@
import com.ruoyi.procurementrecord.dto.ProcurementUpdateDto;
import com.ruoyi.procurementrecord.mapper.ProcurementRecordOutMapper;
import com.ruoyi.procurementrecord.pojo.ProcurementRecordOut;
import com.ruoyi.procurementrecord.pojo.ProcurementRecordStorage;
import com.ruoyi.procurementrecord.service.ProcurementRecordOutService;
import com.ruoyi.project.system.domain.SysUser;
import com.ruoyi.project.system.mapper.SysUserMapper;
@@ -20,7 +21,10 @@
import javax.servlet.http.HttpServletResponse;
import java.math.BigDecimal;
import java.text.DateFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.List;
import java.util.stream.Collectors;
@@ -43,12 +47,21 @@
        if(sysUser == null){
            throw new RuntimeException("出库人不存在");
        }
        // æŸ¥è¯¢æ—¶é—´èŒƒå›´ä¸ºå½“天数量
        LocalDate now = LocalDate.now();
        DateTimeFormatter dateFormat = DateTimeFormatter.ofPattern("yyyyMMdd");
        LambdaQueryWrapper<ProcurementRecordOut> procurementRecordOutLambdaQueryWrapper = new LambdaQueryWrapper<>();
        procurementRecordOutLambdaQueryWrapper.ge(ProcurementRecordOut::getCreateTime, now)  // å¤§äºŽç­‰äºŽå½“天
                .lt(ProcurementRecordOut::getCreateTime, now.plusDays(1)); // å°äºŽæ˜Žå¤©
        Long aLong1 = procurementRecordOutMapper.selectCount(procurementRecordOutLambdaQueryWrapper);
        // æŸ¥è¯¢é‡‡è´­å‡ºåº“数量
        LambdaQueryWrapper<ProcurementRecordOut> procurementRecordLambdaQueryWrapper = new LambdaQueryWrapper<>();
        procurementRecordLambdaQueryWrapper.eq(ProcurementRecordOut::getProcurementRecordStorageId, procurementRecordOutAdd.getId());
        Long aLong = procurementRecordOutMapper.selectCount(procurementRecordLambdaQueryWrapper);
        ProcurementRecordOut.ProcurementRecordOutBuilder procurementRecordOut = ProcurementRecordOut.builder()
                .procurementRecordStorageId(procurementRecordOutAdd.getId())
                .code("LS" + dateFormat.format(now) + String.format("%03d", aLong1 + 1))
                .salesLedgerProductId(procurementRecordOutAdd.getSalesLedgerProductId())
                .inboundBatches(aLong.equals(0L) ? "第1批次" : "第"+ (aLong + 1) + "批次")
                .inboundNum(new BigDecimal(procurementRecordOutAdd.getQuantity()))
src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordServiceImpl.java
@@ -4,7 +4,6 @@
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.common.utils.DateUtils;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.framework.security.LoginUser;
@@ -25,9 +24,10 @@
import javax.servlet.http.HttpServletResponse;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.List;
import java.util.*;
import java.util.stream.Collectors;
/**
@@ -103,6 +103,7 @@
    public int updatePro(ProcurementUpdateDto procurementDto) {
        ProcurementRecordStorage procurementRecordStorageById = getProcurementRecordById(procurementDto.getId());
        procurementRecordStorageById.setInboundNum(procurementDto.getQuantityStock());
        procurementRecordStorageById.setWarnNum(procurementDto.getWarnNum());
        procurementRecordStorageById.setUpdateUser(SecurityUtils.getLoginUser().getUserId());
        procurementRecordStorageById.setUpdateTime(LocalDateTime.now());
        return procurementRecordMapper.updateById(procurementRecordStorageById);
@@ -177,6 +178,12 @@
        DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        String entryDateStr = procurementDto.getEntryDate() + " 00:00:00";
        String createTimeStr = procurementDto.getCreateTime() + " 00:00:00";
        SalesLedgerProduct salesLedgerProduct = salesLedgerProductMapper.selectById(procurementDto.getSalesLedgerProductId());
        if(salesLedgerProduct == null){
            throw new RuntimeException("销售台账产品不存在");
        }
        salesLedgerProduct.setMinStock(procurementDto.getMinStock());
        salesLedgerProductMapper.updateById(salesLedgerProduct);
        ProcurementRecordStorage procurementRecordStorageById = getProcurementRecordById(procurementDto.getId());
        procurementRecordStorageById.setCreateBy(sysUser.getNickName());
        procurementRecordStorageById.setCreateUser(sysUser.getUserId());
@@ -231,6 +238,104 @@
    }
    @Override
    public Map<String, Object> getReportList(Page page, ProcurementPageDto procurementDto) {
        // æž„建报表数据结构
        Map<String, Object> reportData = new HashMap<>();
        // 2. æž„建图表数据
        Map<String, Object> chartData = new HashMap<>();
        IPage<ProcurementPageDtoCopy> procurementPageDtoCopyIPage = procurementRecordMapper.listPageCopy(page, procurementDto);
        List<ProcurementPageDtoCopy> procurementPageDtoCopyList = procurementPageDtoCopyIPage.getRecords();
        // è®¡ç®—待入库数量
        reportData.put("tableData", procurementPageDtoCopyList);
        // æŸ¥è¯¢é‡‡è´­è®°å½•已入库数量
        List<Integer> collect = procurementPageDtoCopyList.stream().map(ProcurementPageDtoCopy::getId).collect(Collectors.toList());
        if(CollectionUtils.isEmpty(collect)){
             return reportData;
        }
        LambdaQueryWrapper<ProcurementRecordOut> procurementRecordLambdaQueryWrapper = new LambdaQueryWrapper<>();
        procurementRecordLambdaQueryWrapper.in(ProcurementRecordOut::getProcurementRecordStorageId, collect);
        List<ProcurementRecordOut> procurementRecords = procurementRecordOutMapper.selectList(procurementRecordLambdaQueryWrapper);
        if(CollectionUtils.isEmpty( procurementRecords)){
             return reportData;
        }
        int totalIn =0;
        int totalOut =0;
        int currentStock =0;
        int turnoverRate =0;
        List<String> dates = new ArrayList<>();
        List<Integer> values = new ArrayList<>();
        List<String> comparisonDates = new ArrayList<>();
        List<Integer> inValues = new ArrayList<>();
        List<Integer> outValues = new ArrayList<>();
        // å®šä¹‰æ—¥æœŸæ ¼å¼åŒ–器,指定为yyyy-MM-dd格式
        DateTimeFormatter dateFormatter = DateTimeFormatter.ISO_LOCAL_DATE;
        for (ProcurementPageDtoCopy dto : procurementPageDtoCopyList) {
            dates.add(dto.getCreateTime().format(dateFormatter));
            comparisonDates.add(dto.getCreateTime().format(dateFormatter));
            // æ ¹æ®é‡‡è´­å°è´¦ID筛选对应的出库记录
            List<ProcurementRecordOut> collect1 = procurementRecords.stream()
                    .filter(ProcurementRecordOut -> ProcurementRecordOut.getProcurementRecordStorageId().equals(dto.getId()))
                    .collect(Collectors.toList());
            // å¦‚果没有相关的出库记录,跳过该条数据
            if(CollectionUtils.isEmpty(collect1)){
                dto.setInboundNum0(dto.getInboundNum());
                continue;
            }
            // è®¡ç®—已出库数量总和,并设置待出库数量
            BigDecimal totalInboundNum = collect1.stream()
                    .map(ProcurementRecordOut::getInboundNum)
                    .reduce(BigDecimal.ZERO, BigDecimal::add);
            // å¾…出库数量 = æ€»æ•°é‡ - å·²å‡ºåº“数量
            dto.setInboundNum0(dto.getInboundNum().subtract(totalInboundNum));
            // è®¡ç®—总入库数量
            totalIn += dto.getInboundNum().intValue();
            inValues.add(totalIn);
            // è®¡ç®—总出库数量
            totalOut += totalInboundNum.intValue();
            outValues.add(totalOut);
            // è®¡ç®—当前库存
            currentStock += dto.getInboundNum().intValue() - totalInboundNum.intValue();
            values.add(currentStock);
            // è®¡ç®—周转率
            if(totalIn > 0){
                turnoverRate = totalOut * 100 / totalIn;
            }
        }
        // 1. æž„建汇总数据
        Map<String, Object> summary = new HashMap<>();
        summary.put("totalIn", totalIn);          // æ€»å…¥åº“量,实际应从数据计算
        summary.put("totalOut", totalOut);         // æ€»å‡ºåº“量,实际应从数据计算
        summary.put("currentStock", currentStock);     // å½“前库存量,实际应从数据计算
        summary.put("turnoverRate", turnoverRate);      // å‘¨è½¬çŽ‡ï¼Œå®žé™…åº”ä»Žæ•°æ®è®¡ç®—
        reportData.put("summary", summary);
        // 2. æž„建图表数据
//        Map<String, Object> chartData = new HashMap<>();
//        List<String> dates = Arrays.asList("2025-09-15", "2025-09-16", "2025-09-17", "2025-09-18", "2025-09-19");
//        List<Integer> values = Arrays.asList(300, 350, 400, 380, 420);
        chartData.put("dates", dates);
        chartData.put("values", values);
        chartData.put("comparisonDates", comparisonDates);  // å®žé™…应从数据计算
        chartData.put("inValues", inValues);         // å®žé™…应从数据计算
        chartData.put("outValues", outValues);        // å®žé™…应从数据计算
        reportData.put("chartData", chartData);
        // 3. è®¾ç½®è¡¨æ ¼æ•°æ®
        reportData.put("tableData", procurementPageDtoCopyList);
        return reportData;
    }
    @Override
    public int add(ProcurementAddDto procurementDto) {
        LoginUser loginUser = SecurityUtils.getLoginUser();
        // æ‰¹é‡æ–°å¢ž
@@ -244,6 +349,7 @@
                    .salesLedgerProductId(detail.getId())
                    .inboundBatches(aLong.equals(0L) ? "第1批次" : "第"+ (aLong + 1) + "批次")
                    .inboundNum(detail.getInboundQuantity())
                    .warnNum(detail.getWarnNum())
                    .createTime(LocalDateTime.now())
                    .createUser(loginUser.getUserId())
                    .updateTime(LocalDateTime.now())
@@ -334,7 +440,8 @@
            BigDecimal totalInboundNum = collect1.stream()
                    .map(ProcurementRecordOut::getInboundNum)
                    .reduce(BigDecimal.ZERO, BigDecimal::add);
            // å‡ºåº“数量 = æ€»æ•°é‡ - å¾…出库数量
            dto.setTotalInboundNum(totalInboundNum);
            // å¾…出库数量 = æ€»æ•°é‡ - å·²å‡ºåº“数量
            dto.setInboundNum0(dto.getInboundNum().subtract(totalInboundNum));
        }
src/main/java/com/ruoyi/procurementrecord/service/impl/ReturnManagementServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,29 @@
package com.ruoyi.procurementrecord.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.procurementrecord.mapper.ReturnManagementMapper;
import com.ruoyi.procurementrecord.pojo.ReturnManagement;
import com.ruoyi.procurementrecord.service.ReturnManagementService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
 * @author :yys
 * @date : 2025/9/17 10:34
 */
@Service
@Slf4j
public class ReturnManagementServiceImpl extends ServiceImpl<ReturnManagementMapper, ReturnManagement> implements ReturnManagementService {
    @Autowired
    private ReturnManagementMapper returnManagementMapper;
    @Override
    public IPage<ReturnManagement> listPage(Page page, ReturnManagement returnManagement) {
        IPage<ReturnManagement> returnManagementIPage =  returnManagementMapper.listPage(page, returnManagement);
        return returnManagementIPage;
    }
}
src/main/java/com/ruoyi/production/controller/SalesLedgerSchedulingController.java
@@ -2,6 +2,7 @@
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.controller.BaseController;
@@ -52,6 +53,17 @@
        salesLedgerSchedulingService.export(response);
    }
    /**
     * å¯¼å‡º
     * @param response
     */
    @PostMapping("/exportOne")
    @ApiOperation("生产管理-生产派工-导出")
    public void exportOne(HttpServletResponse response) {
        salesLedgerSchedulingService.exportOne(response);
    }
    @PostMapping("/productionDispatch")
    @Log(title = "生产管理-生产订单-生产派工", businessType = BusinessType.INSERT)
    @ApiOperation("生产管理-生产订单-生产派工")
@@ -69,6 +81,23 @@
        return AjaxResult.success(result);
    }
    /**
     * å¯¼å‡º
     * @param response
     */
    @PostMapping("/exportTwo")
    @ApiOperation("生产管理-工序排产-导出")
    public void exportTwo(HttpServletResponse response) {
        Page page = new Page(-1,-1);
        SalesLedgerSchedulingProcessDto salesLedgerSchedulingDto = new SalesLedgerSchedulingProcessDto();
        IPage<SalesLedgerSchedulingProcessDto> result = salesLedgerSchedulingService.listPageProcess(page,salesLedgerSchedulingDto);
        result.getRecords().forEach(item -> {
            item.setStatusName(item.getStatus().toString());
        });
        ExcelUtil<SalesLedgerSchedulingProcessDto> util = new ExcelUtil<>(SalesLedgerSchedulingProcessDto.class);
        util.exportExcel(response, result.getRecords(), "工序排产");
    }
    @DeleteMapping("/productionDispatchDelete")
    @Log(title = "生产管理-工序排产-取消排产", businessType = BusinessType.DELETE)
src/main/java/com/ruoyi/production/controller/SalesLedgerWorkController.java
@@ -2,12 +2,14 @@
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.controller.BaseController;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.production.dto.ProcessSchedulingDto;
import com.ruoyi.production.dto.ProductionReportDto;
import com.ruoyi.production.dto.SalesLedgerSchedulingProcessDto;
import com.ruoyi.production.dto.SalesLedgerWorkDto;
import com.ruoyi.production.pojo.SalesLedgerWork;
import com.ruoyi.production.service.SalesLedgerWorkService;
@@ -18,6 +20,7 @@
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
/**
@@ -41,6 +44,24 @@
        return AjaxResult.success(listPage);
    }
    /**
     * å¯¼å‡º
     * @param response
     */
    @PostMapping("/export")
    @ApiOperation("生产管理-生产报工-导出")
    public void export(HttpServletResponse response) {
        Page page = new Page(-1,-1);
        SalesLedgerWorkDto salesLedgerSchedulingDto = new SalesLedgerWorkDto();
        IPage<SalesLedgerWorkDto> result = salesLedgerWorkService.listPage(page,salesLedgerSchedulingDto);
        result.getRecords().forEach(item -> {
            item.setDaiNum(item.getFinishedNum().subtract(item.getSchedulingNum()));
            item.setStatusName(item.getStatus().toString());
        });
        ExcelUtil<SalesLedgerWorkDto> util = new ExcelUtil<>(SalesLedgerWorkDto.class);
        util.exportExcel(response, result.getRecords(), "工序排产");
    }
    @GetMapping("/list")
    @Log(title = "生产报工-查询", businessType = BusinessType.OTHER)
    @ApiOperation("生产报工-查询")
src/main/java/com/ruoyi/production/dto/DaiDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,110 @@
package com.ruoyi.production.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.math.BigDecimal;
import java.util.Date;
/**
 * @author :yys
 * @date : 2025/11/3 9:35
 */
@Data
public class DaiDto{
    @Excel(name = "待排数量")
    private BigDecimal daiNum;
    @ApiModelProperty(value = "销售产品ID")
    private Long salesLedgerProductId;
    @ApiModelProperty(value = "销售台账ID")
    private Long salesLedgerId;
    /**
     * é”€å”®åˆåŒå·
     */
    @Excel(name = "销售合同号")
    @ApiModelProperty(value = "销售合同号")
    private String salesContractNo;
    /**
     * å®¢æˆ·åˆåŒå·
     */
    @Excel(name = "客户合同号")
    @ApiModelProperty(value = "客户合同号")
    private String customerContractNo;
    /**
     * é¡¹ç›®åç§°
     */
    @Excel(name = "项目名称")
    @ApiModelProperty(value = "项目名称")
    private String projectName;
    /**
     * å½•入日期
     */
    @JsonFormat(pattern = "yyyy-MM-dd")
    @Excel(name = "录入日期", width = 30, dateFormat = "yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @ApiModelProperty(value = "录入日期")
    private Date entryDate;
    @ApiModelProperty(value = "录入日期开始")
    private String entryDateStart;
    @ApiModelProperty(value = "录入日期结束")
    private String entryDateEnd;
    /**
     * å®¢æˆ·åç§°
     */
    @Excel(name = "客户名称")
    @ApiModelProperty(value = "客户名称")
    private String customerName;
    /**
     * äº§å“å¤§ç±»
     */
    @Excel(name = "产品大类")
    @ApiModelProperty(value = "产品大类")
    private String productCategory;
    /**
     * è§„格型号
     */
    @Excel(name = "规格型号")
    @ApiModelProperty(value = "规格型号")
    private String specificationModel;
    /**
     * å•位
     */
    @Excel(name = "单位")
    @ApiModelProperty(value = "单位")
    private String unit;
    /**
     * æ•°é‡
     */
    @Excel(name = "数量")
    @ApiModelProperty(value = "数量")
    private BigDecimal quantity;
    /**
     * æŽ’产数量
     */
    @Excel(name = "排产数量")
    @ApiModelProperty(value = "排产数量")
    private BigDecimal schedulingNum;
    @ApiModelProperty(value = "租户ID")
    private Long tenantId;
}
src/main/java/com/ruoyi/production/dto/SalesLedgerSchedulingDto.java
@@ -113,6 +113,9 @@
    @ApiModelProperty(value = "完工数量")
    private BigDecimal successNum;
    @Excel(name = "状态")
    private String status;
    @ApiModelProperty(value = "租户ID")
    private Long tenantId;
src/main/java/com/ruoyi/production/dto/SalesLedgerSchedulingProcessDto.java
@@ -96,9 +96,11 @@
    /**
     * çŠ¶æ€
     */
    @Excel(name = "状态")
    @ApiModelProperty(value = "状态")
    private Integer status;
    @Excel(name = "状态", readConverterExp = "1=待排产,2=排产中,3=已排产")
    private String statusName;
    /**
     * æ´¾å·¥äºº
@@ -125,6 +127,7 @@
     * å·²æŽ’产数量
     */
    @ApiModelProperty(value = "已排产数量")
    @Excel(name = "已排产数量")
    private BigDecimal successNum;
    private Long tenantId;
src/main/java/com/ruoyi/production/dto/SalesLedgerWorkDto.java
@@ -1,5 +1,6 @@
package com.ruoyi.production.dto;
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@@ -27,6 +28,7 @@
     * æŽ’产人名称
     */
    @ApiModelProperty(value = "排产人名称")
    @Excel(name = "排产人")
    private String schedulingUserName;
@@ -34,13 +36,22 @@
     * æŽ’产数量
     */
    @ApiModelProperty(value = "排产数量")
    @Excel(name = "排产数量")
    private BigDecimal schedulingNum;
    /**
     * ç”Ÿäº§æ•°é‡
     */
    @ApiModelProperty(value = "生产数量")
    @Excel(name = "生产数量")
    private BigDecimal finishedNum;
    /**
     * å¾…生产数量
     */
    @ApiModelProperty(value = "待生产数量")
    @Excel(name = "待生产数量")
    private BigDecimal daiNum;
    /**
     * å·¥æ—¶å®šé¢
@@ -52,11 +63,13 @@
     * å·¥åº
     */
    @ApiModelProperty(value = "工序")
    @Excel(name = "工序")
    private String process;
    /**
     * æŽ’产日期
     */
    @ApiModelProperty(value = "排产日期")
    @Excel(name = "排产日期")
    private String schedulingDate;
    @ApiModelProperty(value = "开始时间")
@@ -70,4 +83,8 @@
    @ApiModelProperty(value = "报工状态")
    private Integer status;
    @Excel(name = "状态", readConverterExp = "1=待生产,2=生产中,3=已报工")
    private String statusName;
}
src/main/java/com/ruoyi/production/service/SalesLedgerSchedulingService.java
@@ -29,4 +29,6 @@
    int productionDispatchDelete(List<Long> ids);
    int processScheduling(List<ProcessSchedulingDto> processSchedulingDto);
    void exportOne(HttpServletResponse response);
}
src/main/java/com/ruoyi/production/service/impl/SalesLedgerSchedulingServiceImpl.java
@@ -6,10 +6,7 @@
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.procurementrecord.dto.ProcurementRecordOutPageDto;
import com.ruoyi.production.dto.ProcessSchedulingDto;
import com.ruoyi.production.dto.ProductionDispatchAddDto;
import com.ruoyi.production.dto.SalesLedgerSchedulingDto;
import com.ruoyi.production.dto.SalesLedgerSchedulingProcessDto;
import com.ruoyi.production.dto.*;
import com.ruoyi.production.mapper.SalesLedgerSchedulingMapper;
import com.ruoyi.production.mapper.SalesLedgerWorkMapper;
import com.ruoyi.production.pojo.SalesLedgerScheduling;
@@ -19,6 +16,7 @@
import com.ruoyi.project.system.mapper.SysUserMapper;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
@@ -26,6 +24,7 @@
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
@@ -61,6 +60,12 @@
                    .filter(j -> j.getSalesLedgerProductId().equals(i.getSalesLedgerProductId()))
                    .map(SalesLedgerWork::getFinishedNum)
                    .reduce(BigDecimal.ZERO, BigDecimal::add));
            // çŠ¶æ€ = æ•°é‡å’Œå®Œå·¥æ•°é‡æ¯”较
            if(i.getSchedulingNum().compareTo(i.getSuccessNum()) == 0){
                i.setStatus("已完成");
            }else{
                i.setStatus("未完成");
            }
        });
        return list;
    }
@@ -175,4 +180,22 @@
        }
        return 0;
    }
    @Override
    public void exportOne(HttpServletResponse response) {
        List<SalesLedgerSchedulingDto> list = salesLedgerSchedulingMapper.list();
        if(CollectionUtils.isEmpty(list)){
            throw new RuntimeException("无导出数据");
        }
        List<DaiDto> dais = new ArrayList<>();
        list.forEach(i -> {
            DaiDto daiDto = new DaiDto();
            BeanUtils.copyProperties(i, daiDto);
            // èŽ·å–å¾…æŽ’äº§æ•°é‡
            daiDto.setDaiNum(daiDto.getQuantity().subtract(i.getSchedulingNum()));
            dais.add(daiDto);
        });
        ExcelUtil<DaiDto> util = new ExcelUtil<>(DaiDto.class);
        util.exportExcel(response, dais, "生产派工");
    }
}
src/main/java/com/ruoyi/project/common/CommonController.java
@@ -5,6 +5,11 @@
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.ruoyi.basic.service.StorageBlobService;
import com.ruoyi.framework.web.domain.R;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
@@ -27,6 +32,7 @@
 * 
 * @author ruoyi
 */
@Api(tags = "通用接口")
@RestController
@RequestMapping("/common")
public class CommonController
@@ -69,6 +75,20 @@
        }
    }
    @Autowired
    private StorageBlobService storageBlobService;
    /**
     * minio通用上传请求(多个)
     */
    @PostMapping("/minioUploads")
    @ApiOperation(value = "minio通用上传请求")
    public AjaxResult minioUploadFiles(List<MultipartFile> files, String bucketName, Long type) throws Exception
    {
        return AjaxResult.success(storageBlobService.updateStorageBlobs(files, bucketName,type));
    }
    /**
     * é€šç”¨ä¸Šä¼ è¯·æ±‚(单个)
     */
src/main/java/com/ruoyi/project/system/mapper/SysUserMapper.java
@@ -1,10 +1,13 @@
package com.ruoyi.project.system.mapper;
import java.util.ArrayList;
import java.util.List;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
import com.ruoyi.project.system.domain.SysUser;
import org.springframework.beans.PropertyValues;
/**
 * ç”¨æˆ·è¡¨ æ•°æ®å±‚
@@ -134,4 +137,8 @@
     * @return ç»“æžœ
     */
    public SysUser checkEmailUnique(String email);
    List<SysUser> selectList(List<Long> registrantIds);
    List<SysUser> selectUsersByIds(@Param("userIds") List<Long> userIds);
}
src/main/java/com/ruoyi/purchase/controller/AccountingReportController.java
@@ -2,6 +2,7 @@
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.domain.AjaxResult;
@@ -9,13 +10,17 @@
import com.ruoyi.purchase.dto.VatDto;
import com.ruoyi.purchase.pojo.InvoicePurchase;
import com.ruoyi.purchase.service.IInvoicePurchaseService;
import com.ruoyi.waterrecord.pojo.WaterRecord;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
@RestController
@@ -34,10 +39,31 @@
        return AjaxResult.success(result);
    }
    @Log(title = "采购报表-项目利润导出", businessType = BusinessType.EXPORT)
    @PostMapping("/export")
    @ApiOperation("采购报表-项目利润导出")
    public void export(HttpServletResponse response) {
        Page page = new Page(-1,-1);
        InvoicePurchaseReportDto waterRecord = new InvoicePurchaseReportDto();
        IPage<InvoicePurchaseReportDto> listPage = invoicePurchaseService.listPurchaseReport(page, waterRecord);
        ExcelUtil<InvoicePurchaseReportDto> util = new ExcelUtil<InvoicePurchaseReportDto>(InvoicePurchaseReportDto.class);
        util.exportExcel(response, listPage.getRecords() , "项目利润导出");
    }
    @Log(title = "采购报表-增值税比对", businessType = BusinessType.OTHER)
    @GetMapping("/listVat")
    public AjaxResult listVat(Page page,String month) {
        IPage<VatDto> result = invoicePurchaseService.listVat(page, month);
        return AjaxResult.success(result);
    }
    @Log(title = "采购报表-增值税比对", businessType = BusinessType.EXPORT)
    @PostMapping("/exportTwo")
    @ApiOperation("采购报表-增值税比对")
    public void exportTwo(HttpServletResponse response) {
        Page page = new Page(-1,-1);
        IPage<VatDto> result = invoicePurchaseService.listVat(page, null);
        ExcelUtil<VatDto> util = new ExcelUtil<VatDto>(VatDto.class);
        util.exportExcel(response, result.getRecords() , "增值税比对");
    }
}
src/main/java/com/ruoyi/purchase/controller/PaymentRegistrationController.java
@@ -2,6 +2,7 @@
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.controller.BaseController;
@@ -15,6 +16,7 @@
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
import java.util.Map;
@@ -42,16 +44,17 @@
    }
    /**
     * å¯¼å‡ºä»˜æ¬¾ç™»è®°åˆ—表
     * å¯¼å‡ºä»˜æ¬¾æµæ°´åˆ—表
     */
//    @Log(title = "付款登记", businessType = BusinessType.EXPORT)
//    @PostMapping("/export")
//    public void export(HttpServletResponse response, PaymentRegistrationDto paymentRegistrationDto)
//    {
//        List<PaymentRegistrationDto> list = paymentRegistrationService.selectPaymentRegistrationList(paymentRegistrationDto);
//        ExcelUtil<PaymentRegistration> util = new ExcelUtil<PaymentRegistration>(PaymentRegistration.class);
//        util.exportExcel(response, list, "付款登记数据");
//    }
    @Log(title = "导出付款流水列表", businessType = BusinessType.EXPORT)
    @PostMapping("/export")
    public void export(HttpServletResponse response, PaymentRegistrationDto paymentRegistrationDto)
    {
        Page page = new Page<>(-1,-1);
        IPage<PaymentRegistrationDto> paymentRegistrationDtoIPage = paymentHistoryListPage(page, paymentRegistrationDto);
        ExcelUtil<PaymentRegistrationDto> util = new ExcelUtil<PaymentRegistrationDto>(PaymentRegistrationDto.class);
        util.exportExcel(response, paymentRegistrationDtoIPage.getRecords(), "导出付款流水列表");
    }
    /**
     * èŽ·å–ä»˜æ¬¾ç™»è®°è¯¦ç»†ä¿¡æ¯
src/main/java/com/ruoyi/purchase/controller/PurchaseLedgerController.java
@@ -56,6 +56,20 @@
    }
    /**
     * å¯¼å‡ºæ¥ç¥¨ç™»è®°åˆ—表
     */
    @Log(title = "导出来票登记列表", businessType = BusinessType.EXPORT)
    @PostMapping("/exportOne")
    public void exportOne(HttpServletResponse response, PurchaseLedger purchaseLedger) {
        Page page = new Page();
        page.setCurrent(-1);
        page.setSize(-1);
        IPage<PurchaseLedgerDto> purchaseLedgerDtoIPage = purchaseLedgerService.selectPurchaseLedgerListPage(page, new PurchaseLedgerDto());
        ExcelUtil<PurchaseLedgerDto> util = new ExcelUtil<PurchaseLedgerDto>(PurchaseLedgerDto.class);
        util.exportExcel(response, purchaseLedgerDtoIPage.getRecords(), "导出来票登记列表");
    }
    /**
     * æ–°å¢žä¿®æ”¹é‡‡è´­å°è´¦
     */
    @Log(title = "采购台账", businessType = BusinessType.INSERT)
src/main/java/com/ruoyi/purchase/controller/TicketRegistrationController.java
@@ -103,6 +103,18 @@
    }
    /**
     * ä»˜æ¬¾ç™»è®°å¯¼å‡º
     */
    @Log(title = "付款登记导出", businessType = BusinessType.EXPORT)
    @PostMapping("/exportOne")
    public void exportOne(HttpServletResponse response, TicketRegistration ticketRegistration) {
        Page page = new Page<>(-1, -1);
        IPage<TicketRegistration> ticketRegistrationIPage = listPage(page, ticketRegistration);
        ExcelUtil<TicketRegistration> util = new ExcelUtil<TicketRegistration>(TicketRegistration.class);
        util.exportExcel(response, ticketRegistrationIPage.getRecords(), "付款登记导出");
    }
    /**
     * æŸ¥è¯¢æ¥ç¥¨ç™»è®°å’Œäº§å“çˆ¶å­åˆ—表
     */
    @GetMapping("/getRegistrationById")
src/main/java/com/ruoyi/purchase/dto/InvoicePurchaseReportDto.java
@@ -1,5 +1,6 @@
package com.ruoyi.purchase.dto;
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
import lombok.Data;
/**
@@ -9,24 +10,32 @@
public class InvoicePurchaseReportDto {
    //销售合同号
    @Excel(name = "销售合同号")
    private String customerContractNo;
//    å®¢æˆ·åç§°
    @Excel(name = "客户名称")
    private String customerName;
//    é¡¹ç›®åç§°
    @Excel(name = "项目名称")
    private String projectName;
//    åˆåŒé‡‘额
    @Excel(name = "合同金额")
    private String contractAmount;
//    é‡‡è´­é‡‘额
    @Excel(name = "采购金额")
    private String purchaseAmount;
    private String saleTaxExclusiveTotalPrice;
    private String taxExclusiveTotalPrice;
//    åˆ©æ¶¦
    @Excel(name = "利润")
    private String balance;
    //    åˆ©æ¶¦çއ
    @Excel(name = "利润率")
    private String balanceRatio;
    //    å¢žå€¼ç¨Ž
    @Excel(name = "增值税")
    private String balanceAmount;
}
src/main/java/com/ruoyi/purchase/dto/PaymentRegistrationDto.java
@@ -1,5 +1,6 @@
package com.ruoyi.purchase.dto;
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
import com.ruoyi.purchase.pojo.PaymentRegistration;
import lombok.Data;
@@ -15,9 +16,11 @@
    private String salesContractNo;
    // é‡‡è´­åˆåŒå·
    @Excel(name = "采购合同号")
    private String purchaseContractNumber;
    // ä¾›åº”商名称
    @Excel(name = "供应商名称")
    private String supplierName;
    // å‘票号
src/main/java/com/ruoyi/purchase/dto/ProductRecordDto.java
@@ -25,6 +25,7 @@
    private String purchaseContractNumber;
    //供应商名称
    private String supplierName;
    private String projectName;
    private Long issUerId;
    private String issUer;
    //增值税
src/main/java/com/ruoyi/purchase/dto/PurchaseLedgerDto.java
@@ -2,10 +2,12 @@
import com.baomidou.mybatisplus.annotation.TableField;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
import com.ruoyi.sales.pojo.CommonFile;
import com.ruoyi.sales.pojo.SalesLedgerProduct;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.math.BigDecimal;
import java.util.Date;
@@ -23,7 +25,9 @@
    /**
     * é‡‡è´­åˆåŒå·
     */
    @Excel(name = "采购合同号")
    private String purchaseContractNumber;
    /**
@@ -34,6 +38,7 @@
    /**
     * ä¾›åº”商名称
     */
    @Excel(name = "供应商名称")
    private String supplierName;
    /**
@@ -45,11 +50,13 @@
    /**
     * å½•入人姓名
     */
    @Excel(name = "录入人姓名")
    private String recorderName;
    /**
     * é”€å”®åˆåŒå·
     */
    @Excel(name = "销售合同号")
    private String salesContractNo;
    /**
@@ -60,13 +67,23 @@
    /**
     * é¡¹ç›®åç§°
     */
    @Excel(name = "项目名称")
    private String projectName;
    /**
     * å½•入日期
     */
    @JsonFormat(pattern = "yyyy-MM-dd")
    @Excel(name = "录入日期", width = 30, dateFormat = "yyyy-MM-dd")
    private Date entryDate;
    /**
     * ç­¾è®¢æ—¥æœŸ
     */
    @JsonFormat(pattern = "yyyy-MM-dd")
    @Excel(name = "签订日期", width = 30, dateFormat = "yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private Date executionDate;
    /**
     * å¤‡æ³¨
@@ -142,15 +159,18 @@
    /**
     * åˆåŒé‡‘额(产品含税总价)
     */
    @Excel(name = "合同金额")
    private BigDecimal contractAmount = BigDecimal.ZERO;
    @TableField(exist = false)
    @ApiModelProperty("来票金额")
    @Excel(name = "已来票金额(元)")
    private BigDecimal receiptPaymentAmount =  BigDecimal.ZERO;
    @ApiModelProperty("未来票金额")
    @TableField(exist = false)
    @Excel(name = "未来票金额(元)")
    private BigDecimal unReceiptPaymentAmount =BigDecimal.ZERO;
    @ApiModelProperty("文件类型  å– 4")
src/main/java/com/ruoyi/purchase/dto/VatDto.java
@@ -1,5 +1,6 @@
package com.ruoyi.purchase.dto;
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
import lombok.Data;
import java.math.BigDecimal;
@@ -9,14 +10,18 @@
public class VatDto {
    //月份
    @Excel(name = "月份")
    private String month ;
    //进项税
    @Excel(name = "进项税额")
    private BigDecimal jTaxAmount;
    //销项税
    @Excel(name = "销项税额")
    private BigDecimal xTaxAmount;
    @Excel(name = "销-进")
    private BigDecimal taxAmount;
}
src/main/java/com/ruoyi/purchase/pojo/PaymentRegistration.java
@@ -2,6 +2,7 @@
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
import lombok.Data;
import java.math.BigDecimal;
@@ -48,11 +49,13 @@
    /**
     * æœ¬æ¬¡ä»˜æ¬¾é‡‘额
     */
    @Excel(name = "付款金额")
    private BigDecimal currentPaymentAmount;
    /**
     * ä»˜æ¬¾å½¢å¼
     */
    @Excel(name = "付款形式")
    private String paymentMethod;
    /**
@@ -72,12 +75,14 @@
     * ä»˜æ¬¾æ—¥æœŸ
     */
    @JsonFormat(pattern = "yyyy-MM-dd")
    @Excel(name = "付款日期", width = 30, dateFormat = "yyyy-MM-dd")
    private Date paymentDate;
    /**
     * ç™»è®°æ—¥æœŸ
     */
    @JsonFormat(pattern = "yyyy-MM-dd")
    @Excel(name = "登记日期", width = 30, dateFormat = "yyyy-MM-dd")
    private Date registrationtDate;
    /**
src/main/java/com/ruoyi/purchase/pojo/PurchaseLedger.java
@@ -73,6 +73,14 @@
    @Excel(name = "录入日期", width = 30, dateFormat = "yyyy-MM-dd")
    private Date entryDate;
    /**
     * ç­¾è®¢æ—¥æœŸ
     */
    @JsonFormat(pattern = "yyyy-MM-dd")
    @Excel(name = "签订日期", width = 30, dateFormat = "yyyy-MM-dd")
    private Date executionDate;
    /**
     * å¤‡æ³¨
     */
src/main/java/com/ruoyi/purchase/pojo/TicketRegistration.java
@@ -28,6 +28,13 @@
    private Long id;
    /**
     * çŠ¶æ€
     */
    @Excel(name = "状态")
    @TableField(exist = false)
    private String statusName;
    /**
     * é‡‡è´­å°è´¦id
     */
    private Long purchaseLedgerId;
@@ -135,10 +142,12 @@
    @ApiModelProperty(value = "已付款总金额")
    @TableField(exist = false)
    @Excel(name = "已付款总金额")
    private BigDecimal paymentAmountTotal;
    @ApiModelProperty(value = "未付款总金额")
    @TableField(exist = false)
    @Excel(name = "未付款总金额")
    private BigDecimal unPaymentAmountTotal;
    @TableField(exist = false)
src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java
@@ -6,6 +6,10 @@
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.account.pojo.AccountExpense;
import com.ruoyi.account.pojo.AccountIncome;
import com.ruoyi.account.service.AccountExpenseService;
import com.ruoyi.account.service.AccountIncomeService;
import com.ruoyi.basic.mapper.ProductMapper;
import com.ruoyi.basic.mapper.ProductModelMapper;
import com.ruoyi.basic.mapper.SupplierManageMapper;
@@ -68,7 +72,7 @@
@RequiredArgsConstructor
@Slf4j
public class PurchaseLedgerServiceImpl extends ServiceImpl<PurchaseLedgerMapper, PurchaseLedger> implements IPurchaseLedgerService {
    private final AccountExpenseService accountExpenseService;
    private final PurchaseLedgerMapper purchaseLedgerMapper;
    private final SalesLedgerMapper salesLedgerMapper;
@@ -128,12 +132,41 @@
        purchaseLedger.setRecorderId(purchaseLedgerDto.getRecorderId());
        purchaseLedger.setRecorderName(sysUser.getNickName());
        purchaseLedger.setPhoneNumber(sysUser.getPhonenumber());
        // 2. å¤„理账户收入
        AccountExpense accountExpense = new AccountExpense();
        accountExpense.setExpenseDate(purchaseLedger.getEntryDate());
        accountExpense.setExpenseType("0");
        accountExpense.setSupplierName(purchaseLedger.getSupplierName());
        accountExpense.setExpenseMoney(purchaseLedger.getContractAmount());
        accountExpense.setExpenseDescribed("采购合同:" + purchaseLedger.getPurchaseContractNumber());
        accountExpense.setExpenseMethod("0");
        accountExpense.setInvoiceNumber(purchaseLedger.getPurchaseContractNumber());
        accountExpense.setInputTime(new Date());
        accountExpense.setInputUser(loginUser.getNickName());
        // 3. æ–°å¢žæˆ–更新主表
        if (purchaseLedger.getId() == null) {
            purchaseLedgerMapper.insert(purchaseLedger);
//            accountIncomeService.save(accountIncome);
            accountExpenseService.save(accountExpense);
        } else {
            purchaseLedgerMapper.updateById(purchaseLedger);
            PurchaseLedger purchaseLedgerDB = purchaseLedgerMapper.selectById(purchaseLedger.getId());
            List<AccountExpense> accountExpenseDBs = accountExpenseService.getByInvoiceNumberList(purchaseLedger.getPurchaseContractNumber());
            if (!CollectionUtils.isEmpty(accountExpenseDBs)) {
                accountExpenseDBs.forEach(accountExpenseDB ->{
                    accountExpenseDB.setExpenseDate(purchaseLedgerDB.getEntryDate());
                    accountExpenseDB.setExpenseType("0");
                    accountExpenseDB.setSupplierName(purchaseLedgerDB.getSupplierName());
                    accountExpenseDB.setExpenseMoney(purchaseLedgerDB.getContractAmount());
                    accountExpenseDB.setExpenseDescribed("采购合同:" + purchaseLedgerDB.getPurchaseContractNumber());
                    accountExpenseDB.setExpenseMethod("0");
                    accountExpenseDB.setInvoiceNumber(purchaseLedgerDB.getPurchaseContractNumber());
                    accountExpenseService.updateById(accountExpenseDB);
                });
            }
        }
        // 4. å¤„理子表数据
@@ -276,12 +309,15 @@
            try {
                // æ‰§è¡Œæ–‡ä»¶è¿ç§»ï¼ˆä½¿ç”¨åŽŸå­æ“ä½œç¡®ä¿å®‰å…¨æ€§ï¼‰
                Files.move(
                        Paths.get(tempFile.getTempPath()),
                        formalFilePath,
                        StandardCopyOption.REPLACE_EXISTING,
                        StandardCopyOption.ATOMIC_MOVE
                );
//                Files.move(
//                        Paths.get(tempFile.getTempPath()),
//                        formalFilePath,
//                        StandardCopyOption.REPLACE_EXISTING,
//                        StandardCopyOption.ATOMIC_MOVE
//                );
                // åŽŸå­ç§»åŠ¨å¤±è´¥ï¼Œä½¿ç”¨å¤åˆ¶+删除
                Files.copy(Paths.get(tempFile.getTempPath()), formalFilePath, StandardCopyOption.REPLACE_EXISTING);
                Files.deleteIfExists(Paths.get(tempFile.getTempPath()));
                log.info("文件迁移成功: {} -> {}", tempFile.getTempPath(), formalFilePath);
                // æ›´æ–°æ–‡ä»¶è®°å½•(关联到业务ID)
src/main/java/com/ruoyi/purchase/service/impl/TicketRegistrationServiceImpl.java
@@ -222,12 +222,15 @@
            try {
                // æ‰§è¡Œæ–‡ä»¶è¿ç§»ï¼ˆä½¿ç”¨åŽŸå­æ“ä½œç¡®ä¿å®‰å…¨æ€§ï¼‰
                Files.move(
                        Paths.get(tempFile.getTempPath()),
                        formalFilePath,
                        StandardCopyOption.REPLACE_EXISTING,
                        StandardCopyOption.ATOMIC_MOVE
                );
//                Files.move(
//                        Paths.get(tempFile.getTempPath()),
//                        formalFilePath,
//                        StandardCopyOption.REPLACE_EXISTING,
//                        StandardCopyOption.ATOMIC_MOVE
//                );
                // åŽŸå­ç§»åŠ¨å¤±è´¥ï¼Œä½¿ç”¨å¤åˆ¶+删除
                Files.copy(Paths.get(tempFile.getTempPath()), formalFilePath, StandardCopyOption.REPLACE_EXISTING);
                Files.deleteIfExists(Paths.get(tempFile.getTempPath()));
                log.info("文件迁移成功: {} -> {}", tempFile.getTempPath(), formalFilePath);
                // æ›´æ–°æ–‡ä»¶è®°å½•(关联到业务ID)
@@ -366,6 +369,10 @@
                ticketRegistrationIPage.setTotal(ticketRegistrationIPage.getRecords().size());
            }
        }
        ticketRegistrationIPage.getRecords().forEach(item -> {
            // å·²ä»˜æ¬¾é‡‘额 == å¾…付款金额
            item.setStatusName(item.getPaymentAmountTotal().compareTo(item.getInvoiceAmount()) == 0 ? "已完成付款" : "未完成付款");
        });
        return ticketRegistrationIPage;
    }
src/main/java/com/ruoyi/quality/controller/QualityInspectController.java
@@ -109,21 +109,21 @@
    /**
     * æäº¤
     * @param id
     * @param qualityInspect
     * @return
     */
    @PostMapping("/submit")
    public AjaxResult submit(Integer id) {
        return AjaxResult.success(qualityInspectService.submit(id));
    public AjaxResult submit(@RequestBody QualityInspect qualityInspect) {
        return AjaxResult.success(qualityInspectService.submit(qualityInspect));
    }
    /**
     * ä¸‹è½½
     * @param response
     * @param id
     * @param qualityInspect
     */
    @PostMapping("/down")
    public void down(HttpServletResponse response,Integer id) {
        qualityInspectService.down(response, id);
    public void down(HttpServletResponse response,@RequestBody QualityInspect qualityInspect) {
        qualityInspectService.down(response, qualityInspect);
    }
}
src/main/java/com/ruoyi/quality/service/IQualityInspectService.java
@@ -24,7 +24,7 @@
    QualityInspectDto getDetailById(Integer id);
    int submit(Integer id);
    int submit(QualityInspect qualityInspect);
    void down(HttpServletResponse response, Integer id);
    void down(HttpServletResponse response, QualityInspect qualityInspect);
}
src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java
@@ -79,14 +79,14 @@
    //提交
    @Override
    public int submit(Integer id) {
        QualityInspect qualityInspect = qualityInspectMapper.selectById(id);
    public int submit(QualityInspect inspect) {
        QualityInspect qualityInspect = qualityInspectMapper.selectById(inspect.getId());
        /*判断不合格*/
        if (ObjectUtils.isNotNull(qualityInspect.getCheckResult()) && qualityInspect.getCheckResult().equals("不合格")){
            QualityUnqualified qualityUnqualified = new QualityUnqualified();
            BeanUtils.copyProperties(qualityInspect,qualityUnqualified);
            qualityUnqualified.setInspectState(0);//待处理
            List<QualityInspectParam> inspectParams = qualityInspectParamService.list(Wrappers.<QualityInspectParam>lambdaQuery().eq(QualityInspectParam::getInspectId, id));
            List<QualityInspectParam> inspectParams = qualityInspectParamService.list(Wrappers.<QualityInspectParam>lambdaQuery().eq(QualityInspectParam::getInspectId, inspect.getId()));
            String text = inspectParams.stream().map(QualityInspectParam::getParameterItem).collect(Collectors.joining(","));
            qualityUnqualified.setDefectivePhenomena(text+"这些指标中存在不合格");//不合格现象
            qualityUnqualifiedMapper.insert(qualityUnqualified);
@@ -97,8 +97,8 @@
    /*生成检验报告*/
    @Override
    public void down(HttpServletResponse response, Integer id) {
        QualityInspect inspect = qualityInspectMapper.selectById(id);
    public void down(HttpServletResponse response, QualityInspect qualityInspect) {
        QualityInspect inspect = qualityInspectMapper.selectById(qualityInspect.getId());
        String inspectType="";
        switch (inspect.getInspectType()){
            case 0:
@@ -111,7 +111,7 @@
                inspectType="出厂检验";
                break;
        }
        List<QualityInspectParam> paramList = qualityInspectParamService.list(Wrappers.<QualityInspectParam>lambdaQuery().eq(QualityInspectParam::getInspectId, id));
        List<QualityInspectParam> paramList = qualityInspectParamService.list(Wrappers.<QualityInspectParam>lambdaQuery().eq(QualityInspectParam::getInspectId, inspect.getId()));
        int index = 1;
        for (QualityInspectParam detail : paramList) {
            detail.setIndex(index);
@@ -133,6 +133,7 @@
            response.setContentType("application/msword");
            String fileName = URLEncoder.encode(
                    "检验报告", "UTF-8");
            response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");
            response.setHeader("Content-disposition",
                    "attachment;filename=" + fileName + ".docx");
            OutputStream os = response.getOutputStream();
@@ -148,7 +149,7 @@
    @Override
    public int updateQualityInspect(QualityInspectDto qualityInspectDto) {
        if (qualityInspectDto.getQualityInspectParams().size()>0) {
        if (ObjectUtils.isNotNull(qualityInspectDto.getQualityInspectParams())) {
            qualityInspectParamService.remove(Wrappers.<QualityInspectParam>lambdaQuery().eq(QualityInspectParam::getInspectId,qualityInspectDto.getId()));
            for (QualityInspectParam qualityInspectParam : qualityInspectDto.getQualityInspectParams()) {
                qualityInspectParam.setInspectId(qualityInspectDto.getId());
src/main/java/com/ruoyi/sales/controller/PaymentShippingController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,70 @@
package com.ruoyi.sales.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.utils.OrderUtils;
import com.ruoyi.framework.web.controller.BaseController;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.sales.mapper.PaymentShippingMapper;
import com.ruoyi.sales.pojo.PaymentShipping;
import com.ruoyi.sales.service.PaymentShippingService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
 * @author :yys
 * @date : 2025/9/15 14:02
 */
@RestController
@RequestMapping("/paymentShipping")
@Api(tags = "支付与发货管理")
public class PaymentShippingController extends BaseController {
    @Autowired
    private PaymentShippingService paymentShippingService;
    @Autowired
    private PaymentShippingMapper paymentShippingMapper;
    @GetMapping("/listPage")
    @ApiOperation("分页查询支付与发货信息")
    public AjaxResult listPage(Page page, PaymentShipping paymentShipping) {
        IPage<PaymentShipping> listPage = paymentShippingService.listPage(page, paymentShipping);
        return AjaxResult.success(listPage);
    }
    @PostMapping("/add")
    @ApiOperation("添加支付与发货信息")
    @Transactional(rollbackFor = Exception.class)
    public AjaxResult add(@RequestBody PaymentShipping paymentShipping) {
        String ord = OrderUtils.countTodayByCreateTime(paymentShippingMapper, "ORD");
        paymentShipping.setOrderNo(ord);
        boolean save = paymentShippingService.save(paymentShipping);
        return save ? success() : error();
    }
    @PostMapping("/update")
    @ApiOperation("修改支付与发货信息")
    @Transactional(rollbackFor = Exception.class)
    public AjaxResult update(@RequestBody PaymentShipping paymentShipping) {
        boolean update = paymentShippingService.updateById(paymentShipping);
        return update ? success() : error();
    }
    @DeleteMapping("/delete")
    @ApiOperation("删除支付与发货信息")
    @Transactional(rollbackFor = Exception.class)
    public AjaxResult delete(@RequestBody List<Long> ids){
        if (CollectionUtils.isEmpty(ids)){
            return AjaxResult.error("请传入要删除的ID");
        }
        return AjaxResult.success(paymentShippingService.removeByIds(ids));
    }
}
src/main/java/com/ruoyi/sales/controller/ReceiptPaymentController.java
@@ -2,12 +2,19 @@
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.utils.bean.BeanUtils;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.controller.BaseController;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.framework.web.page.TableDataInfo;
import com.ruoyi.purchase.dto.InvoicePurchaseDto;
import com.ruoyi.sales.dto.ReceiptPaymentDto;
import com.ruoyi.sales.dto.ReceiptPaymentRecordDto;
import com.ruoyi.sales.dto.SalesLedgerDto;
import com.ruoyi.sales.pojo.ReceiptPayment;
import com.ruoyi.sales.pojo.SalesLedger;
import com.ruoyi.sales.service.ReceiptPaymentService;
import io.swagger.annotations.ApiModelProperty;
import org.springframework.beans.factory.annotation.Autowired;
@@ -154,6 +161,26 @@
    }
    /**
     * å¯¼å‡ºå›žæ¬¾æµæ°´åˆ—表
     */
    @Log(title = "导出回款流水列表", businessType = BusinessType.EXPORT)
    @PostMapping("/exportOne")
    public void exportOne(HttpServletResponse response, ReceiptPaymentDto salesLedgerDto) {
        Page page = new Page();
        page.setCurrent(-1);
        page.setSize(-1);
        IPage<ReceiptPaymentDto> salesLedgerIPage = receiptPaymentHistoryListPage(page, salesLedgerDto);
        ExcelUtil<ReceiptPaymentRecordDto> util = new ExcelUtil<ReceiptPaymentRecordDto>(ReceiptPaymentRecordDto.class);
        List<ReceiptPaymentRecordDto> receiptPaymentRecordDtos = new ArrayList<>();
        salesLedgerIPage.getRecords().forEach(receiptPaymentRecordDto -> {
            ReceiptPaymentRecordDto receiptPaymentRecordDto1 = new ReceiptPaymentRecordDto();
            BeanUtils.copyBeanProp(receiptPaymentRecordDto, receiptPaymentRecordDto1);
            receiptPaymentRecordDtos.add(receiptPaymentRecordDto1);
        });
        util.exportExcel(response, receiptPaymentRecordDtos, "导出开票登记列表");
    }
    /**
     * æŸ¥è¯¢å›žæ¬¾è®°å½•不分页
     */
    @GetMapping("/receiptPaymentHistoryListNoPage")
src/main/java/com/ruoyi/sales/controller/SalesLedgerController.java
@@ -1,5 +1,6 @@
package com.ruoyi.sales.controller;
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.extension.plugins.pagination.Page;
@@ -12,6 +13,11 @@
import com.ruoyi.sales.dto.InvoiceLedgerDto;
import com.ruoyi.sales.dto.SalesLedgerDto;
import com.ruoyi.sales.mapper.InvoiceLedgerMapper;
import com.ruoyi.sales.mapper.InvoiceRegistrationProductMapper;
import com.ruoyi.sales.mapper.ReceiptPaymentMapper;
import com.ruoyi.sales.pojo.InvoiceLedger;
import com.ruoyi.sales.pojo.InvoiceRegistrationProduct;
import com.ruoyi.sales.pojo.ReceiptPayment;
import com.ruoyi.sales.pojo.SalesLedger;
import com.ruoyi.sales.service.ICommonFileService;
import com.ruoyi.sales.service.ISalesLedgerService;
@@ -22,6 +28,8 @@
import javax.servlet.http.HttpServletResponse;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
@@ -44,6 +52,12 @@
    @Autowired
    private InvoiceLedgerMapper invoiceLedgerMapper;
    @Autowired
    private InvoiceRegistrationProductMapper invoiceRegistrationProductMapper;
    @Autowired
    private ReceiptPaymentMapper receiptPaymentMapper;
    /**
     * æŸ¥è¯¢é”€å”®å°è´¦åˆ—表
     */
@@ -65,10 +79,10 @@
                if (salesLedger.getId().intValue() == invoiceLedgerDto.getSalesLedgerId()) {
                    BigDecimal noInvoiceAmountTotal = salesLedger.getContractAmount().subtract(invoiceLedgerDto.getInvoiceTotal());
                    salesLedger.setNoInvoiceAmountTotal(noInvoiceAmountTotal);
                }
            }
        }
        return getDataTable(list);
    }
@@ -89,6 +103,20 @@
        List<SalesLedger> list = salesLedgerService.selectSalesLedgerList(salesLedgerDto);
        ExcelUtil<SalesLedger> util = new ExcelUtil<SalesLedger>(SalesLedger.class);
        util.exportExcel(response, list, "销售台账数据");
    }
    /**
     * å¯¼å‡ºå¼€ç¥¨ç™»è®°åˆ—表
     */
    @Log(title = "导出开票登记列表", businessType = BusinessType.EXPORT)
    @PostMapping("/exportOne")
    public void exportOne(HttpServletResponse response, SalesLedgerDto salesLedgerDto) {
        Page page = new Page();
        page.setCurrent(-1);
        page.setSize(-1);
        IPage<SalesLedger> salesLedgerIPage = listPage(page, salesLedgerDto);
        ExcelUtil<SalesLedger> util = new ExcelUtil<SalesLedger>(SalesLedger.class);
        util.exportExcel(response, salesLedgerIPage == null ? new ArrayList<>() : salesLedgerIPage.getRecords(), "导出开票登记列表");
    }
    /**
@@ -181,6 +209,17 @@
            iPage.setTotal(iPage.getRecords().size());
            return iPage;
        }
        // è®¡ç®—回款金额,待回款金额
        List<InvoiceRegistrationProduct> invoiceRegistrationProducts = invoiceRegistrationProductMapper.selectList(new LambdaQueryWrapper<InvoiceRegistrationProduct>()
                .in(InvoiceRegistrationProduct::getSalesLedgerId, salesLedgerIds));
        List<InvoiceLedger> invoiceLedgers = invoiceLedgerMapper.selectList(new LambdaQueryWrapper<InvoiceLedger>()
                .in(InvoiceLedger::getInvoiceRegistrationProductId, invoiceRegistrationProducts.stream().map(InvoiceRegistrationProduct::getId).collect(Collectors.toList())));
        List<ReceiptPayment> receiptPayments = new ArrayList<>();
        if(!CollectionUtils.isEmpty(invoiceLedgers)){
            receiptPayments = receiptPaymentMapper.selectList(new LambdaQueryWrapper<ReceiptPayment>()
                    .in(ReceiptPayment::getInvoiceLedgerId, invoiceLedgers.stream().map(InvoiceLedger::getId).collect(Collectors.toList())));
        }
        for (SalesLedger salesLedger : iPage.getRecords()) {
            boolean existFlag = false;
            BigDecimal noInvoiceAmountTotal = BigDecimal.ZERO;
@@ -190,6 +229,26 @@
                    noInvoiceAmountTotal = salesLedger.getContractAmount().subtract(invoiceLedgerDto.getInvoiceTotal());
                    invoiceTotal = invoiceLedgerDto.getInvoiceTotal();
                    existFlag = true;
                    if(!CollectionUtils.isEmpty(receiptPayments)){
                        List<InvoiceRegistrationProduct> collect = invoiceRegistrationProducts.stream()
                                .filter(item -> salesLedger.getId().equals(Long.parseLong(item.getSalesLedgerId().toString())))
                                .collect(Collectors.toList());
                        List<Integer> collect1 = collect.stream()
                                .map(InvoiceRegistrationProduct::getId).collect(Collectors.toList());
                        List<InvoiceLedger> collect2 = invoiceLedgers.stream()
                                .filter(item -> collect1.contains(item.getInvoiceRegistrationProductId()))
                                .collect(Collectors.toList());
                        // èŽ·å–å·²å›žæ¬¾é‡‘é¢
                        List<ReceiptPayment> collect3 = receiptPayments.stream()
                                .filter(item -> collect2.stream().anyMatch(item1 -> item1.getId().equals(item.getInvoiceLedgerId())))
                                .collect(Collectors.toList());
                        BigDecimal receiptPaymentAmountTotal = collect3.stream().map(ReceiptPayment::getReceiptPaymentAmount)
                                .filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
                        // èŽ·å–å¾…å›žæ¬¾é‡‘é¢
                        BigDecimal noReceiptPaymentAmountTotal = invoiceLedgerDto.getInvoiceTotal().subtract(receiptPaymentAmountTotal);
                        salesLedger.setReceiptPaymentAmountTotal(receiptPaymentAmountTotal);
                        salesLedger.setNoReceiptAmount(noReceiptPaymentAmountTotal);
                    }
                    break;
                }
            }
src/main/java/com/ruoyi/sales/controller/SalesQuotationController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,54 @@
package com.ruoyi.sales.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.ruoyi.aftersalesservice.dto.AfterSalesServiceDto;
import com.ruoyi.aftersalesservice.pojo.AfterSalesService;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.sales.dto.SalesQuotationDto;
import com.ruoyi.sales.service.SalesQuotationService;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.List;
@RestController
@RequestMapping("/sales/quotation")
public class SalesQuotationController {
    @Autowired
    private SalesQuotationService salesQuotationService;
    @GetMapping("/list")
    public AjaxResult getList(Page page, SalesQuotationDto salesQuotationDto) {
        return AjaxResult.success(salesQuotationService.listPage(page, salesQuotationDto));
    }
    @PostMapping("/export")
    public void export(HttpServletResponse response) {
        Page page = new Page(-1,-1);
        SalesQuotationDto afterSalesService = new SalesQuotationDto();
        IPage<SalesQuotationDto> listPage = salesQuotationService.listPage(page, afterSalesService);
        ExcelUtil<SalesQuotationDto> util = new ExcelUtil<SalesQuotationDto>(SalesQuotationDto.class);
        util.exportExcel(response, listPage.getRecords() , "反馈登记");
    }
    @PostMapping("/add")
    public AjaxResult add(@RequestBody SalesQuotationDto salesQuotationDto) {
        return AjaxResult.success(salesQuotationService.add(salesQuotationDto));
    }
    @PostMapping("/update")
    public AjaxResult update(@RequestBody SalesQuotationDto salesQuotationDto) {
        return AjaxResult.success(salesQuotationService.edit(salesQuotationDto));
    }
    @DeleteMapping("/delete")
    public AjaxResult delete(@RequestBody Long id) {
        return AjaxResult.success(salesQuotationService.delete(id));
    }
}
src/main/java/com/ruoyi/sales/controller/SalespersonManagementController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,65 @@
package com.ruoyi.sales.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.framework.web.controller.BaseController;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.sales.dto.InvoiceLedgerDto;
import com.ruoyi.sales.pojo.SalespersonManagement;
import com.ruoyi.sales.service.SalespersonManagementService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
 * @author :yys
 * @date : 2025/9/15 10:04
 */
@RestController
@RequestMapping("/salespersonManagement")
@Api(tags = "业务员管理")
public class SalespersonManagementController extends BaseController {
    @Autowired
    private SalespersonManagementService salespersonManagementService;
    @GetMapping("/listPage")
    @ApiOperation("分页查询业务员信息")
    public AjaxResult listPage(Page page, SalespersonManagement salespersonManagement) {
        IPage<SalespersonManagement> listPage = salespersonManagementService.listPage(page, salespersonManagement);
        return AjaxResult.success(listPage);
    }
    @PostMapping("/add")
    @ApiOperation("添加业务员信息")
    @Transactional(rollbackFor = Exception.class)
    public AjaxResult add(@RequestBody SalespersonManagement salespersonManagement) {
        boolean save = salespersonManagementService.save(salespersonManagement);
        return save ? AjaxResult.success() : AjaxResult.error();
    }
    @PostMapping("/update")
    @ApiOperation("修改业务员信息")
    @Transactional(rollbackFor = Exception.class)
    public AjaxResult update(@RequestBody SalespersonManagement salespersonManagement) {
        boolean update = salespersonManagementService.updateById(salespersonManagement);
        return update ? AjaxResult.success() : AjaxResult.error();
    }
    @DeleteMapping("/delete")
    @ApiOperation("删除业务员信息")
    @Transactional(rollbackFor = Exception.class)
    public AjaxResult delete(@RequestBody List<Long> ids) {
        if (ids == null || ids.isEmpty()) {
            return AjaxResult.error("请传入要删除的ID");
        }
        boolean delete = salespersonManagementService.removeByIds(ids);
        return delete ? AjaxResult.success() : AjaxResult.error();
    }
}
src/main/java/com/ruoyi/sales/controller/ShippingInfoController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,95 @@
package com.ruoyi.sales.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.controller.BaseController;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.sales.mapper.ShippingInfoMapper;
import com.ruoyi.sales.pojo.SalesLedger;
import com.ruoyi.sales.pojo.ShippingInfo;
import com.ruoyi.sales.service.ShippingInfoService;
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.util.List;
/**
 * @author :yys
 * @date : 2025/10/22 9:34
 */
@RestController
@RequestMapping("/shippingInfo")
@Api(tags = "发货信息管理")
public class ShippingInfoController extends BaseController {
    @Autowired
    private ShippingInfoService shippingInfoService;
    @GetMapping("/listPage")
    @ApiOperation("发货信息列表")
    public AjaxResult listPage(Page page, ShippingInfo req) {
        IPage<ShippingInfo> listPage = shippingInfoService.listPage(page,req);
        return AjaxResult.success(listPage);
    }
    @PostMapping("/add")
    @ApiOperation("添加发货信息")
    public AjaxResult add(@RequestBody ShippingInfo req) {
        boolean save = shippingInfoService.save(req);
        return save ? AjaxResult.success() : AjaxResult.error();
    }
    @PostMapping("/update")
    @ApiOperation("修改发货信息")
    public AjaxResult update(@RequestBody ShippingInfo req) {
        ShippingInfo byId = shippingInfoService.getById(req.getId());
        if (byId == null) {
            return AjaxResult.error("发货信息不存在");
        }
        Long userId = getLoginUser().getUserId();
        if(!userId.equals(Long.parseLong(byId.getCreateUser().toString()))){
            return AjaxResult.error("您没有权限修改此发货信息");
        }
        boolean update = shippingInfoService.updateById(req);
        return update ? AjaxResult.success() : AjaxResult.error();
    }
    @DeleteMapping("/delete")
    @ApiOperation("删除发货信息")
    public AjaxResult delete(@RequestBody List<Long> ids) {
        Long userId = getLoginUser().getUserId();
        ids.forEach(id -> {
            ShippingInfo byId = shippingInfoService.getById(id);
            if (byId == null) {
                throw new RuntimeException("发货信息不存在");
            }
            if(!userId.equals(Long.parseLong(byId.getCreateUser().toString()))){
                throw new RuntimeException("您没有权限删除此发货信息");
            }
        });
        boolean delete = shippingInfoService.removeBatchByIds(ids);
        return delete ? AjaxResult.success("删除成功") : AjaxResult.error("删除失败");
    }
    @Autowired
    private ShippingInfoMapper shippingInfoMapper;
    /**
     * å¯¼å‡ºå‘货信息管理
     */
    @PostMapping("/export")
    @ApiOperation("导出发货信息")
    public void export(HttpServletResponse response) {
        List<ShippingInfo> list = shippingInfoMapper.listAll();
        ExcelUtil<ShippingInfo> util = new ExcelUtil<ShippingInfo>(ShippingInfo.class);
        util.exportExcel(response, list, "发货信息");
    }
}
src/main/java/com/ruoyi/sales/dto/ReceiptPaymentDto.java
@@ -1,13 +1,16 @@
package com.ruoyi.sales.dto;
import com.baomidou.mybatisplus.annotation.TableField;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
import com.ruoyi.sales.pojo.ReceiptPayment;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.Date;
@Data
public class ReceiptPaymentDto extends ReceiptPayment {
@@ -16,10 +19,26 @@
    @Excel(name = "客户合同号")
    private String customerContractNo;
    @ApiModelProperty(value = "状态")
    @Excel(name = "状态")
    private String statusName;
    @ApiModelProperty(value = "客户名称")
    @Excel(name = "客户名称")
    private String customerName;
    @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @Excel(name = "开票日期",width = 30,dateFormat = "yyyy-MM-dd")
    @ApiModelProperty(value = "开票日期")
    private Date invoiceDate;
    @TableField(exist = false)
    private String invoiceDateStart;
    @TableField(exist = false)
    private String invoiceDateEnd;
    @ApiModelProperty(value = "查询文本")
    private String searchText;
src/main/java/com/ruoyi/sales/dto/ReceiptPaymentRecordDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,61 @@
package com.ruoyi.sales.dto;
import com.baomidou.mybatisplus.annotation.TableField;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.Date;
/**
 * @author :yys
 * @date : 2025/10/31 10:17
 */
@Data
public class ReceiptPaymentRecordDto {
    @ApiModelProperty(value = "客户合同号")
    @Excel(name = "客户合同号")
    private String customerContractNo;
    @ApiModelProperty(value = "客户名称")
    @Excel(name = "客户名称")
    private String customerName;
    @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @Excel(name = "登记日期",width = 30,dateFormat = "yyyy-MM-dd")
    @ApiModelProperty(value = "登记日期")
    private Date invoiceDate;
    @ApiModelProperty(value = "销售合同号")
    @Excel(name = "销售合同号")
    private String salesContractNo;
    @ApiModelProperty(value = "回款金额")
    @Excel(name = "回款金额")
    private BigDecimal receiptPaymentAmountTotal;
    @ApiModelProperty(value = "项目名称")
    @Excel(name = "项目名称")
    private String projectName;
    @ApiModelProperty(value = "回款形式 0电汇1承兑")
    @Excel(name = "回款形式",readConverterExp = "0=电汇,1=承兑")
    private String receiptPaymentType;
    @ApiModelProperty(value = "登记人")
    @Excel(name = "登记人")
    private String registrant;
    @ApiModelProperty(value = "来款日期")
    @JsonFormat(pattern = "yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @Excel(name = "来款日期",width = 30,dateFormat = "yyyy-MM-dd")
    private LocalDate receiptPaymentDate;
}
src/main/java/com/ruoyi/sales/dto/SalesQuotationDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,14 @@
package com.ruoyi.sales.dto;
import com.ruoyi.sales.pojo.SalesQuotation;
import com.ruoyi.sales.pojo.SalesQuotationProduct;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
@Data
public class SalesQuotationDto extends SalesQuotation {
    @ApiModelProperty(value = "报价商品")
    private List<SalesQuotationProduct> products;
}
src/main/java/com/ruoyi/sales/mapper/PaymentShippingMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
package com.ruoyi.sales.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.sales.pojo.PaymentShipping;
import org.apache.ibatis.annotations.Param;
/**
 * @author :yys
 * @date : 2025/9/15 14:00
 */
public interface PaymentShippingMapper extends BaseMapper<PaymentShipping> {
    /**
     * åˆ†é¡µæŸ¥è¯¢
     *
     * @param page
     * @param paymentShipping
     * @return
     */
    IPage<PaymentShipping> listPage(Page page,@Param("req") PaymentShipping paymentShipping);
}
src/main/java/com/ruoyi/sales/mapper/ReceiptPaymentMapper.java
@@ -26,7 +26,7 @@
     * @param receiptPaymentDto
     * @return
     */
    IPage<ReceiptPaymentDto> bindInvoiceNoRegPage(Page page, @Param("c") ReceiptPaymentDto receiptPaymentDto);
    IPage<ReceiptPaymentDto> bindInvoiceNoRegPage(Page page, @Param("req") ReceiptPaymentDto receiptPaymentDto);
    /**
     * å¼€ç¥¨å°è´¦è¯¦æƒ…
src/main/java/com/ruoyi/sales/mapper/SalesQuotationMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,14 @@
package com.ruoyi.sales.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.ruoyi.sales.dto.SalesQuotationDto;
import com.ruoyi.sales.pojo.SalesQuotation;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.data.repository.query.Param;
@Mapper
public interface SalesQuotationMapper extends BaseMapper<SalesQuotation> {
    IPage<SalesQuotationDto> listPage(Page page,@Param("salesQuotationDto") SalesQuotationDto salesQuotationDto);
}
src/main/java/com/ruoyi/sales/mapper/SalesQuotationProductMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,16 @@
package com.ruoyi.sales.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.sales.pojo.SalesQuotationProduct;
import io.lettuce.core.dynamic.annotation.Param;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
@Mapper
public interface SalesQuotationProductMapper extends BaseMapper<SalesQuotationProduct> {
//    List<SalesQuotationProduct> selectBySalesQuotationIds(List<Long> salesQuotationIds);
    List<SalesQuotationProduct> selectBySalesQuotationId(@Param("id") Long id);
}
src/main/java/com/ruoyi/sales/mapper/SalespersonManagementMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,17 @@
package com.ruoyi.sales.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.sales.pojo.SalespersonManagement;
import org.apache.ibatis.annotations.Param;
/**
 * @author :yys
 * @date : 2025/9/15 10:12
 */
public interface SalespersonManagementMapper extends BaseMapper<SalespersonManagement> {
    IPage<SalespersonManagement> listPage(Page page,@Param("req") SalespersonManagement salespersonManagement);
}
src/main/java/com/ruoyi/sales/mapper/ShippingInfoMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,19 @@
package com.ruoyi.sales.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.sales.pojo.ShippingInfo;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
 * @author :yys
 * @date : 2025/10/22 9:32
 */
public interface ShippingInfoMapper extends BaseMapper<ShippingInfo> {
    IPage<ShippingInfo> listPage(Page page,@Param("req") ShippingInfo req);
    List<ShippingInfo> listAll();
}
src/main/java/com/ruoyi/sales/pojo/PaymentShipping.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,83 @@
package com.ruoyi.sales.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 org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.List;
/**
 * @author :yys
 * @date : 2025/9/15 13:56
 */
@TableName(value = "payment_shipping")
@Data
@ApiModel
public class PaymentShipping {
    private static final long serialVersionUID = 1L;
    /**
     * åºå·
     */
    @TableId(type = IdType.AUTO)
    private Long id;
    @ApiModelProperty(value = "订单号")
    private String orderNo;
    @ApiModelProperty(value = "客户名称")
    private String customer;
    @ApiModelProperty(value = "订单金额")
    private String orderAmount;
    @ApiModelProperty(value = "已付款金额")
    private String paidAmount;
    @ApiModelProperty(value = "付款方式")
    private String paymentMethod;
    @ApiModelProperty(value = "付款状态")
    private String paymentStatus;
    @ApiModelProperty(value = "发货状态")
    private String shippingStatus;
    @ApiModelProperty(value = "发货日期")
    @JsonFormat(pattern = "yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private Date shippingDate;
    @ApiModelProperty(value = "物流单号")
    private String trackingNo;
    @ApiModelProperty(value = "备注")
    private String remark;
    @ApiModelProperty(value = "创建时间")
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    @ApiModelProperty(value = "创建用户")
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    @ApiModelProperty(value = "修改时间")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
    @ApiModelProperty(value = "修改用户")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    @ApiModelProperty(value = "租户ID")
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
}
src/main/java/com/ruoyi/sales/pojo/SalesLedger.java
@@ -104,14 +104,24 @@
    @TableField(exist = false)
    @ApiModelProperty(value = "未开票金额(元)")
    private BigDecimal noInvoiceAmountTotal;
    @Excel(name = "未开票金额")
    private BigDecimal noInvoiceAmountTotal = BigDecimal.ZERO;
    @ApiModelProperty(value = "签订日期")
    private LocalDate executionDate;
    @TableField(exist = false)
    @ApiModelProperty(value = "已开票金额(元)")
    private BigDecimal invoiceTotal;
    @Excel(name = "已开票金额")
    private BigDecimal invoiceTotal = BigDecimal.ZERO;
    @TableField(exist = false)
    @ApiModelProperty(value = "回款金额")
    private BigDecimal receiptPaymentAmountTotal = BigDecimal.ZERO;
    @TableField(exist = false)
    @ApiModelProperty(value = "待回款金额")
    private BigDecimal noReceiptAmount = BigDecimal.ZERO;
    @ApiModelProperty(value = "付款方式")
    private String paymentMethod;
src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java
@@ -36,6 +36,11 @@
    private Long salesLedgerId;
    /**
     * é¢„警数量
     */
    private BigDecimal warnNum;
    /**
     * äº§å“å¤§ç±»
     */
    @Excel(name = "产品大类")
@@ -58,7 +63,8 @@
     */
    @Excel(name = "数量")
    private BigDecimal quantity;
    @Excel(name = "最低库存数量")
    private BigDecimal minStock;
    /**
     * ç¨Žçއ
     */
src/main/java/com/ruoyi/sales/pojo/SalesQuotation.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,69 @@
package com.ruoyi.sales.pojo;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
@Data
@TableName("sales_quotation")
public class SalesQuotation {
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    @ApiModelProperty(value = "报价单编号")
    @Excel(name = "报价单编号")
    private String quotationNo;
    @ApiModelProperty(value = "客户名称")
    @Excel(name = "客户名称")
    private String customer;
    @ApiModelProperty(value = "业务员")
    @Excel(name = "业务员")
    private String salesperson;
    @ApiModelProperty(value = "报价日期")
    @JsonFormat(pattern = "yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @Excel(name = "报价日期", width = 30, dateFormat = "yyyy-MM-dd")
    private LocalDate quotationDate;
    @ApiModelProperty(value = "有效期至")
    @JsonFormat(pattern = "yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @Excel(name = "有效期至", width = 30, dateFormat = "yyyy-MM-dd")
    private LocalDate validDate;
    @ApiModelProperty(value = "付款方式")
    private String paymentMethod;
    @ApiModelProperty(value = "交货周期天数")
    private String deliveryPeriod;
    @ApiModelProperty(value = "状态")
    private String status;
    @ApiModelProperty(value = "报价总金额")
    @Excel(name = "报价金额")
    private Double totalAmount;
    @ApiModelProperty(value = "备注")
    private String remark;
    @ApiModelProperty(value = "创建时间")
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    @ApiModelProperty(value = "修改时间")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
    @ApiModelProperty(value = "创建用户")
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    @ApiModelProperty(value = "修改用户")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    @ApiModelProperty(value = "租户ID")
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
}
src/main/java/com/ruoyi/sales/pojo/SalesQuotationProduct.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,49 @@
package com.ruoyi.sales.pojo;
import com.baomidou.mybatisplus.annotation.*;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.time.LocalDateTime;
@Data
@TableName("sales_quotation_product")
public class SalesQuotationProduct {
    @ApiModelProperty(value = "报价商品ID")
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    @ApiModelProperty(value = "销售报价单id")
    private Long salesQuotationId;
    @ApiModelProperty(value = "商品名称")
    private String product;
    @ApiModelProperty(value = "商品规格")
    private String specification;
    @ApiModelProperty(value = "单位")
    private String unit;
    @ApiModelProperty(value = "单价")
    private Double unitPrice;
    @ApiModelProperty(value = "数量")
    private Integer quantity;
    @ApiModelProperty(value = "金额")
    private Double amount;
    @ApiModelProperty(value = "创建时间")
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    @ApiModelProperty(value = "修改时间")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
    @ApiModelProperty(value = "创建用户")
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    @ApiModelProperty(value = "修改用户")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    @ApiModelProperty(value = "租户ID")
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
}
src/main/java/com/ruoyi/sales/pojo/SalespersonManagement.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,79 @@
package com.ruoyi.sales.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 org.springframework.format.annotation.DateTimeFormat;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.List;
/**
 * @author :yys
 * @date : 2025/9/15 10:06
 */
@TableName(value = "salesperson_management")
@Data
@ApiModel
public class SalespersonManagement {
    private static final long serialVersionUID = 1L;
    /**
     * åºå·
     */
    @TableId(type = IdType.AUTO)
    private Long id;
    @ApiModelProperty(value = "姓名")
    private String name;
    @ApiModelProperty(value = "联系电话")
    private String phone;
    @ApiModelProperty(value = "邮箱")
    private String email;
    @ApiModelProperty(value = "部门")
    private String department;
    @ApiModelProperty(value = "职位")
    private String position;
    @ApiModelProperty(value = "入职日期")
    @JsonFormat(pattern = "yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private Date hireDate;
    @ApiModelProperty(value = "权限")
    private String permissions;
    @ApiModelProperty(value = "权限List")
    @TableField(exist = false)
    private List<String> permissionsList;
    @ApiModelProperty(value = "状态")
    private String status;
    @ApiModelProperty(value = "创建用户")
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    @ApiModelProperty(value = "修改时间")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
    @ApiModelProperty(value = "修改用户")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    @ApiModelProperty(value = "租户ID")
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
}
src/main/java/com/ruoyi/sales/pojo/ShippingInfo.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,68 @@
package com.ruoyi.sales.pojo;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import java.util.Date;
/**
 * @author :yys
 * @date : 2025/10/22 9:29
 */
@Data
@TableName("shipping_info")
public class ShippingInfo {
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    @ApiModelProperty(value = "销售台账id")
    private Long salesLedgerId;
    @TableField(exist = false)
    @ApiModelProperty(value = "销售合同号")
    @Excel(name = "销售合同号")
    private String salesContractNo;
    @TableField(exist = false)
    @ApiModelProperty(value = "客户名称")
    @Excel(name = "客户名称")
    private String customerName;
    @ApiModelProperty(value = "发货日期")
    @JsonFormat(pattern = "yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @Excel(name = "发货日期", width = 30, dateFormat = "yyyy-MM-dd")
    private Date shippingDate;
    @ApiModelProperty(value = "发货车牌号")
    @Excel(name = "发货车牌号")
    private String shippingCarNumber;
    @ApiModelProperty(value = "创建时间")
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    @ApiModelProperty(value = "修改时间")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
    @ApiModelProperty(value = "创建用户")
    @TableField(fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Integer createUser;
    @ApiModelProperty(value = "修改用户")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    @ApiModelProperty(value = "租户ID")
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
}
src/main/java/com/ruoyi/sales/service/PaymentShippingService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,22 @@
package com.ruoyi.sales.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.sales.pojo.PaymentShipping;
/**
 * @author :yys
 * @date : 2025/9/15 14:01
 */
public interface PaymentShippingService extends IService<PaymentShipping> {
    /**
     * åˆ†é¡µæŸ¥è¯¢
     *
     * @param page
     * @param paymentShipping
     * @return
     */
    IPage<PaymentShipping> listPage(Page page, PaymentShipping paymentShipping);
}
src/main/java/com/ruoyi/sales/service/SalesQuotationProductService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,8 @@
package com.ruoyi.sales.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.sales.pojo.SalesQuotationProduct;
public interface SalesQuotationProductService extends IService<SalesQuotationProduct> {
}
src/main/java/com/ruoyi/sales/service/SalesQuotationService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,17 @@
package com.ruoyi.sales.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.sales.dto.SalesQuotationDto;
import com.ruoyi.sales.pojo.SalesQuotation;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
public interface SalesQuotationService extends IService<SalesQuotation> {
    IPage listPage(Page page, SalesQuotationDto salesQuotationDto);
    boolean add(SalesQuotationDto salesQuotationDto);
    boolean delete(Long id);
    boolean edit(SalesQuotationDto salesQuotationDto);
}
src/main/java/com/ruoyi/sales/service/SalespersonManagementService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,22 @@
package com.ruoyi.sales.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.sales.pojo.SalespersonManagement;
/**
 * @author :yys
 * @date : 2025/9/15 10:14
 */
public interface SalespersonManagementService extends IService<SalespersonManagement> {
    /**
     * åˆ—表分页
     *
     * @param page
     * @param salespersonManagement
     * @return
     */
    IPage<SalespersonManagement> listPage(Page page, SalespersonManagement salespersonManagement);
}
src/main/java/com/ruoyi/sales/service/ShippingInfoService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,14 @@
package com.ruoyi.sales.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.sales.pojo.ShippingInfo;
/**
 * @author :yys
 * @date : 2025/10/22 9:33
 */
public interface ShippingInfoService extends IService<ShippingInfo>{
    IPage<ShippingInfo> listPage(Page page, ShippingInfo req);
}
src/main/java/com/ruoyi/sales/service/impl/CommonFileServiceImpl.java
@@ -123,12 +123,15 @@
            try {
                // æ‰§è¡Œæ–‡ä»¶è¿ç§»ï¼ˆä½¿ç”¨åŽŸå­æ“ä½œç¡®ä¿å®‰å…¨æ€§ï¼‰
                Files.move(
                        Paths.get(tempFile.getTempPath()),
                        formalFilePath,
                        StandardCopyOption.REPLACE_EXISTING,
                        StandardCopyOption.ATOMIC_MOVE
                );
//                Files.move(
//                        Paths.get(tempFile.getTempPath()),
//                        formalFilePath,
//                        StandardCopyOption.REPLACE_EXISTING,
//                        StandardCopyOption.ATOMIC_MOVE
//                );
                // åŽŸå­ç§»åŠ¨å¤±è´¥ï¼Œä½¿ç”¨å¤åˆ¶+删除
                Files.copy(Paths.get(tempFile.getTempPath()), formalFilePath, StandardCopyOption.REPLACE_EXISTING);
                Files.deleteIfExists(Paths.get(tempFile.getTempPath()));
                log.info("文件迁移成功: {} -> {}", tempFile.getTempPath(), formalFilePath);
                // æ›´æ–°æ–‡ä»¶è®°å½•(关联到业务ID)
src/main/java/com/ruoyi/sales/service/impl/PaymentShippingServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,29 @@
package com.ruoyi.sales.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.sales.mapper.PaymentShippingMapper;
import com.ruoyi.sales.pojo.PaymentShipping;
import com.ruoyi.sales.service.PaymentShippingService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
 * @author :yys
 * @date : 2025/9/15 14:01
 */
@Service
@Slf4j
public class PaymentShippingServiceImpl extends ServiceImpl<PaymentShippingMapper, PaymentShipping> implements PaymentShippingService {
    @Autowired
    private PaymentShippingMapper paymentShippingMapper;
    @Override
    public IPage<PaymentShipping> listPage(Page page, PaymentShipping paymentShipping) {
        IPage<PaymentShipping> listPage = paymentShippingMapper.listPage(page, paymentShipping);
        return listPage;
    }
}
src/main/java/com/ruoyi/sales/service/impl/ReceiptPaymentServiceImpl.java
@@ -164,6 +164,15 @@
        if (receiptPaymentDto.getStatus()) {
            receiptPaymentDtoIPage.getRecords().removeIf(receiptPaymentDto1 -> new BigDecimal("0.00").equals(receiptPaymentDto1.getNoReceiptAmount()));
        }
        receiptPaymentDtoIPage.getRecords().forEach(item -> {
            // æ¯”较回款金额 == å¾…回款金额
            if (item.getInvoiceTotal().compareTo(item.getReceiptPaymentAmountTotal()) == 0) {
                item.setStatusName("已完成回款");
            }else{
                item.setStatusName("未完成回款");
            }
        });
        return receiptPaymentDtoIPage;
    }
src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
@@ -8,6 +8,9 @@
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.account.pojo.AccountExpense;
import com.ruoyi.account.pojo.AccountIncome;
import com.ruoyi.account.service.AccountIncomeService;
import com.ruoyi.basic.mapper.CustomerMapper;
import com.ruoyi.basic.pojo.Customer;
import com.ruoyi.common.enums.FileNameType;
@@ -62,6 +65,7 @@
@RequiredArgsConstructor
@Slf4j
public class SalesLedgerServiceImpl extends ServiceImpl<SalesLedgerMapper, SalesLedger> implements ISalesLedgerService {
    private final AccountIncomeService accountIncomeService;
    private final SalesLedgerMapper salesLedgerMapper;
@@ -376,13 +380,38 @@
            salesLedger.setCustomerName(customer.getCustomerName());
            salesLedger.setTenantId(customer.getTenantId());
            AccountIncome accountIncome = new AccountIncome();
            accountIncome.setIncomeDate(salesLedger.getEntryDate());
            accountIncome.setIncomeType("0");
            accountIncome.setCustomerName(customer.getCustomerName());
            accountIncome.setIncomeMoney(salesLedger.getContractAmount());
            accountIncome.setIncomeMethod("0");
            accountIncome.setInputTime(new Date());
            accountIncome.setInputUser(salesLedger.getEntryPerson());
            // 3. æ–°å¢žæˆ–更新主表
            if (salesLedger.getId() == null) {
                String contractNo = generateSalesContractNo();
                salesLedger.setSalesContractNo(contractNo);
                salesLedgerMapper.insert(salesLedger);
                accountIncome.setIncomeDescribed("销售合同:" + salesLedger.getSalesContractNo());
                accountIncome.setInvoiceNumber(salesLedger.getSalesContractNo());
                accountIncomeService.save(accountIncome);
            } else {
                salesLedgerMapper.updateById(salesLedger);
                SalesLedger salesLedgerDB = salesLedgerMapper.selectById(salesLedger.getId());
                List<AccountIncome> accountIncomeDBs = accountIncomeService.getByInvoiceNumberList(salesLedger.getSalesContractNo());
                if (!CollectionUtils.isEmpty(accountIncomeDBs)) {
                    accountIncomeDBs.forEach(accountIncomeDB ->{
                        accountIncomeDB.setCustomerName(salesLedgerDB.getCustomerName());
                        accountIncomeDB.setIncomeMoney(salesLedgerDB.getContractAmount());
                        accountIncomeDB.setIncomeDescribed("销售合同:" + salesLedgerDB.getSalesContractNo());
                        accountIncomeDB.setInvoiceNumber(salesLedgerDB.getSalesContractNo());
                        accountIncomeDB.setInputTime(new Date());
                        accountIncomeDB.setInputUser(salesLedgerDB.getEntryPerson());
                        accountIncomeService.updateById(accountIncomeDB);
                    });
                }
            }
            // 4. å¤„理子表数据
@@ -452,12 +481,15 @@
            try {
                // æ‰§è¡Œæ–‡ä»¶è¿ç§»ï¼ˆä½¿ç”¨åŽŸå­æ“ä½œç¡®ä¿å®‰å…¨æ€§ï¼‰
                Files.move(
                        Paths.get(tempFile.getTempPath()),
                        formalFilePath,
                        StandardCopyOption.REPLACE_EXISTING,
                        StandardCopyOption.ATOMIC_MOVE
                );
//                Files.move(
//                        Paths.get(tempFile.getTempPath()),
//                        formalFilePath,
//                        StandardCopyOption.REPLACE_EXISTING,
//                        StandardCopyOption.ATOMIC_MOVE
//                );
                // åŽŸå­ç§»åŠ¨å¤±è´¥ï¼Œä½¿ç”¨å¤åˆ¶+删除
                Files.copy(Paths.get(tempFile.getTempPath()), formalFilePath, StandardCopyOption.REPLACE_EXISTING);
                Files.deleteIfExists(Paths.get(tempFile.getTempPath()));
                log.info("文件迁移成功: {} -> {}", tempFile.getTempPath(), formalFilePath);
                // æ›´æ–°æ–‡ä»¶è®°å½•(关联到业务ID)
src/main/java/com/ruoyi/sales/service/impl/SalesQuotationProductServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,11 @@
package com.ruoyi.sales.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.sales.mapper.SalesQuotationProductMapper;
import com.ruoyi.sales.pojo.SalesQuotationProduct;
import com.ruoyi.sales.service.SalesQuotationProductService;
import org.springframework.stereotype.Service;
@Service
public class SalesQuotationProductServiceImpl extends ServiceImpl<SalesQuotationProductMapper, SalesQuotationProduct> implements SalesQuotationProductService {
}
src/main/java/com/ruoyi/sales/service/impl/SalesQuotationServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,96 @@
package com.ruoyi.sales.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.utils.bean.BeanUtils;
import com.ruoyi.sales.dto.SalesQuotationDto;
import com.ruoyi.sales.mapper.SalesQuotationMapper;
import com.ruoyi.sales.mapper.SalesQuotationProductMapper;
import com.ruoyi.sales.pojo.SalesQuotation;
import com.ruoyi.sales.pojo.SalesQuotationProduct;
import com.ruoyi.sales.service.SalesQuotationProductService;
import com.ruoyi.sales.service.SalesQuotationService;
import org.springframework.beans.factory.annotation.Autowired;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.stream.Collectors;
@Service
@Transactional(rollbackFor = Exception.class)
public class SalesQuotationServiceImpl extends ServiceImpl<SalesQuotationMapper, SalesQuotation> implements SalesQuotationService {
    @Autowired
    private SalesQuotationMapper salesQuotationMapper;
    @Autowired
    private SalesQuotationProductMapper salesQuotationProductMapper;
    @Autowired
    private SalesQuotationProductService salesQuotationProductService;
    @Override
    public IPage<SalesQuotationDto> listPage(Page page, SalesQuotationDto salesQuotationDto) {
        IPage<SalesQuotationDto> salesQuotationDtoIPage = salesQuotationMapper.listPage(page, salesQuotationDto);
        if(CollectionUtils.isEmpty(salesQuotationDtoIPage.getRecords())){
            return salesQuotationDtoIPage;
        }
        salesQuotationDtoIPage.getRecords().forEach(record -> {
            List<SalesQuotationProduct> products = salesQuotationProductMapper.selectBySalesQuotationId(record.getId());
            record.setProducts(products);
        });
        return salesQuotationDtoIPage;
    }
    @Override
    public boolean add(SalesQuotationDto salesQuotationDto) {
        SalesQuotation salesQuotation = new SalesQuotation();
        BeanUtils.copyProperties(salesQuotationDto, salesQuotation);
        String quotationNo = salesQuotation.getQuotationNo();
        salesQuotationMapper.insert(salesQuotation);
//        if(salesQuotationMapper.insert(salesQuotation)!=1){
//            return false;
//        }
        if(CollectionUtils.isEmpty(salesQuotationDto.getProducts())){
            return true;
        }
        List<SalesQuotationProduct> products = salesQuotationDto.getProducts().stream().map(product -> {
            SalesQuotationProduct salesQuotationProduct = new SalesQuotationProduct();
            BeanUtils.copyProperties(product, salesQuotationProduct);
            salesQuotationProduct.setSalesQuotationId(salesQuotationMapper.selectOne(new LambdaQueryWrapper<SalesQuotation>().eq(SalesQuotation::getQuotationNo, quotationNo)).getId());
            return salesQuotationProduct;
        }).collect(Collectors.toList());
        salesQuotationProductService.saveBatch(products);
        return true;
    }
    @Override
    public boolean edit(SalesQuotationDto salesQuotationDto) {
        SalesQuotation salesQuotation = new SalesQuotation();
        BeanUtils.copyProperties(salesQuotationDto, salesQuotation);
        if(salesQuotationMapper.updateById(salesQuotation)!=1){
            return false;
        }
        salesQuotationProductMapper.delete(new LambdaQueryWrapper<SalesQuotationProduct>().eq(SalesQuotationProduct::getSalesQuotationId, salesQuotationDto.getId()));
        if(CollectionUtils.isEmpty(salesQuotationDto.getProducts())){
            return true;
        }
        List<SalesQuotationProduct> products = salesQuotationDto.getProducts().stream().map(product -> {
            SalesQuotationProduct salesQuotationProduct = new SalesQuotationProduct();
            BeanUtils.copyProperties(product, salesQuotationProduct);
            salesQuotationProduct.setSalesQuotationId(salesQuotation.getId());
            return salesQuotationProduct;
        }).collect(Collectors.toList());
        salesQuotationProductService.saveBatch(products);
        return true;
    }
    @Override
    public boolean delete(Long id) {
        salesQuotationMapper.deleteById(id);
        salesQuotationProductMapper.delete(new LambdaQueryWrapper<SalesQuotationProduct>().eq(SalesQuotationProduct::getSalesQuotationId, id));
        return true;
    }
}
src/main/java/com/ruoyi/sales/service/impl/SalespersonManagementServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,37 @@
package com.ruoyi.sales.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.common.utils.StringUtils;
import com.ruoyi.sales.mapper.SalespersonManagementMapper;
import com.ruoyi.sales.pojo.SalespersonManagement;
import com.ruoyi.sales.service.SalespersonManagementService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Arrays;
/**
 * @author :yys
 * @date : 2025/9/15 10:15
 */
@Service
@Slf4j
public class SalespersonManagementServiceImpl extends ServiceImpl<SalespersonManagementMapper, SalespersonManagement> implements SalespersonManagementService {
    @Autowired
    private SalespersonManagementMapper salespersonManagementMapper;
    @Override
    public IPage<SalespersonManagement> listPage(Page page, SalespersonManagement salespersonManagement) {
        IPage<SalespersonManagement> salespersonManagementIPage = salespersonManagementMapper.listPage(page, salespersonManagement);
        salespersonManagementIPage.getRecords().forEach(item -> {
            if(!StringUtils.isEmpty(item.getPermissions())){
                item.setPermissionsList(Arrays.asList(item.getPermissions().split(",")));
            }
        });
        return salespersonManagementIPage;
    }
}
src/main/java/com/ruoyi/sales/service/impl/ShippingInfoServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,30 @@
package com.ruoyi.sales.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.sales.mapper.ShippingInfoMapper;
import com.ruoyi.sales.pojo.ShippingInfo;
import com.ruoyi.sales.service.ShippingInfoService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
 * @author :yys
 * @date : 2025/10/22 9:33
 */
@Service
@Slf4j
public class ShippingInfoServiceImpl extends ServiceImpl<ShippingInfoMapper, ShippingInfo> implements ShippingInfoService {
    @Autowired
    private ShippingInfoMapper shippingInfoMapper;
    @Override
    public IPage<ShippingInfo> listPage(Page page, ShippingInfo req) {
        IPage<ShippingInfo> listPage = shippingInfoMapper.listPage(page, req);
        return listPage;
    }
}
src/main/java/com/ruoyi/staff/controller/HolidayApplicationController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,44 @@
package com.ruoyi.staff.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.staff.pojo.HolidayApplication;
import com.ruoyi.staff.pojo.PersonalAttendanceRecords;
import com.ruoyi.staff.service.HolidayApplicationService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/staff/holidayApplication")
public class HolidayApplicationController {
    @Autowired
    private HolidayApplicationService holidayApplicationService;
    /**
     * è¯·å‡ç”³è¯·åˆ†é¡µæŸ¥è¯¢
     */
    @GetMapping("/listPage")
    public AjaxResult listPage(Page page, HolidayApplication holidayApplication){
        return AjaxResult.success(holidayApplicationService.listPage(page, holidayApplication));
    }
    /**
     * æ–°å¢žè¯·å‡ç”³è¯·
     */
    @PostMapping("/add")
    public AjaxResult add(@RequestBody HolidayApplication holidayApplication){
        return AjaxResult.success(holidayApplicationService.save(holidayApplication));
    }
    /**
     * ä¿®æ”¹è¯·å‡ç”³è¯·
     */
    @PostMapping("/update")
    public AjaxResult update(@RequestBody HolidayApplication holidayApplication){
        return AjaxResult.success(holidayApplicationService.updateById(holidayApplication));
    }
    /**
     * åˆ é™¤è¯·å‡ç”³è¯·
     */
    @DeleteMapping("/delete/{id}")
    public AjaxResult delete(@PathVariable("id") Long id){
        return AjaxResult.success(holidayApplicationService.removeById(id));
    }
}
src/main/java/com/ruoyi/staff/controller/PersonalAttendanceRecordsController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,47 @@
package com.ruoyi.staff.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.staff.pojo.PersonalAttendanceRecords;
import com.ruoyi.staff.pojo.StaffJoinLeaveRecord;
import com.ruoyi.staff.pojo.StaffOnJob;
import com.ruoyi.staff.service.PersonalAttendanceRecordsService;
import lombok.AllArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@AllArgsConstructor
@RestController
@RequestMapping("/staff/personalAttendanceRecords")
public class PersonalAttendanceRecordsController {
    @Autowired
    private PersonalAttendanceRecordsService personalAttendanceRecordsService;
    /**
     * ä¸ªäººè€ƒå‹¤è®°å½•分页查询
     */
    @GetMapping("/listPage")
    public AjaxResult personalAttendanceRecordsListPage(Page page, PersonalAttendanceRecords personalAttendanceRecords) {
        return AjaxResult.success(personalAttendanceRecordsService.listPage(page, personalAttendanceRecords));
    }
    /**
     * æ–°å¢žä¸ªäººè€ƒå‹¤è®°å½•
     */
    @PostMapping("/add")
    public AjaxResult add(@RequestBody PersonalAttendanceRecords personalAttendanceRecords) {
        return AjaxResult.success(personalAttendanceRecordsService.save(personalAttendanceRecords));
    }
    /**
     * ä¿®æ”¹ä¸ªäººè€ƒå‹¤è®°å½•
     */
    @PutMapping("/update")
    public AjaxResult update(@RequestBody PersonalAttendanceRecords personalAttendanceRecords) {
        return AjaxResult.success(personalAttendanceRecordsService.updateById(personalAttendanceRecords));
    }
    /**
     * åˆ é™¤ä¸ªäººè€ƒå‹¤è®°å½•
     */
    @DeleteMapping("/delete/{id}")
    public AjaxResult delete(@PathVariable("id") Long id) {
        return AjaxResult.success(personalAttendanceRecordsService.removeById(id));
    }
}
src/main/java/com/ruoyi/staff/controller/StaffOnJobController.java
@@ -1,6 +1,8 @@
package com.ruoyi.staff.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.staff.pojo.StaffJoinLeaveRecord;
import com.ruoyi.staff.pojo.StaffOnJob;
@@ -8,6 +10,7 @@
import com.ruoyi.staff.service.IStaffOnJobService;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
@@ -53,6 +56,18 @@
    public AjaxResult staffOnJobDetail(String staffNo) {
        return AjaxResult.success(staffOnJobService.staffOnJobDetail(staffNo));
    }
    /**
     * åœ¨èŒå‘˜å·¥å¯¼å…¥
     */
    @PostMapping("/import")
    @Log(title = "在职员工导入", businessType = BusinessType.IMPORT)
    public AjaxResult importData(@RequestPart("file") MultipartFile file) {
        Boolean b = staffOnJobService.importData(file);
        if (b) {
            return AjaxResult.success("导入成功");
        }
        return AjaxResult.error("导入失败");
    }
    /**
     * åœ¨èŒå‘˜å·¥å¯¼å‡º
src/main/java/com/ruoyi/staff/controller/StaffSchedulingController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,67 @@
package com.ruoyi.staff.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.compensationperformance.pojo.CompensationPerformance;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.staff.dto.SaveStaffSchedulingDto;
import com.ruoyi.staff.dto.StaffSchedulingDto;
import com.ruoyi.staff.service.StaffSchedulingService;
import com.ruoyi.staff.vo.SearchSchedulingVo;
import lombok.RequiredArgsConstructor;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
/**
 * æŽ’班
 * @author buhuazhen
 * @date 2025/9/3
 * @email 3038525872@qq.com
 */
@RestController
@RequestMapping("/staff/staffScheduling")
@RequiredArgsConstructor
public class StaffSchedulingController {
    private final StaffSchedulingService staffSchedulingService;
    @PostMapping("/listPage")
    public AjaxResult listPage(@RequestBody SearchSchedulingVo vo){
       return AjaxResult.success(staffSchedulingService.listPage(vo));
    }
    @PostMapping("/save")
    public AjaxResult save(@RequestBody @Validated SaveStaffSchedulingDto saveStaffSchedulingDto){
        staffSchedulingService.saveStaffScheduling(saveStaffSchedulingDto);
        return AjaxResult.success();
    }
    @DeleteMapping("/delByIds")
    public AjaxResult delByIds(@RequestBody List<Integer> ids){
        staffSchedulingService.removeByIds(ids);
        return AjaxResult.success();
    }
    @DeleteMapping("/del/{id}")
    public AjaxResult del(@PathVariable("id") Integer id){
        staffSchedulingService.removeById(id);
        return AjaxResult.success();
    }
    @Log(title = "导出人员排班列表", businessType = BusinessType.EXPORT)
    @PostMapping("/export")
    public void export(HttpServletResponse response ) {
        SearchSchedulingVo vo = new SearchSchedulingVo();
        vo.setCurrent(-1);
        vo.setSize(-1);
        IPage<StaffSchedulingDto> list = staffSchedulingService.listPage(vo);
        ExcelUtil<StaffSchedulingDto> util = new ExcelUtil<StaffSchedulingDto>(StaffSchedulingDto.class);
        util.exportExcel(response, list.getRecords(), "导出人员排班列表");
    }
}
src/main/java/com/ruoyi/staff/dto/SaveStaffSchedulingDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,49 @@
package com.ruoyi.staff.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Date;
/**
 * @author buhuazhen
 * @date 2025/9/3
 * @email 3038525872@qq.com
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class SaveStaffSchedulingDto implements Serializable {
    private Integer id;
    @NotNull(message = "必须要选择员工")
    private Integer staffId;
    @NotNull(message = "部门id不能为空!")
    private Integer department;
    @NotNull(message = "班次id不能为空!")
    private Integer shiftType;
    @NotNull(message = "工作日不能为空!")
    private Date workDate;
    @NotNull(message = "上班时间不能为空!")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime workStartTime;
    @NotNull(message = "下班时间不能为空!")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime workEndTime;
    @NotNull(message = "工时不能为空!")
    private Integer status;
    private String remark;
}
src/main/java/com/ruoyi/staff/dto/StaffSchedulingDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,85 @@
package com.ruoyi.staff.dto;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.Date;
/**
 * @author buhuazhen
 * @date 2025/9/4
 * @email 3038525872@qq.com
 */
@Data
public class StaffSchedulingDto implements Serializable {
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    /**
     * å‘˜å·¥ID
     */
    private Integer staffId;
    @Excel(name = "员工名称")
    private String staffName;
    @Excel(name = "员工编号")
    private String staffNo;
    /**
     * éƒ¨é—¨
     */
    @Excel(name = "部门名称")
    private String department;
    /**
     * æŽ’班类型
     */
    @Excel(name = "班次名称", readConverterExp = "1=早班,2=中班,3=晚班,4=夜班班")
    private String shiftType;
    /**
     * å·¥ä½œæ—¥æœŸ
     */
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    @Excel(name = "工作日期", dateFormat = "yyyy-MM-dd", width = 20)
    private Date workDate;
    /**
     * å¼€å§‹å·¥ä½œæ—¶é—´
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    @Excel(name = "开始工作时间", dateFormat = "mm:ss", width = 20)
    private LocalDateTime workStartTime;
    /**
     * ç»“束工作时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    @Excel(name = "结束工作时间", dateFormat = "mm:ss", width = 20)
    private LocalDateTime workEndTime;
    /**
     * å·¥ä½œæ—¶é•¿
     */
    @Excel(name = "工作时长", width = 20)
    private BigDecimal workHours;
    /**
     * çŠ¶æ€
     */
    @Excel(name = "状态", readConverterExp = "1=已安排,2=已确认,3=已完成,4=已取消")
    private String status;
    /**
     * å¤‡æ³¨
     */
    @Excel(name = "备注")
    private String remark;
}
src/main/java/com/ruoyi/staff/mapper/HolidayApplicationMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,9 @@
package com.ruoyi.staff.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.staff.pojo.HolidayApplication;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface HolidayApplicationMapper extends BaseMapper<HolidayApplication> {
}
src/main/java/com/ruoyi/staff/mapper/PersonalAttendanceRecordsMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,9 @@
package com.ruoyi.staff.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.staff.pojo.PersonalAttendanceRecords;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface PersonalAttendanceRecordsMapper extends BaseMapper<PersonalAttendanceRecords> {
}
src/main/java/com/ruoyi/staff/mapper/StaffSchedulingMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
package com.ruoyi.staff.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.ruoyi.staff.dto.StaffSchedulingDto;
import com.ruoyi.staff.pojo.StaffScheduling;
import com.ruoyi.staff.vo.SearchSchedulingVo;
import org.apache.ibatis.annotations.Param;
/**
* @author buhuazhen
* @description é’ˆå¯¹è¡¨ã€staff_scheduling】的数据库操作Mapper
* @createDate 2025-09-03 14:50:34
* @Entity generator.domain.StaffScheduling
*/
public interface StaffSchedulingMapper extends BaseMapper<StaffScheduling> {
    IPage<StaffSchedulingDto> listPage(IPage page, @Param("vo") SearchSchedulingVo vo);
}
src/main/java/com/ruoyi/staff/pojo/HolidayApplication.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,58 @@
package com.ruoyi.staff.pojo;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDate;
import java.time.LocalTime;
@Data
@TableName("holiday_application")
public class HolidayApplication  {
    /**
     * åºå·
     */
    @TableId(type = IdType.AUTO)
    private Long id;
    /**
     * å‘˜å·¥id
     */
    @TableField(fill = FieldFill.INSERT)
    private Long staffId;
    /**
     * å‡æœŸç±»åž‹
     */
    private String type;
    /**
     * å¼€å§‹æ—¥æœŸ
     */
    @JsonFormat(pattern = "yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private LocalDate startDate;
    /**
     * ç»“束日期
     */
    @JsonFormat(pattern = "yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private LocalDate endDate;
    /**
     * å‡æœŸå¤©æ•°
     */
    private Integer days;
    /**
     * ç”³è¯·ç†ç”±
     */
    private String reason;
    /**
     * çŠ¶æ€
     */
    private String status;
    /**
     * ç§Ÿæˆ·ID
     */
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
}
src/main/java/com/ruoyi/staff/pojo/PersonalAttendanceRecords.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,52 @@
package com.ruoyi.staff.pojo;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.time.LocalDate;
import java.time.LocalTime;
@Data
@TableName("personal_attendance_records")
public class PersonalAttendanceRecords implements Serializable {
    /**
     * åºå·
     */
    @TableId(type = IdType.AUTO)
    private Long id;
    /**
     * æ—¥æœŸ
     */
    @JsonFormat(pattern = "yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private LocalDate date;
    /**
     * ç­¾åˆ°æ—¶é—´
     */
    @JsonFormat(pattern = "HH:mm")
    @DateTimeFormat(pattern = "HH:mm")
    private LocalTime checkIn;
    /**
     * ç­¾é€€æ—¶é—´
     */
    @JsonFormat(pattern = "HH:mm")
    @DateTimeFormat(pattern = "HH:mm")
    private LocalTime checkOut;
    /**
     * å·¥ä½œæ—¶é•¿
     */
    private String workHours;
    /**
     * çŠ¶æ€
     */
    private String status;
    /**
     * ç§Ÿæˆ·ID
     */
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
}
src/main/java/com/ruoyi/staff/pojo/StaffJoinLeaveRecord.java
@@ -36,6 +36,14 @@
    private Integer staffState;
    /**
     * è¯•用期(月)
     */
    @Excel(name = "试用期(月)")
    private Integer probationPeriod;
    /**
     * å‘˜å·¥ç¼–号
     */
    @Excel(name = "员工编号")
src/main/java/com/ruoyi/staff/pojo/StaffOnJob.java
@@ -35,7 +35,7 @@
    /**
     * å‘˜å·¥ç¼–号
     */
    @Excel(name = "员工编号")
    @Excel(name = "员工编号", type = Excel.Type.EXPORT, cellType = Excel.ColumnType.STRING)
    private String staffNo;
    /**
src/main/java/com/ruoyi/staff/pojo/StaffScheduling.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,106 @@
package com.ruoyi.staff.pojo;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.Date;
/**
 *
 * @TableName staff_scheduling
 */
@TableName(value ="staff_scheduling")
@Data
public class StaffScheduling {
    /**
     *
     */
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    /**
     * å‘˜å·¥ID
     */
    @TableField(value = "staff_id")
    private Integer staffId;
    /**
     * éƒ¨é—¨
     */
    @TableField(value = "department")
    private Integer department;
    /**
     * æŽ’班类型
     */
    @TableField(value = "shift_type")
    private Integer shiftType;
    /**
     * å·¥ä½œæ—¥æœŸ
     */
    @TableField(value = "work_date")
    private Date workDate;
    /**
     * å¼€å§‹å·¥ä½œæ—¶é—´
     */
    @TableField(value = "work_start_time")
    private LocalDateTime workStartTime;
    /**
     * ç»“束工作时间
     */
    @TableField(value = "work_end_time")
    private LocalDateTime workEndTime;
    /**
     * å·¥ä½œæ—¶é•¿
     */
    @TableField(value = "work_hours")
    private BigDecimal workHours;
    /**
     * çŠ¶æ€
     */
    @TableField(value = "status")
    private Integer status;
    /**
     * å¤‡æ³¨
     */
    @TableField(value = "remark")
    private String remark;
    /**
     * åˆ›å»ºæ—¶é—´
     */
    @TableField(value = "create_time",fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    /**
     * åˆ›å»ºç”¨æˆ·
     */
    @TableField(value = "create_user",fill = FieldFill.INSERT)
    private Long createUser;
    /**
     * ä¿®æ”¹æ—¶é—´
     */
    @TableField(value = "update_time",fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
    /**
     * ä¿®æ”¹ç”¨æˆ·
     */
    @TableField(value = "update_user",fill = FieldFill.INSERT_UPDATE)
    private Long updateUser;
    /**
     * ç§Ÿæˆ·ID
     */
    @TableField(value = "tenant_id",fill = FieldFill.INSERT)
    private Long tenantId;
}
src/main/java/com/ruoyi/staff/service/HolidayApplicationService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,10 @@
package com.ruoyi.staff.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.staff.pojo.HolidayApplication;
public interface HolidayApplicationService extends IService<HolidayApplication> {
    IPage listPage(Page page, HolidayApplication holidayApplication);
}
src/main/java/com/ruoyi/staff/service/IStaffOnJobService.java
@@ -5,6 +5,7 @@
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.staff.pojo.StaffJoinLeaveRecord;
import com.ruoyi.staff.pojo.StaffOnJob;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
@@ -19,4 +20,6 @@
    void staffOnJobExport(HttpServletResponse response, StaffOnJob staffOnJob);
    List<StaffJoinLeaveRecord> staffOnJobList();
    Boolean importData(MultipartFile file);
}
src/main/java/com/ruoyi/staff/service/PersonalAttendanceRecordsService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,10 @@
package com.ruoyi.staff.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.staff.pojo.PersonalAttendanceRecords;
public interface PersonalAttendanceRecordsService extends IService<PersonalAttendanceRecords> {
    IPage listPage(Page page, PersonalAttendanceRecords personalAttendanceRecords);
}
src/main/java/com/ruoyi/staff/service/StaffSchedulingService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
package com.ruoyi.staff.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.staff.dto.SaveStaffSchedulingDto;
import com.ruoyi.staff.dto.StaffSchedulingDto;
import com.ruoyi.staff.pojo.StaffScheduling;
import com.ruoyi.staff.vo.SearchSchedulingVo;
/**
* @author buhuazhen
* @description é’ˆå¯¹è¡¨ã€staff_scheduling】的数据库操作Service
* @createDate 2025-09-03 14:50:34
*/
public interface StaffSchedulingService extends IService<StaffScheduling> {
    void saveStaffScheduling(SaveStaffSchedulingDto saveStaffSchedulingDto);
    IPage<StaffSchedulingDto> listPage(SearchSchedulingVo vo);
}
src/main/java/com/ruoyi/staff/service/impl/HolidayApplicationServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,22 @@
package com.ruoyi.staff.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
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.staff.mapper.HolidayApplicationMapper;
import com.ruoyi.staff.pojo.HolidayApplication;
import com.ruoyi.staff.service.HolidayApplicationService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class HolidayApplicationServiceImpl extends ServiceImpl<HolidayApplicationMapper, HolidayApplication> implements HolidayApplicationService {
    @Autowired
    private HolidayApplicationMapper holidayApplicationMapper;
    @Override
    public IPage listPage(Page page, HolidayApplication holidayApplication) {
        return holidayApplicationMapper.selectPage(page, new QueryWrapper<>(holidayApplication));
    }
}
src/main/java/com/ruoyi/staff/service/impl/PersonalAttendanceRecordsServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
package com.ruoyi.staff.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
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.staff.mapper.PersonalAttendanceRecordsMapper;
import com.ruoyi.staff.pojo.PersonalAttendanceRecords;
import com.ruoyi.staff.service.PersonalAttendanceRecordsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class PersonalAttendanceRecordsServiceImpl extends ServiceImpl<PersonalAttendanceRecordsMapper, PersonalAttendanceRecords> implements PersonalAttendanceRecordsService {
    @Autowired
    private PersonalAttendanceRecordsMapper personalAttendanceRecordsMapper;
    @Override
    public IPage listPage(Page page, PersonalAttendanceRecords personalAttendanceRecords) {
//        return personalAttendanceRecordsMapper.ListPage(page, personalAttendanceRecords);
        return baseMapper.selectPage(page, new QueryWrapper<>(personalAttendanceRecords));
    }
}
src/main/java/com/ruoyi/staff/service/impl/StaffOnJobServiceImpl.java
@@ -14,6 +14,7 @@
import com.ruoyi.staff.service.IStaffOnJobService;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
@@ -55,5 +56,17 @@
        return staffJoinLeaveRecordMapper.staffOnJobList();
    }
    @Override
    public Boolean importData(MultipartFile file) {
        try {
            ExcelUtil<StaffOnJob> util = new ExcelUtil<>(StaffOnJob.class);
            List<StaffOnJob> staffOnJobs = util.importExcel(file.getInputStream());
            return saveOrUpdateBatch(staffOnJobs);
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }
}
src/main/java/com/ruoyi/staff/service/impl/StaffSchedulingServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,61 @@
package com.ruoyi.staff.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.staff.dto.SaveStaffSchedulingDto;
import com.ruoyi.staff.dto.StaffSchedulingDto;
import com.ruoyi.staff.mapper.StaffSchedulingMapper;
import com.ruoyi.staff.pojo.StaffScheduling;
import com.ruoyi.staff.service.StaffSchedulingService;
import com.ruoyi.staff.vo.SearchSchedulingVo;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.BeanUtils;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.time.Duration;
/**
 * @author buhuazhen
 * @description é’ˆå¯¹è¡¨ã€staff_scheduling】的数据库操作Service实现
 * @createDate 2025-09-03 14:50:34
 */
@Service
@RequiredArgsConstructor
public class StaffSchedulingServiceImpl extends ServiceImpl<StaffSchedulingMapper, StaffScheduling>
        implements StaffSchedulingService {
    private final StaffSchedulingMapper staffSchedulingMapper;
    @Lazy
    @Resource
    private StaffSchedulingService staffSchedulingService;
    @Override
    public void saveStaffScheduling(SaveStaffSchedulingDto saveStaffSchedulingDto) {
        StaffScheduling staffScheduling = new StaffScheduling();
        BeanUtils.copyProperties(saveStaffSchedulingDto, staffScheduling);
        // å¼€å§‹è®¡ç®—æ—¶é—´
        Duration duration = Duration.between(staffScheduling.getWorkStartTime(), staffScheduling.getWorkEndTime());
        long hours = duration.toHours();
        // 0.5
        double minutes = (duration.toMinutes() % 60) / 60.0;
        // minutes = minutes < 0.5 ? 0 : 0.5; å…¬å¸ä¸€èˆ¬ä»¥0.5为标准计算
        staffScheduling.setWorkHours(BigDecimal.valueOf(hours + minutes));
        staffSchedulingService.saveOrUpdate(staffScheduling);
    }
    @Override
    public IPage<StaffSchedulingDto> listPage(SearchSchedulingVo vo) {
        Page<StaffScheduling> page = new Page<>(vo.getCurrent(), vo.getSize());
        return staffSchedulingMapper.listPage(page, vo);
    }
}
src/main/java/com/ruoyi/staff/vo/SearchSchedulingVo.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,27 @@
package com.ruoyi.staff.vo;
import com.ruoyi.dto.PageDto;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.time.LocalDate;
/**
 * @author buhuazhen
 * @date 2025/9/3
 * @email 3038525872@qq.com
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class SearchSchedulingVo extends PageDto {
    private String staffName;
    private String shiftType;
    private LocalDate startDate;
    private LocalDate endDate;
}
src/main/java/com/ruoyi/warehouse/controller/DocumentClassificationController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,52 @@
package com.ruoyi.warehouse.controller;
import com.ruoyi.basic.dto.ProductDto;
import com.ruoyi.basic.dto.ProductTreeDto;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.controller.BaseController;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.warehouse.dto.DocumentClassificationDto;
import com.ruoyi.warehouse.dto.DocumentClassificationTreeDto;
import com.ruoyi.warehouse.pojo.DocumentClassification;
import com.ruoyi.warehouse.service.DocumentClassificationService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@Api(tags = "文档分类")
@RequestMapping("/warehouse/documentClassification")
public class DocumentClassificationController extends BaseController {
    @Autowired
    private DocumentClassificationService documentClassificationService;
    //树结构
    @GetMapping("/getList")
    public  AjaxResult getList() {
        return AjaxResult.success(documentClassificationService.selectDocumentClassificationList());
    }
    @PostMapping("/add")
    @ApiOperation("文档分类-添加")
    @Log(title = "文档分类-添加", businessType = BusinessType.INSERT)
    public AjaxResult add(@RequestBody DocumentClassification documentClassification) {
        return AjaxResult.success(documentClassificationService.save(documentClassification));
    }
    @PutMapping("/update")
    @ApiOperation("文档分类-更新")
    @Log(title = "文档分类-更新", businessType = BusinessType.UPDATE)
    public AjaxResult update(@RequestBody DocumentClassification documentClassification) {
        return AjaxResult.success(documentClassificationService.updateById(documentClassification));
    }
    @DeleteMapping("/delete")
    @ApiOperation("文档分类删除")
    @Log(title = "文档分类删除", businessType = BusinessType.DELETE)
    public AjaxResult delete(@RequestBody List<Long> ids) {
        if(CollectionUtils.isEmpty(ids)) return AjaxResult.error("请传入要删除的ID");
        return AjaxResult.success(documentClassificationService.deleteByIds(ids));
    }
}
src/main/java/com/ruoyi/warehouse/controller/DocumentationBorrowManagementController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,113 @@
package com.ruoyi.warehouse.controller;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.controller.BaseController;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.warehouse.mapper.DocumentationBorrowManagementMapper;
import com.ruoyi.warehouse.mapper.DocumentationReturnManagementMapper;
import com.ruoyi.warehouse.pojo.DocumentationBorrowManagement;
import com.ruoyi.warehouse.pojo.DocumentationReturnManagement;
import com.ruoyi.warehouse.pojo.Warehouse;
import com.ruoyi.warehouse.service.DocumentationBorrowManagementService;
import com.ruoyi.warehouse.service.WarehouseService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.time.LocalDateTime;
import java.util.List;
@RestController
@Api(tags = "文档借阅管理")
@RequestMapping("/documentationBorrowManagement")
public class DocumentationBorrowManagementController extends BaseController {
    @Autowired
    private DocumentationBorrowManagementService documentationBorrowManagementService;
    @Autowired
    private DocumentationBorrowManagementMapper documentationBorrowManagementMapper;
    @Autowired
    private DocumentationReturnManagementMapper documentationReturnManagementMapper;
    @GetMapping("/listPage")
    @ApiOperation("文档借阅管理-借阅分页查询")
    @Log(title = "文档借阅管理-借阅分页查询", businessType = BusinessType.OTHER)
    public AjaxResult listPage(Page page, DocumentationBorrowManagement documentationBorrowManagement) {
        return AjaxResult.success(documentationBorrowManagementService.listPage(page, documentationBorrowManagement));
    }
    @GetMapping("/list")
    @ApiOperation("文档借阅管理-借阅查询")
    @Log(title = "文档借阅管理-借阅查询", businessType = BusinessType.OTHER)
    public AjaxResult list() {
        return AjaxResult.success(documentationBorrowManagementService.listAll());
    }
    @GetMapping("/listPageReturn")
    @ApiOperation("文档借阅管理-归还分页查询")
    @Log(title = "文档借阅管理-归还分页查询", businessType = BusinessType.OTHER)
    public AjaxResult listPageReturn(Page page, DocumentationReturnManagement documentationReturnManagement) {
        return AjaxResult.success(documentationReturnManagementMapper.listPage(page, documentationReturnManagement));
    }
    @GetMapping("/getByDocumentationId/{id}")
    @ApiOperation("根据书籍id查询借阅记录")
    @Log(title = "根据书籍id查询借阅记录", businessType = BusinessType.OTHER)
    public AjaxResult getByDocumentationId(@PathVariable Long id) {
        return AjaxResult.success(documentationBorrowManagementService.selectByDocumentationId(id));
    }
    @PostMapping("/add")
    @ApiOperation("文档借阅管理-借阅")
    @Log(title = "文档借阅管理-借阅", businessType = BusinessType.INSERT)
    public AjaxResult add(@RequestBody DocumentationBorrowManagement documentationBorrowManagement) {
        return AjaxResult.success(documentationBorrowManagementService.add(documentationBorrowManagement));
    }
    @PutMapping("/revent")
    @ApiOperation("文档借阅管理-归还")
    @Log(title = "文档借阅管理-归还", businessType = BusinessType.UPDATE)
    public AjaxResult revent(@RequestBody DocumentationReturnManagement documentationReturnManagement) {
        return AjaxResult.success(documentationBorrowManagementService.reventdbm(documentationReturnManagement));
    }
    @PutMapping("/update")
    @ApiOperation("文档借阅管理-更新")
    @Log(title = "文档借阅管理-更新", businessType = BusinessType.UPDATE)
    public AjaxResult update(@RequestBody DocumentationBorrowManagement documentationBorrowManagement) {
        return AjaxResult.success(documentationBorrowManagementService.updateById(documentationBorrowManagement));
    }
    @PutMapping("/reventUpdate")
    @ApiOperation("文档借阅管理-归还更新")
    @Log(title = "文档借阅管理-归还更新", businessType = BusinessType.UPDATE)
    public AjaxResult reventupdate(@RequestBody DocumentationReturnManagement documentationReturnManagement) {
        return AjaxResult.success(documentationReturnManagementMapper.updateById(documentationReturnManagement));
    }
    @DeleteMapping ("/delete")
    @ApiOperation("文档借阅管理-借阅删除")
    @Log(title = "文档借阅管理-借阅删除", businessType = BusinessType.DELETE)
    public AjaxResult delete(@RequestBody List<Long> ids) {
        if(CollectionUtils.isEmpty(ids)) return AjaxResult.error("请传入要删除的ID");
        return AjaxResult.success(documentationBorrowManagementService.deleteByIds(ids));
    }
    @DeleteMapping ("/reventDelete")
    @ApiOperation("文档借阅管理-归还删除")
    @Log(title = "文档借阅管理-归还删除", businessType = BusinessType.DELETE)
    public AjaxResult reventdelete(@RequestBody List<Long> ids) {
        if(CollectionUtils.isEmpty(ids)) return AjaxResult.error("请传入要删除的ID");
        return AjaxResult.success(documentationBorrowManagementService.reventDeleteByIds(ids));
    }
    @PostMapping("/export")
    @ApiOperation("文档借阅管理-借阅导出")
    @Log(title = "文档借阅管理-借阅导出", businessType = BusinessType.EXPORT)
    public void export(HttpServletResponse response,DocumentationBorrowManagement documentationBorrowManagement) {
        documentationBorrowManagementService.export(response,documentationBorrowManagement);
    }
    @PostMapping("/exportrevent")
    @ApiOperation("文档借阅管理-归还导出")
    @Log(title = "文档借阅管理-归还导出", businessType = BusinessType.EXPORT)
    public void exportrevent(HttpServletResponse response, DocumentationReturnManagement documentationReturnManagement) {
        documentationBorrowManagementService.exportrevent(response,documentationReturnManagement);
    }
}
src/main/java/com/ruoyi/warehouse/controller/DocumentationController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,91 @@
package com.ruoyi.warehouse.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.controller.BaseController;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.warehouse.dto.DocumentationDto;
import com.ruoyi.warehouse.pojo.Documentation;
import com.ruoyi.warehouse.pojo.Warehouse;
import com.ruoyi.warehouse.service.DocumentationService;
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.util.HashMap;
import java.util.List;
import java.util.Map;
@RestController
@RequestMapping("/documentation")
@Api(tags = "文档信息表")
public class DocumentationController extends BaseController {
    @Autowired
    private DocumentationService documentationService;
    @GetMapping("/listPage")
    @ApiOperation("文档信息表-分页查询")
    @Log(title = "文档信息表-分页查询", businessType = BusinessType.OTHER)
    public AjaxResult listPage(Page page, Documentation documentation) {
        IPage<DocumentationDto> list = documentationService.listPage(page, documentation);
        return AjaxResult.success(list);
    }
    @GetMapping("/list")
    @ApiOperation("文档信息表查询")
    @Log(title = "文档信息表查询", businessType = BusinessType.OTHER)
    public AjaxResult list() {
        List<DocumentationDto> list = documentationService.listAll();
        return AjaxResult.success(list);
    }
    @PostMapping("/add")
    @ApiOperation("文档信息表-添加")
    @Log(title = "文档信息表-添加", businessType = BusinessType.INSERT)
    public AjaxResult add(@RequestBody Documentation documentation) {
        return AjaxResult.success(documentationService.save(documentation));
    }
    @PutMapping("/update")
    @ApiOperation("文档信息表-更新")
    @Log(title = "文档信息表-更新", businessType = BusinessType.UPDATE)
    public AjaxResult update(@RequestBody Documentation documentation) {
        return AjaxResult.success(documentationService.updateById(documentation));
    }
    @DeleteMapping("/delete")
    @ApiOperation("文档信息表-删除")
    @Log(title = "文档信息表-删除", businessType = BusinessType.DELETE)
    public AjaxResult delete(@RequestBody List<Long> ids) {
        if(CollectionUtils.isEmpty(ids)) return AjaxResult.error("请传入要删除的ID");
        return AjaxResult.success(documentationService.deleteByIds(ids));
    }
    @PostMapping("/export")
    @ApiOperation("文档信息表-导出")
    @Log(title = "文档信息表-导出", businessType = BusinessType.EXPORT)
    public void export(HttpServletResponse response,Documentation documentation ) {
        documentationService.export(response,documentation);
    }
    @ApiOperation("文档信息表-统计")
    @GetMapping("/overview")
    public AjaxResult getOverviewStatistics() {
        Map<String, Object> result = new HashMap<>();
        result.put("totalDocsCount", documentationService.getTotalDocsCount());
        result.put("categoryNumCount", documentationService.getCategoryNumCount());
        result.put("borrowedDocsCount", documentationService.getBorrowedDocsCount());
        result.put("monthlyAddedDocsCount", documentationService.getMonthlyAddedDocsCount());
        return AjaxResult.success(result);
    }
    @ApiOperation("文档信息表-分类统计")
    @GetMapping("/category")
    public AjaxResult getCategoryDistribution() {
        return AjaxResult.success(documentationService.getCategoryDistribution());
    }
    @ApiOperation("文档信息表-状态统计")
    @GetMapping("/status")
    public AjaxResult getStatusDistribution() {
        return AjaxResult.success(documentationService.getStatusDistribution());
    }
}
src/main/java/com/ruoyi/warehouse/controller/DocumentationFileController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,64 @@
package com.ruoyi.warehouse.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.account.pojo.AccountFile;
import com.ruoyi.account.service.AccountFileService;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.warehouse.pojo.DocumentationFile;
import com.ruoyi.warehouse.service.DocumentationFileService;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.List;
/**
 * æ–‡æ¡£é™„ä»¶
 */
@RestController
@RequestMapping("/documentation/documentationFile")
public class DocumentationFileController {
    @Resource
    private DocumentationFileService documentationFileService;
    /**
     * æ–°å¢ž
     * @param documentationFile
     * @return
     */
    @PostMapping("/add")
    public AjaxResult add(@RequestBody DocumentationFile documentationFile) {
        return AjaxResult.success(documentationFileService.save(documentationFile));
    }
    /**
     * åˆ é™¤
     * @param ids
     * @return
     */
    @DeleteMapping("/del")
    public AjaxResult delDocumentationFile(@RequestBody List<Long> ids) {
        if(CollectionUtils.isEmpty(ids)){
            return AjaxResult.error("请选择至少一条数据");
        }
        //删除检验附件
        return AjaxResult.success(documentationFileService.removeBatchByIds(ids));
    }
    /**
     *查询
     * @param
     * @param documentationFile
     * @return
     */
    @GetMapping("/listPage")
    public AjaxResult documentationFileListPage(DocumentationFile documentationFile) {
        return AjaxResult.success(documentationFileService.documentationFileListPage( documentationFile));
    }
}
src/main/java/com/ruoyi/warehouse/controller/WarehouseController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,63 @@
package com.ruoyi.warehouse.controller;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.controller.BaseController;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.ruoyi.warehouse.pojo.Warehouse;
import com.ruoyi.warehouse.pojo.WarehouseGoodsShelves;
import com.ruoyi.warehouse.service.WarehouseGoodsShelvesService;
import com.ruoyi.warehouse.service.WarehouseService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@Api(tags = "仓库")
@RequestMapping("/warehouse")
public class WarehouseController extends BaseController {
    @Autowired
    private WarehouseService warehouseService;
    @GetMapping("/tree")
    @ApiOperation("仓库-查询树")
    @Log(title = "仓库-查询树", businessType = BusinessType.OTHER)
    public AjaxResult listTree() {
        return AjaxResult.success(warehouseService.findListTree());
    }
    @GetMapping("/list")
    @ApiOperation("仓库-查询")
    @Log(title = "仓库-查询", businessType = BusinessType.OTHER)
    public AjaxResult list(Warehouse warehouse) {
        return AjaxResult.success(warehouseService.findList(warehouse));
    }
    @PostMapping("/add")
    @ApiOperation("仓库-添加")
    @Log(title = "仓库-添加", businessType = BusinessType.INSERT)
    public AjaxResult add(@RequestBody Warehouse warehouse) {
        return AjaxResult.success(warehouseService.save(warehouse));
    }
    @PutMapping("/update")
    @ApiOperation("仓库-更新")
    @Log(title = "仓库-更新", businessType = BusinessType.UPDATE)
    public AjaxResult update(@RequestBody Warehouse warehouse) {
        return AjaxResult.success(warehouseService.updateById(warehouse));
    }
    @DeleteMapping("/delete")
    @ApiOperation("仓库-删除")
    @Log(title = "仓库-删除", businessType = BusinessType.DELETE)
    public AjaxResult delete(@RequestBody List<Long> ids) {
        if(CollectionUtils.isEmpty(ids)) return AjaxResult.error("请传入要删除的ID");
        return AjaxResult.success(warehouseService.deleteByIds(ids));
    }
}
src/main/java/com/ruoyi/warehouse/controller/WarehouseGoodsShelvesController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,54 @@
package com.ruoyi.warehouse.controller;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.controller.BaseController;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.warehouse.dto.WarehouseGoodsShelvesDto;
import com.ruoyi.warehouse.pojo.WarehouseGoodsShelves;
import com.ruoyi.warehouse.service.WarehouseGoodsShelvesService;
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.util.List;
@RestController
@Api(tags = "商品货架")
@RequestMapping("/warehouse/goodsShelves")
public class WarehouseGoodsShelvesController extends BaseController {
    @Autowired
    private WarehouseGoodsShelvesService warehouseGoodsShelvesService;
    @GetMapping("/listById")
    @ApiOperation("商品货架-查询")
    @Log(title = "商品货架-查询", businessType = BusinessType.OTHER)
    public AjaxResult listById(WarehouseGoodsShelves warehouseGoodsShelves) {
        List<WarehouseGoodsShelvesDto> list = warehouseGoodsShelvesService.findList(warehouseGoodsShelves);
        return AjaxResult.success(list);
    }
    @PostMapping("/add")
    @ApiOperation("商品货架-添加")
    @Log(title = "商品货架-添加", businessType = BusinessType.INSERT)
    public AjaxResult add(@RequestBody WarehouseGoodsShelves warehouseGoodsShelves) {
        return AjaxResult.success(warehouseGoodsShelvesService.add(warehouseGoodsShelves));
    }
    @PutMapping("/update")
    @ApiOperation("商品货架-更新")
    @Log(title = "商品货架-更新", businessType = BusinessType.UPDATE)
    public AjaxResult update(@RequestBody WarehouseGoodsShelves warehouseGoodsShelves) {
        return AjaxResult.success(warehouseGoodsShelvesService.updateRowcolById(warehouseGoodsShelves));
    }
    @DeleteMapping("/delete")
    @ApiOperation("商品货架-删除")
    @Log(title = "商品货架-删除", businessType = BusinessType.DELETE)
    public AjaxResult delete(@RequestBody List<Long> ids) {
        if(CollectionUtils.isEmpty(ids)) return AjaxResult.error("请传入要删除的ID");
        return  AjaxResult.success(warehouseGoodsShelvesService.deleteByIds(ids));
    }
}
src/main/java/com/ruoyi/warehouse/controller/WarehouseGoodsShelvesRowcolController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,32 @@
package com.ruoyi.warehouse.controller;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.controller.BaseController;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.warehouse.pojo.WarehouseGoodsShelvesRowcol;
import com.ruoyi.warehouse.dto.WarehouseGoodsShelvesRowcolDto;
import com.ruoyi.warehouse.service.WarehouseGoodsShelvesRowcolService;
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.util.List;
@RestController
@Api(tags = "商品货架行列")
@RequestMapping("/warehouse/goodsShelvesRowcol")
public class WarehouseGoodsShelvesRowcolController extends BaseController {
    @Autowired
    private WarehouseGoodsShelvesRowcolService warehouseGoodsShelvesRowcolService;
    @GetMapping("/list")
    @ApiOperation("商品货架行列-查询")
    @Log(title = "商品货架行列-查询", businessType = BusinessType.OTHER)
    public AjaxResult list(WarehouseGoodsShelvesRowcol warehouseGoodsShelvesRowcol) {
        List<WarehouseGoodsShelvesRowcolDto> list = warehouseGoodsShelvesRowcolService.getList(warehouseGoodsShelvesRowcol);
        return AjaxResult.success(list);
    }
}
src/main/java/com/ruoyi/warehouse/dto/DocumentClassificationDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,12 @@
package com.ruoyi.warehouse.dto;
import com.ruoyi.warehouse.pojo.DocumentClassification;
import lombok.Data;
import java.util.List;
@Data
public class DocumentClassificationDto extends DocumentClassification {
    private List<DocumentClassification> documentClassificationList;
}
src/main/java/com/ruoyi/warehouse/dto/DocumentClassificationTreeDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,13 @@
package com.ruoyi.warehouse.dto;
import lombok.Data;
import java.util.List;
@Data
public class DocumentClassificationTreeDto {
    private Long id;
    private Long parentId;
    private String category;
    private List<DocumentClassificationTreeDto> children;
}
src/main/java/com/ruoyi/warehouse/dto/DocumentationBorrowManagementDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,16 @@
package com.ruoyi.warehouse.dto;
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
import com.ruoyi.warehouse.pojo.DocumentationBorrowManagement;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
public class DocumentationBorrowManagementDto extends DocumentationBorrowManagement {
    /**
     * æ–‡æ¡£åç§°
     */
    @Excel(name = "文档名称")
    private String docName;
}
src/main/java/com/ruoyi/warehouse/dto/DocumentationDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
package com.ruoyi.warehouse.dto;
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
import com.ruoyi.warehouse.pojo.Documentation;
import lombok.Data;
@Data
public class DocumentationDto extends Documentation {
    /**
     * ç±»åˆ«åç§°
     */
    @Excel(name = "类别名称")
    private String category;
    /**
     * ä½ç½®ä¿¡æ¯
     */
    @Excel(name = "位置信息")
    private String locationInfo;
}
src/main/java/com/ruoyi/warehouse/dto/DocumentationReturnManagementDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,12 @@
package com.ruoyi.warehouse.dto;
import com.ruoyi.warehouse.pojo.DocumentationReturnManagement;
import lombok.Data;
@Data
public class DocumentationReturnManagementDto extends DocumentationReturnManagement {
    /**
     * æ–‡æ¡£åç§°
     */
    private String docName;
}
src/main/java/com/ruoyi/warehouse/dto/ReturnExportDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,27 @@
package com.ruoyi.warehouse.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
import org.springframework.format.annotation.DateTimeFormat;
import javax.validation.constraints.NotBlank;
import java.time.LocalDateTime;
public class ReturnExportDto {
    private String id; // è®°å½•编号
    @Excel(name = "文档名称")
    private String docName; // æ–‡æ¡£åç§°
    @Excel(name = "原借阅人")
    private String borrower; // å€Ÿé˜…人
    @Excel(name = "借阅时间", dateFormat = "yyyy-MM-dd", width = 30)
    @JsonFormat(pattern = "yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private LocalDateTime borrowDate; // å€Ÿé˜…æ—¶é—´
    @Excel(name = "归还人")
    @NotBlank(message = "归还人不能为空!!")
    private String returner; // å½’还人
    @Excel(name = "归还时间", dateFormat = "yyyy-MM-dd", width = 30)
    @JsonFormat(pattern = "yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private LocalDateTime returnDate; // å½’还时间
}
src/main/java/com/ruoyi/warehouse/dto/WarehouseDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,13 @@
package com.ruoyi.warehouse.dto;
import com.ruoyi.warehouse.pojo.*;
import lombok.Data;
import java.util.List;
@Data
public class WarehouseDto extends Warehouse {
    private String goodsShelvesName;
    private String category;
}
src/main/java/com/ruoyi/warehouse/dto/WarehouseGoodsShelvesDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,12 @@
package com.ruoyi.warehouse.dto;
import com.ruoyi.warehouse.pojo.WarehouseGoodsShelves;
import java.util.List;
public class WarehouseGoodsShelvesDto extends WarehouseGoodsShelves {
    private String warehouseName;
    private String docName;
    private String docNumber;
    private String category;
}
src/main/java/com/ruoyi/warehouse/dto/WarehouseGoodsShelvesRowcolDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,15 @@
package com.ruoyi.warehouse.dto;
import com.ruoyi.warehouse.dto.DocumentationDto;
import com.ruoyi.warehouse.pojo.WarehouseGoodsShelvesRowcol;
import lombok.Data;
import java.util.List;
@Data
public class WarehouseGoodsShelvesRowcolDto extends WarehouseGoodsShelvesRowcol {
    private String warehouseName;
    private String name;
    private List<DocumentationDto> documentationDtoList;
    private String category;
}
src/main/java/com/ruoyi/warehouse/dto/WarehouseTreeDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,12 @@
package com.ruoyi.warehouse.dto;
import lombok.Data;
import java.util.List;
@Data
public class WarehouseTreeDto {
    private Long id;
    private String label;
    private List<WarehouseTreeDto> children;
}
src/main/java/com/ruoyi/warehouse/mapper/DocumentClassificationMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
package com.ruoyi.warehouse.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.warehouse.pojo.DocumentClassification;
import org.apache.ibatis.annotations.Mapper;
/**
* @author 86151
* @description é’ˆå¯¹è¡¨ã€document_classification(文档分类表)】的数据库操作Mapper
* @createDate 2025-08-15 10:44:23
* @Entity com.ruoyi.warehouse.pojo.DocumentClassification
*/
@Mapper
public interface DocumentClassificationMapper extends BaseMapper<DocumentClassification> {
}
src/main/java/com/ruoyi/warehouse/mapper/DocumentationBorrowManagementMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,35 @@
package com.ruoyi.warehouse.mapper;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.warehouse.dto.DocumentationBorrowManagementDto;
import com.ruoyi.warehouse.dto.ReturnExportDto;
import com.ruoyi.warehouse.pojo.DocumentationBorrowManagement;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
/**
* @author 86151
* @description é’ˆå¯¹è¡¨ã€documentation_borrow_management(文档借阅-归还表)】的数据库操作Mapper
* @createDate 2025-08-14 15:55:45
* @Entity com.ruoyi.warehouse.pojo.DocumentationBorrowManagement
*/
@Mapper
public interface DocumentationBorrowManagementMapper extends BaseMapper<DocumentationBorrowManagement> {
    IPage<DocumentationBorrowManagement> listPage(Page page, @Param("documentationBorrowManagement") DocumentationBorrowManagement documentationBorrowManagement);
    List<DocumentationBorrowManagementDto> export(@Param("documentationBorrowManagement") DocumentationBorrowManagement documentationBorrowManagement);
    List<DocumentationBorrowManagementDto> list(@Param("ew") Wrapper<DocumentationBorrowManagementDto> queryWrapper);
}
src/main/java/com/ruoyi/warehouse/mapper/DocumentationFileMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,17 @@
package com.ruoyi.warehouse.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.account.pojo.AccountFile;
import com.ruoyi.warehouse.pojo.DocumentationFile;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
@Mapper
public interface DocumentationFileMapper extends BaseMapper<DocumentationFile> {
    List<DocumentationFile> documentationFileListPage(@Param("documentationFile") DocumentationFile documentationFile);
}
src/main/java/com/ruoyi/warehouse/mapper/DocumentationMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,48 @@
package com.ruoyi.warehouse.mapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.procurementrecord.dto.ProcurementRecordOutPageDto;
import com.ruoyi.warehouse.dto.DocumentationDto;
import com.ruoyi.warehouse.pojo.Documentation;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import java.util.List;
import java.util.Map;
/**
* @author 86151
* @description é’ˆå¯¹è¡¨ã€documentation(文档信息表)】的数据库操作Mapper
* @createDate 2025-08-14 14:05:49
* @Entity com.ruoyi.warehouse.pojo.Documentation
*/
@Mapper
public interface DocumentationMapper extends BaseMapper<Documentation> {
    IPage<DocumentationDto> listPage(Page page, @Param("documentation") Documentation documentation);
    List<DocumentationDto> list();
    List<DocumentationDto> listByDocumentClassificationId(@Param("documentClassificationId") Long documentClassificationId);
    List<DocumentationDto> listBywarehouseGoodsShelvesRowcolId(@Param("warehouseGoodsShelvesRowcolId") Long warehouseGoodsShelvesRowcolId);
    @Select("select count(*) from documentation")
    Integer countTotalDocs();
    @Select("select count(distinct document_classification_id) from documentation")
    Integer countCategoryNum();
    @Select("select count(*) from documentation where doc_status = '借出'")
    Integer countBorrowedDocs();
    @Select("select count(*) from documentation where create_time >= date_format(now(), '%Y-%m-01') and create_time < date_format(now(), '%Y-%m-%d')")
    Integer countMonthlyAddedDocs();
    @Select("select dc.category, count(*) as count from documentation doc left join document_classification dc on doc.document_classification_id = dc.id group by dc.category")
    List<Map<String, Object>> countCategoryDistribution();
    @Select("select doc_status as docStatus, count(*) as count from documentation group by doc_status")
    List<Map<String, Object>> countStatusDistribution();
}
src/main/java/com/ruoyi/warehouse/mapper/DocumentationReturnManagementMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,33 @@
package com.ruoyi.warehouse.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.warehouse.dto.DocumentationBorrowManagementDto;
import com.ruoyi.warehouse.dto.ReturnExportDto;
import com.ruoyi.warehouse.pojo.DocumentationBorrowManagement;
import com.ruoyi.warehouse.pojo.DocumentationReturnManagement;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* @author 86151
* @description é’ˆå¯¹è¡¨ã€documentation_borrow_management(文档借阅-归还表)】的数据库操作Mapper
* @createDate 2025-08-14 15:55:45
* @Entity com.ruoyi.warehouse.pojo.DocumentationBorrowManagement
*/
@Mapper
public interface DocumentationReturnManagementMapper extends BaseMapper<DocumentationReturnManagement> {
    IPage<DocumentationReturnManagement> listPage(Page page, @Param("documentationReturnManagement") DocumentationReturnManagement documentationReturnManagement);
//
//    List<DocumentationReturnManagementDto> export(@Param("documentationReturnManagement") DocumentationReturnManagement documentationReturnManagement);
//
    List<ReturnExportDto> exportrevent(@Param("documentationReturnManagement") DocumentationReturnManagement documentationReturnManagement);
}
src/main/java/com/ruoyi/warehouse/mapper/WarehouseGoodsShelvesMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,29 @@
package com.ruoyi.warehouse.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.warehouse.dto.WarehouseGoodsShelvesDto;
import com.ruoyi.warehouse.pojo.WarehouseGoodsShelves;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
*
* @description é’ˆå¯¹è¡¨ã€warehouse_goods_shelves(仓库货架表)】的数据库操作Mapper
* @createDate 2025-08-13 11:49:02
* @Entity warehouse.pojo.WarehouseGoodsShelves
*/
@Mapper
public interface WarehouseGoodsShelvesMapper extends BaseMapper<WarehouseGoodsShelves> {
    List<WarehouseGoodsShelvesDto> findList(@Param("warehouseGoodsShelves") WarehouseGoodsShelves warehouseGoodsShelves);
    List<WarehouseGoodsShelvesDto> listAll(@Param("warehouseGoodsShelves") WarehouseGoodsShelves warehouseGoodsShelves);
}
src/main/java/com/ruoyi/warehouse/mapper/WarehouseGoodsShelvesRowcolMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,25 @@
package com.ruoyi.warehouse.mapper;
import com.ruoyi.warehouse.dto.WarehouseGoodsShelvesRowcolDto;
import org.apache.ibatis.annotations.Mapper;
import com.ruoyi.warehouse.pojo.WarehouseGoodsShelvesRowcol;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* @author 86151
* @description é’ˆå¯¹è¡¨ã€warehouse_goods_shelves_rowcol(仓库货架层,列表)】的数据库操作Mapper
* @createDate 2025-08-13 11:49:02
* @Entity warehouse.pojo.WarehouseGoodsShelvesRowcol
*/
@Mapper
public interface WarehouseGoodsShelvesRowcolMapper extends BaseMapper<WarehouseGoodsShelvesRowcol> {
    List<WarehouseGoodsShelvesRowcolDto> findList(@Param("warehouseGoodsShelvesRowcol") WarehouseGoodsShelvesRowcol warehouseGoodsShelvesRowcol);
}
src/main/java/com/ruoyi/warehouse/mapper/WarehouseMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,26 @@
package com.ruoyi.warehouse.mapper;
import com.ruoyi.warehouse.dto.WarehouseDto;
import com.ruoyi.warehouse.pojo.Warehouse;
import org.apache.ibatis.annotations.Mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* @author 86151
* @description é’ˆå¯¹è¡¨ã€warehouse(仓库表)】的数据库操作Mapper
* @createDate 2025-08-13 11:49:02
* @Entity warehouse.pojo.Warehouse
*/
@Mapper
public interface WarehouseMapper extends BaseMapper<Warehouse> {
    List<WarehouseDto> findList(@Param("warehouse") Warehouse warehouse);
    List<Warehouse> listAll(@Param("warehouse") Warehouse warehouse);
}
src/main/java/com/ruoyi/warehouse/pojo/DocumentClassification.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,67 @@
package com.ruoyi.warehouse.pojo;
import com.baomidou.mybatisplus.annotation.*;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Date;
import io.swagger.annotations.ApiModel;
import lombok.Data;
/**
 * æ–‡æ¡£åˆ†ç±»è¡¨
 * @TableName document_classification
 */
@TableName(value ="document_classification")
@Data
@ApiModel(value = "文档分类表")
public class DocumentClassification implements Serializable {
    /**
     *
     */
    @TableId(type = IdType.AUTO)
    private Long id;
    /**
     * ç±»åˆ«åç§°
     */
    private String category;
    /**
     * çˆ¶ç±»id
     */
    private Long parentId;
    /**
     * åˆ›å»ºæ—¶é—´
     */
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    /**
     * åˆ›å»ºç”¨æˆ·
     */
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    /**
     * ä¿®æ”¹æ—¶é—´
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
    /**
     * ä¿®æ”¹ç”¨æˆ·
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    /**
     * ç§Ÿæˆ·id
     */
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
    private static final long serialVersionUID = 1L;
}
src/main/java/com/ruoyi/warehouse/pojo/Documentation.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,175 @@
package com.ruoyi.warehouse.pojo;
import com.baomidou.mybatisplus.annotation.*;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
 * æ–‡æ¡£ä¿¡æ¯è¡¨
 * @TableName documentation
 */
@TableName(value ="documentation")
@Data
@ApiModel(value = "文档信息表")
public class Documentation implements Serializable {
    /**
     *
     */
    @TableId(type = IdType.AUTO)
    @ApiModelProperty(value = "文档ID")
    private Long id;
    /**
     * ç±»åˆ«åç§°id
     */
    @Excel(name = "类别名称id")
    @ApiModelProperty(value = "类别名称id")
    private Long documentClassificationId;
    /**
     * æ–‡æ¡£åç§°
     */
    @Excel(name = "文档名称")
    @ApiModelProperty(value = "文档名称")
    private String docName;
    /**
     * æ–‡æ¡£ç¼–号
     */
    @Excel(name = "文档编号")
    @ApiModelProperty(value = "文档编号")
    private String docNumber;
    /**
     * å¹´ä»½
     */
    @Excel(name = "年份")
    @ApiModelProperty(value = "年份")
    private Long year;
    /**
     * è´£ä»»äºº
     */
    @Excel(name = "责任人")
    @ApiModelProperty(value = "责任人")
    private String responsiblePerson;
    /**
     * æ–‡æ¡£æ”¾ç½®ä½ç½®
     */
    @Excel(name = "文档放置位置")
    @ApiModelProperty(value = "文档放置位置")
    private Long warehouseGoodsShelvesRowcolId;
    /**
     * æ–‡æ¡£æ—¥æœŸ
     */
    @Excel(name = "文档日期", dateFormat = "yyyy-MM-dd", width = 30)
    @ApiModelProperty(value = "文档日期")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private LocalDateTime docDate;
    /**
     * ä¿ç®¡æœŸé™
     */
    @Excel(name = "保管期限")
    @ApiModelProperty(value = "保管期限")
    private Long retentionPeriod;
    /**
     * ä¿å¯†çº§åˆ«
     */
    @Excel(name = "保密级别")
    @ApiModelProperty(value = "保密级别")
    private String securityLevel;
    /**
     * ä»½æ•°
     */
    @Excel(name = "份数")
    @ApiModelProperty(value = "份数")
    private Long copyCount;
    /**
     * é¡µæ•°
     */
    @Excel(name = "页数")
    @ApiModelProperty(value = "页数")
    private Long pageCount;
    /**
     * æ–‡æ¡£ç±»åˆ«
     */
    @Excel(name = "文档类别")
    @ApiModelProperty(value = "文档类别")
    private String docCategory;
    /**
     * æ–‡æ¡£ç§ç±»
     */
    @Excel(name = "文档种类")
    @ApiModelProperty(value = "文档种类")
    private String docType;
    /**
     * ç´§æ€¥ç¨‹åº¦
     */
    @Excel(name = "紧急程度")
    @ApiModelProperty(value = "紧急程度")
    private String urgencyLevel;
    /**
     * æ–‡æ¡£çŠ¶æ€
     */
    @Excel(name = "文档状态")
    @ApiModelProperty(value = "文档状态")
    private String docStatus;
    /**
     * å¤‡æ³¨
     */
    @Excel(name = "备注")
    @ApiModelProperty(value = "备注")
    private String remark;
    /**
     * åˆ›å»ºæ—¶é—´
     */
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    /**
     * åˆ›å»ºç”¨æˆ·
     */
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    /**
     * ä¿®æ”¹æ—¶é—´
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
    /**
     * ä¿®æ”¹ç”¨æˆ·
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    /**
     * ç§Ÿæˆ·ID
     */
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
    private static final long serialVersionUID = 1L;
}
src/main/java/com/ruoyi/warehouse/pojo/DocumentationBorrowManagement.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,129 @@
package com.ruoyi.warehouse.pojo;
import com.baomidou.mybatisplus.annotation.*;
import java.io.Serializable;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.dto.DateQueryDto;
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
/**
 * æ–‡æ¡£å€Ÿé˜…-归还表
 * @TableName documentation_borrow_management
 */
@TableName(value ="documentation_borrow_management")
@Data
@ApiModel(value = "文档借阅表")
public class DocumentationBorrowManagement extends DateQueryDto implements Serializable {
    private static final long serialVersionUID = 1L;
    /**
     * ä¸»é”®
     */
    @TableId(type = IdType.AUTO)
    private Long id;
    /**
     * æ–‡æ¡£id
     */
    @ApiModelProperty(value = "文档id")
    private Long documentationId;
    /**
     * å€Ÿé˜…人
     */
    @ApiModelProperty(value = "借阅人")
    @Excel(name = "借阅人")
    private String borrower;
    /**
     * å½’还人
     */
    @ApiModelProperty(value = "归还人")
    @Excel(name = "归还人")
    private String returner;
    /**
     * å€Ÿé˜…目的
     */
    @Excel(name = "借阅目的")
    @ApiModelProperty(value = "借阅目的")
    private String borrowPurpose;
    /**
     * å€Ÿé˜…日期
     */
    @ApiModelProperty(value = "借阅日期")
    @Excel(name = "借阅日期", dateFormat = "yyyy-MM-dd", width = 30)
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private LocalDate borrowDate;
    /**
     * åº”归还日期
     */
    @ApiModelProperty(value = "应归还日期")
    @Excel(name = "应归还日期", dateFormat = "yyyy-MM-dd", width = 30)
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    private LocalDate dueReturnDate;
    /**
     * å®žé™…归还日期
     */
    @ApiModelProperty(value = "实际归还日期")
    @Excel(name = "实际归还日期", dateFormat = "yyyy-MM-dd", width = 30)
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    private LocalDate returnDate;
    /**
     * å€Ÿé˜…状态
     */
    @ApiModelProperty(value = "借阅状态")
    @Excel(name = "借阅状态")
    private String borrowStatus;
    /**
     * å¤‡æ³¨
     */
    @ApiModelProperty(value = "备注")
    @Excel(name = "备注")
    private String remark;
    /**
     * åˆ›å»ºæ—¶é—´
     */
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    /**
     * åˆ›å»ºç”¨æˆ·
     */
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    /**
     * ä¿®æ”¹æ—¶é—´
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
    /**
     * ä¿®æ”¹ç”¨æˆ·
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    /**
     * ç§Ÿæˆ·id
     */
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
}
src/main/java/com/ruoyi/warehouse/pojo/DocumentationFile.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,60 @@
package com.ruoyi.warehouse.pojo;
import com.baomidou.mybatisplus.annotation.*;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
 * æ–‡æ¡£ä¿¡æ¯è¡¨--附件
 * documentation_file
 */
@TableName(value = "documentation_file")
@Data
public class DocumentationFile implements Serializable {
    private static final long serialVersionUID = 1L;
    /**
     * åºå·
     */
    @TableId(type = IdType.AUTO)
    private Long id;
    @ApiModelProperty(value = "文件名称")
    private String name;
    @ApiModelProperty(value = "文件路径")
    private String url;
    @ApiModelProperty(value = "文件大小")
    private Long fileSize;
    @ApiModelProperty(value = "文档ID")
    @NotBlank(message = "文档id不能为空!")
    private Long documentationId;
    @ApiModelProperty(value = "创建时间")
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    @ApiModelProperty(value = "修改时间")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
    @ApiModelProperty(value = "创建用户")
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    @ApiModelProperty(value = "修改用户")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    @ApiModelProperty(value = "租户ID")
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
}
src/main/java/com/ruoyi/warehouse/pojo/DocumentationReturnManagement.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,130 @@
package com.ruoyi.warehouse.pojo;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.dto.DateQueryDto;
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.time.LocalDate;
import java.time.LocalDateTime;
/**
 * æ–‡æ¡£å€Ÿé˜…-归还表
 * @TableName documentation_return_management
 */
@TableName(value ="documentation_return_management")
@Data
@ApiModel(value = "文档归还表")
public class DocumentationReturnManagement extends DateQueryDto implements Serializable {
    private static final long serialVersionUID = 1L;
    /**
     * ä¸»é”®
     */
    @TableId(type = IdType.AUTO)
    private Long id;
    /**
     * æ–‡æ¡£id
     */
    @ApiModelProperty(value = "文档id")
    private Long documentationId;
    /**
     * å€Ÿé˜…id
     */
    private Long borrowId;
    /**
     * å€Ÿé˜…人
     */
    @ApiModelProperty(value = "借阅人")
    @Excel(name = "借阅人")
    private String borrower;
    /**
     * å½’还人
     */
    @ApiModelProperty(value = "归还人")
    @Excel(name = "归还人")
    private String returner;
    /**
     * å€Ÿé˜…目的
     */
    @Excel(name = "借阅目的")
    @ApiModelProperty(value = "借阅目的")
    private String borrowPurpose;
    /**
     * å€Ÿé˜…日期
     */
    @ApiModelProperty(value = "借阅日期")
    @Excel(name = "借阅日期", dateFormat = "yyyy-MM-dd", width = 30)
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private LocalDate borrowDate;
    /**
     * åº”归还日期
     */
    @ApiModelProperty(value = "应归还日期")
    @Excel(name = "应归还日期", dateFormat = "yyyy-MM-dd", width = 30)
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    private LocalDate dueReturnDate;
    /**
     * å®žé™…归还日期
     */
    @ApiModelProperty(value = "实际归还日期")
    @Excel(name = "实际归还日期", dateFormat = "yyyy-MM-dd", width = 30)
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    private LocalDate returnDate;
    /**
     * å€Ÿé˜…状态
     */
    @ApiModelProperty(value = "借阅状态")
    @Excel(name = "借阅状态")
    private String borrowStatus;
    /**
     * å¤‡æ³¨
     */
    @ApiModelProperty(value = "备注")
    @Excel(name = "备注")
    private String remark;
    /**
     * åˆ›å»ºæ—¶é—´
     */
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    /**
     * åˆ›å»ºç”¨æˆ·
     */
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    /**
     * ä¿®æ”¹æ—¶é—´
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
    /**
     * ä¿®æ”¹ç”¨æˆ·
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    /**
     * ç§Ÿæˆ·id
     */
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
}
src/main/java/com/ruoyi/warehouse/pojo/Warehouse.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,62 @@
package com.ruoyi.warehouse.pojo;
import com.baomidou.mybatisplus.annotation.*;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Date;
import io.swagger.annotations.ApiModel;
import lombok.Data;
/**
 * ä»“库表
 * @TableName warehouse
 */
@TableName(value ="warehouse")
@Data
@ApiModel
public class Warehouse implements Serializable {
    /**
     *
     */
    @TableId(type = IdType.AUTO)
    private Long id;
    /**
     * ä»“库名称
     */
    private String warehouseName;
    /**
     * åˆ›å»ºæ—¶é—´
     */
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    /**
     * åˆ›å»ºç”¨æˆ·
     */
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    /**
     * ä¿®æ”¹æ—¶é—´
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
    /**
     * ä¿®æ”¹ç”¨æˆ·
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    /**
     * ç§Ÿæˆ·ID
     */
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
    private static final long serialVersionUID = 1L;
}
src/main/java/com/ruoyi/warehouse/pojo/WarehouseGoodsShelves.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,79 @@
package com.ruoyi.warehouse.pojo;
import com.baomidou.mybatisplus.annotation.*;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Date;
import io.swagger.annotations.ApiModel;
import lombok.Data;
/**
 * ä»“库货架表
 * @TableName warehouse_goods_shelves
 */
@TableName(value ="warehouse_goods_shelves")
@Data
@ApiModel
public class WarehouseGoodsShelves implements Serializable {
    /**
     *
     */
    @TableId(type = IdType.AUTO)
    private Long id;
    /**
     * è´§æž¶åç§°
     */
    private String name;
    /**
     * å±‚æ•°
     */
    @TableField("`row`")
    private Long row;
    /**
     * åˆ—æ•°
     */
    @TableField("`col`")
    private Long col;
    /**
     * ä»“库id
     */
    private Long warehouseId;
    /**
     * åˆ›å»ºæ—¶é—´
     */
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    /**
     * åˆ›å»ºç”¨æˆ·
     */
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    /**
     * ä¿®æ”¹æ—¶é—´
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
    /**
     * ä¿®æ”¹ç”¨æˆ·
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    /**
     * ç§Ÿæˆ·ID
     */
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
    private static final long serialVersionUID = 1L;
}
src/main/java/com/ruoyi/warehouse/pojo/WarehouseGoodsShelvesRowcol.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,79 @@
package com.ruoyi.warehouse.pojo;
import com.baomidou.mybatisplus.annotation.*;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Date;
import io.swagger.annotations.ApiModel;
import lombok.Data;
/**
 * ä»“库货架层,列表
 * @TableName warehouse_goods_shelves_rowcol
 */
@TableName(value ="warehouse_goods_shelves_rowcol")
@Data
@ApiModel(value = "仓库货架层,列表")
public class WarehouseGoodsShelvesRowcol implements Serializable {
    private static final long serialVersionUID = 1L;
    /**
     *
     */
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    /**
     * å±‚æ•°
     */
    @TableField("`row`")
    private Long row;
    /**
     * åˆ—æ•°
     */
    @TableField("`col`")
    private Long col;
    /**
     * è´§æž¶id
     */
    private Long warehouseGoodsShelvesId;
    /**
     * åˆ›å»ºæ—¶é—´
     */
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    /**
     * åˆ›å»ºç”¨æˆ·
     */
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    /**
     * ä¿®æ”¹æ—¶é—´
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
    /**
     * ä¿®æ”¹ç”¨æˆ·
     */
    @TableField(fill = FieldFill.INSERT)
    private Integer updateUser;
    /**
     * ç§Ÿæˆ·ID
     */
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
    /**
     * å¤‡æ³¨
     */
    private String remark;
}
src/main/java/com/ruoyi/warehouse/service/DocumentClassificationService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
package com.ruoyi.warehouse.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.warehouse.dto.DocumentClassificationDto;
import com.ruoyi.warehouse.dto.DocumentClassificationTreeDto;
import com.ruoyi.warehouse.pojo.DocumentClassification;
import java.util.List;
/**
* @author 86151
* @description é’ˆå¯¹è¡¨ã€document_classification(文档分类表)】的数据库操作Service
* @createDate 2025-08-15 10:44:23
*/
public interface DocumentClassificationService extends IService<DocumentClassification> {
    boolean deleteByIds(List<Long> ids);
    List<DocumentClassificationTreeDto> selectDocumentClassificationList();
}
src/main/java/com/ruoyi/warehouse/service/DocumentationBorrowManagementService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,38 @@
package com.ruoyi.warehouse.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.warehouse.dto.DocumentationBorrowManagementDto;
import com.ruoyi.warehouse.pojo.DocumentationBorrowManagement;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.warehouse.pojo.DocumentationReturnManagement;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
/**
* @author 86151
* @description é’ˆå¯¹è¡¨ã€documentation_borrow_management(文档借阅-归还表)】的数据库操作Service
* @createDate 2025-08-14 15:55:45
*/
public interface DocumentationBorrowManagementService extends IService<DocumentationBorrowManagement> {
    IPage<DocumentationBorrowManagement> listPage(Page page, DocumentationBorrowManagement documentationBorrowManagement);
    boolean add(DocumentationBorrowManagement documentationBorrowManagement);
    boolean deleteByIds(List<Long> ids);
    boolean reventdbm(DocumentationReturnManagement documentationReturnManagement);
    boolean reventDeleteByIds(List<Long> ids);
    void export(HttpServletResponse response, DocumentationBorrowManagement documentationBorrowManagement);
    void exportrevent(HttpServletResponse response, DocumentationReturnManagement documentationReturnManagement);
    List<DocumentationBorrowManagementDto> listAll();
    List<DocumentationBorrowManagementDto> selectByDocumentationId(Long id);
}
src/main/java/com/ruoyi/warehouse/service/DocumentationFileService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,14 @@
package com.ruoyi.warehouse.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.account.pojo.AccountFile;
import com.ruoyi.warehouse.pojo.DocumentationFile;
import java.util.List;
public interface DocumentationFileService extends IService<DocumentationFile> {
    List<DocumentationFile> documentationFileListPage(DocumentationFile documentationFile);
}
src/main/java/com/ruoyi/warehouse/service/DocumentationService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,40 @@
package com.ruoyi.warehouse.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.warehouse.dto.DocumentationDto;
import com.ruoyi.warehouse.pojo.Documentation;
import com.baomidou.mybatisplus.extension.service.IService;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
import java.util.Map;
/**
* @author 86151
* @description é’ˆå¯¹è¡¨ã€documentation(文档信息表)】的数据库操作Service
* @createDate 2025-08-14 14:05:49
*/
public interface DocumentationService extends IService<Documentation> {
    IPage<DocumentationDto> listPage(Page page, Documentation documentation);
    void export(HttpServletResponse response,Documentation documentation);
    boolean deleteByIds(List<Long> ids);
    List<DocumentationDto> listAll();
    Integer getTotalDocsCount();
    Integer getCategoryNumCount();
    Integer getBorrowedDocsCount();
    Integer getMonthlyAddedDocsCount();
    List<Map<String, Object>> getCategoryDistribution();
    List<Map<String, Object>> getStatusDistribution();
}
在上述文件截断后对比
src/main/java/com/ruoyi/warehouse/service/WarehouseGoodsShelvesRowcolService.java src/main/java/com/ruoyi/warehouse/service/WarehouseGoodsShelvesService.java src/main/java/com/ruoyi/warehouse/service/WarehouseService.java src/main/java/com/ruoyi/warehouse/service/impl/DocumentClassificationServiceImpl.java src/main/java/com/ruoyi/warehouse/service/impl/DocumentationBorrowManagementServiceImpl.java src/main/java/com/ruoyi/warehouse/service/impl/DocumentationFileServiceImpl.java src/main/java/com/ruoyi/warehouse/service/impl/DocumentationServiceImpl.java src/main/java/com/ruoyi/warehouse/service/impl/WarehouseGoodsShelvesRowcolServiceImpl.java src/main/java/com/ruoyi/warehouse/service/impl/WarehouseGoodsShelvesServiceImpl.java src/main/java/com/ruoyi/warehouse/service/impl/WarehouseServiceImpl.java src/main/java/com/ruoyi/waterrecord/controller/WaterRecordController.java src/main/java/com/ruoyi/waterrecord/mapper/WaterRecordMapper.java src/main/java/com/ruoyi/waterrecord/pojo/WaterRecord.java src/main/java/com/ruoyi/waterrecord/service/WaterRecordService.java src/main/java/com/ruoyi/waterrecord/service/impl/WaterRecordServiceImpl.java src/main/resources/application-bdsm.yml src/main/resources/application-bhmy.yml src/main/resources/application-cjny.yml src/main/resources/application-cmny.yml src/main/resources/application-demo.yml src/main/resources/application-dhdc.yml src/main/resources/application-hbkj.yml src/main/resources/application-hbxm.yml src/main/resources/application-hckx.yml src/main/resources/application-hcmy.yml src/main/resources/application-hhkj.yml src/main/resources/application-hsmy.yml src/main/resources/application-hsxny.yml src/main/resources/application-hxgy.yml src/main/resources/application-hxsj.yml src/main/resources/application-hysn.yml src/main/resources/application-jjxm.yml src/main/resources/application-jlsn.yml src/main/resources/application-jsmy.yml src/main/resources/application-jsyny.yml src/main/resources/application-jyhj.yml src/main/resources/application-mkzs.yml src/main/resources/application-mqsp.yml src/main/resources/application-mxsc.yml src/main/resources/application-nydl.yml src/main/resources/application-phmk.yml src/main/resources/application-prod.yml src/main/resources/application-qlmc.yml src/main/resources/application-rzny.yml src/main/resources/application-tjxm.yml src/main/resources/application-tymk.yml src/main/resources/application-wdsy.yml src/main/resources/application-xyhb.yml src/main/resources/application-zjyj.yml src/main/resources/application-zqhx.yml src/main/resources/application-zyrq.yml src/main/resources/application-zyrqCopy.yml src/main/resources/mapper/account/AccountFileMapper.xml src/main/resources/mapper/approve/AnnualLeaveSettingMapper.xml src/main/resources/mapper/approve/ApproveProcessMapper.xml src/main/resources/mapper/approve/FileSharingMapper.xml src/main/resources/mapper/approve/HolidaySettingsMapper.xml src/main/resources/mapper/approve/KnowledgeBaseMapper.xml src/main/resources/mapper/approve/NotificationManagementMapper.xml src/main/resources/mapper/approve/OnlineMeetingMapper.xml src/main/resources/mapper/approve/OvertimeSettingMapper.xml src/main/resources/mapper/approve/RpaProcessAutomationMapper.xml src/main/resources/mapper/approve/WorkingHoursSettingMapper.xml src/main/resources/mapper/collaborativeApproval/DutyPlanMapper.xml src/main/resources/mapper/collaborativeApproval/MeetApplicationMapper.xml src/main/resources/mapper/collaborativeApproval/MeetDraftMapper.xml src/main/resources/mapper/collaborativeApproval/MeetingMinutesMapper.xml src/main/resources/mapper/collaborativeApproval/MeetingRoomMapper.xml src/main/resources/mapper/collaborativeApproval/NoticeMapper.xml src/main/resources/mapper/collaborativeApproval/ReadingStatusMapper.xml src/main/resources/mapper/collaborativeApproval/RulesRegulationsManagementMapper.xml src/main/resources/mapper/collaborativeApproval/SealApplicationManagementMapper.xml src/main/resources/mapper/collaborativeApproval/StaffContactsPersonalMapper.xml src/main/resources/mapper/customervisits/CustomerVisitsMapper.xml src/main/resources/mapper/device/DeviceDefectRecordMapper.xml src/main/resources/mapper/device/DeviceLedgerMapper.xml src/main/resources/mapper/device/DeviceMaintenanceMapper.xml src/main/resources/mapper/equipmentenergyconsumption/EnergyPeriodMapper.xml src/main/resources/mapper/equipmentenergyconsumption/electricityConsumptionAreaMapper.xml src/main/resources/mapper/inspectiontask/TimingTaskMapper.xml src/main/resources/mapper/lavorissue/LavorIssueMapper.xml src/main/resources/mapper/measuringinstrumentledger/SparePartsMapper.xml src/main/resources/mapper/oA/OaProjectMapper.xml src/main/resources/mapper/oA/OaProjectPhaseMapper.xml src/main/resources/mapper/oA/OaProjectPhaseTaskMapper.xml src/main/resources/mapper/officesupplies/OfficeSuppliesMapper.xml src/main/resources/mapper/procurementrecord/GasTankWarningMapper.xml src/main/resources/mapper/procurementrecord/InboundManagementMapper.xml src/main/resources/mapper/procurementrecord/ProcurementPlanMapper.xml src/main/resources/mapper/procurementrecord/ProcurementPriceManagementMapper.xml src/main/resources/mapper/procurementrecord/ProcurementRecordMapper.xml src/main/resources/mapper/procurementrecord/ProcurementRecordOutMapper.xml src/main/resources/mapper/procurementrecord/ReturnManagementMapper.xml src/main/resources/mapper/production/SalesLedgerProductionAccountingMapper.xml src/main/resources/mapper/purchase/PaymentRegistrationMapper.xml src/main/resources/mapper/purchase/ProductRecordMapper.xml src/main/resources/mapper/sales/InvoiceLedgerMapper.xml src/main/resources/mapper/sales/PaymentShippingMapper.xml src/main/resources/mapper/sales/ReceiptPaymentMapper.xml src/main/resources/mapper/sales/SalesQuotationMapper.xml src/main/resources/mapper/sales/SalesQuotationProductMapper.xml src/main/resources/mapper/sales/SalespersonManagementMapper.xml src/main/resources/mapper/sales/ShippingInfoMapper.xml src/main/resources/mapper/staff/HolidayApplicationMapper.xml src/main/resources/mapper/staff/PersonalAttendanceRecordsMapper.xml src/main/resources/mapper/staff/StaffJoinLeaveRecordMapper.xml src/main/resources/mapper/staff/StaffSchedulingMapper.xml src/main/resources/mapper/system/SysUserDeptMapper.xml src/main/resources/mapper/system/SysUserMapper.xml src/main/resources/mapper/warehouse/DocumentClassificationMapper.xml src/main/resources/mapper/warehouse/DocumentationBorrowManagementMapper.xml src/main/resources/mapper/warehouse/DocumentationFileMapper.xml src/main/resources/mapper/warehouse/DocumentationMapper.xml src/main/resources/mapper/warehouse/DocumentationReturnManagementMapper.xml src/main/resources/mapper/warehouse/WarehouseGoodsShelvesMapper.xml src/main/resources/mapper/warehouse/WarehouseGoodsShelvesRowcolMapper.xml src/main/resources/mapper/warehouse/WarehouseMapper.xml src/main/resources/mapper/waterrecord/WaterRecordMapper.xml src/main/resources/mybatis/mybatis-config.xml src/main/resources/static/report-template.docx